存储同一类型的数据可以试用数组array。
存储不同类型的数据可以试用结构体struct。
结构体的定义
type struct_name struct {
字段名称1 字段类型1
字段名称2 字段类型2
}
func main() {
//格式1
var p1 Person_struct
p1.name = "liqi"
p1.age = 18
//格式2
p2 := Person_struct{}
p2.name = "liqi"
p2.age = 19
//格式3
p3 := Person_struct{name: "liqi", age: 20}
//格式4
p4 := Person_struct{
name: "liqi",
age: 21,
}
//格式5
p5 := Person_struct{"liqi", 22}
fmt.Printf("p1:%v \np2:%v \np3:%v \np4:%v \np5:%v", p1, p2, p3, p4, p5)
}
结构体指针
结构体是值类型数据,所以拷贝的时候是深拷贝。
如果要实现浅拷贝,可以通过结构体指针来实现。
type Person_struct struct {
name string
age int
}
func main() {
//格式1
fmt.Println("---格式1---")
var p1 Person_struct
p1.name = "liqi"
p1.age = 18
var pp1 *Person_struct
pp1 = &p1
fmt.Printf("p1的值:%v ,p1的类型:%T\n", p1, p1)
fmt.Printf("p1的地址:%p\n", &p1)
fmt.Printf("pp1存储的内存地址:%p\n", pp1)
fmt.Printf("pp1存储的类型:%T\n", pp1)
fmt.Printf("pp1存储的真实的值:%v\n", *pp1)
//格式2
fmt.Println("---格式2---")
pp2 := &Person_struct{name: "liqi", age: 19}
fmt.Printf("pp2存储的内存地址:%p\n", pp2)
fmt.Printf("pp2存储的类型:%T\n", pp2)
fmt.Printf("pp2存储的真实的值:%v\n", *pp2)
}
使用内置函数new()创建指针
new()函数是go语言中专门用于创建某周类型指针的函数。
type Person_struct struct {
name string
age int
}
func main() {
var p1 Person_struct
p1.name = "liqi"
p1.age = 18
pp1 := new(Person_struct)
pp1 = &p1
fmt.Printf("p1的值:%v ,p1的类型:%T\n", p1, p1)
fmt.Printf("p1的地址:%p\n", &p1)
fmt.Printf("pp1存储的内存地址:%p\n", pp1)
fmt.Printf("pp1存储的类型:%T\n", pp1)
fmt.Printf("pp1存储的真实的值:%v\n", *pp1)
}
结构体的匿名字段
匿名结构体
由于结构体一般是用于存储一组类型的数据,但是提名结构体只能使用一次,所以不常用。
struct_name := struct {
定义字段
} {
字段赋值
}
func main() {
p1 := struct {
name string
age int
}{
name: "John",
age: 30,
}
fmt.Println(p1)
}
匿名字段
匿名字段默认以数据类型作为字段名,所以类型不可以重复。
type struct_name struct {
type1
type2
}
type Pserson_struct struct {
string
int
}
func main() {
p1 := Pserson_struct{"zhangsan", 20}
fmt.Println(p1)
}
结构体嵌套
由于结构体是值类型,所以结构体嵌套一般情况下内部的结构体会使用结构体指针。否则内部的结构体会被复制一份。
type Student struct {
name string
age int
book *Book
}
type Book struct {
bookName string
price float64
}
func main() {
book1 := Book{"Go语言从入门到放弃", 100.0}
student1 := Student{"张三", 18, &book1}
fmt.Println(student1)
fmt.Println(student1.book)
}
提升字段
如果一个嵌套结构体中,匿名字段是一个结构体,那么这个匿名字段的结构体中的字段就是提升字段。
可以直接通过struct_name.字段名直接访问,中间不需要字段的结构体名称。
type Student struct {
name string
age int
*Book
}
type Book struct {
bookName string
price float64
}
func main() {
book1 := Book{"Go语言从入门到放弃", 100.0}
student1 := Student{"张三", 18, &book1}
fmt.Println(student1)
fmt.Println(student1.bookName, student1.price)
}