go-聚合数据类型-结构体
结构体
在go中:结构体指的是一系列属性的集合。
在python:类指的是一系列属性和方法的集合
结构体的声明
结构体是一种数据类型,每一个成员变量都是结构体类型的一部分:成员数量,成员变量名与其对应的变量类型
// 声明结构体变量
var a struct{
name string
age int
}
// 声明并初始化结构体变量
var b struct{
name string
age int
} = struct{
name string
age int
}{"小红", 18}
// 自动推导
c := struct{
name string
age2 int
}{"小明", 19}
fmt.Printf("a的数据类型:%T",a)
fmt.Printf("b的数据类型:%T",b)
fmt.Printf("c的数据类型:%T",c)
/*
总结:
1、a和b的结构体类型完全一致:成员数量,成员变量名,成员数据类型
2、a,b和c不是同一种结构体类型:a,b和c有一个成员变量名的区别
3、a,b结构体类型一致,可以进行赋值运算:a = b
*/
常用声明方式
由于结构体成员的丰富性,所以结构体类型也是多种多样,在go中通常使用type关键字来重命名结构体类型
// 重命名定义结构体
type Student struct {
name string
age int
}
type Hobby struct {
id string
name string
}
// 基于结构体名声明结构体变量
var a Student
var b = Student{}
c := Student
结构体变量初始化
注意:按位置传参与按关键字传参的区别
// 声明结构体
type Student struct {
name string
age int
}
// 声明结构体变量
var s = Struct{} // 结构体零值为成员的零值,类似于数组
var a = Student{"小明", 18} // 位置实参,缺一不可,不会默认零值
var b = Student{name:"小红"} // 关键字实参,可缺,默认零值
匿名成员与结构体嵌套
定义结构体成员时,只声明成员数据类型,一般与结构体嵌套连用
被嵌套在内的结构体必须提前被声明
声明与传参
func testStruct(){
type Hobby struct {
name string
int
}
type Student struct {
name string
age int
Hobby // 结构体嵌套
}
// 关键字传参时:匿名成员默认变量名为类型名
student1 := Student{name: "小明", age: 18, Hobby: Hobby{name: "篮球", int:999},}
student2 := Student{"小红", 20, Hobby{"饮血",234},}
fmt.Println(student1) // {小明 18 {篮球 999}}
fmt.Println(student2) // {小红 20 {饮血 234}}
}
匿名成员为结构体:成员提升
类似于Python中类的继承,对象属性查找
// 借助上一段 声明与传参 代码示例
student1 := Student{name: "小明", age: 18, Hobby: Hobby{name: "篮球", int:999},}
fmt.Println(student1.name) // 小明
fmt.Println(student1.Hobby.name) // 篮球
结构体的指针
指向结构体变量值的指针
var p Person=Person{sex:1,age:18}
var p1 *Person=&Person{sex:1,age:18}
fmt.Println(p1)
结构体的相等性
结构体变量是值类型,所以可以进行比较,但是有条件限制
1、同一个结构体类型的结构体变量之间才能进行比较
2、在1的基础上,结构体变量每一个成员变量都是可以比较的
func main(){
type Hobby struct {
name string
int
}
a := Hobby{"小小", 19}
b := Hobby{"小小", 19}
c := Hobby("大大", 19)
fmt.Println(a==b) // true
fmt.Println(a==b) // false
}

浙公网安备 33010602011771号