Go的结构体

结构体

go中的结构体,就相当于面向对象的类。

一、什么是结构体?

结构体是用户定义的类型,表示一系列属性的集合。

(Python中的类:一系列属性和方法的集合。)

有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。

例如,一个职员有 firstNamelastNameage 三个属性,而把这些属性组合在一个结构体 employee 中就很合理。

二、结构体的声明

语法:

type 结构体的名字 struct {
    属性 类型
    属性 类型
    。。。
}

三、创建结构体

1、创建有名结构体

type Person struct {
	name string
	age int
	gender int
}

func main() {
	var p = Person{}
	// p:=Person{}
}

2、结构体初始化

2.1 按位置传参

type Person struct {
	name   string
	age    int
	gender int
}

func main() {
	var p Person = Person{"donner",19,1}
	fmt.Println(p)
}

{donner 19 1}

2.2 按关键字传

可以乱序,可以少传。

type Person struct {
	name   string
	age    int
	gender int
}

func main() {
	var p Person = Person{gender:1,name:"donner"}
	fmt.Println(p)
}

{donner 0 1}

3、创建匿名结构体

没有名字的结构体。需要定义在函数内部。不需要type关键字。

只是用一次,可以把一堆属性封装到对象中。

语法:

var 变量名 = struct {
    属性 类型
    属性 类型
    。。。
}{初始化传参}

范例:

func main() {
	var obj = struct {
		name   string
		age    int
		gender int
	}{name:"noname"}
	fmt.Println(obj)
}

{noname 0 0}

四、结构体的类型

结构体是值类型。

结构体的类型名就是结构体的名称。

type Person struct {
	name   string
	age    int
	gender int
}

func main() {
	var p = Person{}
	//p:=Person{}
	fmt.Printf("%T", p) // main.Person
}

五、结构体的默认值、

结构体的默认值就是包含属性默认值的结构体。

结构体属性的默认值就是属性类型的默认值。

type Person struct {
	name   string
	age    int
	gender int
}

func main() {
	var p = Person{}
	p.name = "donner"
	fmt.Println(p)
}

{donner 0 0}

六、访问结构体的字段

通过点点点就可以访问。

type Person struct {
	name   string
	age    int
	gender int
}

func main() {
	var p Person = Person{gender:1,name:"donner"}
	fmt.Println(p.name)  // donner
}

七、结构体的指针

var p Person = Person{gender:1,name:"donner"}
var pPointer *Person=&p
fmt.Println(pPointer)  // &{donner 0 1}
fmt.Println(*pPointer)  // {donner 0 1}

八、匿名字段

只有类型,没有名字的字段。

但是默认匿名字段的类型名就是匿名字段的名称。

同一个类型的匿名字段只能出现一次。

type Person2 struct {
	string
	int
}

// 按位置
var p = Person2{"name",18}
fmt.Println(p)

// 按关键字(类型就是关键字)
var p = Person2{int:18,string:"name"}
fmt.Println(p)

// 获取匿名字段的属性
var p = Person2{int:18,string:"name"}
fmt.Println(p.int) // 18

九、嵌套结构体

结构体嵌套结构体,即为结构体中的某个字段也是结构体。

type Hobby struct {
	hobbyName string
	hobbyTime string
}

type Person3 struct {
	name string
	age int
	hobby Hobby
}

// 按位置传参
var p = Person3{"donner",18,Hobby{"rap","1year"}}
fmt.Println(p) // {donner 18 {rap 1year}}

// 按关键字自传参
var p = Person3{name:"donner",hobby:Hobby{hobbyTime:"1year",hobbyName:"rap"},age:18}
fmt.Println(p) // {donner 18 {rap 1year}}

// 获取嵌套结构体的属性
p.hobby.hobbyName = "篮球"
fmt.Println(p) // {donner 18 {篮球 1year}}

十、提升字段

提升字段:如果嵌套结构体字段是一个匿名字段,那么该嵌套结构体中的字段可以被大结构体直接点出。

type Hobby struct {
	hobbyName string
	hobbyTime string
}

type Person4 struct {
	name string
	age int
	Hobby
}

var p = Person4{"donner",18,Hobby{"rap","1year"}}
// 字段未提升前,需一层一层点出
fmt.Println(p.Hobby.hobbyName)  // rap

// 字段提升后,一步到位
fmt.Println(p.hobbyName)  // rap

十一、导出结构体和字段

导出结构体(大小写)和字段(大小写)。

如果结构体名称以大写字母开头,则它是其他包可以访问的导出类型。同样,如果结构体里的字段首字母大写,它也能被其他包访问到。

十二、结构体相等性

结构体是值类型。

如果它的每一个字段都是可比较的,则该结构体也是可比较的。

如果两个结构体变量的对应字段相等,则这两个变量也是相等的。

如果结构体包含不可比较的字段,则结构体变量也不可比较。

posted @ 2020-03-29 21:46  Donner  阅读(587)  评论(0编辑  收藏  举报