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 相关文章推荐
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
golang fmt格式“占位符”的实例用法详解
Jul 04 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 入门 之url 包
May 04 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代码
2013/12/03 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
python创建一个最简单http webserver服务器的方法
2015/05/08 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
德国拖鞋网站:German Slippers
2019/11/08 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
干部培训自我鉴定
2014/01/22 职场文书
浪费资源的建议书
2014/03/12 职场文书
努力学习保证书
2015/02/26 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
公司更名通知函
2015/04/24 职场文书
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers