您好,欢迎访问一九零五行业门户网

Go语言基础之结构体(春日篇)

回忆map之前我们讲过,go语言的map是键值对的方式存储数据的,就像这样的。不记得的小伙伴请戳:一篇文章带你了解go语言基础之map、go语言基础之map补充。
//方式一var student = map[string]string{ "name": "张三", "age": "18",}//方式二var student2 = make(map[string]string, 10)student2["name"] = "张三"student2["age"] = "18"
但是这样,似乎有一个弊端,我不知道我有几个key,并且value类型是固定的。
理论来说,key age 对应的value应该是int类型,还有一些其他微妙的问题,通过map都是不太好解决的。
因为解决这些问题,所以,又引出了结构体这个类型。
前戏补充在开始结构体之前呢,先看两个奇怪的知识点。
自定义类型代码
type 自定义类型名 类型名例:type newint int
完整代码
package mainimport "fmt"type newint intfunc main() { var n1 newint = 1 fmt.println(n1)//结果为1}
如果要是理解的话,可以理解为newint包含了int的功能。
这里可以把newint当作int来使用。
注:newint是一个新的类型,它包含int,并不等于int。
类型别名代码
type 类型别名 = 类型名例:type nint = int
完整代码
package mainimport "fmt"type nint = intfunc main() { var n1 nint = 1 fmt.println(n1)//1}
自定义类型和类型别名区别
可能猛一看,感觉自定义类型和类型别名似乎一样,但是其实是不太一样的。
代码
package mainimport "fmt"type nint1 int //自定义类型type nint2 = int //类型别名func main() { var n1 nint1 = 1 var n2 nint2 = 1 fmt.printf("n1类型:%t,n2类型:%t", n1, n2)}
执行结果。
结论:自定义类型真的是自定义类型,类型都变了,类型别名只是类型名变了,但是本质没变。
结构体go语言的结构体,相当java,python等语言中的类,已经不再是简简单单的结构体那么简单了。
结构体属于基本数据类型。
内存图大概如下。
结构体定义
定义结构体需要用到关键字type和struct。
语法
type 结构体名 struct { 字段1 字段类型1 字段2 字段类型2 ...}
示例,通过结构体描述一个学生。
type student struct { name string age int height int weight int phone string}
注:如果字段类型是相同的,可以写在同一行。
type student struct { name string age, height, weight int phone string}
结构体初始化方式一,赋值时初始化func main() { var s1 = student{ name: "张三", age: 18, height: 180, weight: 120, phone: "6666666", } fmt.println(s1)}
方式二,先声明,后赋值func main() { var s1 student s1.name = "张三" s1.age = 18 s1.height = 180 s1.weight = 120 s1.phone = "66666"}
两个执行结果。
匿名结构体
有时候我们的函数可能会要求传入一个结构体,但是你又不想定义,就想临时用一下,赶紧传参得了。
这时候可以考虑匿名结构体。
方式一,先声明,后赋值func main() { var car struct { name string; carnum string } car.name = "qq" car.carnum = "京6666" fmt.println(car) //{qq 京6666}}
方式二,声明+初始化func main() { var car = struct { name string; carnum string }{ name: "qq", carnum: "京6666", } fmt.println(car) //{qq 京6666}}
两个执行结果。
通过&方式初始化结构体
通过&的方式初始化,性能会提高一点,因为返回的是第一个的指针。
但是操作过程跟上述一样,go已经封装好了。
代码
func main() { //方式一,等于一个空&结构体在赋值 var s1 = &student{} s1.name = "张三" //... //方式二,直接赋值 var s2 = &student{ name: "", age: 0, height: 0, weight: 0, phone: "", } //方式三不可以 //var s3 &student//error}
使用&的方式基本跟原来一样,但是方式三不行。
&初始化结构体函数注意事项如果使用&的方式,那函数参数也要变一下的。
package mainimport "fmt"type student struct { name string age, height, weight int phone string}func saystudent1(s student) { fmt.println(s)}func saystudent2(s *student) { //如果穿的是结构体地址,那么接收就需要用* fmt.println(s)}func main() { var s1 = student{ name: "111", age: 0, height: 0, weight: 0, phone: "1111", } var s2 = &student{ name: "2222", age: 0, height: 0, weight: 0, phone: "2222", } saystudent1(s1) saystudent2(s2)}
执行结果。
关于结构体默认值
代码
func main() { var s1 = student{} fmt.println(s1)}
执行结果。
在操作结构体时,即使没有赋值,也会有默认值,所以不用担心会报错。
int默认值是0,string默认值是,等。
以上就是go语言基础之结构体(春日篇)的详细内容。
其它类似信息

推荐信息