golang中struct
前面已经介绍的数组,slice,map有一定的相同之处,即处理的都是相同类型的元素,map中的key和value属于相同的类型,但如果要把多个类型的元素放到一起进行处理,则要使用go语言为我们提供的数据结构struct
struct非常适合定义一个有意义的对象,可以用于定义属性和方法,这和c语言的结构体,java,class类有些相似。当然struct肯定不是class
struct也是复合类型,而非引用类型,复合类型和引用类型是有区别的,复合类型是值传递,引用类型是引用传递。
type Person strcuct {name stringgender int //stringage int
}
上述代码简单定义了一个struct 包含三个成员,也可以说三个字段或者属性,在语法上,可以吧同类型的元素写在一行,通常建议一行一个成员比较好。除了类型以外,在定义结构体的时候还可以定义对应的数据库字段和json关键字。
可以定义,没有任何成员的空结构体struct {},在并发编程中,channel之间的通信可以用空结构体作为信号量。
在介绍了struct的定义后,接着介绍struct的使用,我们可以定义一个所有成员都取默认值的struct变量
var p1 Persion
p2 := Persion{ "Scott",1,30} 也可以在定义变量的同时赋予初始值
这种赋值方式要求赋值顺序一定要和struct成员的定义顺序保持一致,现任这对于写代码非常不方便,
p3 :=Persion{name:"lili",gender:1,age:30}
这种方式可以解决struct比较复杂时的赋值问题,也是比较常见的方式,注意,在这种方式里,person和p3赋值语句是在一个包内完成的,如果要在其他包使用persion创建变量并赋值则会报错,因为成员首字母全部为小写
struct成员的可见性是通过首字母大小写控制的,首字母小写仅本包可见,首字母大写则包外可见
如果我们要访问struct变量内的具体某个成员,则可以使用p3.name 类似的写法
这里请注意struct内成员的可见性,上面的代码仅当与Person的定义在同一包内时才不会报错。结构体作为复合结构也是值传递的,所以在使用结构体的时候一定要注意与指针的结合,使用指针来传递可以提高效率,避免数组的赋值。
结构体指针的定义非常简单,就是在struct类型前面加上* var pp *Person
pp就是Person这个struct指针类型的变量,上面的例子中pp是nil值,结构体指针本质上就是指针,所以其默认值是nil,如果在上例中调用pp.name则会报错,因为pp此时还没初始化
结构化指针必须初始化以后才可以使用,因为如果仅仅声明结构体指针类型变量,其默认值是nil
很多时候我们都需要先初始化一个struct,然后将其地址引用返回给一个结构体指针变量,故而go语言专门提供了一个new函数
pp := new(Person)
pp.name = "lili"
这里pp还是指向struct的指针,但new函数已经为我们初始化了一个结构体,再继续为结构体的name赋值就不会报错
首先定义了一个结构体 struct,注意属性都是首字母大写,说明是包外可访问的
AddAgePlus采用struct指针作为参数,属性Age+1 以后,没有返回值
先创建p1变量,然后p2接收Addage函数的返回值,接着打印。p1没有任何改变,p2的Age属性+1。说明AddAgefunc 是值传递的,其函数体内的操作并没有对p1产生影响。
前面介绍了make函数,本节又介绍了new函数,此处将二者对比。make函数用于slice,map,channel进行内存分配,它返回的不是指针,而是类型本身。new函数返回初始化的类型对应的指针,new函数主要用于struct初始化中。
组合
struct是golang中最常用的数据类型,go是支持面向对象编程的,但是没有继承。那么go是通过什么方法实现类似继承的效果呢,那就是通过struct的组合,go语言推荐使用struct组合来达到代码复用的效果,并以此实现类似继承的功能
struct组合涉及多个struct,一个struct可以包含有其他struct,以此达到复用效果。
虽然struct可以含有其他struct但是不可以含有自身,也就是说一个struct的成员不可以是本struct。不过struct内的成员可以是指向自己的指针
先定义了一个struct person
然后定义Employee struct ,里面包含了Person结构,吧person作为Emplloyee的一个字段
定义了一个student struct ,这是匿名字段的用法,只需要写类型即可,当要访问内部结构体的字段时,不需要按照完整路径去写,在结构体下直接访问内部结构体的字段即可。也可以带上匿名字段。
其实struct的用法更为灵活,可以在定义的时候使用tags,是struct字段与json数据库建立关系。
golang中struct相关推荐
- golang中struct字段
golang中struct字段名首字母必须大写,不然json无法解析 golang中struct字段后面json字段要小写或小写加下划线 golang中首字母大写表示共有
- golang 中 map 转 struct
golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...
- golang中如何比较struct,slice,map是否相等以及几种对比方法的区别
一.前言 对比两个struct或者map,slice是否相等是大家经常会有的需求,想必大家也都接触过很多对比的方式,比如==,reflect.DeepEqual(),cmp.Equal()等. 这么多 ...
- Golang中Buffer高效拼接字符串以及自定义线程安全Buffer
本文原创文章,转载注明出处,博客地址 https://segmentfault.com/u/to... 第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. Go中可以使用"+ ...
- 初步解读Golang中的接口相关编写方法
初步解读Golang中的接口相关编写方法 概述如果说goroutine和channel是Go并发的两大基石,那么接口是Go语言编程中数据类型的关键.在Go语言的实际编程中,几乎所有的数据结构都围绕接口 ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- onclick如何调用含参函数_在 golang 中如何调用私有函数(绑定隐藏的标识符)
名字在 golang 中的重要性和在其他任何一种语言是一样的.他们甚至含有语义的作用:在一个包的外部某个名字的可见性是由这个名字首字母是否是大写来决定的. 有时为了更好的组织代码或者在其他包使用某些隐 ...
- golang判断结构体为空_如何在Golang中检查结构是否为空?
golang判断结构体为空 The size of an empty structure is zero in Golang. Here, empty structure means, there i ...
- go语言os.exit(1)_在Golang中各种永远阻塞的姿势
在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...
最新文章
- C++11 的新特性
- Crontab使用详解
- CF1385E Directing Edges 拓扑序
- C++:05---class和struct
- 怎样在CSDN的博客里面显示上传的图片,教你一招
- 电力三维基础信息平台
- matlab的GUI实验——实现简单信号发生器
- qt串口通信_Qt编写气体安全管理系统29-跨平台
- 批处理向FTP上传指定属性的文件 批处理增量备份的例子
- PowerDesign的基本使用
- 固态硬盘接口类型介绍
- 这个好像、也许、或许、大概、应该、Maybe真的可以算是传说中的Spring.Net了吧...
- php 微信公众号跳转小程序,PHP微信公共号H5页面跳转小程序。
- 安卓上利用百度输入法提供的导入词库与个性短语,批量造词方便输入
- 天虹数科Java笔试题B
- matplotlib之pyplot画饼图(pie)
- 使用turtle库绘制倒计时数码管
- 近十年来出现的计算机术语,近十年来科技英语翻译研究评述(2003—2012).doc
- java中文资源收集
- 在?快来pick你最喜爱的团队!