我已经到了我的Go项目中的一个点,我想创建一个基类的多个子类,并且能够通过基类/接口变量操作子类的实例(我' m使用“class”这个词,即使这个概念在Go中并不存在。
以下是C ++中的内容,只是为了表明我的意思:
#include <iostream>
using namespace std;
class Base {
public:
int x,y;
virtual void DoStuff() {};
};
class Thing : public Base {
public:
void DoStuff() { x = 55; y = 99; }
};
Base *gSomething;
int main(int argc, char **argv) {
gSomething = new Thing();
gSomething->DoStuff();
cout << "gSomething = {" << gSomething->x << ", " << gSomething->y << "}" << endl;
return 0;
}
这将打印“gSomething = {55,99}”。 作为Go的新手,我希望能做到这样的事情(我感觉相当干净):
package main
import "fmt"
type IBase interface {
DoStuff()
}
// The base "class"
type Base struct {
x, y int
}
// A more specific variant of Base
type Thing struct {
Base
}
func (o Base) DoStuff() {
// Stub to satisfy IBase
}
func (o Thing) DoStuff() {
o.x, o.y = 55, 99
fmt.Println("In Thing.DoStuff, o = ", o)
}
var Something IBase
func main() {
Something = new (Thing)
Something.DoStuff()
fmt.Println("Something = ", Something)
}
唉,这不起作用。它编译,似乎运行正常,但我没有得到我想要的结果。这是打印输出:
在Thing.DoStuff中,o = {{55 99}}
某事=&amp; {{0 0}}
我显然希望最后一次打印说“Something =&amp; {{55 99}}”
我完全不参与此设计(这是不是可以在Go中完成),还是我只是错过了一些小细节?
答案 0 :(得分:5)
您的func (o Thing) DoStuff()
有一个类型为Thing struct
的接收器,并且结构在Go中按值传递。如果要修改结构(而不是它的副本),则必须通过引用传递它。将此行更改为func (o *Thing) DoStuff()
,您应该会看到预期的输出。