1.类型
结构体,用于描述一个整体结构的数据类型,在 Go 中,主要充当 OOP 的功能。
类型标识符:
struct {
m1 m1T
m2 m2T
}
其中 struct 是结构体的关键字,m,就是 member 成员,也被称作 p,property 属性。
一个结构体,由多个成员 member 构成,每个 member 都是用户自定义的,因此该结构体,也是用户自定义的数据类型。 该自定义,指的是结构上的自定义。(与数组切片,仅仅定义元素类型和长度是不同的)。
一个结构体,体现的一个整体的数据的各个部分。例如:
struct {
name string
age int
}
表示一个用户,具备了 name 和 age 两个属性。同时也意味着,只要是一个用户,就一 定要具备该两个属性。
在定义结构体时,往往会给结构体类型,起一个名字,称之为类型定义(别名),便于 之后方便的使用该结构体。类型的标识符(类型名)。
典型的结构体定义类型如下:
type Person struct {
ID string
Name string
age int
}
若没有起名字的结构体,称之为匿名结构体。 注意,以上语法,仅仅是定义了类型,而不是数据。仅仅是个结构。
2.字面量
语法: 类型标识符 {
成员的初始化
}
成员的初始化语法,有如下几个方案:
- StructType {},使用成员的零值进行初始化
- StructType {mValue1, mValue2 .. mValueN},依据成员声明顺序,将全部成员进行初始化。
- StructType {mN:mValueN},对特定成员变量进行初始化,其他成员变量使用类型 零值。
代码示例:
type Person struct {
ID string
Name string
age int
}
//fmt.Println(Person)
fmt.Println(Person{})
fmt.Println(Person{"42007", "Hank", 42})
//fmt.Println(Person{"Hank", "42007",}) // too few values in Person literal
fmt.Println(Person{ID: "42008"})
3.结构体类型,类型名和类型数据概念区分
结构体类型,是对类型的描述 。
类型名,对该类型起的一个名字,便于访问。
类型数据,基于该类型,创建的数据。
类型 和 数据间的关系,相当于图纸和建筑物的关系。
4.成员访问 .
点运算符,用于完成对结构体数据成员的访问。
语法: 结构体.成员变量 (范围限定符)
代码示例:
type Person struct {
ID string
Name string
age int
}
p1 := Person{"42007", "Hank", 42}
fmt.Println(p1.Name) // Hank
5.匿名结构体
没有为结构体类型起名字,直接去使用。
匿名结构体的使用,通常需要立即使用其成员声明语法,得到数据。
代码:
//匿名结构体
p := struct {
ID string
Name string
}{
"007",
"Hank",
}
fmt.Println(p, p.Name) // {007 Hank} Hank
整体上的语法,就是匿名结构体的字面量语法。
若需要相同的结构,则还需使用匿名结构体语法,可见匿名结构体仅仅适用于临时使用一次的结构。
若结构体使用了多次,不建议使用匿名结构体,应该使用具名结构体(起名字的机构体)。
6.结构体是值类型
复制时,值会被拷贝!
代码:
p := struct {
ID string
Name string
}{
"007",
"Hank",
}
p2 := p
p2.Name = "Firelinks"
fmt.Println(p, p2)
// {007 Hank} {007 Firelinks}