结构体指针

之前的章节我们已经讨论过指针,本节我们会继续指针的讨论并且提供一个与结构体指针的示例,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()的主要区别,就是前者返回指向结构体的指针,这意味着你在想获取结构体内字段值的时候,就必须先解引用,有些人会觉得这种操作不太优雅。

结构体是一个非常重要的概念,在实战中会经常用到,它能够帮你把很多不同类型的变量聚合到一起,然后依次处理。

results matching ""

    No results matching ""