一个接口,多种实现

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

https://play.golang.org/p/hW1q8eMve3