age := new(42)
Для начала, для чего вообще это нужно?
Это нужно,чтобы передать конкретное значение в поле, которое принимает ссылочный тип. Например, необязательное поле в json-структуре в Go обычно делают как ссылку на значение, которая может быть nil.
type User struct {
name string
age *int
}
А надо передать в него 42. И вот сделали для этого new(42).
user := User{
name: "vasya",
age: new(42),
}
Но зачем, блин, для этого использовать new?
Оператор new и в предыдущих версиях максимально странный. Всё что он может - это делать ссылку на zero value типа, который в него передали. Если написать
go
a := new(int)
это всё равно, что
var x int = 0
a = &x
Для структур тоже самое. Но довольно редко кому то нужна ссылка на 0. А на пустую структуру все обычно делают ссылку явно &User{} (для единообразия), а не new(User). Есть некоторые очень редкие кейсы с дженериками, где нужен именно new, но это прям надо постараться.
И вот они взяли и разрешили делать new(42), чтобы получить ссылку на 42.
Как по мне они к почти бесполезной хрени, которая и так вызывает вопросы у новичков, добавили костыль. Костыль - потому что теперь в аргумент внезапно передается не тип, а некое значение.
Лучше бы просто в стандартной библиотеке сделали какую-нибудь функцию ptr(). Она пишется за минуту, и есть в каждом, наверно, проекте:
func Ptr[T any](v T) *T {
return &v
}
А еще лучше бы не занимались такими мелочами, а улучшили бы синтаксис обработки ошибок 🙂
🫥 Cross Join - канал о разработке
⠀