【问题标题】:Method receivers方法接收器
【发布时间】:2014-08-16 20:49:34
【问题描述】:

Go 方法接收器接受一个类型以及该类型的变量名,例如:

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 ?既然接收者是一个类型或一个类型的引用,为什么不简单地像这样单独获取类型或指针

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

我的假设是Java golang 中的this 允许任何名称?是这样吗?

【问题讨论】:

  • 好问题。这超出了我的理解,为什么“约定优于配置”警察又名 go 语言创建者(参见例如变量的大写等确定可见性)将使 this 的名称可配置。一个方法中是否可以有两个接收器,或者为什么有人需要它? this 是任何人都可以立即习惯的约定。

标签: methods syntax go


【解决方案1】:

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

请注意,使用“self”或“this”或“me”作为接收者名称在 go 中被认为是不好的样式。名字应该简短——一个字母就可以了。在https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Names查看更多信息

【讨论】:

  • 它说“不要使用诸如“me”、“this”或“self”之类的通用名称,这些标识符是面向对象语言的典型标识符,它们更加强调方法而不是函数”。绑定到接收器的函数是一种方法。这是一个有效的 stmt,如果是这样,我不完全理解为什么使用 this 或 self 会不好,因为它会强调该方法正在作用于一个类型的实例这一事实?
【解决方案2】:

我认为你没有正确使用它,你应该在结构中使用它。接收者在哪里引用结构的字段。

例如:

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)
}

【讨论】:

    【解决方案3】:

    这是一种设计选择。

    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。

    毕竟是一种选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多