🔩

Go言語で構造体を使う

2023/07/14に公開

Go by Example: Structs

公式を翻訳しています
Goの構造体は、フィールドの型付きコレクションである。データをグループ化してレコードを形成するのに便利です。

この人物構造型には、名前フィールドと年齢フィールドがあります。

newPersonは、指定された名前の新しい人物構造体を構築する。

ローカル変数は関数のスコープから外れないので、安全にローカル変数へのポインタを返すことができる。

この構文は新しい構造体を作成する。

構造体を初期化するときに、フィールドに名前を付けることができます。

省略されたフィールドはゼロ値となる。

プレフィックスは構造体へのポインターを返す。

構造体の新規作成はコンストラクタ関数でカプセル化するのが一般的だ。

構造体のフィールドにドットでアクセスする。

構造体ポインタでもドットを使うことができ、ポインタは自動的に参照解除される。

構造体は変更可能である。

構造体タイプが単一の値にしか使用されない場合は、名前を付ける必要はありません。値には無名 struct 型を指定できます。この手法は、テーブル駆動型テストによく使用されます。

package main

import "fmt"

// personは、名前と年齢を持つ構造体です。
type person struct {
    name string
    age  int
}
// newPersonは、person構造体のポインタを返します。
func newPerson(name string) *person {
    // p := person{name: name}は、ローカル変数pを定義し、
    // nameフィールドを設定します。
    p := person{name: name}
    // p.age = 42は、pのageフィールドを設定します。
    p.age = 42
    // &pは、構造体pのポインタを返します。
    return &p
}

func main() {
    // この構文は、構造体のすべてのフィールドを列挙します。
    fmt.Println(person{"Bob", 20})
    // 構造体のフィールドを指定して初期化します。
    fmt.Println(person{name: "Alice", age: 30})
    // 省略されたフィールドは、ゼロ値になります。
    fmt.Println(person{name: "Fred"})
    // &を前置すると、構造体のポインタを生成します。
    fmt.Println(&person{name: "Ann", age: 40})
    // newを使うと、ポインタを返します。
    fmt.Println(newPerson("Jon"))
    // 構造体のフィールドにアクセスするには、ドット(.)を使います。
    s := person{name: "Sean", age: 50}
    fmt.Println(s.name)
    // ポインタを通して構造体のフィールドにアクセスするには、
    // ポインタをドット(.)で参照します。
    sp := &s
    fmt.Println(sp.age)
    // 構造体は、ミュータブルです。
    // つまり、フィールドを変更できます。
    sp.age = 51
    fmt.Println(sp.age)
    // 構造体は、フィールドの型を持つことができます。
    dog := struct {
        name   string
        isGood bool
    }{
        "Rex",
        true,
    }
    // 構造体のフィールドにアクセスするには、ドット(.)を使います。
    fmt.Println(dog)
}

実行結果

hashimotojunichi@hashimotojunichinoMacBook-Pro go-example % go run hello.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
{Rex true}

まとめ

プログラミング言語では、クラスがありますけどGolangにはありません。データのモデルを作るときは、構造体を使います。
最近趣味で、MySQLにHTTP POST, GETをORMを使って実験するプロジェクトを作ってみました。ご興味ある方は見てみてください。
https://github.com/sakurakotubaki/GoMySQL

Jboy王国メディア

Discussion