interfaceと構造体の埋め込み

type Person interface {
    Name() string
    Title() string
}

type person struct {
    firstame string
}

// 共通メソッドをperson structに持たせる
func (p *person) Name() string {
    return p.firstame
}

type male struct {
    *person // 埋め込み
}

func (m male) Title() string {
    return "Mr."
}

type female struct {
    *person
}

// Person interface作成メソッド
func newPerson(gender, firstname string) Person {
    switch gender {
    case "male":
        // p := person{firstame: firstname}
        p := male{&person{firstame: firstname}} // maleは、person structをラップしたもの
        return p
    }
    return nil
}

func fullName(p Person) string {
    return p.Title() + p.Name()
}

func main() {
    p := newPerson("male", "yohei")
    log.Print(fullName(p))
}

参考

https://qiita.com/tenntenn/items/e04441a40aeb9c31dbaf