Когда следует использовать `new` в Go? - PullRequest
4 голосов
/ 28 июня 2010

Кажется бессмысленным использование в примитивных языковых конструкциях, так как вы не можете указать какие-либо значения

func main() {
    y := new([]float)
    fmt.Printf("Len = %d", len(*y) ) // => Len = 0
}

Для структур это имеет смысл бит больше смысла, но чторазница между высказыванием y := new(my_stuct) и, казалось бы, более кратким y := &my_struct?

И поскольку все, что вы создаете, основано на этих примитивах, они будут инициализированы до указанных нулевых значений.Так какой смысл?Когда бы вы хотели использовать new()?

Извините за вопрос новичка, но документация не всегда так ясна.

Ответы [ 2 ]

5 голосов
/ 28 июня 2010

Вы не можете использовать new для срезов и карт, как в вашем примере кода, но вместо этого вы должны использовать команду make : make([]float, 100)

И new(MyStruct), и &MyStruct{} делают одно и то же, потому что Go будет распределять значения в куче, если вы получите их адрес с помощью &. Иногда код просто выражает свое намерение лучше в том или ином стиле.

Go не имеет встроенной поддержки для конструкторов, поэтому обычно вам нужно заключить вызов new в функцию, например NewMyStruct(), которая выполняет всю необходимую инициализацию. Это также позволяет инициализировать приватные поля или скрывать структуру за интерфейсом, чтобы пользователи объекта не могли напрямую связываться с его внутренними компонентами. Кроме того, развить структуру структуры проще, когда вам не нужно менять всех пользователей при добавлении / удалении / переименовании / переупорядочении полей.

0 голосов
/ 09 сентября 2012

make работает только для карт, фрагментов и каналов, а составные литералы, такие как type{}, работают только для структур, массивов, фрагментов и карт.Для других типов вам придется использовать new, чтобы получить указатель на недавно выделенный экземпляр (если вы не хотите использовать более длинный var v T; f(&v)).Вы хотите инициализировать структуру:

typedef foo struct {
    bar *int
}
v := foo{bar: new(int)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...