我试图"抽象地"实现一个接口.我的意思是,我试图用另一个接口的方法实现该接口的方法.

以下是我try 过的(但它不起作用,因为我们似乎不允许使用接口类型作为接收器):

package symbols

import "fmt"

type Symbol interface {
    Name() string
}

type TerminalSymbol struct {
    rune rune
}

func (t TerminalSymbol) Name() string {
    return `'` + string(t.rune) + `'`
}

type NonTerminalSymbol struct {
    name string
}

func (nt NonTerminalSymbol) Name() string {
    return nt.name
}

/////////////////////////////////////////////////////////
/// Try to implement 'Stringer' interface for Symbols

func (s Symbol) String() string {
    //^ ERROR: invalid receiver type Symbol (pointer or interface type)
    return fmt.Sprintf("A symbol with name: %v", s.Name())
}

我想go编译器本质上是在告诉我,根本不支持基于另一个接口实现一个接口?

我想我可以简单地接受这个暗示,然后做这个:

func (s NonTerminalSymbol) String() string {
    return fmt.Sprintf("A symbol with name: %v", s.Name())
}

func (s TerminalSymbol) String() string {
    return fmt.Sprintf("A symbol with name: %v", s.Name())
}

这是可行的,但它最终会复制"String"方法的实现.

在Java中,我们可以轻松避免这种重复;e、 g.通过向抽象类添加具体方法;或者向接口中的某些方法添加"默认"实现.

有没有一种"惯用"的方式在围棋中完成这种事情?(也就是说,我们可以在不复制String()实现的情况下,创建一个抽象类型,比如Symbol实现Stringer吗.

推荐答案

不能有一个类似于调用具体实现方法的抽象基类的 struct .有很多方法可以效仿,但我猜这不是你想要的.

在Go中,接口只是一个方法列表,类继承的概念并不存在.可以使用类型嵌入来构建对象层次 struct ,但这并不提供实现此功能所需的后期绑定.

但是,您可以这样做:

为符号创建梯边梁函数:

func SymbolToString(s Symbol) string {
       return fmt.Sprintf("A symbol with name: %v", s.Name())
}

现在,您可以 for each struct 编写String个方法的简单实现:

type NonTerminalSymbol struct {
    name string
}

func (n NonTerminalSymbol) String() string {return SymbolToString(n)}

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

Go 1.22 net/http群组路由

如果添加构建标签,gopls将停止工作

如何存储来自异步Goroutine的返回值列表?

Go SQLCMD比Windows本机版本慢吗?

golang有int32溢出吗?

Secrets Manager Update Secret - Secret String 额外的 JSON 编码

golang gin 获取 cookie json

Go 中如何调用测试函数?

go version -m 输出中的箭头符号=>是什么意思?

确保 Go 1.20 编译时的严格可比性?

如何在切片增长时自动将切片的新元素添加到函数参数

如何在 Docker 容器中使用私有存储库进行身份验证

在 Golang 中,如何将接口作为泛型类型与 nil 进行比较?

Go 泛型:自引用接口约束

如何在测试中使用自定义标志(使用`testify/suite`)

即使一个测试用例失败,如何运行所有测试用例

通用函数与外部包中的常见成员一起处理不同的 struct ?

Go:如何创建一个可以提供配置文件中描述的 url 的服务器

有没有一种方法可以确保传递的值具有使用泛型的某些字段?