pointers - Golang 指针

标签 pointers go

我目前正在学习使用 Go 语言进行编程。 我在理解 Go 指针时遇到了一些困难(而且我的 C/C++ 现在还很远......)。 例如,在 Tour of Go #52 (http://tour.golang.org/#52) 中,我读到:

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := &Vertex{3, 4}
    fmt.Println(v.Abs())
}

但如果不是

func (v *Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}

我写道:

func (v Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}

甚至:

func (v Vertex) Abs() float64 {
[...]
v := &Vertex{3, 4}

反之亦然:

func (v *Vertex) Abs() float64 {
[...]
v := Vertex{3, 4}

我得到了完全相同的结果。有区别吗(内存方面等)?

最佳答案

您的示例使用了两种不同的 Go 语言规则:

  1. 可以从带有值接收器的方法派生带有指针接收器的方法。因此 func (v Vertex) Abs() float64 会自动生成一个额外的方法实现:

    func (v Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
    func (v *Vertex) Abs() float64 { return Vertex.Abs(*v) }  // GENERATED METHOD
    

    编译器会自动查找生成的方法:

    v := &Vertex{3, 4}
    v.Abs()  // calls the generated method
    
  2. Go 可以自动获取变量的地址。在以下示例中:

    func (v *Vertex) Abs() float64 { return math.Sqrt(v.X*v.X+v.Y*v.Y) }
    func main() {
        v := Vertex{3, 4}
        v.Abs()
    }
    

    表达式 v.Abs() 等价于以下代码:

    vp := &v
    vp.Abs()
    

关于pointers - Golang 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096329/

相关文章:

c++ - 函数的返回值未被识别为左值

c - 通过 const 指针传递与通过内置类型的值传递。效率

c - 在 C 中定义一个全局结构指针?

c++ - struct 中的 vector 指针无法转换 main 中的 vector ,这是怎么回事?

c++ - 指向数组的指针,然后获取完整的数组 C++

json - 自定义编码到 bson 和 JSON(Golang 和 mgo)

Golang time - 时区显示两次

go - 使用什么类型来正确处理奇数美分的划分? (或任何货币的最小单位)

javascript - 如何使用 Javascript 设置下拉列表的默认值

go - cmd 行参数字符串。包含与硬编码参数不同的行为