как понять "ch = ch1" в следующих кодах? - PullRequest
1 голос
/ 20 мая 2019

Я не могу понять значение "ch = ch1" и почему он может печатать простое число?кто-то может объяснить это для меня?Я изучаю Go.

    // Copyright 2009 The Go Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style
    // license that can be found in the LICENSE file.package main
    package main

    import "fmt"

    // Send the sequence 2, 3, 4, ... to channel 'ch'.
    func generate(ch chan int) {
        for i := 2; ; i++ {
            ch <- i // Send 'i' to channel 'ch'.
        }
    }

    // Copy the values from channel 'in' to channel 'out',
    // removing those divisible by 'prime'.
    func filter(in, out chan int, prime int) {
    for {
        i := <-in // Receive value of new variable 'i' from 'in'.
        if i%prime != 0 {
            out <- i // Send 'i' to channel 'out'.
        }
    }
}

// The prime sieve: Daisy-chain filter processes together.
func main() {
    ch := make(chan int) // Create a new channel.
    go generate(ch)      // Start generate() as a goroutine.
    for {
        prime := <-ch
        fmt.Print(prime, " ")
        ch1 := make(chan int)
        go filter(ch, ch1, prime)
        ch = ch1
    }
}

Может кто-нибудь объяснить мне этот код?Меня учили Го за несколько дней.

1 Ответ

0 голосов
/ 20 мая 2019

ch - «текущий канал». Цикл следующий:

  1. Вы начинаете с канала, заполненного сгенерировать. Это канал всех целых чисел. Первое число с этого канала - 2 (простое число).
  2. Затем вы создаете ch1, который является каналом всех целых чисел без чисел, кратных 2.
  3. = - оператор присваивания. Используя ch = ch1, вы говорите, что текущий канал является каналом всех целых чисел без деления на 2.
  4. Новая итерация цикла. Первое число из текущего канала - 3. Вы создаете ch1 как текущий канал без чисел, кратных 3.
  5. Назначить ch1 текущим каналом. Таким образом, теперь текущий канал является каналом всех чисел, не делимых на 2, не делимых на 3.
  6. Повторите
...