Go 言語の構造体 (Struct)
1. 構造体(Structures)とは
構造体(Struct)は、異なるデータ型(データタイプ)を持つ複数のメンバを一つの変数に集約するために使用されます。
配列(Array)が同じデータ型の値を複数格納するために使用されるのに対し、構造体は異なるデータ型の値を組み合わせて一つの変数として保持するために利用されます。これは、関連するデータをグループ化して「レコード」を作成する際に非常に便利です。
2. 構造体の宣言
Goで構造体を宣言(デクレア)するには、type と struct キーワードを使用します。
2.1. シンタックス
type struct_name struct {
member1 datatype;
member2 datatype;
member3 datatype;
...
}2.2. 実装例
ここでは、name(名前)、age(年齢)、job(職業)、salary(給与)というメンバを持つ Person 型の構造体を宣言します。
type Person struct {
name string
age int
job string
salary int
} ヒント: 上記の構造体メンバがそれぞれ異なるデータ型を持っている点に注目してください。name と job は string型、age と salary は int型です。
3. 構造体メンバへのアクセス
構造体の特定のメンバにアクセスするには、構造体変数名とメンバ名の間にドット演算子(.)を使用します。
3.1. 実装例
package main
import ("fmt")
// 構造体の定義
type Person struct {
name string
age int
job string
salary int
}
func main() {
var pers1 Person
var pers2 Person
// pers1 のスペック指定
pers1.name = "Hege"
pers1.age = 45
pers1.job = "教師"
pers1.salary = 6000
// pers2 のスペック指定
pers2.name = "Cecilie"
pers2.age = 24
pers2.job = "マーケティング"
pers2.salary = 4500
// pers1 の情報をアクセスして出力
fmt.Println("名前: ", pers1.name)
fmt.Println("年齢: ", pers1.age)
fmt.Println("職業: ", pers1.job)
fmt.Println("給与: ", pers1.salary)
// pers2 の情報をアクセスして出力
fmt.Println("名前: ", pers2.name)
fmt.Println("年齢: ", pers2.age)
fmt.Println("職業: ", pers2.job)
fmt.Println("給与: ", pers2.salary)
}実行結果:
名前: Hege
年齢: 45
職業: 教師
給与: 6000
名前: Cecilie
年齢: 24
職業: マーケティング
給与: 45004. 構造体を関数の引数として渡す
構造体は、他の変数と同様に関数の引数(アーギュメント)として渡すことが可能です。
4.1. 実装例
以下のコードでは、構造体を表示するためのロジックを関数として切り出し、再利用性を高めています。
package main
import ("fmt")
type Person struct {
name string
age int
job string
salary int
}
func main() {
var pers1 Person
var pers2 Person
// pers1 の設定
pers1.name = "Hege"
pers1.age = 45
pers1.job = "教師"
pers1.salary = 6000
// pers2 の設定
pers2.name = "Cecilie"
pers2.age = 24
pers2.job = "マーケティング"
pers2.salary = 4500
// 関数を呼び出して pers1 の情報を出力
printPerson(pers1)
// 関数を呼び出して pers2 の情報を出力
printPerson(pers2)
}
// 構造体を引数として受け取る関数
func printPerson(pers Person) {
fmt.Println("名前: ", pers.name)
fmt.Println("年齢: ", pers.age)
fmt.Println("職業: ", pers.job)
fmt.Println("給与: ", pers.salary)
}