構造体の埋め込みで継承っぽく

構造体はクラスではないので、継承はできません。
ただしGOでは、構造体の埋め込みを使うことで継承っぽいことができます(笑)

  • 構造体の中に構造体を入れる場合に、変数名を書かない。
    type UserExt struct {
    	User // 埋め込む(継承したい)構造体
    	Age int
    }
  • メンバ変数にアクセスするときは直接アクセス可能
    下記のどちらでもアクセス可能。
    user2.User.ID = 2
    user2.ID = 2
  • 同じメソッド名を定義すると上書きされる(クラスでいうオーバーライド)


下記がサンプルコードです。

package main

import (
	"fmt"
)

// User ユーザー基本データ
type User struct {
	ID   int
	Name string
}

// Output ユーザー基本データの出力
func (u *User) Output() {
	fmt.Printf("ID=%d, Name=%s\n", u.ID, u.Name)
}

// UserExt 拡張ユーザーデータ
type UserExt struct {
	User // 埋め込む(継承したい)構造体
	Age int
}

// Output 拡張ユーザーデータの出力
func (u *UserExt) Output() {
	fmt.Printf("ID=%d, Name=%s, Age=%d\n", u.ID, u.Name, u.Age)
}

func main() {
	user1 := UserExt{User{1, "Taro"}, 21}
	user2 := UserExt{}

	user2.User.ID = 2
	user2.Name = "Hanako"
	user2.Age = 22

	fmt.Println(user1)
	fmt.Println(user2)

	user1.Output()
	user2.User.Output()
}


実行するとこんな感じです。

{{1 Taro} 21}
{{2 Hanako} 22}
ID=1, Name=Taro, Age=21
ID=2, Name=Hanako