go语言结构体struct,三种定义方法
go语言的结构体struct,可以用来声明一个新的类型,用来封装其他类型的属性或字段。就像python语言中的类class一样,而且也有类似的继承关系。
结构体struct语法基本结构
type TypeName struct{
attribute DataType
}
基本结构解析
- 如上代码,结构体必须以关键词type开头作为声明;
- TypeName是我们所要定义的类型名称;
- struct关键字紧随TypeName之后;
- 花括号"{}"里面用来定义类型的属性或字段,可以写无限多个。
结构体struct的简单实例
type programmer struct {
name string
age int
ability string
hair string
companion string
}
代码解析
如上代码,我们设计了一个程序员类型的结构体,里面有name、age、ability、hair和companion等字段,及各自的数据类型。
结构体的声明
我们声明一个自定义的数据类型(结构体)变量与go语言当中的其他的数据类型的变量的方式是一样的,只是值的初始化可能有些不同,如下实例代码(我们接着上面的结构体programmer):
func main() {
var p programmer //我们声明了一个programmer类型的变量p,并且没有初始化
fmt.Printf("p的数据类型为%T,值为%v \n", p, p)
//为变量p赋值
p.name = "小明" //我们用“.”符号来访问结构体的属性或字段
p.age = 30
p.ability = "软件开发"
p.hair = "不多"
p.companion = "单身"
fmt.Printf("p的数据类型为%T,值为%v \n", p, p)
//也可以用键值对的方式进行赋值
p1 := programmer{name: "小花", age: 28, ability: "软件开发", hair: "茂盛", companion: "单身"}
fmt.Printf("p1的数据类型为%T,值为%v \n", p1, p1)
//还可以按结构体中属性或字段的顺序来赋值
p2 := programmer{"小强", 31, "架构师", "秃顶", "单身"}
fmt.Printf("p2的数据类型为%T,值为%v \n", p2, p2)
}
代码输出:
p的数据类型为main.programmer,值为{ 0 }
p的数据类型为main.programmer,值为{小明 30 软件开发 不多 单身}
p1的数据类型为main.programmer,值为{小花 28 软件开发 茂盛 单身}
p2的数据类型为main.programmer,值为{小强 31 架构师 秃顶 单身}
结构体struct的匿名字段
结构体struct中的字段没有字段名,只有类型,或其他的结构体的名称,那么这个字段就成为匿名字段,而且如果匿名字段是结构体的话,那么就相当于继承了该字段的所有字段,我们可以通过如下的实例来进一步了解:
package main
import "fmt"
type interest []string
type worker struct {
job string
}
type programmer struct {
name string
age int
ability string
hair string
companion string
interest
worker
}
func main() {
var p programmer //我们声明了一个programmer类型的变量p,并且没有初始化
//为变量p赋值
p.name = "小明"
p.age = 30
p.ability = "软件开发"
p.hair = "不多"
p.companion = "单身"
p.interest = []string{"穿格子衫", "宅在宿舍或家里"} //注意p.interest的赋值方式,以及下面p.worker的赋值方式
p.worker = worker{job: "打工人"}
fmt.Printf("p的数据类型为%T,值为%v \n", p, p)
fmt.Printf("我们可以直接用p.job来访问,比如p.job的值为%v \n", p.job)
}
代码输出:
p的数据类型为main.programmer,值为{小明 30 软件开发 不多 单身 [穿格子衫 宅在宿舍或家里] {打工人}}
我们可以直接用p.job来访问,比如p.job的值为打工人
结构体的方法,我们将在下一章节中进行介绍。