【问题标题】:Pointer operator -> for golang指针运算符 -> 用于 golang
【发布时间】:2014-02-18 17:02:58
【问题描述】:

似乎 golang 没有像 C 和 C++ 那样的指针运算符 -> 。现在假设我有一个看起来像这样的函数:myfun(myparam *MyType),在函数内部,如果我想访问 MyType 的成员变量,我必须做 (*myparam).MyMemberVariable。在 C 和 C++ 中执行 myparam->MyMemberVariable 似乎要容易得多。

我很陌生。不确定我是否遗漏了什么,或者这不是正确的方法?

谢谢。

【问题讨论】:

    标签: pointers go operator-keyword


    【解决方案1】:

    可以myparam.MyMemberValue,指针会自动解引用

    Go spec:

    选择器自动取消引用指向结构的指针。如果 x 是指向结构的指针,则 x.y 是 (x).y 的简写;如果字段 y 也是指向结构的指针,则 x.y.z 是 ((*x).y).z 的简写,依此类推。如果 x 包含 *A 类型的匿名字段,其中 A 也是结构类型,则 x.f 是 (*x.A).f 的简写。

    【讨论】:

      【解决方案2】:

      在 Go 中,->. 都由 . 表示

      编译器知道类型,必要时可以取消引用。

      package main
      
      import "fmt"
      
      type A struct {
          X int
      }
      
      func main() {
          a0, a1 := A{42}, &A{27}
          fmt.Println(a0.X, a1.X)
      }
      

      【讨论】:

      • 感谢您的回答。我真正的问题是 os.Lstat(path string) 声称返回 os.FileInfo,但是,os.Lstat 实现实际上返回了 &fileStat{...},我认为它是一个指针。 os.FileInfo 是一个接口,但是,Lstat 返回一个 pinter 类型的 os.fileStat,它实现了 os.FileInfo。我想知道在go中是否可以用指针类型替换接口类型?我真的很困惑。
      • 或许澄清一下你的想法,然后再问第二个问题?
      • 这一切都归结为什么(指针或原始类型)实现了该方法。如果指针接收器有所需的方法,那么将指针返回到需要接口的地方就完美了。
      【解决方案3】:
      Goes uses -> for passing data by using channels.
      
      package main
      
      import "fmt"
      
      type Person struct {
          Name string
      }
      
      func (p *Person) printName() {
          p.Name = "brian"
      }
      
      func main() {
          // obj
          brian := Person{""}
      
          // prints obj default value
          fmt.Println("No pointer", brian.Name) 
      
          // it access the method with the pointer
          brian.printName()
      
          // prints the result 
          fmt.Println("With a pointer", brian.Name)
      }
      

      【讨论】:

        【解决方案4】:

        嗯,这种自动取消引用可能会非常令人困惑(对于像我这样的老程序员)

        1. 如果你用 GOLANG 学编程,没问题,很实用。
        2. 如果您从 C 传递到 GOLANG,这看起来很奇怪,您可能更喜欢(至少在开始时)保留“(*my_var).my_field”表达式而不是“my_var.myfield”
        3. 如果你从 GOLANG 传递到 C,你会得到很多编译错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-11
          • 1970-01-01
          • 1970-01-01
          • 2013-07-22
          • 1970-01-01
          • 2011-05-09
          • 2011-05-14
          • 2021-06-08
          相关资源
          最近更新 更多