有没有一种优雅的规范方法可以在Go中实现模板方法模式?在C ++中,它看起来像这样:
#include <iostream>
#include <memory>
class Runner {
public:
void Start() {
// some prepare stuff...
Run();
}
private:
virtual void Run() = 0;
};
class Logger : public Runner {
private:
virtual void Run() override {
std::cout << "Running..." << std::endl;
}
};
int main() {
std::unique_ptr<Runner> l = std::make_unique<Logger>();
l->Start();
return 0;
}
在golang中,我这样写:
package main
import (
"fmt"
"time"
)
type Runner struct {
doRun func()
needStop bool
}
func (r *Runner) Start() {
go r.doRun()
}
func NewRunner(f func()) *Runner {
return &Runner{f, false}
}
type Logger struct {
*Runner
i int
}
func NewLogger() *Logger {
l := &Logger{}
l.doRun = l.doRunImpl
return l
}
func (l *Logger) doRunImpl() {
time.Sleep(1 * time.Second)
fmt.Println("Running")
}
func main() {
l := NewLogger()
l.Start()
fmt.Println("Hello, playground")
}
但是此代码会因运行时空指针错误而失败。基本思想是将某种功能从派生类(结构)混合到基类例程中,以便可以从此混入派生例程中获得基类状态。
Logger
嵌入一个指针,当您分配结构时该指针将为nil。这是因为嵌入不会将所有内容都放入结构中,而是实际上会创建一个字段(在您的情况下Runner
为type 命名*Runner
),并且语言为您提供了一些语法糖来访问其中的内容。就您而言,这意味着您可以通过Runner
两种方式访问字段:
l := Logger{}
l.needStop = false
//or
l.Runner.needStop = false
要修复该错误,您需要像这样分配Runner
字段Logger
:
l := Logger{Runner:&Runner{}}
或按值嵌入而不是指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句