返回介绍

04.2.1 结构体指针

发布于 2024-08-14 12:50:32 字数 4632 浏览 0 评论 0 收藏 0

之前的章节我们已经讨论过指针,本节我们会继续指针的讨论并且提供一个与结构体指针的示例,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文