Я пытаюсь более полно понять природу отношений Happens-Before между каналами и другим общим состоянием. В частности, я хочу посмотреть, создается ли какое-либо ограждение памяти при операции отправки и получения канала.
Например, если я отправляю сообщение по каналу, все остальные операции, связанные с изменением общего состояния, выполняются «до» операции отправки/получения. В моем конкретном примере я пишу только из одной процедуры go, а затем читаю из одной процедуры go.
(Кроме того, очевидный ответ в приведенном ниже примере — поместить экземпляр структуры Person
непосредственно в канал, но это не то, о чем я прошу.)
package main
func main() {
channel := make(chan int, 128)
go func() {
person := &sharedState[0]
person.Name = "Hello, World!"
channel <- 0
}()
index := <-channel
person := sharedState[index]
if person.Name != "Hello, World!" {
// unintended race condition
}
}
type Person struct{ Name string }
var sharedState = make([]Person, 1024)