Go言語 struct

Goは静的型付けされたプログラミング言語で、そのシンプルさ、効率性、拡張性で知られています。Go言語の主な特徴の1つはコンポジット型です。コンポジット型により、開発者は基本的なデータ型を組み合わせてより複雑な構造にすることができます。

Go言語 構造体

Goの構造体は、複数の変数をまとめて保持できるデータ構造です。基本的には、整数、文字列、ブール値など、異なるデータ型の変数の集合体です。構造体の変数はフィールドと呼ばれ、ドット記法を使ってアクセスできます。

myStruct.fieldName

Goで構造体を定義するには、以下のようなコードを記述します。

struct {
    name string
    age int
}

この例では、構造体はnameとageという2つのフィールドを持っています。nameフィールドはstring型、ageフィールドはint型です。

構造体を定義すると、そのインスタンスを作成してコード内で使用することができます。構造体の新しいインスタンスを作成するには、構造体名と初期化するフィールドを指定します。

package main

import "fmt"

func main() {
    person := struct {
        name string
        age  int
    }{
        name: "John Smith",
        age:  30,
    }
    fmt.Println("name:", person.name)
    fmt.Println("age:", person.age)
}

この例では、personという名前の構造体の新しいインスタンスを作成し、nameフィールドの値をJohn Smith、ageフィールドの値を30で初期化しています。また、構造体のフィールドへの参照は(.)を使ってアクセスすることができます。上記の構造体はnameとageのフィールドを持っているため、personを用いてperson.name、person.ageのようにアクセスします。

Note: 構造体はそれ自体では単なる変数の集合体であり、それにメソッドを付けることはできません。構造体にメソッドを追加するには、構造体をベースにしたカスタム型を定義し、そのカスタム型にメソッドを紐付けする必要があります。

Go言語 カスタム型

カスタム型はGoプログラミング言語の強力な機能で、開発者が独自のデータ型を作成することを可能にします。カスタム型は型のエイリアスや構造体を定義することで作成され、Goの他の組み込み型と同様に使用することができます。

型のエイリアス(別名)は、既存の型に対する新しい名前です。例えば、int型のエイリアスを作成するには、次のように記述します。

type Age int

この例では、Ageはint型のエイリアスになっています。つまり、コード内でintを使うのと同じようにAgeを使うことができます。型のエイリアスを使用する主な利点は、コードの可読性を向上させることができることです。

例えば、次のように記述する代わりに

age := 30

以下のように記述できます。

age := Age(30)

これは、ageが年齢であり、単なる任意の整数ではないことを明確にするでしょう。

構造体とtypeを使うと、以下のように記述できます。

type Person struct {
    name string
    age int
}

この例では、Personという新しい型を定義していますが、これは先ほど定義した構造体をベースにしています。これで、Person型のインスタンスを作成し、コード内で使用することができます。

person := Person{
    name: "John Smith",
    age: 30,
}

構造体にはメソッドを関連付けることもできるので、コードをより整理して保守しやすくすることができます。たとえば、Person構造体にメソッドを追加して、その人のフルネームを返すことができます。

func (p Person) sayHello() {
    fmt.Println("Hello, my name is", p.name)
}

この例では、sayHelloメソッドがPerson構造体に関連付けられており、次のように呼び出すことができます。

person.sayHello()

全体のコードは以下のようになります。

package main

import "fmt"

type Person struct {
    name string
    age  int
}

func (p Person) sayHello() {
    fmt.Println("Hello, my name is", p.name)
}

func main() {
    john := Person{
        name: "John Smith",
        age:  30,
    }
    john.sayHello()
}

pは、sayHelloメソッド内のレシーバです。レシーバとは、Goで構造体のフィールドやその他のデータ型にアクセスする方法を提供するメソッドの引数のことです。この場合、レシーバはPerson型なので、メソッドの内部でp.nameなどの構造体のフィールドにアクセスすることができます。

sayHelloメソッドはPerson型に紐づいており、Person型のインスタンスに対して呼び出すことができるため、構造体のデータにアクセスして操作することができます。

Go言語 structのゼロ値

structのゼロ値は、そのすべてのフィールドがそれぞれのゼロ値に設定された構造体です。たとえば、int型のフィールドを持つ構造体の場合、そのフィールドのゼロ値は0になり、string型のフィールドを持つ構造体の場合、そのフィールドのゼロ値は空の文字列""になります。

type Person struct {
    Name string
    Age  int
}

var p Person
fmt.Println(p) // {  0}

この記事を書いた人

著者の画像

Jeffry Alvarado

Ex-Facebook Engineer 大学ではコンピュータサイエンスを専攻し、在学中に複数のインターンシップを経験。コンピュータサイエンスが学習できるプラットフォームRecursionを創業し、CTOとしてカリキュラム作成、ソフトウェア開発を担当。


ツイート