Golang の構造体は、最もよく使用されるものの 1 つであり、ユーザー定義型を作成する方法です。
この記事では、構造体に関するすべての基本と、それらを go プログラムで使用する方法について、いくつかの例を挙げて説明します。
始めましょう!
序章
あ 構造体 定義されたデータ型がグループ化された複数のデータ フィールドのコレクションです。 これらは、データをグループ化してカスタム レコードを形成するのに役立ちます。 構造体は、組み込み型とユーザー定義型の両方で構成されます (構造体自体はユーザー定義型です)。
Golang の構造体は変更可能です。つまり、プログラム全体で変更できます。
構造体は、複雑なデータ構造を作成して複数のモジュールに渡せるようにすることで、全体的なコード品質の向上に役立ちます。 関数に 10 個のパラメーターを渡すと想像してみてください。すぐにコードから逃げてしまいます。 これがまさに構造体が便利な理由です。10 個のパラメーターの代わりに、単一の構造体をその関数に渡すだけです。
構造体は、2 つのキーワードを使用して宣言されます。 タイプ と構造体。 定義された型と識別子 (名前) を持つ一連のフィールドを含む中括弧 (Java のクラスと同様) で囲まれています。 実装の詳細については、次のセクションで説明します。
オブジェクト指向プログラミング (OOP) のバックグラウンドを持っている場合は、構造体をクラスと見なすことができますが、継承はありません。
構造体の宣言
構造体とは何か、なぜそれが使用されるのかを理解したので、次は構造体の宣言方法を学習します。 構造体の基本的なスケルトンは次のようになります –
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() で、構造体をユーザーとして宣言し、出力します! まだ初期化していないため、得られる出力は構造体のゼロ/空の値です! の ゼロ値 各フィールドの値は基本的にゼロです。
{ 0 0}
構造体の初期化
前のセクションでは、構造体を宣言する方法を学びました。 ここで、値を初期化または割り当てます。 その方法については、以下のコードを確認してください –
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 はドット演算子を提供します。 前の例を続けて、name フィールドと age フィールドにアクセスし、それらを出力してみましょう。
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 キーワードは、初期化された構造体へのポインターを返します。 Golang では、ポインターを明示的に逆参照する必要はありませんが、 fmt.Println(*user) は同じ出力になります。
ネストされた構造体
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 にアクセスしたい場合は、同じドット演算子を使用してアクセスできます –
user.roleDetails.position
構造体の等価性
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 つの構造体を比較する方法と、ネストされた構造体を実装する方法についても説明しました。 構造体の詳細については、次のリソースを参照してください。
構造体について学ぶべきことはまだたくさんありますが、今のところは良いスタートです。 何か新しいことを学んだことを願っています!
探索を続けます。 学び続けます!