非零基础自学Golang
文章目录
- 非零基础自学Golang
- 第9章 结构体
- 9.6 结构体内嵌
- 9.6.1 初始化结构体内嵌
- 9.6.2 内嵌匿名结构体
第9章 结构体
9.6 结构体内嵌
Go语言的结构体内嵌是一种组合特性,使用结构体内嵌可构建一种面向对象编程思想中的继承关系。
结构体实例化后,可直接访问内嵌结构体的所有成员变量和方法。
结构体内嵌格式如下:
type 结构体名1 struct {
成员变量1 类型1
成员变量2 类型2
}
type 结构体名2 struct {
结构体名1
成员变量3 类型3
}
对于图书馆中的书,我们可大致分为两类:可外借的书和不可外借的书。
我们现在将图书馆中的书抽象为结构体Book,将可借阅的书抽象为结构体BookBorrow,将不可借阅的书抽象为结构体BookNotBorrow。
可借阅和不可借阅的书作为图书馆中的书,都继承了书的基本属性和方法,具体代码如下:
[ 动手写 9.6.1]
package main
import "fmt"
type Book struct {
title string
author string
num int
id int
}
type BookBorrow struct {
Book
borrowTime string
}
type BookNotBorrow struct {
Book
readTime string
}
func main() {
bookBorrow := &BookNotBorrow{}
bookNotBorrow := &BookNotBorrow{}
fmt.Println(bookBorrow)
fmt.Println(bookNotBorrow)
}
运行结果
9.6.1 初始化结构体内嵌
结构体内嵌的初始化和结构体初始化类似,可以使用键值对或“.”的方式来进行初始化。
例如,已借阅书籍和未借阅书籍的初始化:
[ 动手写 9.6.2]
package main
import "fmt"
type Book struct {
title string
author string
num int
id int
}
type BookBorrow struct {
Book
borrowTime string
}
type BookNotBorrow struct {
Book
readTime string
}
func main() {
bookBorrow := &BookBorrow{
Book: Book{
"Go语言",
"Tom",
20,
152368,
},
borrowTime: "30",
}
fmt.Println(bookBorrow)
bookNotBorrow := &BookNotBorrow{}
bookNotBorrow.title = "Python语言"
bookNotBorrow.author = "Peter"
bookNotBorrow.num = 10
bookNotBorrow.id = 152369
bookNotBorrow.readTime = "50"
fmt.Println(bookNotBorrow)
}
运行结果
9.6.2 内嵌匿名结构体
在部分场景下,我们会使用匿名结构体来代替普通的结构体,以使代码的编写更加便利。
在定义匿名结构体时,无须type关键字,但是在初始化被嵌入的匿名结构体时,需要再次声明结构体才能赋予数据。
[ 动手写 9.6.3]
package main
import "fmt"
type BookBorrow struct {
Book struct { //内嵌匿名结构体
title string
author string
num int
id int
}
borrowTime string
}
func main() {
bookBorrow := &BookBorrow{
Book: struct { // 声明类型
title string
author string
num int
id int
}{"Go语言", "Tom", 20, 152368},
borrowTime: "30",
}
fmt.Println(bookBorrow)
}
运行结果