メインコンテンツにスキップ
モジュール 5 · レッスン 1 / 5コース内の 21/50~12 min
モジュールのレッスン (1/5)

構造体の定義と使用

struct は、名前付きフィールドを 1 つのタイプにグループ化します。それがGoのやり方だ 「オブジェクト」の構築 — クラスよりも文字通りで即時的なもので、 継承や組み込みコンストラクターはありません。

宣言

Go
type Person struct {
    Name string
    Age  int
}

type では、新しい名前付き型 が導入されています。フィールドは 1 つずつ書き込まれます 行、name type。同じ型の連続したフィールドは、 宣言: X, Y int。

創造

Go
// with named fields (recommended: robust to reordering)
p := Person{Name: "Ada", Age: 36}

// positional (fragile: depends on declaration order)
q := Person{"Ada", 36}

// zero value: every field at its zero value
var r Person          // r = {Name: "", Age: 0}

// pointer: allocate with & or new
ptr := &Person{Name: "Ada"}
ptr2 := new(Person)   // *Person to a zero-value struct

フィールドアクセス

Go
p := Person{Name: "Ada", Age: 36}
fmt.Println(p.Name, p.Age)

p.Age = 37            // mutation (if p is a variable)

ポインタでは、ptr.Name が直接動作します。Go は 暗黙的な逆参照。 C のような -> はありません。

可視性: 大文字ルール

頭文字が大文字のフィールドはエクスポートされます(他のフィールドから参照できます) パッケージ);小文字 = 現在のパッケージに対してプライベート。

Go
type User struct {
    Name   string  // exported
    salt   []byte  // private to the package
}

同じルールが Go のすべての識別子に適用されます: タイプ、 関数、変数、フィールド。

匿名構造体と入れ子構造体

Go
// anonymous (handy for ad-hoc data)
config := struct {
    Host string
    Port int
}{Host: "localhost", Port: 8080}

// nested
type Address struct {
    Street string
    City   string
}
type Customer struct {
    Name    string
    Address Address
}

比較可能性

すべてのフィールドが次の場合、2 つの構造体は == と 比較可能 同等(内部にスライス/マップ/関数はありません):

Go
a := Person{Name: "Ada", Age: 36}
b := Person{Name: "Ada", Age: 36}
fmt.Println(a == b)   // true

これにより、マップ キーとしても使用できます。

試してみてください

運動#go.m5.l1.e1
試行回数: 0読み込み中…

Name string と Age int を使用して Person タイプを定義し、main で {Name: 'Ada', Age: 36} としてインスタンス化します。

エディターを読み込み中…
ヒントを表示

構文: `type Name struct { フィールド タイプ; ... }`。

3 回の試行後に解決策が利用可能になります

運動#go.m5.l1.e2
試行回数: 0読み込み中…

p (既存の人) の Name フィールドの値を出力します。

エディターを読み込み中…
ヒントを表示

フィールドアクセス: `p.Field`。

3 回の試行後に解決策が利用可能になります

Quiz#go.m5.l1.e3
準備完了

別のパッケージからの「名前文字列」フィールド (小文字) の可視性は何ですか?

Go
// in package other
type X struct {
    name string
}
回答の選択肢

要約

  • type Name struct { ... }: 名前付きフィールドを持つ新しい名前付きタイプ。
  • 構造: T{Field: value, ...} (推奨) または定位置。
  • ゼロ値: すべてのフィールドの型がゼロです。
  • ポインターの場合は &T{...} および new(T)。暗黙的な逆参照 (*T 上の p.Field)。
  • 大文字 = エクスポートされます。小文字 = パッケージに対してプライベート。
  • すべてのフィールドがそうである場合、構造体は == と同等です。マップキーとして使用可能。