结构体的定义
为了提高数据类型的灵活性,我们可以把基础数据类型聚合到一起形成一个新的数据类型,这个新的数据类型就是结构体,其中每个基础数据都是结构体的成员。
结构体的声明
定义结构体的关键字是 type
和 struct
。
type Data struct {
id int
name string
}
结构体的初始化
结构体一旦声明完成就可以使用结构体类型了,初始化有两种方式。
第一种,直接对类型进行初始化:
data := Data{1, "Golang"}
第二种,和基本类型使用方式一样,使用 var
关键字声明,使用 .
操作符赋值:
var data Data
data.id = 1
data.name = "Golang"
结构体的访问
访问结构体成员需要使用 .
操作符:
var d1 Data
var d2 Data
d1.id = 1
d1.name = "Golang"
d2.id = 2
d2.name = "极客点儿"
fmt.Println(d1)
fmt.Println(d2)
结构体的组合
Go
语言是没有设计面向对象的,不过我们可以通过各种方式模拟面向对象,结构体就有面向对象的特性:继承。
继承类型结构体中的组合,所谓组合就是把一个结构体嵌入到另一个结构体,从而达到继承的目的。
现在有两个结构体:
type Data struct {
id int
name string
}
type Demo struct {
age int
user string
}
Data
要继承 Demo
的成员,只需要在 Data
中定义一个匿名字段 Demo
, Data
就用于 Demo
中所有的成员了:
type Demo struct {
age int
user string
}
type Data struct {
id int
name string
Demo
}
完整代码示例:
package main
import "fmt"
type Demo struct {
age int
user string
}
type Data struct {
id int
name string
Demo
}
func main () {
var demo Demo
demo.age = 18
demo.user = "极客点儿"
var data Data
data.id = 1
data.name = "Golang"
data.Demo = demo
fmt.Printf("%T\n", demo)
fmt.Println(demo)
fmt.Printf("%T\n", data)
fmt.Println(data)
fmt.Println(data.id, data.name, data.Demo, data.Demo.age, data.Demo.user)
fmt.Println(data.id, data.name, data.Demo, data.age, data.user)
}
运行结果:
$ go run main.go
main.Demo
{18 极客点儿}
main.Data
{1 Golang {18 极客点儿}}
1 Golang {18 极客点儿} 18 极客点儿
1 Golang {18 极客点儿} 18 极客点儿
从结果可以看到 Demo
中的字段已经合并到 Data
中了,可以通过 data.*
的方式直接访问,当然也可以通过 data.Demo.*
这样一级一级指下去的方式访问。