Я все еще озадачен тем, почему у нас new
в Go.
Когда вы хотите создать экземпляр структуры, вы делаете
t := Thing{}
и вы можете получить указатель на новый экземпляр, выполнив
t := &Thing{}
Но есть и такая возможность:
t := new(Thing)
Этот последний кажется немного чуждым для остальной части языка. &Thing{}
ясен и лаконичен, new(Thing)
и в нем используются только конструкции, которые вы часто используете в других местах. Он также более расширяемый, так как вы можете изменить его на &Thing{3}
или &Thing{Feets:7}
.
По моему мнению, наличие дополнительного ключевого слова 1 стоит дорого, оно делает язык более сложным и добавляет того, что вы должны знать. И это может замаскировать новичков, что стоит за созданием структуры.
Это также делает еще одно зарезервированное слово.
Так в чем же причина new
? Это иногда полезно? Должны ли мы использовать это?
1 : Да, я знаю, что это не ключевое слово на уровне грамматики, вы можете замаскировать его , но это не меняет того факта, что для разумного разработчика это зарезервированное слово.
Ответы:
Наверное, лучший способ спросить - это люди, которые над этим работают; именно то, что я сделал !
Tl; dr: он был там раньше
make
и до&{}
сих пор, и это все еще функция, которую можно использовать в некоторых ситуациях.В основном, здесь приведены наиболее важные части:
После другого ответа, показывающего такое решение:
Я попросил дальнейших разъяснений:
Это также там в основном по историческим причинам:
источник
v := &(0)
и пропускать переменную temp? (Я не знаю Go.)0
буквальная константа, вы не можете взять ее адрес. Проблема может возникнуть, если вы тоже хотите определенный тип. Вот почему синтаксис похож&int
или&int(0)
может быть полезен (хотя и не задумывался о лучшем синтаксисе). Но делать это в две строки, как показал Коллинз, тоже хорошо (vv := 0; v := &vv
).Go 2
считается вредным.