テクノロジー 開発 非公開: Golang の構造体

Golang の構造体

Golang の構造体は最もよく使用されるものの 1 つであり、ユーザー定義型を作成する方法です。

この記事では、構造体に関するすべての基本と、それを Go プログラムで使用する方法をいくつかの例とともに説明します。

始めましょう!

Golang の構造体
Golang の構造体

導入

構造体は 、定義されたデータ型がグループ化された複数のデータ フィールドのコレクションです。これらは、データをグループ化してカスタム レコードを形成するのに役立ちます。構造体は 、組み込み型 ユーザー定義型 の両方で構成されます (構造体自体はユーザー定義型です)。

Golang の構造体は 変更可能 です。つまり、プログラム全体で変更できます。

構造体を使用すると、複雑なデータ構造を作成して複数のモジュールに渡せるため、コード全体の品質が向上します。関数に 10 個のパラメーターを渡すことを想像してください。すぐにコードから逃げてしまうでしょう。これがまさに構造体が役立つ理由です。10 個のパラメーターの代わりに、単一の構造体をその関数に渡すだけで済みます。

構造体は、 type struct という 2 つのキーワードを使用して宣言されます。これは (Java のクラスと同様に) 中括弧で囲まれており、定義されたタイプと識別子 (名前) を持つフィールドのセットが含まれています。実装の詳細については次のセクションで説明します。

オブジェクト指向プログラミング (OOP) の経験がある場合は、構造体を継承のないクラスとして考えることができます。

Golang の構造体
Golang の構造体

構造体の宣言

構造体とは何か、そしてそれが使用される理由は理解できたので、次は構造体の宣言方法を学習します。構造体の基本的なスケルトンは次のようになります –

 type name_of_struct struct { 
     field1 data_type_field1 
     field2 data_type_field2 
 }

ここで、 type struct はキーワードですが、struct には定義されたデータ型を持つ複数のフィールドが含まれています。

例を見てみましょう –

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	var user User
	fmt.Println(user)
}

ここでは、 string int 、および float32 フィールドで構成される User 構造体を定義します。 main() で構造体を user として宣言し、それを出力します。まだ初期化していないため、取得する出力は struct のゼロ/空の値です。 ゼロ値は、 基本的に各フィールドのゼロ値です。

  { 0 0} 
Golang の構造体
Golang の構造体

構造体の初期化

前のセクションでは、構造体を宣言する方法を学びました。ここで、それらを初期化するか、値を割り当てます。その方法については、以下のコードを確認してください –

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	
	// Without field names
	user2 := User{"Nidhi", 21, 1000.0}
	
	fmt.Println(user1)
	fmt.Println(user2)
}

コード自体は、フィールド名の有無にかかわらず 2 つの構造体を初期化する方法を説明しています。ここで、出力は次のようになります –

 {Mohit 24 100}
 {Nidhi 21 1000}

上記の場合、フィールドの 1 つが初期化されていない場合、そのフィールドはデフォルトのゼロ値になります。

 user1 := User{
	name:        "Mohit",
	age:         24,
}

 // Output - { Mohit 24 0.0 }

new キーワードを使用して構造体を作成する方法がもう 1 つあります。次のセクションでその使用方法を見ていきます。

Golang の構造体
Golang の構造体

構造体のフィールドへのアクセス

構造体の作成と初期化の方法がわかったので、構造体のフィールドにアクセスする方法を見てみましょう。このために、Golang は ドット演算子 を提供します。前の例を続けて、名前と年齢のフィールドにアクセスして、それらを印刷してみましょう。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}

	fmt.Println(user.name)
	fmt.Println(user.age)
	fmt.Println(user.bankBalance)
}

ここでは、 struct_name.field_name を使用して構造体のフィールドにアクセスします。上記のコードの出力は次のようになります –

 Mohit
 24
 100

前述したように、 new キーワードを使用して構造体を作成できます。方法を見てみましょう –

 user := new(User)
 user.name = "Mohit"
 user.age = 24
 user.bankBalance = 100.0

 fmt.Println(user)

 // Output - &{Mohit 24 100}

new キーワードは、 初期化された struct へのポインタ を返します。 Golang では、ポインターを明示的に逆参照する必要はありませんが、 fmt.Println(*user) を実行しても同じ出力が得られます。

Golang の構造体
Golang の構造体

入れ子になった構造体

golang の構造体には、他のユーザー定義型も含めることができます。したがって、構造体には他のネストされた構造体を含めることができます。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
	roleDetails RoleDetails
}

type RoleDetails struct {
	position string
	team     string
}

func main() {
	roleDetailForMohit := RoleDetails{
		position: "Software Engineer",
		team:     "Transport",
	}
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
		roleDetails: roleDetailForMohit,
	}

	fmt.Println(user)
}

上記のコードでは、 User 構造体の一部として、 RoleDetails 構造体があります。出力は次のようになります –

  {Mohit 24 100 {Software Engineer Transport}}
 

roleDetails にアクセスしたい場合は、同じ dot 演算子を使用してアクセスできます。

user.roleDetails.position

構造の等価性

2 つの構造体が持つ各フィールドが等しい (組み込みとユーザー定義の両方) 場合、2 つの構造体は等しいと見なされますが、すべてのデータ型が比較できるわけではありません。 (マップは直接比較できません)。平等性を示す例を見てみましょう。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user2 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user3 := User{
		name:        "Nidhi",
		age:         21,
		bankBalance: 1000.0,
	}

	if user1 == user2 {
		fmt.Println("user1 and user2 are equal")
	} else {
		fmt.Println("user1 and user2 are not equal")
	}

	if user1 == user3 {
		fmt.Println("user1 and user3 are equal")
	} else {
		fmt.Println("user1 and user3 are not equal")
	}
}

空の構造体とゼロ値の構造体は同等です。フィールドの順序は重要ではありません。基本的に、各フィールドは等しく一致する必要があります。上記のコードの出力は次のようになります –

 user1 and user2 are equal
user1 and user3 are not equal

結論

素晴らしい!

これで、golang で構造体を使用する準備が整いました。宣言、初期化、構造体フィールドへのアクセスなどの基本をすべてカバーしました。また、2 つの構造体を比較する方法や、ネストされた構造体を実装する方法も検討しました。構造体について詳しく学ぶためのリソースをいくつか紹介します。

構造体について学ぶべきことはまだたくさんありますが、今のところは良いスタートです。何か新しいことを学べたことを願っています!

探索を続けてください。学び続けます!

「 Golang の構造体」についてわかりやすく解説!絶対に観るべきベスト2動画

【1/6】構造体の基本をマスター!(そもそも構造体とは?)
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】

Golang の構造体は最もよく使用されるものの 1 つであり、ユーザー定義型を作成する方法です。

この記事では、構造体に関するすべての基本と、それを Go プログラムで使用する方法をいくつかの例とともに説明します。

始めましょう!

Golang の構造体
Golang の構造体

導入

構造体は 、定義されたデータ型がグループ化された複数のデータ フィールドのコレクションです。これらは、データをグループ化してカスタム レコードを形成するのに役立ちます。構造体は 、組み込み型 ユーザー定義型 の両方で構成されます (構造体自体はユーザー定義型です)。

Golang の構造体は 変更可能 です。つまり、プログラム全体で変更できます。

構造体を使用すると、複雑なデータ構造を作成して複数のモジュールに渡せるため、コード全体の品質が向上します。関数に 10 個のパラメーターを渡すことを想像してください。すぐにコードから逃げてしまうでしょう。これがまさに構造体が役立つ理由です。10 個のパラメーターの代わりに、単一の構造体をその関数に渡すだけで済みます。

構造体は、 type struct という 2 つのキーワードを使用して宣言されます。これは (Java のクラスと同様に) 中括弧で囲まれており、定義されたタイプと識別子 (名前) を持つフィールドのセットが含まれています。実装の詳細については次のセクションで説明します。

オブジェクト指向プログラミング (OOP) の経験がある場合は、構造体を継承のないクラスとして考えることができます。

Golang の構造体
Golang の構造体

構造体の宣言

構造体とは何か、そしてそれが使用される理由は理解できたので、次は構造体の宣言方法を学習します。構造体の基本的なスケルトンは次のようになります –

 type name_of_struct struct { 
     field1 data_type_field1 
     field2 data_type_field2 
 }

ここで、 type struct はキーワードですが、struct には定義されたデータ型を持つ複数のフィールドが含まれています。

例を見てみましょう –

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	var user User
	fmt.Println(user)
}

ここでは、 string int 、および float32 フィールドで構成される User 構造体を定義します。 main() で構造体を user として宣言し、それを出力します。まだ初期化していないため、取得する出力は struct のゼロ/空の値です。 ゼロ値は、 基本的に各フィールドのゼロ値です。

  { 0 0} 
Golang の構造体
Golang の構造体

構造体の初期化

前のセクションでは、構造体を宣言する方法を学びました。ここで、それらを初期化するか、値を割り当てます。その方法については、以下のコードを確認してください –

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	
	// Without field names
	user2 := User{"Nidhi", 21, 1000.0}
	
	fmt.Println(user1)
	fmt.Println(user2)
}

コード自体は、フィールド名の有無にかかわらず 2 つの構造体を初期化する方法を説明しています。ここで、出力は次のようになります –

 {Mohit 24 100}
 {Nidhi 21 1000}

上記の場合、フィールドの 1 つが初期化されていない場合、そのフィールドはデフォルトのゼロ値になります。

 user1 := User{
	name:        "Mohit",
	age:         24,
}

 // Output - { Mohit 24 0.0 }

new キーワードを使用して構造体を作成する方法がもう 1 つあります。次のセクションでその使用方法を見ていきます。

Golang の構造体
Golang の構造体

構造体のフィールドへのアクセス

構造体の作成と初期化の方法がわかったので、構造体のフィールドにアクセスする方法を見てみましょう。このために、Golang は ドット演算子 を提供します。前の例を続けて、名前と年齢のフィールドにアクセスして、それらを印刷してみましょう。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	// With field names
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}

	fmt.Println(user.name)
	fmt.Println(user.age)
	fmt.Println(user.bankBalance)
}

ここでは、 struct_name.field_name を使用して構造体のフィールドにアクセスします。上記のコードの出力は次のようになります –

 Mohit
 24
 100

前述したように、 new キーワードを使用して構造体を作成できます。方法を見てみましょう –

 user := new(User)
 user.name = "Mohit"
 user.age = 24
 user.bankBalance = 100.0

 fmt.Println(user)

 // Output - &{Mohit 24 100}

new キーワードは、 初期化された struct へのポインタ を返します。 Golang では、ポインターを明示的に逆参照する必要はありませんが、 fmt.Println(*user) を実行しても同じ出力が得られます。

Golang の構造体
Golang の構造体

入れ子になった構造体

golang の構造体には、他のユーザー定義型も含めることができます。したがって、構造体には他のネストされた構造体を含めることができます。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
	roleDetails RoleDetails
}

type RoleDetails struct {
	position string
	team     string
}

func main() {
	roleDetailForMohit := RoleDetails{
		position: "Software Engineer",
		team:     "Transport",
	}
	user := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
		roleDetails: roleDetailForMohit,
	}

	fmt.Println(user)
}

上記のコードでは、 User 構造体の一部として、 RoleDetails 構造体があります。出力は次のようになります –

  {Mohit 24 100 {Software Engineer Transport}}
 

roleDetails にアクセスしたい場合は、同じ dot 演算子を使用してアクセスできます。

user.roleDetails.position

構造の等価性

2 つの構造体が持つ各フィールドが等しい (組み込みとユーザー定義の両方) 場合、2 つの構造体は等しいと見なされますが、すべてのデータ型が比較できるわけではありません。 (マップは直接比較できません)。平等性を示す例を見てみましょう。

 package main

import (
	"fmt"
)

type User struct {
	name        string
	age         int
	bankBalance float32
}

func main() {
	user1 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user2 := User{
		name:        "Mohit",
		age:         24,
		bankBalance: 100.0,
	}
	user3 := User{
		name:        "Nidhi",
		age:         21,
		bankBalance: 1000.0,
	}

	if user1 == user2 {
		fmt.Println("user1 and user2 are equal")
	} else {
		fmt.Println("user1 and user2 are not equal")
	}

	if user1 == user3 {
		fmt.Println("user1 and user3 are equal")
	} else {
		fmt.Println("user1 and user3 are not equal")
	}
}

空の構造体とゼロ値の構造体は同等です。フィールドの順序は重要ではありません。基本的に、各フィールドは等しく一致する必要があります。上記のコードの出力は次のようになります –

 user1 and user2 are equal
user1 and user3 are not equal

結論

素晴らしい!

これで、golang で構造体を使用する準備が整いました。宣言、初期化、構造体フィールドへのアクセスなどの基本をすべてカバーしました。また、2 つの構造体を比較する方法や、ネストされた構造体を実装する方法も検討しました。構造体について詳しく学ぶためのリソースをいくつか紹介します。

構造体について学ぶべきことはまだたくさんありますが、今のところは良いスタートです。何か新しいことを学べたことを願っています!

探索を続けてください。学び続けます!

「 Golang の構造体」についてわかりやすく解説!絶対に観るべきベスト2動画

【1/6】構造体の基本をマスター!(そもそも構造体とは?)
【たった1時間で学べる】Go言語のプログラミング初心者向けの超入門講座【文字書き起こし、ソースコードも完全無料!】