- 前言
- 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.1 结构体指针
之前的章节我们已经讨论过指针,本节我们会继续指针的讨论并且提供一个与结构体指针的示例,pointerStruct.go
。
第一部分代码:
> package main
>
> import "fmt"
>
> type myStructure struct {
> Name string
> Surname string
> Height int32
> }
>
> func createStructure(n,s string, h int32) *myStructure {
> if h > 300 {
> h = 0
> }
> return &myStructure{n, s, h}
> }
相对于直接初始化一个结构体变量,createStructure()
提供了一种更加优雅的方法,不仅能够检查赋予结构体字段的值的正确性和有效性,而且当出问题之后,能够很快找到问题所在。注意一下该函数的命名,命名为NewStructure()
是比较妥当的。
对于有C/C++背景的开发者来说,Go函数返回局部变量的内存地址是很容易理解的,所以Go的这种设计皆大欢喜!
第二部分:
> func retStructure(n,s string, h int32) myStructure {
> if h > 300 {
> h = 0
> }
> return myStructure{n, s, h}
> }
这部分实现了createStructure()
的无指针版本,两个函数的效果都是一样的,所以选择哪一种就看开发者的喜好了。其实这两个函数命名为NewStructurePointer()
和NewStructure()
是比较规范的。
最后一部分代码:
> func main() {
> s1 := createStructure("Mihalis","Tsoukalos",123)
> s2 := retStructure("Mihalis","Tsoukalos",123)
> fmt.Println((*s1).Name)
> fmt.Println(s2.Name)
> fmt.Println(s1)
> fmt.Println(s2)
> }
执行pointerStruct.go
我们得到下面的输出:
$ go run pointerStruct.go
Mihalis
Mihalis
&{Mihalis Tsoukalos 123}
{Mihalis Tsoukalos 123}
通过输出你能够发现createStructure()
和retStructure()
的主要区别,就是前者返回指向结构体的指针,这意味着你在想获取结构体内字段值的时候,就必须先解引用,有些人会觉得这种操作不太优雅。
结构体是一个非常重要的概念,在实战中会经常用到,它能够帮你把很多不同类型的变量聚合到一起,然后依次处理。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论