Почему происходит выполнение fmt.Println?
Всем привет! Объясните пожалуйста, почему после записи данных в канал функция продолжает своё выполнение, и мы видим в консоли "hello" ? Ведь чтение и запись в канал порождают блокировку, в следствии чего начинает выполнятся другая горутина, то есть горутина main. Однако, если вставить между записью в канал и выводом в консоль какой-то синхронный код (например, цикл с итерациями на ~250к), то при выполнении программы не во всех случаях будет выполняться вывод в консоль
package main
import (
"fmt"
)
func test (ch chan int) {
ch <- 1
fmt.Println("hello")
}
func main () {
ch := make(chan int)
go test(ch)
<- ch
}
Ответы (1 шт):
В данном примере порядок и скорость выполнения не гарантированы. В Вашем случае первым завершается мини-функция, чем main, поэтому в консоль попадает вывод.
давайте запустим трассировку выполнения программы и посмотрим какая функция как выполнялась.
package main
import (
"fmt"
"os"
"runtime"
"runtime/trace"
)
func test(ch chan int) {
ch <- 1
fmt.Println("hello")
}
func main() {
err := trace.Start(os.Stderr)
if err != nil {
panic(err)
}
ch := make(chan int)
go test(ch)
<-ch
runtime.StopTrace()
}
$ go run main.go 2> trace.out
$ go tool trace trace.out
2021/08/02 14:11:29 Parsing trace...
2021/08/02 14:11:29 Splitting trace...
2021/08/02 14:11:29 Opening browser. Trace viewer is listening on http://127.0.0.1:62212
откроется браузер со страницей результатов трассировки. нужно выбрать "View trace"

