存储为值的接口;无法更新结构字段的方法

我有一个我正在编写的工具,它公开了一些函数,这些函数从静态数据库中提取信息到我嵌入到该工具中的几种脚本语言。


我想; “嘿,听起来是个不错的接口用例”。所以我在我的包脚本中定义了一个这样的接口


type ScriptingLang interface {

    RunScript(filename string) error

    RunString(s string) error

    Interpreter() error

    Init() error

    IsInit() bool

}

然后我存储它们的地图,以便我可以通过在不同包中这样定义的字符串来查找它们。


var ScriptingLangs = make(map[string]scripting.ScriptingLang)

和一个函数来注册它们。还有一些小助手功能,如


func RunString(lang, s string) error {

    if v, ok := ScriptingLangs[lang]; ok {

        if !v.IsInit() {

            v.Init()

        }

        return v.RunString(s)

    } else {

        return NoSuchLangErr

    }

    return nil

 }

我遇到的问题是接口不能有带有指针接收器的方法。因此,我实现 ScriptingLang 的 Lua 结构无法保存它的 *state,因为它存储在 ScriptingLangs 中。


我已经尝试在保存状态的函数结束时更新存储在地图中的值,但它没有更新该值。


据我了解,您不应该使用接口指针,那么我的选择是什么?我想真正保留接口,这样我就可以用 git 子模块做一些整洁的事情。


我的问题的一个最小例子:


package main


import (

    "fmt"

)


type ScriptingLang interface {

    DoString(s string) error

    Init() error

}


type Lua struct {

    state string

}


func (l Lua) DoString(s string) error {

    fmt.Printf("Doing '%v' with state '%v'\n", s, l.state)

    return nil

}


func (l Lua) Init() error {

    l.state = "Inited"

    return nil

}


var lang ScriptingLang


func main() {

    lang = Lua{}

    lang.Init()

    lang.DoString("Stuff")

}


qq_花开花谢_0
浏览 156回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go