пытаясь понять, что Голанг Чан вызывает сбой или делает что-то еще - PullRequest
1 голос
/ 27 марта 2019

Ниже приведен пример из https://golang.org/ref/mem:

var c = make(chan int)
var a string

func f() {
    a = "hello, world"
    <-c
}
func main() {
    go f()
    c <- 0
    print(a)
}

также гарантированно печатать «привет, мир».Запись в a происходит до получения на c, что происходит до завершения соответствующей отправки на c, что происходит до печати. ​​

Если канал был буферизован (например, c = make (chan int, 1)) тогда программа не будет гарантированно печатать "привет, мир".(Может быть напечатана пустая строка, произойдет сбой или что-то еще.)

Я понимаю, что It might print the empty string, но не для crash или do something else, когда произойдет crash?И когда это будет do something else?

1 Ответ

3 голосов
/ 27 марта 2019

Строка в Go - это кусочек байтов только для чтения . Срез состоит из длины указателя.Давайте предположим, что сначала мы установили длину в большое значение, а затем изменили указатель.Другая подпрограмма go может сначала прочитать новую длину и старый указатель.Затем он пытается прочитать конец предыдущей строки.Он либо читает какой-то мусор, либо останавливается операционной системой и вылетает.

Порядок операций на самом деле не имеет значения, если вы установите первый указатель, он может указывать на область памяти, слишком короткую для текущей длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...