并发解析JSON-运行时错误恐慌(解码相关)

并发解析JSON-运行时错误恐慌(解码相关),json,go,concurrency,Json,Go,Concurrency,我最近在玩围棋,遇到了一个运行时错误,我无法解释。这些是我的工作职责 类型用户结构{ 浏览器[]字符串`json:“浏览器”` 名称字符串`json:“名称”` 电子邮件字符串`json:“电子邮件”` } func asyncUserProcJson(wg*sync.WaitGroup,users*[]User,ch chan[]字节){ 对于buf:=范围ch{ var mu sync.Mutex var用户 木锁() err:=json.Unmarshal(buf,&user) mu.Un

我最近在玩围棋,遇到了一个运行时错误,我无法解释。这些是我的工作职责

类型用户结构{
浏览器[]字符串`json:“浏览器”`
名称字符串`json:“名称”`
电子邮件字符串`json:“电子邮件”`
}
func asyncUserProcJson(wg*sync.WaitGroup,users*[]User,ch chan[]字节){
对于buf:=范围ch{
var mu sync.Mutex
var用户
木锁()
err:=json.Unmarshal(buf,&user)
mu.Unlock()
如果错误!=零{
fmt.Println(“json:,错误)
wg.Done()
持续
}
*用户=追加(*用户,用户)
wg.Done()
}
}
func userProcJson(buf[]字节)(用户,错误){
var用户
err:=json.Unmarshal(buf,&user)
如果错误!=零{
返回用户{},错误
}
返回用户,无
}
如果我做一个公共的非并发的aproach,它的工作就像预期的那样。但如果,尝试使用通道将字节传递给goroutine。。。它失败了

键入AsyncUserProc func(*sync.WaitGroup,*[]用户,chan[]字节)
类型UserProc func(buf[]字节)(用户,错误)
类型SearchParams结构{
我是作家
asyncUserProc asyncUserProc
userProc userProc
}
func(sp SearchParams)AsyncSearch()[]用户{
文件,错误:=os.Open(文件路径)
如果错误!=零{
log.Fatalln(错误)
}
var Users=make([]用户,0,1024)
var ch=make(chan[]字节)
var wg sync.WaitGroup
go sp.asyncUserProcess(&wg,&Users,ch)
扫描程序:=bufio.NewScanner(文件)
对于scanner.Scan(){
工作组.添加(1)
中国

Bytes返回由扫描调用生成的最新令牌 底层数组可能指向将被 扫描的后续调用。它不进行分配


底层数组可能指向将被后续扫描调用覆盖的数据

Bytes返回由扫描调用生成的最新令牌 底层数组可能指向将被 扫描的后续调用。它不进行分配



底层数组可能指向将被后续扫描调用覆盖的数据。

您的
mu
变量的用途是什么?当您说它失败时…如何?您看到了什么错误或意外的输出?我不知道发生了什么,在
json.Unmarshal
行得通。我不认为它在那里有用,但我显然不知道正在发生什么以及为什么数据在解组过程中会发生变化。你的互斥锁没有任何作用。你正在为每次迭代创建一个新实例,所以它从来没有保护过任何东西。但它正在改变。每次调用
append
你都会改变它。这一定是syn计时。容量完全不相关。
mu
变量的用途是什么?当你说它失败时…如何?你看到了什么错误或意外的输出?我不知道发生了什么,并尝试使用互斥来防止数据在
json.Unmarshal
工作时更改。我认为它在那里没有用处,但我是c显然不知道解组过程中发生了什么以及为什么数据会发生变化。你的互斥锁没有任何作用。你正在为每次迭代创建一个新实例,因此它从来没有保护过任何东西。但是它在变化。每次调用
append
你都会改变它。这必须同步。容量完全无关。th是!我确信其中一个阶段使用了copy,但我猜我错了。@Butuzov,如果您的操作系统支持,使用
-race
标志运行/测试将启用,这将指出此类错误。这!我确信其中一个阶段使用了copy,但我猜我错了。@Butuzov,如果您的操作系统支持,使用
-race
标志将启用,它将指出此类错误。
// phasePanicMsg is used as a panic message when we end up with something that
// shouldn't happen. It can indicate a bug in the JSON decoder, or that
// something is editing the data slice while the decoder executes.
json: invalid character 'i' looking for beginning of value
json: invalid character ':' after top-level value
json: invalid character 'r' looking for beginning of value
panic: runtime error: index out of range
----
json: invalid character '.' after top-level value
json: invalid character 'K' looking for beginning of value
panic: JSON decoder out of sync - data changing underfoot?
import "bufio"
func (s *Scanner) Bytes() []byte