go 笔记 第九章 结构体 struct 声明和使用
发布人:shili8
发布时间:2024-11-17 09:29
阅读次数:0
**Go 笔记 - 第九章: 结构体 (struct) 声明和使用**
在 Go语言中,结构体(struct)是用户自定义的数据类型,它可以包含多个字段,每个字段都有一个特定的名称和类型。结构体是一种非常强大的数据类型,可以用来表示复杂的数据结构。
**9.1 结构体声明**
要声明一个结构体,我们使用 `type` 关键字,后面跟着结构体的名称和它的字段列表。每个字段都有一个名称和一个类型。
gotype Person struct { name string age int email string}
在上面的例子中,我们定义了一个名为 `Person` 的结构体,它包含三个字段:`name`、`age` 和 `email`。每个字段都有一个特定的名称和类型。
**9.2 结构体的访问**
要访问结构体中的字段,我们使用点运算符(.`)。
gopackage mainimport "fmt" type Person struct { name string age int email string} func main() { p := Person{ name: "John", age:30, email: "john@example.com", } fmt.Println(p.name) // John fmt.Println(p.age) //30 fmt.Println(p.email) // john@example.com}
在上面的例子中,我们定义了一个 `Person` 结构体,并创建了一个 `p` 变量,类型为 `Person`。然后我们使用点运算符访问 `p` 的各个字段。
**9.3 结构体的初始化**
结构体可以通过多种方式进行初始化。
gopackage mainimport "fmt" type Person struct { name string age int email string} func main() { p1 := Person{ name: "John", age:30, email: "john@example.com", } p2 := Person{ name: "Alice", } p2.age =25 p2.email = "alice@example.com" fmt.Println(p1.name) // John fmt.Println(p1.age) //30 fmt.Println(p1.email) // john@example.com fmt.Println(p2.name) // Alice fmt.Println(p2.age) //25 fmt.Println(p2.email) // alice@example.com}
在上面的例子中,我们定义了两个 `Person` 结构体,分别是 `p1` 和 `p2`。我们使用结构体的字段列表进行初始化。
**9.4 结构体的嵌套**
结构体可以嵌套在其他结构体中。
gopackage mainimport "fmt" type Address struct { street string city string} type Person struct { name string age int email string addr Address} func main() { p := Person{ name: "John", age:30, email: "john@example.com", addr: Address{ street: "123 Main St", city: "New York", }, } fmt.Println(p.name) // John fmt.Println(p.age) //30 fmt.Println(p.email) // john@example.com fmt.Println(p.addr.street) //123 Main St fmt.Println(p.addr.city) // New York}
在上面的例子中,我们定义了一个 `Address` 结构体,并嵌套在 `Person` 结构体中。
**9.5 结构体的方法**
结构体可以定义方法。
gopackage mainimport "fmt" type Person struct { name string age int} func (p *Person) sayHello() { fmt.Println("Hello, my name is", p.name) } func main() { p := &Person{ name: "John", age:30, } p.sayHello() }
在上面的例子中,我们定义了一个 `sayHello` 方法,并将其绑定到 `Person` 结构体的指针类型。
**9.6 结构体的比较**
结构体可以使用 `==` 和 `!=` 运算符进行比较。
gopackage mainimport "fmt" type Person struct { name string age int} func main() { p1 := &Person{ name: "John", age:30, } p2 := &Person{ name: "John", age:30, } p3 := &Person{ name: "Alice", age:25, } fmt.Println(p1 == p2) // true fmt.Println(p1 != p3) // true}
在上面的例子中,我们定义了三个 `Person` 结构体,并使用 `==` 和 `!=` 运算符进行比较。
**9.7 结构体的零值**
结构体的零值是所有字段都为零值的状态。
gopackage mainimport "fmt" type Person struct { name string age int} func main() { var p Person fmt.Println(p.name) // "" fmt.Println(p.age) //0}
在上面的例子中,我们定义了一个 `Person` 结构体,并创建了一个零值的实例。
**9.8 结构体的匿名字段**
结构体可以包含匿名字段。
gopackage mainimport "fmt" type Person struct { name string age int Address} func main() { p := &Person{ name: "John", age:30, Address: Address{ street: "123 Main St", city: "New York", }, } fmt.Println(p.name) // John fmt.Println(p.age) //30 fmt.Println(p.street) //123 Main St fmt.Println(p.city) // New York}
在上面的例子中,我们定义了一个 `Person` 结构体,并包含匿名的 `Address` 字段。
**9.9 结构体的嵌套**
结构体可以嵌套在其他结构体中。
gopackage mainimport "fmt" type Address struct { street string city string} type Person struct { name string age int addr *Address} func main() { p := &Person{ name: "John", age:30, addr: &Address{ street: "123 Main St", city: "New York", }, } fmt.Println(p.name) // John fmt.Println(p.age) //30 fmt.Println(p.addr.street) //123 Main St fmt.Println(p.addr.city) // New York}
在上面的例子中,我们定义了一个 `Address` 结构体,并嵌套在 `Person` 结构体中。
**9.10 结构体的方法**
结构体可以定义方法。
gopackage mainimport "fmt" type Person struct { name string age int} func (p *Person) sayHello() { fmt.Println("Hello, my name is", p.name) } func main() { p := &Person{ name: "John", age:30, } p.sayHello() }
在上面的例子中,我们定义了一个 `sayHello` 方法,并将其绑定到 `Person` 结构体的指针类型。
**9.11 结构体的比较**
结构体可以使用 `==` 和 `!=` 运算符进行比较。
gopackage mainimport "fmt" type Person struct { name string age int} func main() { p1 := &Person{ name: "John", age:30, } p2 := &Person{ name: "John", age:30, } p3 := &Person{ name: "Alice", age:25, } fmt.Println(p1 == p2) // true fmt.Println(p1 != p3) // true}
在上面的例子中,我们定义了三个 `Person` 结构体,并使用 `==` 和 `!=` 运算符进行比较。
**9.12 结构体的零值**
结构体的零值是所有字段都为零值的状态。
gopackage mainimport "fmt" type Person struct { name string age int} func main() { var p Person fmt.Println(p.name) // "" fmt.Println(p.age) //0}
在上面的例子中,我们定义了一个 `