go - 实现和扩展来自不同包的接口(interface)

标签 go methods interface django-inheritance

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

主要包

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 undefined (type io.ReaderAt has no field or method A)

这是告诉我不能实现来自不同包的接口(interface)的一种方式吗?

最佳答案

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

您需要类型断言才能从 io.ReaderAt 中获取 *Aaa

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

接口(interface)不需要在任何特定的地方定义,所以如果你的代码需要一个带有这些方法的ReaderAtA,你可以自己定义它,任何ReaderAtA值也将是 io.ReaderAt

type ReaderAtA interface {
    io.ReaderAt
    A()
}


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

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

关于go - 实现和扩展来自不同包的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682578/

相关文章:

Java - 为什么我的鼠标不能正确移动?

Java 参数传递

go - 从 io.ReadWriteSeeker 中删除字节(通过文件)

go - 如何将累加器传递给递归函数?

go - 显示结构值的链代码函数

ruby - 处理 3 个或更多默认参数 Ruby

go - 如何在 Golang 中将不同类型的结构作为参数传递给函数

java - 如何调用带参数的私有(private)方法

php - 使用 PHPUnit 测试 protected 方法的最佳实践(在抽象类上)

java - 获取泛型类型参数的正确方法