Я начинаю с Go и сейчас пишу простую программу, которая считывает данные с датчика и помещает их в канал, чтобы выполнить с ним некоторые вычисления.Теперь у меня это работает следующим образом:
package main
import (
"fmt"
"time"
"strconv"
)
func get_sensor_data(c chan float64) {
time.Sleep(1 * time.Second) // wait a second before sensor data starts pooring in
c <- 2.1 // Sensor data starts being generated
c <- 2.2
c <- 2.3
c <- 2.4
c <- 2.5
}
func main() {
s := 1.1
c := make(chan float64)
go get_sensor_data(c)
for {
select {
case s = <-c:
fmt.Println("the next value of s from the channel: " + strconv.FormatFloat(s, 'f', 1, 64))
default:
// no new values in the channel
}
fmt.Println(s)
time.Sleep(500 * time.Millisecond) // Do heavy "work"
}
}
Это прекрасно работает, но датчик генерирует много данных, и меня всегда интересуют только самые последние данные.Однако при такой настройке он считывает только следующий элемент с каждым циклом, что означает, что если канал в какой-то момент содержит 20 значений, только самое новое значение считывается только через 10 секунд.
Есть ли способчтобы канал всегда содержал только одно значение за раз, чтобы я всегда получал только те данные, которые мне интересны, и канал не использует ненужную память (хотя эта память меньше всего беспокоит меня)?
Все советы приветствуются!