Struct

结构体是一种聚合的数据类型,由零个或多个任意类型的值聚合成的实体。

type Student struct {
    Name   string
    Age    int
    Scores int
}

结构体变量的成员可以通过点操作符访问,点操作符也可以和指向结构体的指针一起工作。

var stu1 Studnt
s.Name = "tom"

var stu2 *Student = &stu1
stu2.Age = 18

通常一行对应一个结构体成员,成员名字在前,类型在后。不过如果相邻成员类型相同,就可以合并到一行。

type Student struct {
    Name        string
    Age, Scores int
}

如果成员顺序不同,那么就是不同类型的结构体。

一个命名为S的结构体类型,将不能再包含S类型的成员,因为一个聚合的值不能包含它自身。

S类型的结构体可以包含*S指针类型的成员。

零值

结构体类型的零值,是每个成员都是零值。

创建

直接创建:

type Person struct {
    Name string
    Age int
}

var p Person

创建并且返回地址:

pp := &Person{"jerry", 20}
// 等价于
// pp := new(Perosn)
// *pp = Person{"jerry", 20}

字面值顺序创建,一般只在定义结构体的包内部使用,或者是在较小的结构体中使用。

type Person struct {
    Name string
    Age int
}

stu := PerSon{"tom", 20}

使用成员名和值来初始化:

type Person struct {
    Name string
    Age int
}

stu := Person{
    Name: "jerry",
    Age: 20,
}

比较

如果结构体成员都可以比较,那么结构体也可以比较。

嵌入

结构体中可以包含另一个结构体类型的成员。

type Point struct {
    X, Y int
}

type Circle struct {
    Center Point
    Radius int
}

type Wheel struct {
    Circle Circle
    Spokes int
}

可以通过点操作符访问结构体成员嵌套的成员。

var w Wheel
w.Circle.Center.X = 8

匿名成员

可以在结构体中只声明一个成员的类型,而不指定成员的名字。

匿名成员的数据类型,必须是命名类型,或指向一个命名类型的指针。

type Circle struct {
    Point
    Radius int
}

type Wheel struct {
    Circle
    Spokes int
}

可以直接访问呢叶子属性,不需要给出完整的路径:

var w Wheel
w.X = 8

结构体字面值并没有简短表示匿名成员的语法。

匿名成员的名字由类型隐式地决定,所以不能同时包含两个类型相同的匿名成员。

如果匿名成员不导出,可以用简短形式访问匿名成员嵌套的成员,但是不能用简短形式访问匿名成员本身。

Last updated

Was this helpful?