golang中的struct操作


Posted in Golang onNovember 11, 2021

struct是实现面向对象的重要技术,基本上都跟类型声明type name underlying-type结合使用。

struct是值类型,所以它的零值是所有成员的零值。由于值类型在作为函数参数时的局限性,所以经常配合指针一起使用。

声明

type Employee struct {
    ID      int
    Name    string
    Address string
}

一行一个成员,中间没有逗号或分号,大写的成员可以在包外访问。

如果类型相同,也可以考虑定义在一行,例如

type Employee struct {
    ID            int
    Name, Address string
}

结构体中不能定义同名结构体的成员,但可以定义同名结构体的指针类型的成员,例如

type Employee struct {
    ID            int
    Name, Address string
	   Leader        *Employee		
}

初始化

可以在声明时直接初始化,也可以声明后再一个个赋值。先看一个最直接的方式。

var empl Employee
empl.ID = 1
empl.Name = "foo"
empl.Address = "nanshan"

还可以更快地初始化

empl2 := Employee{2, "foo", "nanshan"}

所以,声明成员的顺序非常重要。上面初始化的值必须与struct的成员一一对应,不多不少,类型上可赋值。

由于struct成员可能会调整,所以上面的代码就显得有些脆弱,下面改进一下,按照成员名称来初始化。

empl3 := &Employee{
    ID:      3,
    Name:    "foo",
    Address: "beijing",
}

这时候顺序不重要了,也不要求我完整性了,未直接赋值的成员继续保留零值。

与指针相关的操作

由于struct是值类型,如果作为参数传递的话,函数体内接收到的是一个拷贝,所以作为函数的参数时一般用结构体指针来传递。

emplPtr := &empl
emplPtr.Name = "bar" 		// 等同于 (*emplPtr).Name = "bar"

在使用struct指针类型的变量时,可以省略*,看上去就像struct是引用类型一样,其实它是一个结构体指针。

下面的函数初始化一个struct,并返回了它的指针

func EmployeeById(id int) *Employee {
    return &Employee{
        ID:      id,
        Name:    "foo",
        Address: "beijing",
    }
}

struct的可比较性

如果struct的每个成员都是可比较的,那么这个结构体就是可比较的。

比较算法为:如果每个成员的值都相等,则两个结构体变量相等,否则不相等。

如果结构体类型是可比较的,就意味着它可以作为map的key类型。

结构体嵌套和匿名成员

这是一个神奇的机制,当在结构体里面声明一个匿名结构体时,使用这个匿名结构体的成员时,就可以省略匿名结构体的名字,就好像当前的结构体拥有这个匿名结构体的成员一样。

下面的结构体,EmployeeManager,将上面的结构体Employee作为一个匿名成员

type EmployeeManager struct {
    Employee                // 匿名成员
    ManagerLevel int
}

初始化匿名成员:

var manager = EmployeeManager{
    Employee: Employee{
        ID:      2,
        Name:    "fooManager",
        Address: "beijing",
    },
    ManagerLevel: 4,
}

看上去中规中矩,没有什么神奇的。再来看看如何使用这个结构体

fmt.Println(manager.ManagerLevel)
fmt.Println(manager.Name)				//这一行
fmt.Println(manager.Employee.Name)		//等同于这一行

这么折腾,不仅是一种简化,更重要的是,我看出来了继承的味道,但从技术上看又不存在继承,而是组合,它即享受了继承的好处,又避免了继承的麻烦。

使用匿名结构体时,除了可以直接使用它的属性以外,还可以直接使用它的方法。

到此这篇关于golang中的struct的文章就介绍到这了,更多相关golang中struct内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
go 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
goland 设置project gopath的操作
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Golang表示枚举类型的详细讲解
Sep 04 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go 语言中 20 个占位符的整理
Oct 16 #Golang
Golang中channel的原理解读(推荐)
Oct 16 #Golang
Go语言并发编程 sync.Once
Oct 16 #Golang
Go 通过结构struct实现接口interface的问题
Oct 05 #Golang
golang实现一个简单的websocket聊天室功能
深入理解go slice结构
Sep 15 #Golang
Golang表示枚举类型的详细讲解
You might like
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
php多文件上传功能实现原理及代码
2013/04/18 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
2014/06/04 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
JQuery验证工具类搜集整理
2013/01/16 Javascript
JS解决ie6下png透明的方法实例
2013/08/02 Javascript
鼠标移到图片上变大显示而不是放大镜效果
2014/06/15 Javascript
JavaScript中的逻辑判断符&&、||与!介绍
2014/12/31 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
Python程序中的观察者模式结构编写示例
2016/05/27 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
python实现高斯投影正反算方式
2020/01/17 Python
浅析Python面向对象编程
2020/07/10 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
美国休闲服装品牌:Express
2016/09/24 全球购物
公务员个人自我评价分享
2013/11/06 职场文书
精彩的推荐信范文
2013/11/26 职场文书
上课迟到检讨书
2014/01/19 职场文书
运动会入场解说词300字
2014/01/25 职场文书
勤俭节约倡议书
2014/04/14 职场文书
中国文明网向国旗敬礼寄语大全
2014/09/27 职场文书
党员公开承诺书2016
2016/03/24 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js