我如何在路由函数之间传递一个var,并在每个控制器中改变它?

问题描述 投票:-1回答:0

我想在路由之间的每个控制器中传递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
         }
}
go mutex gin
0
投票

的注释 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 仅供使用。

© www.soinside.com 2019 - 2024. All rights reserved.