为了账号安全,请及时绑定邮箱和手机立即绑定

来自流中的字符串,用于多种对象类型

来自流中的字符串,用于多种对象类型

Go
江户川乱折腾 2021-08-23 17:07:39
我习惯了 Java,并在 google go 中设置了第一步。我有一棵带有子对象等的对象树……这棵树被递归地转储到 io.Writer。输出可能很大,所以我不想为每个对象创建一个字符串,并将结果连接到内存中..出于调试目的,我想 fmt.Printf 这棵树的部分。因此,我想在调用 ToStream 函数的每个对象上创建一个通用的 String() 函数,将结果作为字符串返回。在 Java 中,这很简单:在基类上创建方法。如何在 GO 中执行此操作,而不为每种对象创建自定义 String 方法。查看我想要的代码,特别是标记为 ERROR 的行package mainimport ("io""fmt""bytes")//Base is an interface for bulk outputtype Base interface {    ToStream(io.Writer)}//Impl1 has interface Basetype Impl1 struct{    stuff int}func (Impl1) ToStream(w io.Writer) {    fmt.Fprintf(w, "A lot of stuff")}//Impl2 has interface Basetype Impl2 struct{    otherstuff int}func (Impl2) ToStream(w io.Writer) {    fmt.Fprintf(w, "A lot of other stuff")}//I want to convert any base to a sting for debug output//This should happen by the ToStream methodfunc (v Base) String() string {//ERROR here: Invalid receiver type Base (Base is an interface type)//func (v Impl1) String() string {//This works, but requires re-implementation for every struct Impl1,Impl2,...    var buffer bytes.Buffer    v.ToStream(&buffer)    return string(buffer.Bytes())}func main(){    aBase:= new(Impl1)    fmt.Printf("%s\n",aBase)}
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

您可以环绕 Base 以添加必要的String()功能。这是一种方法:


type StreamerToStringer struct {

    Base

}


func (s StreamerToStringer) String() string {

    var buffer bytes.Buffer

    s.Base.ToStream(&buffer)

    return string(buffer.Bytes())

}

有了这个,你可以增加任何Base实例,让它有一个String()方法。


func main() {

    aBase1 := StreamerToStringer{new(Impl1)}

    aBase2 := StreamerToStringer{new(Impl2)}

    fmt.Printf("%s\n", aBase1)

    fmt.Printf("%s\n", aBase2)


    // These wrapped values still support ToStream().

    var buffer bytes.Buffer

    aBase1.ToStream(&buffer)

    fmt.Println(buffer.Bytes())

}


查看完整回答
反对 回复 2021-08-23
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

似乎 Java 思维在这里阻止了您 :-)


虽然Java有方法只去不具备的功能。当然,你不能在接口上有方法,但你可以制作一个简单的函数,接受 aBase并做一些事情:


func Base2String(b Base) string {

    var buffer bytes.Buffer

    b.ToStream(&buffer)

    return string(buffer.Bytes())

}

现在,如果您将 Base 重命名为 Go 风格的东西(请记住,Go 中没有类型层次结构),您将获得一些不错的代码。


查看完整回答
反对 回复 2021-08-23
  • 3 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信