为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_花开花谢_0 2021-10-04 16:05:31
我有一个我正在编写的工具,它公开了一些函数,这些函数从静态数据库中提取信息到我嵌入到该工具中的几种脚本语言。我想; “嘿,听起来是个不错的接口用例”。所以我在我的包脚本中定义了一个这样的接口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 mainimport (    "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 ScriptingLangfunc main() {    lang = Lua{}    lang.Init()    lang.DoString("Stuff")}
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信