GO语言结构体
1.结构体的概述
有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性。显然单独定义以上变量比较繁琐,数据不便于管理。一般用于全局变量
结构体是一种聚合的数据类型
,它是由一系列具有相同类型或不同类型的数据构成的数据集合。每个数据称为结构体的成员。
2.结构体的初始化
//普通变量初始化
type Person struct {
name string
sex string
age int
}
func main(){
var man1 Person = Person{"Jerry","M",19}
fmt.Println(man1)
// 2.部分初始化
man2 := Person{name:"MM",age:20}
fmt.Println(man2)
// Index member variable "."
fmt.Printf("man2.name = %q\n", man2.name) //man2.name = "MM"
//单独初始化
var man3 Person
man3.name = "mike"
man3.sex = "M"
man3.age = 99
fmt.Println("man3:", man3)
man3.age = 1973 //可以修改
fmt.Println("man3:", man3)
}
指针变量初始化
type Student struct {
id int
name string
sex string
age int
addr string
}
func main() {
var s1 *Student = &Student{
id: 3,
name: "Q",
sex: "M",
age: 29,
addr: "hahaha",
}
s2 := &Student{
id: 34,
name: "W",
sex: "M",
age: 30,
addr: "lalala",
}
fmt.Println(s1,s2)
}
3.结构体的比较
相同结构体类型(成员变量的类型、个数、顺序一致)变量之间可以直接赋值。结构体也是可以比较的,两个结构体将可以使用 == 或 != 运算符进行比较,但不支持 > 或 < 。
var p1 Creature = Creature{
name: "A",
age: 10,
sex: "M",
}
var p2 Creature = Creature{
name: "A",
age: 10,
sex: "M",
}
var p3 Creature = Creature{
name: "A",
age: 30,
sex: "M",
}
fmt.Println(p1 == p2) //false
fmt.Println(p1 == p3) //false
4 结构体的地址:
结构体变量的地址 == 结构体收个元素的地址
unSafe.Sizeof(变量名) ——> 此种类型的变量所占用的内存空间大小
将结构体变量的值拷贝一份,传递。 —— 几乎不用。 内存消耗大,效率低。
5 结构体指针做函数返回值:
不能返回局部变量的地址。—— 局部变量保存栈帧上,函数调用结束后,栈帧释放。局部变量的地址,不再受系统保护,随时可能分配给其他程序。 可以返回局部变量的值