为了账号安全,请及时绑定邮箱和手机立即绑定

接口方法实现可以在 Go 中“跳过”吗?

接口方法实现可以在 Go 中“跳过”吗?

Go
慕斯王 2022-05-05 17:58:17
我不确定“跳过”是否是描述我所看到的正确方式:type Container struct {    clck         sync.Mutex    closed       bool    cli          *client.Client    ID           string    IO           io.ReadWriteCloser    closetimeout time.Duration}func (c *Container) Write(dat []byte) (int, error) {    return c.IO.Write(dat)}func (c *Container) Read(dat []byte) (int, error) {    return c.IO.Read(dat)}在我看来Read,Write方法没有实现。这在 Golang 中叫什么?
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

如果您在谈论Container类型,则ReadandWrite方法实现已经显示在您的代码中。你不能为一个类型定义一个方法而不实现它。使用这些方法,Container现在实现io.Reader、io.Writer和io.ReadWriter接口。简单的将操作委托给字段所指向的Read和Write方法。没有实现方法,所以它不是一个.ContainerReadWriteCloserIOContainerCloseio.ReadWriteCloser


如果您在谈论c.IO.Read,则使用接口调用这些方法。创建Container实例时,必须设置c.IO为实现的结构,io.ReadWriteCloser当c.IO.Read被调用时,将调用该结构上的方法。例如,一个os.Fileimplements io.ReadWriteCloser,所以你可以:


file, err:=os.Open("filename")

ctr:=Container{IO:file}

在此之后,ctr.Write将写入该文件。


查看完整回答
反对 回复 2022-05-05
?
倚天杖

TA贡献1828条经验 获得超3个赞

在这种情况下,两个方法都实现了,它们的实现调用了 IO 的方法。请注意,您可以根据需要更改实现,或在请求之前或之后添加行。


然而,有趣的是“跳过”可以通过匿名字段来实现。在这种情况下,如果您进行:


type Container struct {

    io.ReadWriteCloser

    clck         sync.Mutex

    closed       bool

    cli          *client.Client

    ID           string

    closetimeout time.Duration

}

io.ReadWriteCloser 的方法将执行到 Container 结构。


但是,如果您忘记将 ReadWriteCloser 放入结构中,它会出现恐慌,因此请尽量不要使用它,除非您知道自己在做什么。(例如: https: //play.golang.org/p/ak7qpaWSE8n)


查看完整回答
反对 回复 2022-05-05
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信