猿问

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

我习惯了 Java,并在 google go 中设置了第一步。我有一棵带有子对象等的对象树……这棵树被递归地转储到 io.Writer。输出可能很大,所以我不想为每个对象创建一个字符串,并将结果连接到内存中..


出于调试目的,我想 fmt.Printf 这棵树的部分。因此,我想在调用 ToStream 函数的每个对象上创建一个通用的 String() 函数,将结果作为字符串返回。在 Java 中,这很简单:在基类上创建方法。如何在 GO 中执行此操作,而不为每种对象创建自定义 String 方法。


查看我想要的代码,特别是标记为 ERROR 的行


package main


import (

"io"

"fmt"

"bytes"

)


//Base is an interface for bulk output

type Base interface {

    ToStream(io.Writer)

}


//Impl1 has interface Base

type Impl1 struct{

    stuff int

}


func (Impl1) ToStream(w io.Writer) {

    fmt.Fprintf(w, "A lot of stuff")

}


//Impl2 has interface Base

type 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 method


func (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)

}


江户川乱折腾
浏览 170回答 3
3回答

小怪兽爱吃肉

您可以环绕 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())}

拉莫斯之舞

似乎 Java 思维在这里阻止了您 :-)虽然Java有方法只去不具备的功能。当然,你不能在接口上有方法,但你可以制作一个简单的函数,接受 aBase并做一些事情:func Base2String(b Base) string {    var buffer bytes.Buffer    b.ToStream(&buffer)    return string(buffer.Bytes())}现在,如果您将 Base 重命名为 Go 风格的东西(请记住,Go 中没有类型层次结构),您将获得一些不错的代码。
随时随地看视频慕课网APP

相关分类

Go
我要回答