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

Ric*_*son 17 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)
}
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误:

prog.go:24: cannot use e (type entity) as type incer in function argument:
entity does not implement incer (inc method requires pointer receiver)
Run Code Online (Sandbox Code Playgroud)

我想使用指针,以便inc()将影响函数外部的enity.我应该使用什么语法?

/瑞奇

new*_*cct 22

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