Golang の構造体は最もよく使用されるものの 1 つであり、ユーザー定義型を作成する方法です。
この記事では、構造体に関するすべての基本と、それを Go プログラムで使用する方法をいくつかの例とともに説明します。
始めましょう!

導入
構造体は 、定義されたデータ型がグループ化された複数のデータ フィールドのコレクションです。これらは、データをグループ化してカスタム レコードを形成するのに役立ちます。構造体は 、組み込み型 と ユーザー定義型 の両方で構成されます (構造体自体はユーザー定義型です)。
Golang の構造体は 変更可能 です。つまり、プログラム全体で変更できます。
構造体を使用すると、複雑なデータ構造を作成して複数のモジュールに渡せるため、コード全体の品質が向上します。関数に 10 個のパラメーターを渡すことを想像してください。すぐにコードから逃げてしまうでしょう。これがまさに構造体が役立つ理由です。10 個のパラメーターの代わりに、単一の構造体をその関数に渡すだけで済みます。
構造体は、 type と struct という 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()
で構造体を
user
として宣言し、それを出力します。まだ初期化していないため、取得する出力は struct のゼロ/空の値です。
ゼロ値は、
基本的に各フィールドのゼロ値です。
{ 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 は ドット演算子 を提供します。前の例を続けて、名前と年齢のフィールドにアクセスして、それらを印刷してみましょう。
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 の構造体には、他のユーザー定義型も含めることができます。したがって、構造体には他のネストされた構造体を含めることができます。
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 つの構造体を比較する方法や、ネストされた構造体を実装する方法も検討しました。構造体について詳しく学ぶためのリソースをいくつか紹介します。
- Go の構造
- Golangbot – golang の非常に優れたシリーズ
- 完全な開発者ガイド
構造体について学ぶべきことはまだたくさんありますが、今のところは良いスタートです。何か新しいことを学べたことを願っています!
探索を続けてください。学び続けます!