Methods 方法接收器

Methods 方法接收器,methods,syntax,go,Methods,Syntax,Go,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()) } 我的假设是,在Java中,golang允

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

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

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


请注意,使用“self”或“this”或“me”作为接收方名称在go中被认为是不好的风格。名字应该很短——一个字母就可以了。请参阅

中的更多信息。我认为您没有正确地使用它,您应该在结构中使用它。如果接收者引用结构的字段

例如:

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)
}
这是一种设计选择

Java使用
,Go lang选择另一个机械师

在围棋中,让接受者成为或不是指针是合法的

让我们看看:

func (t Type)  Id()  { return t }
func (t *Type) IdPointer() { return t }
如果使用Java的设计呢

它将成为:

func (Type)  Id()  { return this }
func (*Type) IdPointer() { return this }
首先,混淆了什么是
(*类型)

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

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


毕竟这是一种选择。

它说“不要使用诸如“me”、“this”或“self”之类的通用名称,这些标识符是面向对象语言的典型标识符,它们更强调方法而不是函数”。绑定到接收器的函数是一种方法。这是一个有效的stmt吗?如果是的话,我不完全理解为什么使用this或self是不好的,因为它会强调方法作用于类型实例的事实?好问题。我无法理解,为什么go语言创建者(参见变量大小写等确定可见性)的“约定优先于配置”策略会使
的名称可配置。一个方法中是否可能有两个接收器,或者为什么有人需要这样做
这是任何人都可以很快习惯的惯例。
func (Type)  Id()  { return this }
func (*Type) IdPointer() { return this }