Golang:异步HTTP服务器中的共享通信

Golang:异步HTTP服务器中的共享通信,第1张

Golang:异步HTTP服务器中的共享通信

尽管可以使用通道执行此 *** 作,但我更希望使用受互斥锁保护的哈希(映射),因为在这种情况下更容易实现。

为您提供一个想法并助您一臂之力:

package mainimport (    "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 packagefunc 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)    }}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5600342.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存