我有一个包含一个字节数据的类型,并采用一个通道在那里发布新数据。其他代码可以使用Read
函数读取最后写入的数据字节。
编辑:对于实际的、可运行的代码,请参阅https://github.com/ariejan/i6502/pull/3尤其是文件 acia6551.go 和 acia6551_test.go。测试结果可以在这里查看:https ://travis-ci.org/ariejan/i6502/jobs/32862705
我有以下内容:
// Emulates a serial interface chip of some kind.
type Unit struct {
// Channel used for others to use, bytes written here will be placed in rxChar
Rx chan byte
// Internal store of the last byte written.
rxChar byte // Internal storage
}
// Used internally to read data store in rxChar
func (u *Unit) Read() byte {
return u.rxChar
}
// Create new Unit and go-routing to listen for Rx bytes
func NewUnit(rx chan byte) *Unit {
unit := &Unit{Rx: rx}
go func() {
for {
select {
case data := <-unit.Rx:
unit.rxData = data
fmt.Printf("Posted 0x%02X\n", data)
}
}
}()
return unit
}
我的测试如下所示:
func TestUnitRx(t *testing.T) {
rx := make(chan byte)
u := NewUnit(rx)
// Post a byte to the Rx channel
// This prints "Posted 0x42", as you'd expect
rx <- 0x42
// Using testing
// Should read last byte, 0x42 but fails.
fmt.Println("Reading value...")
assert.Equal(t, 0x42, u.Read())
}
起初,我认为“读取值”发生在 go-routing 开始写入数据之前。但是“已发布”消息总是在“阅读”之前打印。
所以,还有两个问题:
- 这是处理传入字节流的最佳方法吗(9600 波特;-))
- 如果这是正确的方法,我该如何正确测试它或我的代码有什么问题?