【问题标题】:How can I pass a var between routes funcs and change it in every controller?如何在路由函数之间传递 var 并在每个控制器中更改它?
【发布时间】:2020-05-30 21:06:01
【问题描述】:

我想传递 var 并在路由之间的每个控制器中全局更改它,所以如果控制器 1 将 var 更改为“as”,我希望控制器 2 使用 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 go-gin


【解决方案1】:

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 的使用范围内。

【讨论】:

  • 你好@TranvuXuannhat 它的作品。但是当我尝试在另一条路线中循环 chan 时遇到了一个小问题,比如r.GET("/mn", er(updateChan)) 当我在浏览器上到达 /mn 时它会超时,我想因为我没有关闭chan这发生了,但我应该如何处理呢?
  • 如果循环chan,它将等待来自updateChan的新消息来做某事,然后再次等待。如果您只想获取最新更新的值,只需获取第一条消息,不要循环。我会更新答案
  • 你好@TranvuXuannhat,这不是我想要的,我想循环 chan 并将所有值放入另一个函数中的 chan,我将在另一个函数中使用这个 chan,我该怎么做呢?
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多