Golang - 方法接收器

时间:2014-08-16 20:49:35

标签: methods syntax go

Golang方法接收器采用类型以及类型的变量名称,例如:

type MyFloat float64

func (x MyFloat) Abs() float64 {
    if x < 0 {
        return float64(-x)
    }
    return float64(x)
}

func main() {
    f := MyFloat(-math.Sqrt2)
    fmt.Println(f.Abs())
}

接收方将"x"与接收方法的类型一起使用。名字'x'的意义是什么?因为我能够在MyFloat的任何实例上调用该方法(不仅仅是在名为x的实例上)为什么我必须指定x?由于接收器是Type或对类型的引用,为什么不像这样单独使用类型或指针

func (MyFloat) Abs() float64 {
    if this < 0 {
        return float64(-this)
    }
    return float64(this)
}

我的假设是Java而不是this golang允许任何名字?是这样吗?

3 个答案:

答案 0 :(得分:3)

您的假设是准确的:接收器必须在方法定义中明确命名。它避免了任何歧义。在您的示例中,Go编译器如何猜测x是接收器?

请注意使用&#34; self&#34;或者&#34;这个&#34;或者&#34;我&#34;因为接收者名称被认为是糟糕的风格。这个名字应该很短 - 一封信很好。请在https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Names

查看更多信息

答案 1 :(得分:0)

我认为你没有正确使用你应该在struct中使用它。接收者引用struct的字段。

例如:

package main
import "fmt"

type Decimal struct {
    first float64
}

func (x Decimal) out() float64 {
    return x.first
}
func main() {
    var start Decimal
    start.first = 10.8
    show := start.out()
    fmt.Println(show)
}

答案 2 :(得分:0)

这是一个设计选择。

Java使用this,Go-lang选择其他机制。

在Go中,使接收器成为指针是合法的。

让我们看看:

func (t Type)  Id()  { return t }
func (t *Type) IdPointer() { return t }

如果Go使用Java的设计会怎样?

它将成为:

func (Type)  Id()  { return this }
func (*Type) IdPointer() { return this }

首先,对于(*Type)是什么感到困惑。

其次,这也可以是指针或值。也很困惑。

但是,无论如何,你可以像这样设计Go-lang。

毕竟这是一个选择。