Голанг: почему эта переменная переменная инициализируется как время чана. Продолжительность, а не время чана. Продолжительность? - PullRequest
0 голосов
/ 09 октября 2018

Новый суслик здесь.Следующий код работает для меня, но меня смущает функция doStuff.Почему верно, что переменная ac имеет тип chan time. Продолжительность, а не chan chan time.Duration?

package main

import (
  "log"
  "sync"
  "time"
)

// the function to be run inside a goroutine. It receives a channel on ch, sleeps for t, then sends t
// on the channel it received
func doStuff(t time.Duration, ch <-chan chan time.Duration) {
  ac := <-ch
  time.Sleep(t)
  ac <- t
}

func main() {
  // create the channel-over-channel type
  sendCh := make(chan chan time.Duration)

  recvCh := make(chan time.Duration)

  // use this to block until all goroutines have received the ack and logged
  var wg sync.WaitGroup

  // start up 10 doStuff goroutines
  for i := 0; i < 10; i++ {
    go doStuff(time.Duration(i+1)*time.Second, sendCh)
    // send channels to each doStuff goroutine. doStuff will "ack" by sending its sleep time back
    sendCh <- recvCh
    wg.Add(1)
    go func() {
      defer wg.Done()
      log.Printf("slept for %s", <-recvCh)
    }()
  }

  wg.Wait()
}

Что делает ac: = <- ch, и почему ac <- tРабота?</p>

Первое, что я попробовал, это просто удалить переменную ac, потому что сначала это казалось ненужным дополнительным шагом, но при этом вывод был последовательным, а не параллельным:

func doStuff(t time.Duration, ch <-chan chan time.Duration) {
  time.Sleep(t)
  <- ch <- t
}

Итак, я начал экспериментировать, мне кажется, что он просто инициализирует новую переменную в качестве копии аргумента sendCh, который является пустым канальным временем. Продолжительность.поэтому я попробовал следующее:

func doStuff(t time.Duration, ch <-chan chan time.Duration) {
  // What makes this different from the original code?
  ac := make(chan chan time.Duration)
  time.Sleep(t)
  ac <- t
}
// This gives an immediate error: cannot use t (type time.Duration) as type chan time.Duration in send

Хорошо, это имеет смысл.Я не могу отправить время. Длительность на канал каналов времени. Длительность, мне нужно отправить канал времени. Длительность.Понятно ... но я не знаю, почему работает оригинальный код, так как мне кажется, это должно было быть так же, как если бы оригинал был каналом только для приема.Таким образом, я импортировал fmt и проверил тип переменного тока, и, конечно же, время его изменения. Продолжительность.Зачем?

Мой последний эксперимент состоял в том, чтобы попытаться инициализировать переменную переменного тока как время чана. Продолжительность напрямую, что привело к тупику:

func doStuff(t time.Duration, ch <-chan chan time.Duration) {
  ac := make(chan time.Duration)
  time.Sleep(t)
  ac <- t
  // this causes deadlock
}

Какого черта, лол ... Итак, подведу итог, я неЯ не понимаю, почему в исходном коде ac: = <- ch заставляет его инициализироваться как канал времени. Длительность, а не канал каналов времени. Продолжительность, и я не понимаю, почему изменения, которые я сделал в экспериментахвызвал различные условия ошибки, которые они сделали.Любое понимание приветствуется! </p>

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