go函数在一个http过程中被多次调用,如果避免多次执行

fancyecommerce · · 2017 次点击
除了直接使用 gin,楼主也可以考虑用 context 包来做这个事情。 以下是我的代码,原生的 context 来存储所谓的中间变量。 ```go package main import ( "context" "fmt" "log" "net/http" "time" ) var parentCtx = context.Background() type contextKey string func foo(r *http.Request, key contextKey) { ctx := r.Context() if value := ctx.Value(key); value != nil { log.Printf("Found value for key %s, is %s\n", key, value) } else { log.Printf("Could not found value for key:%s\n", key) } } var Handler = func(w http.ResponseWriter, r *http.Request) { key := contextKey("timestamp") ctx := context.WithValue(parentCtx, key, time.Now().String()) // check foo(r, key) // Set the new context into request. r = r.WithContext(ctx) // check foo(r, key) fmt.Fprintln(w, "byebye.") } func main() { http.HandleFunc("/", Handler) http.ListenAndServe(":4004", nil) } ```
#12
更多评论
如果是php,我可以存储到对象变量里面,各个PHP http 是不会影响的 go,貌似函数外部的包变量,每次http访问,都是可以相互访问的。
#1
难道解决的方式,就是http 请求要结束的事情,清空变量x的值?这样应该也不行 ``` var x int64 func goo(st string) int64{ if x !=0 { return x } if st == "A" { x := 1+2+3+...+100000 // 这里是一系列的计算 } else { x := 1+2+3+...+200000 // 这里是一系列的计算 } return x // 这里是一些逻辑,计算的值赋值给result } ```
#2