结构体指针

之前的章节我们已经讨论过指针,本节我们会继续指针的讨论并且提供一个与结构体指针的示例,pointerStruct.go

第一部分代码:

  1. package main
  2. import "fmt"
  3. type myStructure struct {
  4. Name string
  5. Surname string
  6. Height int32
  7. }
  8. func createStructure(n,s string, h int32) *myStructure {
  9. if h > 300 {
  10. h = 0
  11. }
  12. return &myStructure{n, s, h}
  13. }

相对于直接初始化一个结构体变量,createStructure()提供了一种更加优雅的方法,不仅能够检查赋予结构体字段的值的正确性和有效性,而且当出问题之后,能够很快找到问题所在。注意一下该函数的命名,命名为NewStructure()是比较妥当的。

对于有C/C++背景的开发者来说,Go函数返回局部变量的内存地址是很容易理解的,所以Go的这种设计皆大欢喜!

第二部分:

  1. func retStructure(n,s string, h int32) myStructure {
  2. if h > 300 {
  3. h = 0
  4. }
  5. return myStructure{n, s, h}
  6. }

这部分实现了createStructure()的无指针版本,两个函数的效果都是一样的,所以选择哪一种就看开发者的喜好了。其实这两个函数命名为NewStructurePointer()NewStructure()是比较规范的。

最后一部分代码:

  1. func main() {
  2. s1 := createStructure("Mihalis","Tsoukalos",123)
  3. s2 := retStructure("Mihalis","Tsoukalos",123)
  4. fmt.Println((*s1).Name)
  5. fmt.Println(s2.Name)
  6. fmt.Println(s1)
  7. fmt.Println(s2)
  8. }

执行pointerStruct.go我们得到下面的输出:

$ go run pointerStruct.go

Mihalis

Mihalis

&{Mihalis Tsoukalos 123}

{Mihalis Tsoukalos 123}

通过输出你能够发现createStructure()retStructure()的主要区别,就是前者返回指向结构体的指针,这意味着你在想获取结构体内字段值的时候,就必须先解引用,有些人会觉得这种操作不太优雅。

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