英文:
Why does specifying a Method Receiver sometimes trigger an 'undefined' error?
问题
我以为我理解了Go的类和方法接收器,但显然不是这样。它们通常很直观,但是这里有一个例子,使用一个方法似乎会导致一个“undefined: Wtf”错误:
package main
type Writeable struct {
seq int
}
func (w Writeable) Wtf() { // 这里会导致编译错误
//func Wtf() { // 如果你使用这个代替,它就能工作
}
func Write() {
Wtf() // 这是编译器抱怨的那一行
}
func main() {
}
我使用的是最近一个月左右从golang下载的编译器,以及LiteIDE。请解释一下!
英文:
I thought I understood Go's classes and Method Receivers, but apparently not. They generally work intuitively, but here's an example where using one appears to cause an 'undefined: Wtf' error:
package main
type Writeable struct {
seq int
}
func (w Writeable) Wtf() { // causes a compile error
//func Wtf() { // if you use this instead, it works
}
func Write() {
Wtf() // this is the line that the compiler complains about
}
func main() {
}
I am using a compiler downloaded from golang within the last month or so, and LiteIDE. Please explain!
答案1
得分: 2
你正在将Wtf()定义为Writeable的一个方法。然后你试图在没有结构实例的情况下使用它。我修改了你的代码,创建了一个结构并将Wtf()作为该结构的方法使用。现在它可以编译通过。http://play.golang.org/p/cDIDANewar
package main
type Writeable struct {
seq int
}
func (w Writeable) Wtf() { // 导致编译错误
//func Wtf() { // 如果你使用这个代替,它可以工作
}
func Write() {
w := Writeable{}
w.Wtf() // 这是编译器抱怨的那一行
}
func main() {
}
英文:
You're defining Wtf() as a method of Writeable. Then you're trying to use it without a struct instance. I changed your code below to create a struct and then use Wtf() as the method of that struct. Now it compiles. http://play.golang.org/p/cDIDANewar
package main
type Writeable struct {
seq int
}
func (w Writeable) Wtf() { // causes a compile error
//func Wtf() { // if you use this instead, it works
}
func Write() {
w := Writeable{}
w.Wtf() // this is the line that the compiler complains about
}
func main() {
}
答案2
得分: 1
关于接收器的要点是,你必须使用receiver.function()
的形式在其上调用函数。
如果你希望Wtf
可以在没有接收器的情况下被调用,可以将其声明更改为
func Wtf() {
如果你希望在不改变它的情况下调用它,可以写成
Writeable{}.Wtf()
英文:
The point about the receiver is that you must call the function on it with receiver.function()
If you want Wtf
to be callable without a receiver, change its declaration to
func Wtf() {
If you want to call it without changing it, you may write
Writeable{}.Wtf()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论