Функция new для структур

Функция new выделяет память под структуру и возвращает указатель на нее. В качестве параметра функция принимает тип структуры. Все поля структуры при этом инициализируются нулевыми значениями (для чисел это 0, для строк - пустая строка, для булевых - false).

Синтаксис

gonew(StructType)

Пример

Давайте создадим структуру Person и с помощью функции new получим указатель на нее:

gopackage 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)
}

Результат выполнения кода:

go"Type: *main.Person, Value: &{ 0}"
"Name: "", Age: 0"

Пример

Создадим структуру User, заполним поля через указатель и выведем ее содержимое:

gopackage 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)
}

Результат выполнения кода:

go"User: &{ID:1 Active:true Login:john_doe}"
"ID: 1, Active: true, Login: john_doe"

Пример

Сравним работу функции new с литералом структуры. В первом случае мы получаем указатель, во втором - значение:

gopackage 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)
}

Результат выполнения кода:

go"p1: *main.Point, value: &{0 0}"
"p2: main.Point, value: {5 10}"

Смотрите также