我想在路由之间的每个控制器中传递var,并在全局范围内改变它,所以如果controller1将var改为 "as",我想让controller2使用新的var值="as"。我怎样才能做到这一点?
main.go:
var test []string
func NewRouter() *gin.Engine {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
r.GET("/ping", gets(test))
r.Run(":6030")
return r
}
controller.go:
func gets(test) gin.HandlerFunc {
fn := func(c *gin.Context){
// Here I want to change my var (test) and I want to change it globally so if any another function use it I want to use the new value I just change it here
}
}
的注释 mkopriva
已经给你解决了如何使用 mutex
.
但是,由于golang提倡 share memory by communicating
我提出另一种解决方案,使用 channel
.
package main
import (
"fmt"
"github.com/gin-gonic/gin"
)
func main() {
r := NewRouter()
r.Run(":6030")
}
var test = []string{"abc"}
func NewRouter() *gin.Engine {
gin.SetMode(gin.ReleaseMode)
r := gin.New()
updateChan := make(chan []string, 0)
r.GET("/", gets(updateChan))
r.GET("/mn", er(updateChan))
return r
}
func gets(updateChan chan []string) gin.HandlerFunc {
return func(c *gin.Context){
fmt.Println("before update in get, test=",test)
newTest := []string{"def"}
updateChan <- newTest
}
}
func er(updateChan chan []string) gin.HandlerFunc {
return func(c *gin.Context){
test = <-updateChan
fmt.Println("get a new value for test in er, test=",test)
}
}
有了一个无缓冲的通道 updateChan
,测试将始终以最新的输入推送给 updateChan
渠道。而且这里不会发生数据竞赛。
当然这只是一个简单的演示,还有很多东西要用gin做一个完整的http服务器。但我把演示的范围限制在 channel
仅供使用。