我刚刚看到了 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)
我想使用指针,以便 ink() 影响函数外部的实体。我应该使用什么语法?
/Ricky
我认为这里有些混乱。inc
是该类型的方法*entity
,并且不属于该类型entity
(虽然您可以直接在指针上调用值的方法;但通常不能直接在值上调用指针的方法)。您可能会感到困惑的是为什么您可以打电话e.inc()
,而不是必须做(&e).inc()
。这是一个鲜为人知的特殊情况,记录在底部Calls http://golang.org/doc/go_spec.html#Calls语言规范中的部分,表示如果x
是可寻址的,并且&x
的方法集包含m
, then x.m()
是简写(&x).m()
。这适用于本例,因为e
是一个变量,所以它是可寻址的;但其他表达式可能无法寻址。但是,我建议您不要使用此快捷方式,因为它会导致混乱;这让你觉得e
符合接口inter
,而事实并非如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)