登录
首页 >  Golang >  Go问答

通过接口实现“Stringer”功能

来源:stackoverflow

时间:2024-02-24 09:30:25 203浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《通过接口实现“Stringer”功能》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在尝试“抽象地”实现一个接口。我的意思是,我试图根据另一个接口的方法来实现该接口的方法。

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

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中我们可以轻松避免这种重复;例如通过向抽象类添加具体方法;或者通过向接口中的某些方法添加“默认”实现。

go 中有没有一种“惯用”的方法来完成这种事情? (也就是说,我们是否可以创建一个像 symbol 这样的抽象类型来实现 stringer,而不重复 string() 的实现。


正确答案


您不能拥有类似于抽象基类的结构来调用具体实现的方法。有多种方法可以模拟这一点,但我猜这不是您要问的。

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

但是,您可以这样做:

为符号创建一个字符串函数:

func symboltostring(s symbol) string {
       return fmt.sprintf("a symbol with name: %v", s.name())
}

现在您可以为每个结构编写 string 方法的简单实现:

type NonTerminalSymbol struct {
    name string
}

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

今天关于《通过接口实现“Stringer”功能》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>