我刚刚看到了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。我应该使用什么语法?
/瑞奇
答案 0 :(得分:22)
我认为这里有一些混乱。 inc
是*entity
类型的方法,而不是entity
类型的方法(虽然您可以直接在指针上调用值的方法;通常不能直接在值上调用指针上的方法) 。您可能会感到困惑的是,为什么您可以拨打e.inc()
而不必执行(&e).inc()
。这是一个鲜为人知的特殊情况,记录在语言规范的Calls部分的底部,表示x
是否可寻址,&x
的方法集包含{{1 }},然后m
是x.m()
的简写。这适用于这种情况,因为(&x).m()
是一个变量,所以它是可寻址的;但其他表达方式可能无法解决。但是,我建议您不要使用此快捷方式,因为它会导致混淆;它会让您认为e
符合界面e
,而不是{。}}。
答案 1 :(得分:4)
将其更改为:doSomething(& e)。 func(e * entity)inc()只满足*实体类型的incer接口。只有实体类型没有inc(),这就是你传递给doSomething()的内容。