【发布时间】:2020-10-10 10:41:15
【问题描述】:
对于这个非常简单的问题,我很抱歉,只是在理解我们如何实施 io.Reader 时遇到了一些麻烦。
我的最终用例是我正在消费一个可以随时发送数据的无限流。为了模拟这一点,我创建了一个实现io.Reader 和io.Writer 的emitter。
我同时使用bufio.Scanner 收听阅读器,同时从 main 向任何监听器发送值。
游乐场: https://goplay.space/#eJfe0HyfYrL
func main() {
wg := &sync.WaitGroup{}
wg.Add(1)
data := newEmitter()
go func() {
scanner := bufio.NewScanner(data)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
wg.Done()
}()
data.WriteString("foo")
time.Sleep(2 * time.Second)
data.WriteString("bar")
wg.Wait()
}
我的emitter
type emitter struct {
ch chan []byte
}
func (em *emitter) Read(b []byte) (int, error) {
n := copy(b, <-em.ch)
return n, nil
}
func (em *emitter) Write(b []byte) (int, error) {
em.ch <- b
return len(b), nil
}
func (em *emitter) WriteString(s string) (int, error) {
return em.Write([]byte(s))
}
func newEmitter() *emitter {
return &emitter{
ch: make(chan []byte),
}
}
我收到以下错误
fatal error: all goroutines are asleep - deadlock!
【问题讨论】:
-
哦,太好了! io.Pipe 正是我想要做的
标签: go