go 程序 Append bug ,求助

yyhero1 2016-06-23 01:03:00
开了两个协程,一个在不断的生成数据,另一个在不断的消耗数据.


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()
}


代码大体就是这样,典型的消费-生成模型,程序我觉得也没有问题,但是测试时间一长,就会在上面的地方报错,求助
...全文
1962 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
victorLDB 2016-11-11
  • 打赏
  • 举报
回复
这代码写得让人无法直视呀,用go来实现生产和消费模型应该采用协程和channel
Kerr_hg 2016-11-02
  • 打赏
  • 举报
回复
produce()里面unlock前面你不加上defer?
悲催的码农 2016-08-17
  • 打赏
  • 举报
回复
go的经典坑之一 append的时候如果长度超过了初始化时的长度,他会重新申请空间并把数据复制过去,虽然内容已经变成了你想要的数据,然而此时地址已经变了,如果你按照原来的地址去读取那么还是原来的内容,并没有被更新
假正经的班长 2016-07-13
  • 打赏
  • 举报
回复
引用 1 楼 cjqpker 的回复:
错误信息贴出来啊
抱歉,看到错误信息了。 出错时你把 fivePersonList 整个打印出来看看是什么样
假正经的班长 2016-07-13
  • 打赏
  • 举报
回复
错误信息贴出来啊

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧