3

メインパッケージとhttpハンドラーパッケージがあります。基本的に私がやろうとしているのは、グローバル構造体を設定して、いつでもその構造体の情報を呼び出すことができるようにすることです。

以下の私の試みた例の基本的な概要:メインパッケージはハンドラー関数をインポートしますメインパッケージはhandlerfuncを呼び出しますHandlerfuncはhttp.ResponseWriterと他のアイテムをUrlInfo構造体に設定します関数homeは、いつでも変数uinfoを呼び出すことができ、そのポインターUrlInfo構造体を作成します。

明らかにこれは機能しませんが、これは基本的に私がやりたいことです。そうすれば、このすべての情報を私のホーム関数に渡す必要がなくなります。清潔でシンプルに保つ。

どんな考えやアイデアでも大歓迎です。ありがとう。

ハンドラーパッケージ

package handler

// Struct containing http requests and variables
type UrlInfo struct {
    Res http.ResponseWriter
    Req *http.Request
    Item string
}

func HandleFunc(handlepath string, runfunc func()) {
    // Set handler and setup struct
    http.HandleFunc(handlepath, func(w http.ResponseWriter, r *http.Request) {
        url := new(UrlInfo)
        url.Res = w
        url.Req = r
        url.Item = "Item information"

        runfunc()
    })
}

メインパッケージ

import "handler"

var uinfo = &handler.UrlInfo{}

func init() {
    handler.HandleFunc("/home/", home)
}

func home() {
    fmt.Println(uinfo.Item)
}
4

1 に答える 1

5

私があなたの質問から集めたものから、あなたは、とりわけ、現在のRequestとResponseWriterへの参照を保持する構造の単一のグローバルインスタンスを定義しようとしています。

これが意図されている場合は、これが問題を引き起こす可能性があることを警告する必要があります。Goのhttpパッケージは、各リクエストハンドラーを個別のゴルーチンで実行します。これは、任意の数のリクエストを同時に処理できることを意味します。したがって、すべてが同じグローバル構造を安全に参照できず、その特定の要求にのみ関連する要求情報が含まれていることを期待することはできません。サーバーがスレッドセーフであることが期待される場合は、グローバルインスタンスを使用しないでください。

構造内の無関係なパラメーターをグループ化することでコードをクリーンに保つことは便利ですが、あなたの場合、構造の新しいインスタンスをパラメーターとしてUrlInfo直接渡すことを避けることができる(またはすべきではない)とは思いません。home()それは物事を不必要に複雑にし、予測不可能にします。

于 2012-09-29T00:28:43.790 に答える