Новый суслик здесь.Следующий код работает для меня, но меня смущает функция 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>