我习惯了 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)
}
小怪兽爱吃肉
拉莫斯之舞
相关分类