Golang ネストされた構造体フィールドの昇格について

2020-03-12

フィールドの昇格

Goの構造体フィールドは昇格という概念を持っています。
例えばネストされた子構造体のフィールドが昇格し、構造体の外からダイレクトにアクセスすることが可能です。

文字だとちょっとわかりずらいので以下に例を示します。

サンプルコード

package main

import "fmt"

// このようなネスト関係の構造体があるとします
type details struct {

	// details structure
	name string
	age  int
}
type team struct {
	name string
	year int
	details
}

func main() {

	// 構造体を宣言
	values := team{
		name: "Reds",
		year: 2020,

		details: details{

			name: "Salah",
			age:  27,
		},
	}

	// 昇格により直接アクセスできる
	fmt.Println("Age: ", values.age) // Age: 27

    // 通常の子構造体へのアクセス
	fmt.Println("Name: ", values.details.name) // Name: Salah

	// 通常のフィールドアクセス
	fmt.Println("Year: ", values.year)  // Year: 2020
	fmt.Println("Team name: ", values.name) // Team name: Reds

}

play.golang
このように子構造体のフィールドが昇格しネスト関係を明示しなくてもアクセスできるようになります。

Use Case

どの構造体にアクセスしているか正確に認識しなければならない時は、
明示して使うことの方が多いのですが、アクセスしているネストした
構造体を意識しなくても良い、意識させないケースでは使えます。

参照 Promoted Fields in Golang Structure
https://www.geeksforgeeks.org/promoted-fields-in-golang-structure/