在go做http api的过程中,我有一个函数,会被多次调用,多次调用的值是固定的
```
func goo(st string) int64{
var x int64
if st == "A" {
x := 1+2+3+...+100000 // 这里是一系列的计算
} else {
x := 1+2+3+...+200000 // 这里是一系列的计算
}
return x // 这里是一些逻辑,计算的值赋值给result
}
```
我希望第一次计算的值可以保存到一个变量里面,然后第二次调用goo(),直接返回即可,因此,我进行了修正:
```
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
}
```
这样修改后,一个http请求中虽然调用了goo多次,但是只计算一次。
但是,这个会影响其他的http,其他的http直接从这里取值了,当我在其他的http api请求中传递不同的参数,返回的和第一个http api请求是一样的,这和php太不一样了
我想问:我如何实现在一个http api请求中 goo() 函数里面x的计算只计算一次,而且,不影响其他的http api请求
ps: 我是phper出身,多谢各位帮助
除了直接使用 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
更多评论
难道解决的方式,就是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