gpt4 book ai didi

go - Go 编程语言中的 "method requires pointer receiver"

转载 作者:IT老高 更新时间:2023-10-28 13:04:14 25 4
gpt4 key购买 nike

我刚刚看到了 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() 会影响函数外部的实体。我应该使用什么语法?

/瑞奇

最佳答案

我认为这里有些困惑。 inc*entity 类型的方法,而不是 entity 类型的方法(虽然您可以直接在指针上调用值的方法;您通常不能直接在值上调用指针上的方法)。您可能会感到困惑的是,为什么您可以调用 e.inc(),而不必执行 (&e).inc()。这是一个鲜为人知的特殊情况,记录在 Calls 的底部。语言规范中的部分,说明如果 x 是可寻址的,并且 &x 的方法集包含 m,则 x.m() (&x).m() 的简写。这适用于这种情况,因为 e 是一个变量,所以它是可寻址的;但其他表达式可能无法寻址。但是,我建议您不要使用此快捷方式,因为它会引起混淆;它让你认为 e 符合接口(interface) inter,而实际上它不符合。

关于go - Go 编程语言中的 "method requires pointer receiver",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7438323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com