I'm used to Java, and setting first steps in google go. I have a tree of objects with child objects etc... This tree is recursively dumped to an io.Writer. Output might be huge, so I don't want to create a string for each object, and concatenate the result in memory..
For debugging purposes, i want to fmt.Printf parts of this tree. Thus, I want to create a generic String() function on each object in which calls the ToStream function, returning the result as a string. In Java, this is easy: create the method on the base class. How do I do this in GO, without creating a custom String method for each kind of object.
See the code for what I want, specifically the line marked 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
",aBase)
}