Gleichzeitiger Zugriff auf Karten mit 'range' in Go

Das "Gehen Sie auf Karten in Aktion "Eintrag im Go-Blog besagt:

Maps können nicht gleichzeitig verwendet werden: Es ist nicht definiert, was passiert, wenn Sie gleichzeitig lesen und schreiben. Wenn Sie von gleichzeitig ausgeführten Goroutinen lesen und auf eine Karte schreiben müssen, müssen die Zugriffe durch eine Art Synchronisationsmechanismus vermittelt werden. Ein üblicher Weg, um Karten zu schützen, ist sync.RWMutex.

Eine gebräuchliche Methode, auf Karten zuzugreifen, besteht darin, sie mit dem @ -Zeichen zu durchlauferange Stichwort. Es ist nicht klar, ob für den gleichzeitigen Zugriff die Ausführung innerhalb einesrange loop ist ein "Lesen" oder nur die "Umsatz" -Phase dieser Schleife. Beispielsweise kann der folgende Code abhängig von der spezifischen Semantik / Implementierung des @ -Zeichens der Regel "Kein gleichzeitiges Schreiben / Schreiben auf Karten" zuwiderlaufen oder nichrange Betrieb

 var testMap map[int]int
 testMapLock := make(chan bool, 1)
 testMapLock <- true
 testMapSequence := 0

...

 func WriteTestMap(k, v int) {
    <-testMapLock
    testMap[k] = v
    testMapSequence++
    testMapLock<-true
 }

 func IterateMapKeys(iteratorChannel chan int) error {
    <-testMapLock
    defer func() { 
       testMapLock <- true
    }
    mySeq := testMapSequence
    for k, _ := range testMap {
       testMapLock <- true
       iteratorChannel <- k
       <-testMapLock
       if mySeq != testMapSequence {
           close(iteratorChannel)
           return errors.New("concurrent modification")
       }
    }
    return nil
 }

ie Idee hier ist, dass dasrange "iterator" ist geöffnet, wenn die zweite Funktion darauf wartet, dass ein Consumer den nächsten Wert annimmt, und der Writer zu diesem Zeitpunkt nicht blockiert ist. Es ist jedoch nie der Fall, dass sich zwei Lesevorgänge in einem einzelnen Iterator auf beiden Seiten eines Schreibvorgangs befinden - dies ist ein "ausfallsicherer" Iterator, der einen Java-Term ausleiht.

Gibt es irgendwo in der Sprachspezifikation oder in anderen Dokumenten Hinweise darauf, ob dies legitim ist? Ich konnte es so oder so sehen, und das oben zitierte Dokument ist nicht klar, was genau ein "Lesen" ausmacht. Die Dokumentation scheint völlig leise zu sein, was die Parallelität des @ betrifffor/range Erklärung

(Bitte beachten Sie, dass es sich bei dieser Frage um die Währung von @ handelfor/range, aber kein Duplikat von:Golang gleichzeitiger Kartenzugriff mit Bereich - Der Anwendungsfall ist völlig anders und ich frage nach der genauen Sperranforderung für das Schlüsselwort "range" hier!)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage