How do I translate the following Java code to Go?
interface NamePrinter {
void print();
}
class NamePrinterWithoutGreeting implements NamePrinter {
private string name;
public NamePrinterWithoutGreeting(string name) {
this.name = name;
}
public void print() {
System.out.println(this.name);
}
}
class NamePrinterWithGreeting implements NamePrinter {
private string name;
public NamePrinterWithoutGreeting(string name) {
this.name = name;
}
public void print() {
System.out.println("Hello, " + this.name);
}
}
Type NamePrinter
can reference an instance of both NamePrinterWithoutGreeting
and NamePrinterWithGreeting
:
void main(String[] args) {
a NamePrinter = new NamePrinterWithoutGreeting("Joe");
b NamePrinter = new NamePrinterWithGreeting("Joe");
a.print(); // prints "Joe"
b.print(); // prints "Hello, Joe"
}
Back to go
... I'd like to have an interface
of type NamePrinter
that could reference many different implementations... but I don't know how to do it. Here below is an implementation... but it is fine for just one case:
type Person struct {
name string
}
type NamePrinter interface {
Create(name string)
Print()
}
func Create(name string) *Person {
n := Person{name}
return &n
}
func (p *Person) print() {
fmt.Println(p.name)
}
func main() {
p := Create("joe")
fmt.Println(p.Print())
}
Thank you.
Any type that you define, and on which you implement a set of methods that are equal in their signatures to those defined by an interface, that type can be used in place where you expect that interface.
type NamePrinter interface {
print()
}
type NamePrinterWithoutGreeting struct {
name string
}
func (p *NamePrinterWithoutGreeting) print() {
fmt.Println(p.name)
}
type NamePrinterWithGreeting struct {
name string
}
func (p *NamePrinterWithGreeting) print() {
fmt.Println("Hello, ", p.name)
}
type MyInt int
func (i MyInt) print() {
fmt.Printf("Hello, %d
", i)
}
type MyFunc func() string
func (f MyFunc) print() {
fmt.Println("Hello,", f())
}
func main() {
var a NamePrinter = &NamePrinterWithoutGreeting{"joe"}
var b NamePrinter = &NamePrinterWithGreeting{"joe"}
var i NamePrinter = MyInt(2345)
var f NamePrinter = MyFunc(func() string { return "funk" })
a.print()
b.print()
i.print()
f.print()
}