Похоже, что у вас может быть недопонимание по каналам и процедурам перехода.
Строка:
go change(c)
, кажется, указывает на то, что функция change
собирается записать c
.Однако в конечном итоге он просто возвращает значение через определенный промежуток времени.
Это значение (2.5
) нигде не принимается.Кроме того, c
нигде не записывается.Я подозреваю, что вы намеревались записать 2.5
на канал c
.Синтаксис для этого следующий:
c<-2.5
Поэтому, если вы измените свою функцию change
на:
func change(c chan float64) {
time.Sleep(2 * time.Second)
c <- 2.5
}
Вы больше не должны видеть тупик.Обратите внимание, что я больше не возвращаю float64
.
Я создал игровую площадку для этого: https://play.golang.org/p/SgLiUmPpcAZ
Обновление для комментариев
1.1
всегда будет перезаписываться значением канала.Однако, если вы хотите напечатать начальное значение s
(как указано в комментарии), вам придется немного изменить поток и использовать выражение select
:
package main
import (
"fmt"
"time"
)
func change(c chan float64) {
time.Sleep(2 * time.Second)
c <- 2.5
}
func main() {
s := 1.1
c := make(chan float64)
go change(c)
for {
select {
case s = <-c:
default:
// c isn't ready yet
}
fmt.Println(s)
time.Sleep(100 * time.Millisecond)
}
}
Теперь, когда выесть оператор select
, вы также можете использовать его с time.Ticker
:
ticker := time.NewTicker(100 * time.Millisecond)
for {
select {
case s = <-c:
case <-ticker.C:
fmt.Println(s)
default:
// c isn't ready yet
}
}