Функция new для структур
Функция new выделяет память под структуру и возвращает указатель на нее.
В качестве параметра функция принимает тип структуры.
Все поля структуры при этом инициализируются нулевыми значениями
(для чисел это 0, для строк - пустая строка, для булевых - false).
Синтаксис
new(StructType)
Пример
Давайте создадим структуру Person и с помощью функции new
получим указатель на нее:
package main
import "fmt"
type Person struct {
Name string
Age int
}
func main() {
p := new(Person)
fmt.Printf("Type: %T, Value: %v\n", p, p)
fmt.Printf("Name: %q, Age: %d\n", p.Name, p.Age)
}
Результат выполнения кода:
"Type: *main.Person, Value: &{ 0}"
"Name: "", Age: 0"
Пример
Создадим структуру User, заполним поля через указатель
и выведем ее содержимое:
package main
import "fmt"
type User struct {
ID int
Active bool
Login string
}
func main() {
u := new(User)
u.ID = 1
u.Active = true
u.Login = "john_doe"
fmt.Printf("User: %+v\n", u)
fmt.Printf("ID: %d, Active: %t, Login: %s\n", u.ID, u.Active, u.Login)
}
Результат выполнения кода:
"User: &{ID:1 Active:true Login:john_doe}"
"ID: 1, Active: true, Login: john_doe"
Пример
Сравним работу функции new с литералом структуры.
В первом случае мы получаем указатель, во втором - значение:
package main
import "fmt"
type Point struct {
X int
Y int
}
func main() {
p1 := new(Point)
p2 := Point{X: 5, Y: 10}
fmt.Printf("p1: %T, value: %v\n", p1, p1)
fmt.Printf("p2: %T, value: %v\n", p2, p2)
}
Результат выполнения кода:
"p1: *main.Point, value: &{0 0}"
"p2: main.Point, value: {5 10}"
Смотрите также
-
функцию
new для литерала структуры,
которая позволяет создавать структуры без использования функции new -
раздел
указатели на структуры,
в котором рассказывается о работе с указателями на структуры -
раздел
доступ к полям структуры,
в котором описывается чтение и запись полей структуры -
раздел
методы структур,
в котором описывается добавление методов к структурам