В этом коде есть несколько ошибок,
- значение chan никогда не сливается, поэтому любая запись будет блокировать
- значение chan никогда не закрывается, поэтому любой сток будет бесконечным
Канал всегда должен быть опустошен, в какой-то момент канал должен быть закрыт.
Также, пожалуйста, опубликуйте воспроизводимые примеры, в противном случае диагностировать проблему будет сложно.
Это слегка измененная, но рабочая версия кода OP.
package main
import (
"fmt"
"math"
"time"
)
func sineWave(value chan float64) {
defer close(value) // A channel must always be closed by the writer.
var div float64
sinMult := 6.2839
i := 0
fmt.Println("started")
for {
div = (float64(i+1) / sinMult)
time.Sleep(100 * time.Millisecond)
value <- math.Sin(div)
i++
if i == 4 {
// i = 0 // commented in order to quit the loop, thus close the channel, thus end the main for loop
break
}
}
}
func main() {
value := make(chan float64)
go sineWave(value) // start writing the values in a different routine
// drain the channel, it will end the loop whe nthe channel is closed
for v := range value {
fmt.Println(v)
}
}