Skip to content

结构体

Go 的结构体(struct) 是带类型的字段(fields)集合。 这在组织数据时非常有用。

代码示例

package main

import "fmt"

// 这里的 person 结构体包含了 name 和 age 两个字段。
type person struct {
    name string
    age  int
}

// newPerson 使用给定的名字构造一个新的 person 结构体.
func newPerson(name string) *person {
    // 可以安全地返回指向局部变量的指针, 因为局部变量将在函数的作用域中继续存在。
    p := person{name: name}
    p.age = 33
    return &p
}

func main() {
    // 使用这个语法创建新的结构体元素。
    fmt.Println(person{"Bob", 20})
    // 可以在初始化一个结构体元素时指定字段名字。
    fmt.Println(person{name: "Alice", age: 30})
    // 省略的字段将被初始化为零值。
    fmt.Println(person{name: "Fred"})
    // & 前缀生成一个结构体指针。
    fmt.Println(&person{name: "Ann", age: 40})
    // 在构造函数中封装创建新的结构实例是一种习惯用法
    fmt.Println(newPerson("Jon"))
    // 使用.来访问结构体字段。
    s := person{name: "Sean", age: 50}
    fmt.Println(s.name)
    // 可以对结构体指针使用. - 指针会被自动解引用。
    sp := &s
    fmt.Println(sp.age)
    // 结构体是可变(mutable)的。
    sp.age = 51
    fmt.Println(sp.age)
}

执行结果

# zeroval 在 main 函数中不能改变 i 的值, 但是 zeroptr 可以,因为它有这个变量的内存地址的引用。
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 33}
Sean
50
51