Go语言结构体
Go语言结构体
结构体: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的数据没有变化