異なる型をまとめて扱いたい場合に構造体(struct)を利用します。
基本
定義
構造体は予め定義する必要があります。structキーワード使用して、”{” (波括弧) の中に使用したいフィールド(名前と型)を定義します。
以下は構造体を定義する例になります。
type myStruct struct {
name string
age int
}
使い方
定義した構造体を変数宣言します。
フィールドへのアクセスは .(ドット)表記を使います。
package main
import (
"fmt"
)
// 構造体の定義
type myStruct struct {
name string
age int
}
func main() {
// 定義した構造体の変数宣言
var parson myStruct
// フィールドへのアクセス。値を設定。
parson.name = "名前"
parson.age = 20
// フィールドへのアクセス。値を取得。
fmt.Println(parson.name) // "名前" が表示される。
fmt.Println(parson.age) // 20 が表示される。
}
構造体の初期化
リテラル宣言
構造体の宣言は以下のように書くことも可能です。var による宣言と差異はありません。
各フィールドはゼロ値が設定されます。var による宣言も同様です。
func main() {
// 定義した構造体の変数宣言
// var parson myStruct
parson := myStruct{}
}
フィールドの初期化
フィールド名を指定せず値を指定する方法とフィールド名を指定して値を指定する方法がありますが、フィール名を指定する方法が良いでしょう。理由としては、どのフィールドが利用されるかが明示的になります。また、構造体のフィールドが追加された場合、フィールド名を指定せず値を指定した構造体を初期化した箇所全てを修正する必要があります。このような理由でフィールド名を指定して値を指定する方が良いでしょう。
名前を指定しない
フィールド名を指定しない場合、全てのフィールドに値を指定します。なお、指定する順番もフィールドが定義されている順となります。
func main() {
parson := myStruct{
"名前",
20,
}
fmt.Println(parson.name) // "名前" が表示される。
fmt.Println(parson.age) // 20 が表示される。
}
名前を指定する
フィールド名と値を “:” コロンで区切り指定します。
func main() {
parson := myStruct{
name: "名前",
age: 20,
}
fmt.Println(parson.name) // "名前" が表示される。
fmt.Println(parson.age) // 20 が表示される。
}
定義されないフィールドはゼロ値が設定されます。以下は、ageを設定していないので、int型のゼロ値である0が表示されます。
func main() {
parson := myStruct{
name: "名前",
}
fmt.Println(parson.name) // "名前" が表示される。
fmt.Println(parson.age) // 0 が表示される。
}