结构体概念
是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。学过 C 或 C++ 的人都知道结构体,但在 Go 中,没有像 C++ 中的 class 类的概念,只有 struct 结构体的概念,所以也没有继承。
结构体的声明
type 结构体名 struct {
属性名1 属性类型1
属性名2 属性类型2
...
}
例:
type Lesson struct {
name, target string
spend int
}
注:可以把相同类型的属性声明在同一行,这样可以使结构体变得更加紧凑
上面的结构体 Lesson 称为 命名的结构体(Named Structure)。我们创建了名为 Lesson 的新类型,而它可以用于创建 Lesson 类型的结构体变量。
声明结构体时也可以不用声明一个新类型,这样的结构体类型称为匿名结构体(Anonymous Structure) 。
var Lesson3 struct {
name, target string
spend int
}
初始化结构体
有俩种方式去初始化结构体
// 使用字段名创建结构体
lesson1 := Lesson{
name: "我是HH啊!!!",
target: "拿高薪",
spend: 5,
}
// 不使用字段名创建结构体
lesson2 := Lesson{"我是YY啊!!!", "增强自己", 5}
访问结构体的字段
点操作符 . 用于访问结构体的字段。有点类似java的点方法
fmt.Println(lession3.name)
输出的就是我是HH啊!!!,也就是上面的name属性
匿名字段
在创建结构体时,字段可以只有类型没有字段名,这种字段称为 匿名字段(Anonymous Field) 。
type Lesson4 struct {
string
int
}
func main() {
lesson := Lesson4{"我叫HH", 50}
fmt.Println("lesson ", lesson9)
fmt.Println("lesson string: ", lesson9.string)
fmt.Println("lesson int: ", lesson9.int)
}
上面的程序结构体定义了两个匿名字段,虽然这两个字段没有字段名,但匿名字段的名称默认就是它的类型。所以上面的结构体 Lesoon4 有两个名为 string 和 int 的字段。
嵌套结构体
结构体的字段也可能是另外一个结构体,这样的结构体称为 嵌套结构体(Nested Structs)
type Lesson struct {
name, target string
spend int
}
type Author struct {
name string
wx string
}
func main() {
lesson6 := Lesson5{
name: "我是HH啊!!!",
spend: 50,
}
lesson6.author = Author{
name: "小豪",
wx: "66666",
}
fmt.Println(lesson6)
}
哈哈,这里让我想起我写java接口的时候各种大套小的。
给结构体定义方法
type Lesson struct {
name, target string
spend int
}
// ShowLessonInfo 定义一个与 Person 的绑定的方法
func (l Lesson) ShowLessonInfo() {
fmt.Println("name:", l.name)
fmt.Println("target:", l.target)
}
func main() {
lesson13 := Lesson{
name: "我是HH啊!!!",
target: "提升自己啊!",
}
lesson13.ShowPersonInfo()
}
上面的程序中定义了一个与结构体 Lesson 绑定的方法 ShowLessonInfo() ,其中 ShowLessonInfo 是方法名, (l Lesson) 表示将此方法与 Lesson 的实例绑定,这在 Go 语言中称为接收者,而 l 表示实例本身,相当于 Python 中的 self ,在方法内可以使用 实例本身.属性名称 来访问实例属性。