2014-09-30 3 views
0

Я изучаю «Go Concurrency Pattern 'из https://talks.golang.org/2012/concurrency.slide#25'Почему канал не работает?

Вопрос:

  1. Как канал переменной доли от его пределами? В этом случае i был распространен. Переменная в точке A и точке B, по-видимому, имеет какое-то особое отношение? Что это ?

  2. Для чего это означает?

    для 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. 
+3

как именно вы управляете этим? Вы знаете, что Go не является языком сценариев. вам нужно скомпилировать программу и запустить ее с 'go run'. Кроме того, это не может быть 'package a1', если вы собираетесь его запускать, это должно быть' package main' –

+0

@Not_a_Golfer Я исправил проблему, изменив имя пакета. Благодарю. Но не знаю, как это работает ... – CodeFarmer

+0

Во-первых: каналы do_not_ приводят к магическому соединению переменных или совместному использованию переменных. На самом деле каналы имеют * ничего *, чтобы делать с переменными. Какими каналами это: они принимают * значения *, которые вы вкладываете в канал, и выплевываете одно и то же значение на другом конце. Часто эти значения исходят из переменных, и часто эти переменные имеют одно и то же (или подобное) имя. Во-вторых: «Вы зацикливаете на вас», например, на C. Посмотрите на тур или спецификацию языка для этого типа основных вопросов. – Volker

ответ

0

for (i := 0; ; i++) { } создает индекс приращения навсегда.

Когда вы создали make(chan string), вы создали канал чтения/записи. Вы также ссылаетесь на канал внутри функции go и передаете его как возвращаемое значение. Go анализирует, как используются переменные, называемые «escape-анализом», и выбирает, нужно ли делать канал в куче или в стеке, в вашем случае в куче, так что когда функция, создающая канал, выходит из канала, не получается перераспределена.

Смежные вопросы