除了编写简单的http服务器之外,绝对是golang的初学者。我正在研究Go作为编写异步过程的一种可能性。如果可以的话,请提供一个简单的示例来说明如何实现:
Http请求’a’进入,基于该请求中的POST负载启动操作(在post或url中带有某种唯一标识符)。当请求“ a”仍处于打开状态时,以“ a”开始的异步过程将以原始唯一标识符(请求“ b”)响应同一服务器。我想根据请求“ b”响应将该响应传达回请求“ a”。
尽管可以使用通道执行此操作,但我更希望使用受互斥锁保护的哈希(映射),因为在这种情况下更容易实现。
为您提供一个想法并助您一臂之力:
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) } }