Go编程语言中的“方法需要指针接收器”

时间:2011-09-15 22:47:29

标签: go

我刚刚看到了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。我应该使用什么语法?

/瑞奇

2 个答案:

答案 0 :(得分:22)

我认为这里有一些混乱。 inc*entity类型的方法,而不是entity类型的方法(虽然您可以直接在指针上调用值的方法;通常不能直接在值上调用指针上的方法) 。您可能会感到困惑的是,为什么您可以拨打e.inc()而不必执行(&e).inc()。这是一个鲜为人知的特殊情况,记录在语言规范的Calls部分的底部,表示x是否可寻址,&x的方法集包含{{1 }},然后mx.m()的简写。这适用于这种情况,因为(&x).m()是一个变量,所以它是可寻址的;但其他表达方式可能无法解决。但是,我建议您不要使用此快捷方式,因为它会导致混淆;它会让您认为e符合界面e,而不是{。}}。

答案 1 :(得分:4)

将其更改为:doSomething(& e)。 func(e * entity)inc()只满足*实体类型的incer接口。只有实体类型没有inc(),这就是你传递给doSomething()的内容。