次のGo Playの例は、私が定義した単純な方法を示しています。私はコピーされた値として関数(参照ではない)としてマップを渡しているだけでなく、値渡しとみなす私の関数には再帰があります。並行性がない場合の同時マップ読み込みと書き込み
https://play.golang.org/p/na6y6Wih4M
// this function has no write operations to dataMap, just reads
// dataMap, in fact, has no write operations since it was copied
func findParentAncestors(ID int, dataMap map[int]Data) []Data {
results := []Data{}
if _, ok := dataMap[ID]; ok {
if parentData, ok := dataMap[dataMap[ID].ParentID]; ok {
results = append(results, parentData)
// recursion
results = append(results, findParentAncestors(parentData.ID, dataMap)...)
}
}
return results
}
問題:どういうわけか、この例よりもはるかに多くのデータを必要とする私のプログラムの実行、(obviusly)に沿って、エラー「致命的なエラー:同時マップ読み込み、マップ書き込み」ポイント機能findParentAncestors():
main.findParentAncestors(0x39e3, 0xc82013ac90, 0x0, 0x0, 0x0)
/opt/test/src/test.go:17 +0xa6 fp=0xc820269fb8 sp=0xc820269bd0
main.findParentAncestors(0x5d25, 0xc82013ac90, 0x0, 0x0, 0x0)
/opt/test/src/test.go:21 +0x239 fp=0xc82026a3a0 sp=0xc820269fb8
Goのバージョンは?そのスタックトレースは完了していますか? – hobbs
goバージョンgo1.6.3 linux/amd64 スタックトレースは、さまざまな並行通貨のため非常に大きくなります。中間の部分(パニックの一番上)が上記です。 dataMapは値渡しされます。私はこれが並行性の問題につながることはありません。 – gextra
フルトレースをここに追加しましたhttps://play.golang.org/p/p75UITydPP – gextra