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