0

言語を学ぶための練習として、Go で簡単なプログラムを書いています。プログラムはゲーム プレーヤーです。exec.Commandテキスト ベースのゲームであり、StdinPipe/を介して通信しStdoutPipeます。いろいろいじってたくさんのオンライン ドキュメントを読んだ後、なんとかスケルトンが機能するようになりました。Hello World に相当するもので、双方向通信を確立し、プログラムの終了などのエラーを処理できます。

現在、実際にゲームをプレイする AI コードを作成しようとしています。私の目的は言語を学ぶことなので、スタイルには細心の注意を払っています。単に C (または他の言語) を Go で書きたいだけではありません。

プログラム内の明らかな作業分担 (すべてのセットアップが完了すると) は、2 つの部分に分けられます。まず、プログラムは現在の状態を調べて、ゲームに発行するコマンドを決定します。次に、プログラムは返されたデータを確認し、それに応じて状態を更新します。(はい、単純なゲームです。入力を待ってから応答します。タイミングの問題はありません。)

この状態情報がどこに行くべきかわかりません。すべてをグローバルスコープにダンプするのは間違っているように感じ、巨大なシングルトンオブジェクトを作成するのはさらに悪いように思えます (そして Go は特に OO ではありません)。いずれにせよ、関数が 20 以上の変数を渡して返すようにしたくありません。

一般的なアドバイスでも構いませんが、慣用的に Go に適しているものに最も関心があります。リクエストに応じてコードを共有できますが、役に立たないと思います。

4

2 に答える 2

2

この目的のためにパッケージを使用するのが好きです。

些細な例:

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 の状態へのアクセス方法を完全に制御でき、適切に制御できます。

于 2014-10-03T02:06:13.433 に答える