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
}
posted @ 2020-03-28 10:26  DongDon  阅读(318)  评论(0)    收藏  举报