0Pricing
Go Academy · レッスン

構造体の定義と利用

構造体リテラル、フィールドアクセス、埋め込み

「構造体の定義と利用」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

構造体とは

構造体は、異なる型の関連フィールドを1つの名前付き型にまとめたものです。Goでカスタムデータ構造を定義する主要な仕組みであり、継承はありませんがクラスに似ています。

構造体の宣言

typeキーワードを使用して構造体型を定義します。

package main
import "fmt"

type Person struct {
    Name string
    Age  int
    City string
}

func main() {
    p := Person{Name: "Alice", Age: 30, City: "London"}
    fmt.Println(p)
}

構造体リテラル

方法は2つあります。名前付きフィールドを使う方法(推奨)と、位置に依存する方法(順序に依存するため壊れやすい)です。

package main

type Point struct{ X, Y int }

func main() {
    p1 := Point{X: 1, Y: 2} // named — preferred
    p2 := Point{3, 4}        // positional — avoid in non-test code
    _ = p1; _ = p2
}

フィールドへのアクセス

ドット記法を使用してフィールドを読み書きします。

package main
import "fmt"

type Car struct{ Brand string; Speed int }

func main() {
    c := Car{Brand: "Tesla", Speed: 200}
    fmt.Println(c.Brand)  // Tesla
    c.Speed = 250
    fmt.Println(c.Speed)  // 250
}

構造体のゼロ値

構造体のゼロ値では、すべてのフィールドがそれぞれのゼロ値に設定されます。初期化しなくても安全に使用できます。

package main
import "fmt"

type Config struct{ Debug bool; Port int; Host string }

func main() {
    var cfg Config
    fmt.Println(cfg) // {false 0 }
    cfg.Port = 8080
    fmt.Println(cfg) // {false 8080 }
}

構造体の比較

すべてのフィールドが比較可能であれば、構造体は==で比較できます。

package main
import "fmt"

type Point struct{ X, Y int }

func main() {
    a := Point{1, 2}
    b := Point{1, 2}
    c := Point{3, 4}
    fmt.Println(a == b) // true
    fmt.Println(a == c) // false
}

構造体は値型

構造体を代入すると、すべてのフィールドがコピーされます。コピーを変更しても元の構造体には影響しません。

package main
import "fmt"

type Rect struct{ W, H int }

func main() {
    r1 := Rect{10, 20}
    r2 := r1
    r2.W = 99
    fmt.Println(r1) // {10 20}
    fmt.Println(r2) // {99 20}
}

ネストした構造体

構造体のフィールド自体を構造体にすることもできます。

package main
import "fmt"

type Address struct{ City, Country string }
type Employee struct {
    Name    string
    Age     int
    Address Address
}

func main() {
    e := Employee{Name: "Bob", Age: 28, Address: Address{"Berlin", "DE"}}
    fmt.Println(e.Address.City) // Berlin
}

エクスポートフィールドと非エクスポートフィールド

大文字で始まるフィールドはエクスポートされます(公開)。小文字で始まるフィールドは非エクスポートです(パッケージ内限定)。

package main

type config struct {
    host string // unexported
    Port int    // exported
}

func main() {
    c := config{host: "localhost", Port: 8080}
    _ = c
}

構造体タグ

構造体タグはメタデータを提供します(例: JSONエンコード)。フィールドの型の後に文字列リテラルとして記述します。

package main

type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email,omitempty"`
}

func main() { _ = User{} }

簡単な確認

構造体内のboolフィールドのゼロ値は何ですか。

まとめ: 構造体

要点:

  • 構造体は関連するフィールドを名前付き型にまとめます
  • 名前付きフィールドのリテラルを使用し、位置指定は避けます
  • 構造体は値型なので、代入するとコピーされます
  • 大文字で始まるフィールドはエクスポートされます
  • 構造体タグによって、encoding/jsonなどのライブラリ向けのメタデータを追加できます

練習問題

Name string、Price float64、InStock boolのフィールドを持つProduct構造体を定義してください。2つのインスタンスを作成し、==で比較して、その結果を出力してください。

よくある質問

「構造体の定義と利用」レッスンは無料ですか?

はい。「構造体の定義と利用」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「構造体の定義と利用」で何を学びますか?

構造体リテラル、フィールドアクセス、埋め込み ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「構造体の定義と利用」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 構造体の定義と利用
  2. 構造体のメソッド
  3. コンストラクターパターン
  4. 匿名構造体とコンポジション
← Go Academyに戻る