在Golang中实现模板方法模式的优雅方法

user6256186:

有没有一种优雅的规范方法可以在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

模板方法模式在真实场景中的实现

如何在Kotlin中实现模板方法设计模式?

具有不同已实现方法参数的模板方法模式

在 Python 中的“模板方法模式”继承中,对从基类继承的方法使用派生类上已实现方法的签名

具有实现特定参数类型的模板方法模式

在Java中实现工厂模式的最佳方法

在React中实现模式的正确方法

实现模板化模板方法

C ++-在单独的文件中实现内部模板类的模板方法

了解模板方法模式

从Golang的父级实现方法中调用子级方法

实现在Java中运行异步作业的优雅取消的最佳方法

有没有更优雅的方法可以在Swift中编写这种惰性加载模式?

在此uint8数组中搜索模式的更优雅方法

检查R中丢失数据模式的最优雅方法是什么?

没有<>的模板方法实现

在golang中是否有一些优雅的方法可以暂停和恢复其他goroutine?

在Django模板中实现当前月份的简单方法?

模板方法模式-命名约定

在python函数中实现不同模式的最佳方法

Javascript 中的自定义方法实现模式

重命名Java中Observer模式的实现方法

如何在异步方法中实现InvokeRequired UI模式?

在python中实现观察者模式的替代方法

在JavaScript中实现模块模式功能的最佳方法?

在 Bootstrap 5 中实现暗/亮/...模式的最合适方法?

如何为图像对象实现Java模板方法设计模式:BufferedImage,Image,ImageIcon

牛顿方法是否有更优雅的Go实现?

Javascript重构-实现ES6类的优雅方法