在Go中同时使用变量总是可行的吗?

Dou*_*ith 4 json go

我正在编写一个小型的Web服务器程序,它会从POST请求中进行大量的JSON解码.

最初我认为,不是json.Decoder每次请求进入时都初始化一个新的,我将它作为一个全局变量,每次都被调用,并与goroutines同时解码.

作为Go的新手,这可以吗?是否有时候我不应该这样做,并且由于不是线程安全而且课程会变得怪异(我猜"goroutine"安全会更好)?

Joh*_*yil 6

在Go中,json.NewDecoder将io.Reader作为输入参数并返回*json.Decoder.因此,由于我们为每个POST请求提供了不同的http.Request.Body(实现io.Reader),因此无法重用相同的Decoder.

正如Paul Hankin所提到的,你不能同时使用go对象,除非它们被记录为可以安全地同时使用.

例子 :

  1. http.Client和http.Transport

    客户端和传输对于多个goroutine的并发使用是安全的,并且效率应该只创建一次并重新使用.

资源

  1. 地图

    经过长时间的讨论,决定地图的典型使用不需要从多个goroutine安全访问.

资源

如果您询问重用JSON解码器以避免重复代码,您可以查看TigertonicGo-Json-Rest等框架.

另外,您可以查看ffjson以加速JSON解码.