🧗‍♂️

Golangで構造体を扱う#1

2023/07/17に公開

今回は Go言語を使用して、構造体の作成し、メソッド(関数)の定義の関連付けや、埋め込みなどを扱った記事となります。

What is 構造体

構造体(Struct)は、関連するデータをグループ化するために使用されるデータ型です
また、異なるデータ型のフィールドを持つことができ、それぞれのフィールドには名前が付けられます

type Person struct {
	Name string
	Age  int
	City string
}

この Person 構造体は、名前、年齢、都市の3つのフィールドを持っています。それぞれのフィールドには名前が付けられ、対応するデータ型が指定されています。

構造体の使用場面

構造体はデータの保存や伝送、APIのリクエストやレスポンスのモデルとして使用されたり、データを操作し、保持するためのコンテナとして使用されます。

上記は一部の例であり、構造体の使用はとてもに多岐にわたります

インスタンスを作成し、フィールドにアクセスする

下記のコードは、構造体 Person のインスタンスをスライス people にコンパクトに初期化しています。各インスタンスはフィールドの値を中括弧 {} 内に列挙して作成されます。

type Person struct {
	Name string
	Age  int
	City string
}

func main() {
	people := []Person{
		{"Alice", 25, "Tokyo"},
		{"Bob", 30, "New York"},
		{"Charlie", 35, "London"},
	}

	for _, p := range people {
		fmt.Printf("%s is %d years old and lives in %s.\n", p.Name, p.Age, p.City)
	}
}

ループを使用して、people スライスの各要素である構造体インスタンスの情報を表示しています。

出力結果は以下

Alice is 25 years old and lives in Tokyo.
Bob is 30 years old and lives in New York.
Charlie is 35 years old and lives in London.

このように、構造体のインスタンス作成とフィールドへのアクセスをコンパクトかつ簡潔に行うことができます。

メソッド(関数)の定義の関連付け

下記のコードは、Person構造体にGreetというメソッドを関連付けています

type Person struct {
	Name string
	Age  int
	City string
}

func (p Person) Greet() {
	fmt.Printf("Hello, my name is %s. I am %d years old.\n", p.Name, p.Age)
}

func main() {
	person := Person{
		Name: "Alice",
		Age:  25,
		City: "Tokyo",
	}

	person.Greet()
}

メソッドの定義はfunc (p Person) Greet()とします。
Greetメソッドは、Person構造体のインスタンスに対して呼び出すことができます。

main関数では、personという名前のPerson構造体のインスタンスを作成し、person.Greet()のようにGreetメソッドを呼び出しています。

出力結果は以下

Hello, my name is Alice. I am 25 years old.

埋め込み

埋め込みを使用することで、構造体内に他の構造体を匿名フィールドとして埋め込むことができます

また、埋め込まれた構造体のフィールドやメソッドに対して、外部から直接アクセスすることができます

type Person struct {
	Name string
	Age  int
}

type Employee struct {
	Person
	EmployeeID string
}

Employee構造体内でPersonを匿名フィールドとして埋め込んでいます

EmployeeのインスタンスにはNameとAgeのフィールドが直接アクセス可能となります(継承)

func (p Person) Introduce() {
	fmt.Printf("My name is %s and I am %d years old.\n", p.Name, p.Age)
}

func (e Employee) Work() {
	fmt.Printf("I am an employee with ID %s.\n", e.EmployeeID)
}

func main() {
	employee := Employee{
		Person: Person{
			Name: "Alice",
			Age:  25,
		},
		EmployeeID: "E001",
	}

	employee.Introduce()
	employee.Work()
}

Person構造体にはIntroduceメソッド、Employee構造体にはWorkメソッドがあります

main関数では、Employee構造体のインスタンスを作成し、IntroduceメソッドとWorkメソッドを呼び出しています。これにより、従業員の自己紹介と業務内容を表示することができます。

出力結果は以下

My name is Alice and I am 25 years old.
I am an employee with ID E001.

まとめ

関連するデータフィールドをまとめるために使用され、異なるデータ型のフィールドを一つのオブジェクトとして扱うことができ、データのグループ化、操作、保持、伝送などの目的で使用される。

Discussion