3

単純な http サーバーを作成する以外は、golang の初心者です。非同期プロセスを作成する可能性として Go を研究しています。これがどのように達成されるかの簡単なサンプルを提供していただければ:

HTTP リクエスト「a」が着信すると、このリクエストの POST ペイロードに基づいて操作が開始されます (post または url に何らかの一意の識別子が含まれます)。'a' によって開始された非同期プロセスは、元の一意の識別子 (要求 'b') を使用して同じサーバーに応答しますが、要求 'a' はまだ開いています。リクエスト「b」の応答に基づいて、その応答をリクエスト「a」に送り返したいと思います。

4

1 に答える 1

7

チャネルでこれを行うことは可能ですが、ミューテックスで保護されたハッシュ (マップ) を使用した方が簡単です。

あなたにアイデアを与え、あなたを始めるために:

package main

import (
    "fmt"
    "net/http"
    "sync"
)

type state struct {
    *sync.Mutex // inherits locking methods
    Vals map[string]string // map ids to values
}

var State = &state{&sync.Mutex{}, map[string]string{}}

func get(rw http.ResponseWriter, req *http.Request) {
    State.Lock()
    defer State.Unlock() // ensure the lock is removed after leaving the the function
    id := req.URL.Query().Get("id") // if you need other types, take a look at strconv package
    val := State.Vals[id]
    delete(State.Vals, id)
    rw.Write([]byte("got: " + val))
}

func post(rw http.ResponseWriter, req *http.Request) {
    State.Lock()
    defer State.Unlock()
    id := req.FormValue("id")
    State.Vals[id] = req.FormValue("val")
    rw.Write([]byte("go to http://localhost:8080/?id=42"))
}

var form = `<html>
    <body>
        <form action="/" method="POST">
            ID: <input name="id" value="42" /><br />
            Val: <input name="val" /><br />
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>`

func formHandler(rw http.ResponseWriter, req *http.Request) {
    rw.Write([]byte(form))
}

// for real routing take a look at gorilla/mux package
func handler(rw http.ResponseWriter, req *http.Request) {
    switch req.Method {
    case "POST":
        post(rw, req)
    case "GET":
        if req.URL.String() == "/form" {
            formHandler(rw, req)
            return
        }
        get(rw, req)
    }
}

func main() {
    fmt.Println("go to http://localhost:8080/form")
    // thats the default webserver of the net/http package, but you may
    // create custom servers as well
    err := http.ListenAndServe("localhost:8080", http.HandlerFunc(handler))
    if err != nil {
        fmt.Println(err)
    }
}
于 2013-07-29T17:26:36.640 に答える