结构体:struct
结构体是一系列具有指定数据类型的数据字段,能够把单个变量引用一些列相关的值。
一、下面采用学生的个人信息来展示结构体的运用:
package main import ( "fmt" ) type Student struct { Name string Age int Sex string } func StudentAdd() (ret Student) { ret =Student{ Name:"jack", Age:28, Sex:"boy", } return } func main() { fmt.Println(StudentAdd()) }
执行结果:{jack 28 boy}
(1)首先创建Student结构体,定义Name,Age,Sex等参数,(在go语言里,首写字母大写的变量、数据结构或者函数是可以被导出的,也就是共有的,小写开头的则是私有的变量、数据结构或者函数)
(2)定义StudentAdd函数,里面添加学生的信息,返回Student类型的结构体。
(3)main函数里面调用StudentAdd函数,输出本次添加的信息。
二、数据结构的嵌套
数据结构可以有很多层,也有很多结够体的属性相同或者包含关系,所以在建立数据结构的时候我们可以采用嵌套功能,减少很多代码的书写,提高代码的复用性。
下面举例说明:
package main import "fmt" type People struct { Name string Age int Sex string } type Students struct { Information People Study string } type Teacher struct { Information People IsMarry bool Salary float32 } func main() { S:=Students{ Information: People{Name:"Tom", Age:16, Sex:"boy", }, Study:"学习高等数学", } T:=Teacher{ Information:People{Name:"张三",Age:32,Sex:"男"}, IsMarry:true, Salary:6556, } fmt.Println(S) fmt.Println(T) }
执行结果:
{{Tom 16 boy} 学习高等数学}
{{张三 32 男} true 6556}
解释:定义了一个人的属性,有名字,年龄,性别。定义老师和学生,这两个对象都有人里面含有的属性,各自还有各自的属性,比如老师还有工资属性,结婚属性;学生有学习属性。由于这两个属性有相同的,直接嵌入人的结构体,节省了时间,减少了代码的重复率。
三、区别结构体的指针引用和值引用
指针指的是值的内存地址,改变指针的值,也就改变了原来数据的值;而值,改变值的值原来数据的值不变,下面用例子来说明:
(1)
package main import ( "fmt" ) type Student struct { Name string Age int Sex string } func StudentAdd() (ret Student) { a:=Student{ Name:"jack", Age:28, Sex:"boy", } b:=&a b.Name="Mike" ret=a return } func main() { fmt.Println(StudentAdd()) }
输出结果:
{Mike 28 boy} {Mike 28 boy}
(2)
package main import ( "fmt" ) type Student struct { Name string Age int Sex string } func StudentAdd() (ret1,ret2 Student) { a:=Student{ Name:"jack", Age:28, Sex:"boy", } b:=a b.Name="Mike" ret1=a ret2=b return } func main() { fmt.Println(StudentAdd()) }
输出结果:
{jack 28 boy} {Mike 28 boy}
解释:上面结果我只定义了b结构体,把a的指针内存地址传给b,然后修改b.Name参数的值,结果a也修改了;而值传值的话,b修改了,但是a的数据没有变化