结构体
Go 语言的结构体可以包含多种数据类型,Go语言的数组只能包含一种数据类型,可以使用type和struct定义一个结构体:
type test struct { //声明一个结构体,名字为test
value int //声明其中一个字段,名字为value ,数据类型为int
name string //声明其中一个字段,名字为name, 数据类型为string
}
结构体内的字段是唯一的,不能重复,也可以把类型相同的字段放在一行:
type letsgo struct{
data1,data2,data3 int
}
也可以定义一个空的结构体,没有内容:
type test strut{
}
结构体初始化
定义了一个结构体不使用也不会报错,因为结构体只是规定了一组数据的内存布局,只有实例化才会分配内存。
type test strut{
myvalue int
mydata string
}
var mytest test //实例化一个结构体,mytest为结构体实例,test为结构体类型,这个东西将会非常常见
一种基础的实例化方式:
type letsgo struct{
data1,data2,data3 int
}
var p letsgo
p.data1 = 1
p.data2 = 2
p.data3 = 3
fmt.Println(p) //{1,2,3},如果没有给data2,data3赋值,那么输出的值就是{1,0,0}
可以在实例化的时候给其中字段赋值,必须按照顺序来:
type letsgo struct{
data1,data2,data3 int
}
var p =letsgo{1,30,3}
fmt.Println(p) //{1,30,3}
如果不按照顺序呢:
type letsgo struct{
data1,data2,data3 int
}
var p =letsgo{data3:3,data2:30,data1:1}
fmt.Println(p) //{1,30,3},还是按照结构体的顺序输出
嵌套结构体
结构体还可以套娃,结构体里面还可以弄一个结构体:
type father struct{
name string
other son
}
type son struct{
name string
}
嵌套结构体也可以用上面的方法一样初始化:
package main
import "fmt"
func main() {
type son struct{
name string
}
type father struct{
name string
other son //son 的定义一定要在上面,不然会报错。
}
p:=father{
name:"张三",
other:son{
name :"张三的儿子",
},
}
fmt.Println(p) //{张三 {张三的儿子}}
fmt.Println(p.other.name) //访问结构体使用. 输出:张三的儿子
}
访问结构体用.,上面的例子已经说明白了。第二层也是用.,
把结构体作为函数参数
填补一下说函数的时候挖的坑,直接来一个例子:
package main
import "fmt"
type father struct{
name string
}
func printName ( fa father ){
fmt.Println(fa.name)
}
func main() {
p:=father{
name:"张三",
}
printName(p) //输出张三
}
再试下用结构体指针作为函数参数:
package main
import "fmt"
type father struct{
name string
}
func printName ( fa *father ){
fmt.Println(fa.name) //读取传递过来的fa的地址保存的结构体,输出结构体其中的字段
}
func main() {
p:=father{
name:"张三",
}
printName(&p) //传递结构p的地址,输出张三
}
这里讲了很多代码例子,因为发现结构体特性用代码说出来比较直接,下一篇说一下与结构体关联很密切的接口