Обзор Go - Выберите пример выписки - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в языке Go и сейчас прохожу через Go Tour. У меня есть вопрос относительно примера параллелизма 5 в операторе Select.

Приведенный ниже код был отредактирован операторами печати для отслеживания выполнения оператора.

package main

import "fmt"

func fibonacci(c, quit chan int) {
    x, y := 0, 1
    fmt.Printf("Run fib with c: %v, quit: %v\n", c, quit)
    for {
        select {
        case c <- x:
            fmt.Println("Run case: c<-x")
            x, y = y, x+y
            fmt.Printf("x: %v, y: %v\n", x, y)
        case <-quit:
            fmt.Println("Run case: quit")
            fmt.Println("quit")
            return
        }
    }
}

func runForLoop(c, quit chan int) {
    fmt.Println("Run runForLoop()")
    
    for i := 0; i < 10; i++ {
        fmt.Printf("For loop with i: %v\n", i)
        fmt.Printf("Returned from c: %v\n", <-c)
    }
    
    quit <- 0
}

func main() {
    c := make(chan int)
    quit := make(chan int)
    go runForLoop(c, quit)
    fibonacci(c, quit)
}

На консоль выводится следующее:

Run fib with c: 0xc00005e060, quit: 0xc00005e0c0
Run runForLoop()
For loop with i: 0
Returned from c: 0 // question 1
For loop with i: 1
Run case: c<-x // question 2
x: 1, y: 1
Run case: c<-x // question 2
x: 1, y: 2
Returned from c: 1
For loop with i: 2
Returned from c: 1
For loop with i: 3
...

Мои вопросы:

    1. Здесь получено значение c 0, хотя ни один из выбранных блоков не был выполнен. Могу ли я подтвердить, что это нулевое значение переменной c с типом int?
  • Почему дело c<-x выполняется дважды?

1 Ответ

1 голос
/ 10 июля 2020

For 1: печатает результат <-c, который будет блокироваться до тех пор, пока другая горутина не запишет в него. Итак, ваше утверждение неверно: случай выбора для c<-x запустился с x=0. Это не нулевое значение переменной chan. Вы будете читать только нулевое значение типа chan из канала, если канал закрыт, или если вы используете двухзначную форму чтения канала: value,ok := <-c. Когда ok=false, value является нулевым значением типа значения канала.

For 2: c<-x будет выполняться 10 раз, потому что вы читаете из него 10 раз в for-l oop, и только после этого вы пишете на quit, что активирует второй случай выбора. Здесь вы видите вторую итерацию l oop.

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