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允许任何名字?是这样吗?
答案 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。
毕竟这是一个选择。