结构体
-
概念
由一系列具有相同类型或不同类型的数据,构成的数据集合。
结构体成员由一系列的成员变量构成,这些成员变量也被称为“字段”
结构体也可理解为一个数据记录,结构体抛弃了面向对象类,继承等概念。
-
结构体的定义与初始化
type struct_varibale_type struct{ member definition; //member首字母大写代表public访问属性 member definition; .... member definition; }
type Person struct{ name string age int sex string address string } //初始化 //方法1 var p1 Person p1.name="henry" p1.age = 30 p1.sex = "男" p1.address = "北京" //方法2 p2 := Person{} p2.name="henry" p2.age = 30 p2.sex = "男" p2.address = "北京" //方式3 var p1 Person = Person{name:"henry", age:30, sex:"男", address:"北京", //注意,如果最后一个属性不跟}在同一行,需要加上, } //方法4 p2 := Person{"kaka",30,"男","巴西"}
-
结构体是值类型
-
make,new操作
make用于内建类型(slice,map,channel)的内存分配。new用于各种类型的内存分配,内建函数new本质上说跟其他语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用GO的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:new返回指针。
内建函数make(T,args)与new(T)有着不同的功能,make只能创建slice,map,channel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice,map和channel来说,make初始化了内部的数据结构,填充适当的值。
-
结构体指针
var pp1 *Person pp1 = &p1 (*pp1).name pp1.name //以上两种通过结构体指针,访问结构体属性的方式,作用相同
-
new创建结构体
//返回指向类型T零值空间的指针 p4 := new(Person) fmt.Printf("%T ",p4) //*main.Person
-
匿名结构体
-
概念:没有名字的结构体,在创建匿名结构体时同时创建对象
-
变量名 := struct{ 定义字段 }{字段进行赋值} s1 := struct{ name string age int }{"henry",30} fmt.Println(s1.name)
-
-
结构体匿名字段
-
概念:结构体的字段省略名字,只有类型
-
type Worker struct{ string int } s2 := Worker{"kaka",29} fmt.Println(s2.string) //类型名称将成为结构体的匿名字段名, //但匿名字段的类型不能重复,否则会冲突
-
-
结构体嵌套
-
概念:一个结构体可能包含一个字段,而这个字段反过来是一个结构体,这样的结构就是嵌套结构。
-
type Book struct { bookName string price float64 } type Student struct { name string age int book Book } book := Book{"数学",100} student := Student{name:"henry", age:16, } student.book = book //值传递 fmt.Println(student.book.bookName) //数学 student.book.bookName = "语文" fmt.Println(student.book.bookName) //语文 fmt.Println(book.bookName)//数学
-