[英]“method requires pointer receiver” in Go Programming Language
我刚刚看到了Go编程语言的演示文稿,并认为我试着写几行。 一切正常,直到我尝试在这种情况下使用接口。 我该如何解决这个问题?
package main
import "fmt"
type entity float32
func (e *entity) inc() {
*e++
}
type incer interface {
inc()
}
func doSomething(i incer) {
i.inc()
}
func main() {
fmt.Println("Hello, 世界")
var e entity = 3
e.inc()
doSomething(e)
fmt.Println(e)
}
我收到编译器错误:
prog.go:24: cannot use e (type entity) as type incer in function argument:
entity does not implement incer (inc method requires pointer receiver)
我想使用指针,以便inc()将影响函数外部的enity。 我应该使用什么语法?
/瑞奇
我认为这里有一些混乱。 inc
是类型*entity
的方法,而不是类型entity
(虽然你可以直接在指针上调用值的方法;你通常不能直接在值上调用指针上的方法)。 您可能会感到困惑的是为什么您可以调用e.inc()
,而不必执行(&e).inc()
。 这是一个鲜为人知的特殊情况,记录在语言规范的Calls部分的底部,表示如果x
是可寻址的,并且&x
的方法集包含m
,那么xm()
是(&x).m()
缩写(&x).m()
。 这适用于这种情况,因为e
是一个变量,所以它是可寻址的; 但其他表达方式可能无法解决。 但是,我建议您不要使用此快捷方式,因为它会导致混淆; 它会让你认为e
符合inter
界面,而不是。
将其更改为:doSomething(&e)。 func(e * entity)inc()只满足*实体类型的incer接口。 只有实体类型没有inc(),这就是你传递给doSomething()的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.