前言大家好,我是星期五,终于迎来了Go中最大的知识点,结构。在Go中,没有类和对象的概念。像Java、Python这样的面向对象对象,都是通过对结构体的各种操作来模拟的。在回忆map之前,我们说过Go语言的map是以键值对的形式存储数据的,就是这样。不记得的朋友请戳:一篇文章带你了解Go语言基础图谱和Go语言基础图谱补充。//方法一varstudent=map[string]string{"姓名":"张三","年龄":"18",}//方法二varstudent2=make(map[string]string,10)student2["姓名"]="张三"student2["年龄"]="18"不过这样好像有缺点。我不知道我有多少个键,值类型是固定的。理论上keyAge对应的value应该是int类型,另外还有一些细微的问题,不容易通过map解决。因为解决了这些问题,引入了结构类型。前戏补充在开始结构之前,我们先来看两个奇怪的知识点。自定义类型类型自定义类型名称类型名称示例:typeNewIntint完整代码packagemainimport"fmt"typeNewIntintfuncmain(){varn1NewInt=1fmt.Println(n1)//结果为1}理解的话可以理解为NewInt包含int函数.在这里您可以将NewInt用作int。注意:NewInt是包含int的新类型,不等于int。类型别名代码typealias=typename例子:typeNint=intcompletecodepackagemainimport"fmt"typeNint=intfuncmain(){varn1Nint=1fmt.Println(n1)//1}自定义类型和类型别名的区别可能是一眼看去,自定义类型和类型别名好像是一样的,其实不一样。代码packagemainimport"fmt"typeNint1int//自定义类型typeNint2=int//类型别名funcmain(){varn1Nint1=1varn2Nint2=1fmt.Printf("n1type:%T,n2type:%T",n1,n2)}执行结果.结论:自定义类型真的是自定义类型,类型变了,类型别名只是类型名变了,本质没变。结构体Go语言的结构体相当于Java、Python等语言中的类,不再是简单的结构体那么简单。结构是原始数据类型。内存映射大致如下。结构体定义定义结构体需要关键字type和struct。语法类型结构名struct{field1fieldtype1field2fieldtype2...}例子,通过结构描述一个学生。typeStudentstruct{NamestringAgeintHeightintWeightintphonestring}注意:如果字段类型相同,可以写在同一行。typeStudentstruct{NamestringAge,Height,Weightintphonestring}结构初始化方法一、初始化funcmain(){vars1=Student{姓名:“张三”,年龄:18,身高:180,体重:120,电话:“6666666”,}fmt.println(s1)}方法二,先声明,再赋值funcmain(){vars1Students1.Name="张三"s1.Age=18s1.Height=180s1.Weight=120s1.phone="66666"}两个结果。匿名结构有时候我们的函数可能需要传入一个结构,但是你不想定义它,只是想临时用一下,快速传递参数。这时候可以考虑匿名结构。方法一,先声明,再赋值funcmain(){varcarstruct{Namestring;CarNumstring}car.Name="QQ"car.CarNum="北京6666"fmt.Println(car)//{QQ北京6666}}方法二,声明+初始化funcmain(){varcar=struct{Namestring;CarNumstring}{Name:"QQ",CarNum:"北京6666",}fmt.Println(car)//{QQ北京6666}}两次执行结果。通过&方法初始化结构体通过&方法初始化结构体,性能会提高一点,因为返回的是第一个指针。但是操作过程和上面一样,Go已经打包好了。代码funcmain(){//方法一,赋值时等于一个空&结构vars1=&Student{}s1.Name="张三"//...//方法二,直接赋值vars2=&Student{Name:"",Age:0,Height:0,Weight:0,phone:"",}//不允许使用方法3//vars3&Student//error}使用&的方法和原来的方法基本一样,但是Method3不允许。&初始化结构函数的注意事项如果使用&方法,函数参数也应该改变。packagemainimport"fmt"typeStudentstruct{NamestringAge,Height,Weightintphonestring}funcsayStudent1(sStudent){fmt.Println(s)}funcsayStudent2(s*Student){//如果你是穿结构地址,那么就需要使用*fmt.Println(s)}funcmain(){vars1=Student{姓名:"111",年龄:0,身高:0,体重:0,电话:"1111",}vars2=&Student{姓名:"2222",年龄:0,身高:0,体重:0,phone:"2222",}sayStudent1(s1)sayStudent2(s2)}执行结果。关于代码funcmain(){vars1=Student{}fmt.Println(s1)}结构体默认值的执行结果。操作结构体时,即使没有赋值,也会有默认值,不用担心报错。int的默认值为0,string的默认值为""等。综上所述,我们学习了Go语言的基本结构,首先回顾一下map,map的优缺点,然后结构介绍。介绍了如何创建和赋值结构体,什么是匿名结构体,通过&直接赋值结构体等。本文转载自微信公众号“Go语言进阶学习”,可关注下方二维码。转载本文请联系Go语言进阶学习公众号。
