最近疫情比较严重,过年也不能出门,闲来无事,继续更新博客吧。

武汉加油!

我们来继续说下go语言中的结构体

比如我们现在想存储一个学生信息,如:学号、姓名、年龄、性别,等信息,按照我们以前的存储习惯,将分别定义各个类型的字段,来表示不同的字段,不同的数据类型。

通过以往的定义形式进行存储,这种方法可行,但是相对来说,比较麻烦,且不利于数据的管理。

但是在GO语言中,我们可以通过结构体的形式来存储数据,下面我们看下,结构体的定义:

package mainimport "fmt"//在函数外部定义结构体,作用全局。
//结构体定义
//type 名称 struct {
//结构体成员列表
//}
type Student struct {id intname stringsex stringage intaddr string
}func main() {//通过结构体名, 定义结构体变量var stdu Student//结构体变量名.成员名称stdu.id = 111stdu.name = "张三"stdu.sex = "男"stdu.age = 26stdu.addr = "成都"fmt.Println(stdu)
}

输出结果:

{111 张三 男 26 成都}

另外一种定义方式:

在写结构体参数时,固定按照定义的结构体顺序来写

func main() {var stdu Student=Student{111,"张三", "男", 28, "成都"}fmt.Println(stdu)
}

我们在看看自动推导类型如何定义结构体

stdu_1:= Student{age:26, id:222, name:"李四", addr:"成都", sex:"男"}

我们在使用自动推导类型定义结构体的时候,需要将结构体中的参数添加在定义变量之前。

二、结构体的赋值和比较

package mainimport "fmt"type Student struct {id   intname stringsex  stringage  intaddr string
}func main() {s:= Student{1, "啦啦", "男", 18, "成都"}//结构体变量赋值s1:=sfmt.Println(s1)//改变结构体中的值s1.age=26fmt.Println(s1)//我们看看,修改的值,会不会影响我们原来的sfmt.Println(s)
}

结果:

{1 啦啦 男 18 成都}
{1 啦啦 男 26 成都}
{1 啦啦 男 18 成都}

我们可以看到,我们将结构体s赋值给s1打印,s1,得到跟s结构体一样的信息

在将,s1的年龄更改至26岁,打印s1, 打印s,可以看到,修改s1的值,不会更改s的值.。

结构体比较

//在结构体中,比较操作,使用“==”或者“!=”来比较,不能大于小于等。if s1!=s{fmt.Println("不相同")}else {fmt.Println("相同")}

结果:

不相同

在结构体中,只能使用“==”或“!=”进行比较,不可以使用大于、小于等作为结构体的比较。

大于小于,可以用于对结构体成员进行比较。

 if s.age>s1.age{fmt.Println("s的年龄,大于s1的年龄")}else {fmt.Println("s的年龄,小于s1的年龄")}

结果:

s的年龄,小于s1的年龄

三、结构体数组切片的定义于使用

前面我们已经对结构体的定义,与基本使用做了一定的介绍。

1、结构体数组

package mainimport "fmt"type student struct {id    intname  stringsex   stringage   intscore intaddr  string
}func main() {//var 结构体变量名 结构体类型//定义结构体数组//var 结构体数组名[元素个数] 结构体类型var arr[5]student// len(数组名)计算数组元素个数//fmt.Println(len(arr))for i:=0; i<len(arr) ;i++{fmt.Scan(&arr[i].id,&arr[i].name,&arr[i].sex,&arr[i].age,&arr[i].score,&arr[i].addr)}fmt.Println(arr)
}

结果:

1 哈哈 男 18 88 成都
2 啦啦 女 16 99 北京
3 呆呆 男 17 77 上海
4 哒哒 女 15 66 广州
5 嘎嘎 男 14 55 深圳
[{1 哈哈 男 18 88 成都} {2 啦啦 女 16 99 北京} {3 呆呆 男 17 77 上海} {4 哒哒 女 15 66 广州} {5 嘎嘎 男 14 55 深圳}]

输入上面的数据,打印结构体数组得到的内容。

通过循环方式,输出结构体数据内容

 //fmt.Println(arr)//通过循环方式,将结构体的每一项输出for i:=0; i<len(arr); i++ {fmt.Println(arr[i])}

结果:

1 哈哈 男 18 88 成都
2 啦啦 女 16 99 北京
3 呆呆 男 17 77 上海
4 哒哒 女 15 66 广州
5 嘎嘎 男 14 55 深圳
{1 哈哈 男 18 88 成都}
{2 啦啦 女 16 99 北京}
{3 呆呆 男 17 77 上海}
{4 哒哒 女 15 66 广州}
{5 嘎嘎 男 14 55 深圳}

2、根据结构体成员信息进行排序操作(冒泡排序算法)

package mainimport "fmt"type student struct {id    intname  stringsex   stringage   intscore intaddr  string
}func main() {//var 结构体变量名 结构体类型//定义结构体数组//var 结构体数组名[元素个数] 结构体类型var arr[5]student// len(数组名)计算数组元素个数//fmt.Println(len(arr))for i:=0; i<len(arr) ;i++{fmt.Scan(&arr[i].id,&arr[i].name,&arr[i].sex,&arr[i].age,&arr[i].score,&arr[i].addr)}//fmt.Println(arr)//通过循环方式,将结构体的每一项输出fmt.Println("排序前:")for i:=0; i<len(arr); i++ {fmt.Println(arr[i])}//根据结构体成员信息进行排序操作,使用冒泡排序算法for i:=0; i< len(arr)-1; i++{for j:=0;j<len(arr)-1-i;j++{//比较结构体成员信息,年龄,成绩均可以进行排序if arr[j].age>arr[j+1].age{//通过比较交换成员arr[j],arr[j+1]=arr[j+1],arr[j]}}}fmt.Println("排序后:")for i:=0; i<len(arr); i++ {fmt.Println(arr[i])}
}

结果:

1 哈哈 男 18 88 成都
2 啦啦 女 16 99 北京
3 呆呆 男 17 77 上海
4 哒哒 女 15 66 广州
5 嘎嘎 男 14 55 深圳
排序前:
{1 哈哈 男 18 88 成都}
{2 啦啦 女 16 99 北京}
{3 呆呆 男 17 77 上海}
{4 哒哒 女 15 66 广州}
{5 嘎嘎 男 14 55 深圳}
排序后:
{5 嘎嘎 男 14 55 深圳}
{4 哒哒 女 15 66 广州}
{2 啦啦 女 16 99 北京}
{3 呆呆 男 17 77 上海}
{1 哈哈 男 18 88 成都}

数组中的元素,允许相互赋值操作,将结构体成员中的所有数据进行相互交换。

3、使用自动类型推导,创建结构体

package mainimport "fmt"type students struct {id    intname  stringsex   stringage   intscore intaddr  string
}func main() {//使用自动类型推导创建结构体信息arr:=[3]students{{101,"啦啦","男", 50, 99,"成都"},{102,"哈哈","女",40,100,"北京"},{103,"嘎嘎", "男",30,88,"上海"},}for i,v:=range arr{//打印类型//fmt.Printf("%T",v)fmt.Println(i,v)}
}

结果:

0 {101 啦啦 男 50 99 成都}
1 {102 哈哈 女 40 100 北京}
2 {103 嘎嘎 男 30 88 上海}

4、切片结构体定义:

区别:[元素个数] 数组      []切片

arr:=[]students{{101,"啦啦","男", 50, 99,"成都"},{102,"哈哈","女",40,100,"北京"},{103,"嘎嘎", "男",30,88,"上海"},}

一样可以进行打印运行。

package mainimport "fmt"type students struct {id    intname  stringsex   stringage   intscore intaddr  string
}func main() {//使用自动类型推导创建结构体信息// [元素个数] 数组    [] 切片arr:=[]students{{101,"啦啦","男", 50, 99,"成都"},{102,"哈哈","女",40,100,"北京"},{103,"嘎嘎", "男",30,88,"上海"},}//在切片中添加数据信息arr = append(arr,students{104,"哒哒", "男",40,77,"广州"})for i,v:=range arr{//打印类型//fmt.Printf("%T",v)fmt.Println(i,v)}
}

结果:

0 {101 啦啦 男 50 99 成都}
1 {102 哈哈 女 40 100 北京}
2 {103 嘎嘎 男 30 88 上海}
3 {104 哒哒 男 40 77 广州}

四、结构体作为Map中的值

package mainimport "fmt"type stu struct {name  stringage   intscore int
}func main() {//定义一个mapm:=make(map[int]stu)m[1] = stu{"哈哈", 50,88}m[2] = stu{"哒哒",51,88}fmt.Println(m)
}

结果:

map[1:{哈哈 50 88} 2:{哒哒 51 88}]

使用循环遍历map中的值

 for k,v:=range m{fmt.Println(k,v)}

结果:

1 {哈哈 50 88}
2 {哒哒 51 88}

五、结构体切片作为map中的值

package mainimport "fmt"type stu struct {name  stringage   intscore int
}func main()  {//结构体切片作为map中的值m:=make(map[int][]stu)// map结构体切片赋值m[1] = append(m[1],stu{"哈哈1",51,81},stu{"哒哒1",61,91})m[2] = append(m[2],stu{"哈哈2",52,82},stu{"哒哒2",62,82})m[3] = append(m[3],stu{"哈哈3",53,83},stu{"哒哒3",63,93})//遍历操作for k,v:=range m{//此时,V的类型为,结构体切片。//在遍历切片信息for i,data:=range v{fmt.Println("key:",k,"index:",i,"value:",data)}}
}

结果:

key: 1 index: 0 value: {哈哈1 51 81}
key: 1 index: 1 value: {哒哒1 61 91}
key: 2 index: 0 value: {哈哈2 52 82}
key: 2 index: 1 value: {哒哒2 62 82}
key: 3 index: 0 value: {哈哈3 53 83}
key: 3 index: 1 value: {哒哒3 63 93}

六、结构体作为函数参数

package mainimport "fmt"type person struct {id intname stringscore intsex string
}func test(s person){fmt.Println(s.name)fmt.Println(s.score)fmt.Println(s.sex)
}func main() {stu:=person{1,"哈哈", 55,"男"}//结构体作为函数参数test(stu)
}

结果:

哈哈
55
男

结构体作为函数参数是值传递

package mainimport "fmt"type person struct {id intname stringscore intsex string
}func test(s person){s.name = "哒哒哒"
}func main() {stu:=person{1,"哈哈", 55,"男"}//结构体作为函数参数test(stu)//结构体作为函数参数,是值传递。fmt.Println(stu)
}

结果:没有改变结构体名称,值传递。

值传递,形参单元和实参单元是不同的存储区域,修改不会影响其他的值。(这里注意,所有的切片类型,都为地址传递)

{1 哈哈 55 男}

结构体切片,作为参数地址传递。

package mainimport "fmt"type person struct {id intname stringscore intsex string
}//所有的切片,都是地址传递
func test(stu []person){stu[0].name = "哒哒"
}func main() {//定义结构体切片stu:=[]person{{1,"哈哈", 55,"男"},{2,"啦啦", 88,"女"}}//为切片添加数据stu = append(stu,person{3,"嘎嘎",66,"男"})//结构体切片作为函数参数是地址传递//结构体数组作为函数参数是值传递test(stu)fmt.Println(stu)
}

结果:

[{1 哒哒 55 男} {2 啦啦 88 女} {3 嘎嘎 66 男}]

Go语言学习、结构体相关推荐

  1. ios开发中的C语言学习—— 结构体简介

    在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来 ...

  2. C语言学习—结构体的定义与使用

    文章目录 前言 一.结构体的概念 1.结构体是什么? 2.如何定义一个结构体? 3.结构体变量 4.结构体变量的初始化 4.1结构体成员的访问 4.2结构体变量的初始化 二.结构体的使用 1.如何去使 ...

  3. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

    结构体 结构体的形式 struct 结构体名称 { 结构体成员1; 结构体成员2; - }; 例如: 图书的结构体 struct Book {char title[128];char author[4 ...

  4. 一起学习C语言:结构体(二)

    上一篇<一起学习C语言:结构体(一)> 中,我们了解了结构体的概念与定义形式,以及结构体变量初始化赋值.本章节,我们分析结构体成员访问形式,以及结构数组使用的场景. 章节预览: 4. 结构 ...

  5. c语言 结构体ppt,C语言知识学习结构体.ppt

    C语言知识学习结构体.ppt Chap 9 结构,9.1 输出平均分最高的学生信息 9.2 学生成绩排序 9.3 修改学生成绩,本章要点,什么是结构结构与数组有什么差别 有几种结构的定义形式,它们之间 ...

  6. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  7. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  8. 【Golang第8章:面向对象编程】Go语言的结构体是什么,怎么声明;Golang方法的调用和声明;go语言面向对象实例,go语言工厂模式;golang面向对象的三大特性:继承、封装、多态

    介绍 这个是在B站上看边看视频边做的笔记,这一章是Glang面向对象编程 这一章内容较多,内容有Go语言的结构体是什么,怎么声明:Golang方法的调用和声明:go语言面向对象实例,go语言工厂模式: ...

  9. matlab学习-结构体变量

    matlab结构体学习 matlab结构体学习 matlab结构体与C语言数据结构结构体或java语言类的定义有异曲同工之妙,其主要知识点如下 提示:写完文章后,目录可以自动生成,如何生成可参考右边的 ...

  10. Go语言中结构体打Tag是什么意思?

    前言 哈喽,大家好,我是asong.今天想与大家分享Go语言中结构体标签是怎么使用的,以及怎样定制自己的结构体标签解析. 大多数初学者在看公司的项目代码时,看到的一些结构体定义会是这样的: type ...

最新文章

  1. python笔记:load_ext autoreload
  2. 如何查看numpy库数组的:类型、数据类型、尺寸、形状、维度? (type、dtype、size、shape、ndim)
  3. CodeForces - 894B Ralph And His Magic Field(组合数学+思维)
  4. pyspark读写SequenceFile
  5. 修改linux系统中自带的jdk
  6. 李宏毅 课程打包_按功能而不是按层打包课程
  7. 十余位权威专家深度解读,达摩院2019十大科技趋势点燃科技热情
  8. Linux卸载系统盘,Linux磁盘管理(创建、卸载、挂载磁盘)
  9. excel文件修复工具_DBF Doctor下载_DBF文件修复软件官方版下载[管理工具]
  10. 如何使用GoldWave中文版将语音转化为文字
  11. 二十四节气—立秋,文案、海报分享。
  12. 用biobert标记基因和蛋白质
  13. 计算机类部分核心期刊说明
  14. 移动安全工具-jadx
  15. 用excel做logistic回归分析_怎样用SPSS做二项Logistic回归分析?结果如何解释?
  16. 2012系统服务器网络限制,Windows server 2012 r2对计算机的网络速度限制在~30mbps
  17. 物联网教育现状和前景
  18. 小学生台灯哪个品牌更护眼?精选教育部认可护眼灯品牌
  19. 【运筹学】由原问题直接写出对偶问题
  20. PM1200手持无线电综合测试仪的功能与特点

热门文章

  1. 智慧林业解决方案-最新全套文件
  2. 老板们这些股权结构需要优化了
  3. mysql vb.net odbc_在VB.net中连接MySql的类库_MySQL
  4. matlab r2010b 怎么设置中文,[矩阵实验室]Matlab R2010b 乱码问题
  5. 在华为P50 Pro中,听到AI异构通信的朱弦三叹
  6. Linux系统代理上网
  7. WWDC20 Session 清单(06-23)
  8. 密码学系列 - 椭圆曲线签名的基本原理
  9. Windows窗体应用程序~随机数字抽奖系统
  10. java_异常_练习题:处理输入非数字异常和除数为0的异常。