- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
04.2 结构体
数组,切片,映射这类数据结构的确很有用,但是它们不能将多个值聚合到同一个地方。如果你想要将不同类型的不同变量聚合到一个地方以创建一个新的类型,那么结构体会满足你的需要。结构体中的不同元素叫做结构体的字段。
本章我们以一个简单的结构体为例来讲解,上一章的sortSlie.go
中我们定义过一个结构体:
> type aStructure struct {
>
> person string
>
> height int
>
> weight int
> }
其实结构体的字段通常是大写字母开头,这个原因我们将在第六章中具体说明,这个习惯会贯穿本书接下来的内容。
这个结构体有三个字段,分别是person,height,weight
。现在,你可以创建一个类型为aStructure
的变量了:
var s1 aStructure
另外,我们使用.
操作符来访问结构体中的字段,例如我们可以使用s1.person
来获取person
字段的值。
一个结构体字面量可以这样定义:
p1 := aStructure{"fmt",12,-2}
然而你可能觉得记住结构体中字段的声明顺序实在是太难了,莫慌,我们有另外一种定义结构体字面量的方式:
p1 := aStructure{weight: 12, height:-2}
这种方式你无须初始化结构体中的所有字段。
现在你已经了解了结构体的基本操作,让我们尝试一些实战性更强的代码吧,这部分代码保存在structures.go
中,分为三部分。
第一部分代码:
> package main
>
> import "fmt"
>
> func main(){
> type XYZ struct {
> X int
> Y int
> Z int
> }
>
> var s1 XYZ
> fmt.Println(s1.Y, s1.Z)
Go结构体通常来说是定义在
main()
函数外面的,这样在整个Go package中可以拥有全局的属性,除非你不想让你的结构体在任何地方都被访问到,这种情况下你可以定义局部的结构体。
第二部分代码:
> p1 := XYZ{23,12, -2}
> p2 := XYZ{Z:12,Y:13}
>
> fmt.Println(p1)
> fmt.Println(p2)
我们使用两种定义结构体字面量的方式定义了p1
与p2
,并且打印出来。
最后一部分:
> pSlice := [4]XYZ{}
> pSlice[2] = p1
> pSlice[0] = p2
>
> fmt.Println(pSlice)
>
> p2 = XYZ{1,2,3}
> fmt.Println(pSlice)
> }
最后一部分代码中,我们创建了一个结构体数组pSlice
,当你将一个结构体分配给结构体数组,那么这个结构体就会被深拷贝至这个数组,这意味着改变原结构体是对数组中的结构体没有影响的,从下面的打印输出中我们能够看出来:
$ go run structures.go
0 0 {23 12 -2} {0 13 12} [{0 13 12} {0 0 0} {23 12 -2} {0 0 0}]
[{0 13 12} {0 0 0} {23 12 -2} {0 0 0}]
注意,结构体中字段的定义顺序是有意义的,简单来说,就算两个结构体拥有相同的字段,但是字段的声明顺序不同,那么这两个结构体也是不相等的。
从程序输出中我们能够知道,结构体中的变量是初始化为其类型的零值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论