消息关闭
    暂无新消息!

go 程序 Append bug ,求助

问题作者 : 瑞瑞2017-06-05发布
开了两个协程,一个在不断的生成数据,另一个在不断的消耗数据.


var (
fivePersonList  [][]*player = make([][]*player, 0, 64)
fivePersonMutex sync.Mutex
)

func produce(){
               //创建matchPlayerList
               matchPlayerList :=make([]*player,0, 5)
               //向matchplayerList追加数据,省略....

fivePersonMutex.Lock()
fivePersonMutex.Unlock()
fivePersonList = append(fivePersonList, matchPlayerList)\
}

func fetch() {
fivePersonMutex.Lock()
defer fivePersonMutex.Unlock()

if len(fivePersonList) == 0 {
return nil, false
}

//组装
retList := make([]*player, 0, 5)

//从中提取一个
retList = append(retList, fivePersonList[0]...)       

        //append这个地方,总数会报错,panic: runtime error:
        // invalid memory address or nil                                                                                             
        // pointer dereference

fivePersonList = fivePersonList[1:]

        //.....
}

func main() {
      go produce()
      go fetch()
}


代码大体就是这样,典型的消费-生成模型,程序我觉得也没有问题,但是测试时间一长,就会在上面的地方报错,求助

4个回答

︿ 1
go的经典坑之一
append的时候如果长度超过了初始化时的长度,他会重新申请空间并把数据复制过去,虽然内容已经变成了你想要的数据,然而此时地址已经变了,如果你按照原来的地址去读取那么还是原来的内容,并没有被更新
︿ 0
这代码写得让人无法直视呀,用go来实现生产和消费模型应该采用协程和channel