architecture - 在 Go 中存储状态

标签 architecture go coding-style global-variables information-hiding

我正在用 Go 编写一个简单的程序作为学习这门语言的练习。该程序是一个游戏播放器:它 exec.Command 是一个基于文本的游戏,然后通过 StdinPipe/StdoutPipe 与其通信。在四处闲逛并阅读了大量在线文档之后,我设法使框架正常工作——相当于 Hello World,我在其中建立了双向通信并可以处理程序终止等错误。

现在我正在尝试编写实际玩游戏的 AI 代码。因为我的目的是学习这门语言,所以我尝试在风格上非常小心——我不只是想在 Go 中编写 C(或其他语言)。

程序中明显的分工(一旦完成所有设置)分为两部分。首先,程序查看当前状态并决定应该向游戏发出什么命令。其次,程序查看返回的数据并相应地更新状态。 (是的,这是一个简单的游戏 -- 它等待输入然后响应,没有时间问题。)

我不确定这个状态信息应该放在哪里。将它全部倾倒到全局范围内感觉是错误的,而制作一个巨大的单例对象似乎更糟(而且 Go 并不是特别面向对象)。无论如何,我不想让函数传递并返回 20 多个变量。

一般建议很好,但我最感兴趣的是 Go 惯用的建议。根据要求,我可以共享代码,但我认为这不会有帮助。

最佳答案

我喜欢为此目的使用包。

简单的例子:

package foo

func Incr() {
    f.incr()
}

func Count() int {
    return f.count()
}

type foo struct {
    sync.RWMutex
    count int
}

func (f *foo) incr() {
    f.Lock()
    f.count++
    f.Unlock()
}

func (f *foo) count() int {
    f.RLock()
    defer f.RUnlock()
    return f.count
}

var f = &foo{}

此包可以导入任何其他包并保持状态。我添加了 sync.RWMutex 来防止任何竞争条件。这使您可以完全控制如何访问 foo 的状态并很好地包含它。

关于architecture - 在 Go 中存储状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26170409/

相关文章:

go - 无法将结构类型参数传递给另一个包中的函数

android - 覆盖 onClick color/drawable

php - 如何在 PHPStorm 中保持 Blade 语法的缩进?

Haskell 代码格式化

c# - 用于创建实时应用程序的 ASP.net/C# 书籍

go - Colly 找不到任何链接

用于下载进度的 Golang 和本地 Web 界面?

c# - 将审计和存档信息生成到由多个应用程序共享的 sql 数据库中的最简单方法

linux - 终端:发送禁止操作转义序列或控制字符

java - 不确定我应该把我的方法放在哪个类中