1

我想知道,是否可以扩展现有接口?有一个简单的代码片段不起作用。

包主

import (
    "fmt"
    "io"
)

type Aaa struct {}

// Implementing io.ReaderAt interface
func (a Aaa)ReadAt(p []byte, off int64) (n int, err error) {
    return
}

// Extending it
func (a *Aaa) A() {
    fmt.Println("A")
}

func main() {
    list := [1]io.ReaderAt{Aaa{}} // Use Aaa object as io.ReaderAt type
    list[0].A() //Trying to use an extended type. << Error occurred here
}

list[0].A 未定义(类型 io.ReaderAt 没有字段或方法 A)

这是一种告诉我我不能从不同的包实现接口的方法吗?

4

1 回答 1

6

它只是告诉你io.ReaderAt没有A()方法。

你需要一个类型断言来*Aaa摆脱io.ReaderAt.

a := io.ReaderAt(&Aaa{})
if a, ok := a.(*Aaa); ok {
    a.A()
}

接口不需要在任何特定的地方定义,所以如果你的代码需要ReaderAtA这些方法,你可以自己定义,任何ReaderAtA值也可以是io.ReaderAt

type ReaderAtA interface {
    io.ReaderAt
    A()
}


a := ReaderAtA(&Aaa{})
a.A()

https://play.golang.org/p/0bl5djJ0im

于 2016-11-18T17:20:36.533 回答