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
Там одна переменная и две ссылки.
Давайте я сделаю это за вас:
#> 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.
Нету, в вашем примере идет передача указателя по значению. self *TDive — это указатель. Содержит (хранит в памяти) адрес указывающий на объект. Это просто значение. Оно хранится в памяти, потому можно даже получить указатель на эту переменную (указатель на указатель).
Разберитесь, что такое ссылка и что указатель, и почитайте что в 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.
нет, есть передача по ссылке, есть передача по значению (не важно, что передается). Некоторые языки имеют и передачу по ссылке и по значению. Ссылка это не указатель, это два разных понятия. В Go же есть только передача по значению.
2. статический бинарник
3. производительность (в зависимости с чем сравнивать, конечно)
4. concurrency
5. тулсет (go fmt/imports/guru/vet/rename, go/ast (что очень важно, что бы свои тулзы проще писать было), vgo)
6. стандартная библиотека (конечно же не все идеально), но все равно помогает решать очень много задач
7. простота кода (да да, я перешел на Go с java и код на Go читать намного проще)
8. ошибки — намного удобнее чем исключения (но может быть это уже вкусовщина)
Ответ на ваш комментарий вы найдете в практически любом посте про Go, где вы писали.
Я уже устал объяснять — передается указатель по значению, потом перезаписывается объект, на который указывает указатель.
Код: https://play.golang.org/p/pcc6SG8cvP0
окей, доверюсь вам, я не настолько хорошо знаю что там в java, с первого взгляда было похоже, что как раз С++ ссылки в java
В Go нету ссылок.
b = &a;—bтут указатель, а не ссылка.в С++ есть точно такие же референс переменные
Это ссылочные переменные.
Там одна переменная (которая храниться в памяти) и две ссылочные переменные (что как бы не совсем переменнае). Вот вам почитать:
https://isocpp.org/wiki/faq/references#overview-refs
Но тут другое дело, такого в Go нету и вы ошибались.
Там одна переменная и две ссылки.
Давайте я сделаю это за вас:
Там не ссылки в 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 нету ссылок, есть указатели.
Простите, что????
Я не уверен, просто возможно, что переменные в Джаве изначально содержат ссылку на объект. Вот например:
Тут
objхранит ссылку или сам объект (значение)?fmt.Print(b)выведетk: 2 и v: 2. Это не ссылка, это указатель передали в другую функцию по значению. Указатель содержит адрес, это просто значение тип0x...... Если скопировать это значение у другую переменную — тогда она тоже будет указывать на тот же объект.Тип в функции
func foo(b *bar)—*barуказатель, причем типизированный указатель. Есть ещеunsafe.Pointer.нет, в Java, насколько я знаю, объекты передаются по ссылке. Можно ли в Java сделать, например, вот так в Go:
нет, есть передача по ссылке, есть передача по значению (не важно, что передается). Некоторые языки имеют и передачу по ссылке и по значению. Ссылка это не указатель, это два разных понятия. В Go же есть только передача по значению.