go - 使用结构成员而不是结构本身

标签 go

所以这与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/

相关文章:

time - 获取 time.Time 月份的最后一天

go - 为什么 golang 中的 channel 需要一个 go-routine?

oop - 如何在golang中创建一个自动调用的结构方法?

go - 发生错误时如何停止goroutine

go - 如何在 Go 结构中设置默认值

arrays - 如何在golang中递增数组或 slice 中的所有元素

docker - 使用`dlv`调试`docker`失败

postgresql - 无法从golang Docker容器连接到Postgres数据库

docker - 无法使用 Goland 部署 docker 容器 - DockerClientException - .eslintrc(没有这样的文件或目录)

regex - Go 中不前瞻地匹配进行中的单词