Go by Example: 構造体

Go の構造体は、型指定されたフィールドの集合です。データのグループ化に役立つため、記録を形成できます。

package main
import "fmt"

この person 構造体タイプには、name フィールドと age フィールドがあります。

type person struct {
    name string
    age  int
}

newPerson は、指定された名前を使用して新しい person 構造体を構築します。

func newPerson(name string) *person {

ローカル変数は関数のスコープに存続するため、ローカル変数へのポインタを安全に返せます。

    p := person{name: name}
    p.age = 42
    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})

イディオム的に、新しい構造体作成をコンストラクタ関数にカプセル化します

    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)
}
$ go run structs.go
{Bob 20}
{Alice 30}
{Fred 0}
&{Ann 40}
&{Jon 42}
Sean
50
51
{Rex true}

次の例: メソッド