Обновить
2
Eduard@Edison

Software Engineer

1
Подписчики
Отправить сообщение
1. быструю компиляцию и оптимизацию кода
2. статический бинарник
3. производительность (в зависимости с чем сравнивать, конечно)
4. concurrency
5. тулсет (go fmt/imports/guru/vet/rename, go/ast (что очень важно, что бы свои тулзы проще писать было), vgo)
6. стандартная библиотека (конечно же не все идеально), но все равно помогает решать очень много задач
7. простота кода (да да, я перешел на Go с java и код на Go читать намного проще)
8. ошибки — намного удобнее чем исключения (но может быть это уже вкусовщина)
интересный вы человек. Практически в каждом посте про Go приходите вы и пишете одни и тоже притензии (ошибки, дженерики, менеджер зависимостей). И каждый раз разводите километровый срач. И вот опять. В чем смысле?
Ответ на ваш комментарий вы найдете в практически любом посте про Go, где вы писали.

Я уже устал объяснять — передается указатель по значению, потом перезаписывается объект, на который указывает указатель.
Код: https://play.golang.org/p/pcc6SG8cvP0

окей, доверюсь вам, я не настолько хорошо знаю что там в java, с первого взгляда было похоже, что как раз С++ ссылки в java

В Go нету ссылок.
b = &a;b тут указатель, а не ссылка.

в С++ есть точно такие же референс переменные

Ну а ссылки, что? Разве не переменные?

Это ссылочные переменные.


Я спрашиваю про другое: вот эти три ссылки — они В ОДНОЙ ЯЧЕЙКЕ памяти лежат?

Там одна переменная (которая храниться в памяти) и две ссылочные переменные (что как бы не совсем переменнае). Вот вам почитать:
https://isocpp.org/wiki/faq/references#overview-refs


Но тут другое дело, такого в Go нету и вы ошибались.

Там одна переменная и две ссылки.
Давайте я сделаю это за вас:


#> test  % cat main.cpp                                                                                                                                                             
#include <stdio.h>

int main() {
        int a = 10;
        int &b = a;
        int &c = b;

        printf("%p %p %p\n", &a, &b, &c);
        return 0;
}
#> test  % gcc main.cpp -o main                                                                                                                                                     
#> test  % ./main                                                                                                                                                                   
0x7fff53584858 0x7fff53584858 0x7fff53584858

Там не ссылки в Go, там указатели.
Ссылочная переменная это алиас на другую переменную. Такого в Go нету.
Скопируйте/скомпилируйте/запустите код, что там показан и проанализируйте результат.

Это ссылочные переменные. Там же есть код, скопируйте и запустите у себя. Адрес всех трех переменных будет один и тот же. Потому что b и c это ссылки на a.
В Go такое не возможно.


Точно так же, при передаче по ссылке, адрес переменной в вызываемой функции будет тот же, что и в вызывающей.
В Go такое не возможно.

речь идёт не про ссылки и указатели, а про ссылки и указатели.

Что?


Что я не понял: фактически в примере на С++ создаются три переменных, указывающих на одну и туже переменную.

Правильно, две переменные ссылаются на первую — адрес у всех одинаковый. Эти две переменные называются ссылками (ссылочными переменными).


В Go такого нету. Можно создать переменную, которая будет хранит адрес на участок памяти где хранится другая переменная (например, переменная varFoo). Но это будет новая переменная, она будет хранится отдельно в памяти и иметь свой адрес. Это называется указатель.


Этот указатель можно скопировать (значение его будет все то же, то есть будет хранить все тот же адрес переменной varFoo). Указатель можно разыменовать и получить новую переменную со значение переменной varFoo.

Передаются не объекты, а переменные. Передаются они в джаве только по значению.

насколько я понял, в Java переменные типа Object obj = new Object() являются ссылочными переменными.

Даже в документации Go часто находят слово "reference", есть issue на гитхабе на счет этого. Но это не означает, что в Go есть передача по ссылке или ссылочные переменные.

Ссылка и указатель это не одно и то же.
map это структура (как и слайс) которая содержит указатель, потому такое и поведение.

Потому что это ведет к неправильным выводам, что в Go есть передача по ссылке. Нету, только по значению.

В голанге нет передаче по ссылке?

Нету, в вашем примере идет передача указателя по значению. self *TDive — это указатель. Содержит (хранит в памяти) адрес указывающий на объект. Это просто значение. Оно хранится в памяти, потому можно даже получить указатель на эту переменную (указатель на указатель).
Разберитесь, что такое ссылка и что указатель, и почитайте что в Go.

Если в go нет ссылок, то как же происходит РАЗЫМЕНОВАНИЕ??))

РАЗЫМЕНОВАНИЕ чего?


В Go нету ссылок, есть указатели.

Передаются не объекты, а переменные.

Простите, что????


Передаются они в джаве только по значению.

Я не уверен, просто возможно, что переменные в Джаве изначально содержат ссылку на объект. Вот например:


Object obj = new Object()

Тут obj хранит ссылку или сам объект (значение)?


Если в b в main напечатается k: 2 и v: 2, то нельзя. Плюс это означает передачу параметра b по ссылке.

fmt.Print(b) выведет k: 2 и v: 2. Это не ссылка, это указатель передали в другую функцию по значению. Указатель содержит адрес, это просто значение тип 0x...... Если скопировать это значение у другую переменную — тогда она тоже будет указывать на тот же объект.
Тип в функции func foo(b *bar)*bar указатель, причем типизированный указатель. Есть еще unsafe.Pointer.

Во многих языках где есть ссылки, ссылка является таким же типом данных что и указатель.

нет, в Java, насколько я знаю, объекты передаются по ссылке. Можно ли в Java сделать, например, вот так в Go:


package main

import (
    "fmt"
)

type bar struct {
    k string
    v int
}

func main() {
    b := bar{k: "1", v: 1}
    foo(&b)
    fmt.Print(b)
}

func foo(b *bar) {
    b2 := bar{k: "2", v: 2}
    *b = b2
}

нет, есть передача по ссылке, есть передача по значению (не важно, что передается). Некоторые языки имеют и передачу по ссылке и по значению. Ссылка это не указатель, это два разных понятия. В Go же есть только передача по значению.

Информация

В рейтинге
Не участвует
Откуда
Киев, Киевская обл., Украина
Зарегистрирован
Активность