所以这与tarm's Go Serial Package有关.
我试图用它从串口中读取以“\r\n”结尾的字符串。虽然它没有内置函数,但我发现了 this answer并从那里开始工作(在创建的端口上使用具有自定义拆分功能的扫描仪)。
现在我的问题是,为什么这行得通?端口结构如下(来自包源码):
type Port struct {
// We intentionly do not use an "embedded" struct so that we
// don't export File
f *os.File
}
所以文件指针只是Port类型的一个字段,没有嵌入什么的。
但下面的代码有效:
func handler(port *serial.Port) {
scanner := bufio.NewScanner(port)
scanner.Split(scanMessageLine)
for {
scanner.Scan()
messageBytes := scanner.Bytes()
}
}
我怎样才能创建一个扫描器,它需要带有端口的 io.Reader 接口(interface);虽然它只是实现接口(interface)的端口成员,而不是端口本身?
此外,Webstorm 中的代码完成(我将它与 Golang 插件一起使用)建议将 f 上的函数作为端口的直接成员,但如果我打印端口结构实例,它只包含一个指针?
为了避免 IDE 做一些奇怪的事情,我从命令行构建了程序,它仍然有效。
我在这里缺少一些奇特的指针巫术吗?或者它是一个常用的 Golang 特性吗?是否有针对单个成员的结构直接公开其成员方法的规定?即使它不是嵌入式的?
由于我完全有可能完全误解了整个界面的事情,如果你们建议我阅读一些不错的深度 Material ,我很乐意这样做。考虑到接口(interface)在 go 中无处不在,我想正确地理解它们。
最佳答案
Port
有方法 Read(b []byte) (n int, err error)
因此它实现了 io.Reader
。
参见 the source .
关于go - 使用结构成员而不是结构本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34881555/