Я изучаю «Go Concurrency Pattern 'из https://talks.golang.org/2012/concurrency.slide#25'Почему канал не работает?
Вопрос:
Как канал переменной доли от его пределами? В этом случае i был распространен. Переменная в точке A и точке B, по-видимому, имеет какое-то особое отношение? Что это ?
Для чего это означает?
для i: = 0; ; я ++
Главный код:
package main
import (
"fmt"
"math/rand"
"time"
)
func boring(msg string) <-chan string { // Returns receive-only channel of strings.
c := make(chan string)
go func() { // We launch the goroutine from inside the function.
for i := 0; ; i++ { // <--------- point B
c <- fmt.Sprintf("%s %d", msg, i)
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
}
}()
return c // Return the channel to the caller.
}
func main() {
c := boring("boring!") // Function returning a channel.
for i := 0; i < 5; i++ { // <--------- point A
fmt.Printf("You say: %q\n", <-c)
}
fmt.Println("You're boring; I'm leaving.")
}
выход:
You say: "boring! 0"
You say: "boring! 1"
You say: "boring! 2"
You say: "boring! 3"
You say: "boring! 4"
You're boring; I'm leaving.
Program exited.
как именно вы управляете этим? Вы знаете, что Go не является языком сценариев. вам нужно скомпилировать программу и запустить ее с 'go run'. Кроме того, это не может быть 'package a1', если вы собираетесь его запускать, это должно быть' package main' –
@Not_a_Golfer Я исправил проблему, изменив имя пакета. Благодарю. Но не знаю, как это работает ... – CodeFarmer
Во-первых: каналы do_not_ приводят к магическому соединению переменных или совместному использованию переменных. На самом деле каналы имеют * ничего *, чтобы делать с переменными. Какими каналами это: они принимают * значения *, которые вы вкладываете в канал, и выплевываете одно и то же значение на другом конце. Часто эти значения исходят из переменных, и часто эти переменные имеют одно и то же (или подобное) имя. Во-вторых: «Вы зацикливаете на вас», например, на C. Посмотрите на тур или спецификацию языка для этого типа основных вопросов. – Volker