我正在用 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/