猿问

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

我不确定“跳过”是否是描述我所看到的正确方式:


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 中叫什么?


慕斯王
浏览 123回答 2
2回答

不负相思意

如果您在谈论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将写入该文件。

倚天杖

在这种情况下,两个方法都实现了,它们的实现调用了 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)
随时随地看视频慕课网APP

相关分类

Go
我要回答