2017-05-19 6 views
2

私は新しいです、次の問題があります。私はそれを単純化しようとしました: 私は、例えばグローバル変数myvarを持っているサーバーを持っています。すべてのユーザーは、エンドポイント/step1をPOSTし、変数にいくつかのデータを保存できます。このデータは、第2のエンドポイント/step2を使用してGETで取り出すことができます。これらの2つの呼び出しの間で、そのユーザーの値はmyvarに変更されるべきではありません。複数のユーザーを持つサーバーインスタンス

このプロセスをすべてのユーザーにインスタンス化する方法があるかどうかを知りたいのは、あるユーザーが変数を変更しても他のユーザーに影響を与えないようにする必要があるからです。グローバル変数を必ずしも使う必要はありません。エンドポイントでやりたいことを公開するだけです。

コード:

package main 

import (
    "encoding/json" 
    "net/http" 

    "github.com/gorilla/mux" 
    "github.com/rs/cors" 

    "fmt" 
) 

type Test struct { 
    test string `json:"test,omitempty"` 
} 

func main() { 
    var myvar = "test" 

    router := mux.NewRouter() 

    router.HandleFunc("/step1", func(w http.ResponseWriter, r *http.Request) { 
     var test Test 
     _ = json.NewDecoder(r.Body).Decode(&test) 
     myvar = test.test 
    }) 

    router.HandleFunc("/step2", func(w http.ResponseWriter, r *http.Request) { 
     fmt.Println(myvar) 
    }) 

    c := cors.New(cors.Options{ 
     AllowedOrigins: []string{"*"}, 
     AllowCredentials: true, 
     AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "PATCH"}, 
     AllowedHeaders: []string{"*"}, 
     ExposedHeaders: []string{"*"}, 
    }) 

    handler := c.Handler(router) 

    http.ListenAndServe(":8003", handler) 
} 

答えて

4

要求は同時に、複数のゴルーチンから提供されています。つまり、同じ変数を読み書きすると、この変数へのアクセスを同期させる必要があります。

次に、ユーザーごとにこのデータの別のインスタンスが必要な場合は、ユーザーIDまたは名前からデータ構造にマップするマップを使用できます。

たとえば、のは、データ構造が構造体であると仮定しましょう:

type customData struct { 
    Field1 string 
    Field2 int 
    // Whatever fields you need 
} 

ユーザーごとに1つを保持しているマップ:

var userDataMap = map[string]customData{} 

それが読まれている間は、マップを保護するためsync.RWMutexを使用することができます/ goroutineから書いた:

maへの同期アクセスp、上記のmutexを使用する:

func Get(user string) customData { 
    mux.RLock() 
    defer mux.RUnlock() 
    return userDataMap[user] 
} 

func Set(user string, data customData) { 
    mux.Lock() 
    userDataMap[user] = data 
    mux.Unlock() 
} 

さらに洗練されたソリューションは、サーバー側のHTTPセッションを使用することです。詳細については、Go session variables?

+0

フィードバックをお寄せいただき、ありがとうございましたフィードバックに戻る – Battalgazi

+0

@Battalgaziコードを編集し、 'customData'ポインタを非ポインタに変更しました。これにより、同じ '* customData'値を修正して設定してください)。 – icza

+0

ありがとう私はあなたが提案したようにマップを使用して動作させることができます:) – Battalgazi

関連する問題