さんごー日記。

映画や本やゲームの感想をゆるく記録したり、プログラミングの勉強をゆるく記録するゆるい日記です。

Go(プログラミング言語)メモ:構造体

Go言語のお勉強をしているのでメモ。

今回は構造体周り。
コードはテストなどしていないので、イメージです。

ブランクフィールド

メモリ領域だけ確保したい時に使う。
変数名の部分を「‗」にするとブランクフィールドになり、その部分にはアクセスできないがメモリが確保された状態になる。
パディングなどで使うとの事だが、どんな時に使うんだろう。あんま使わなさそう。

struct {
    b1 byte
    _ byte
    b2 byte
    _ byte
}

匿名フィールド

変数名を指定しない場合、匿名フィールドとなる。
匿名フィールドになると、その変数には型名でアクセスする事になる。

struct {
    int
    string
    *byte // ポインタの場合はアスタリスクを除いた部分が変数名になる。この場合は「byte」
}

埋め込み

自分で定義した型を他の埋め込む事もできる。
型Aを型Bに埋め込んだ場合、型Aが持っている変数や関数を型Bから直接呼び出せる。継承のような事ができるようになる。

type A struct {
    i int
}

type B struct {
    A
}

func main() {
    var b = B
    fmt.Println(B.i) // 型AのiをBから直接呼び出せる。
}

構造体の初期化

type A struct {
    x int
    s test
}

// フィールドを一つずつ初期化
var a1 = A
a.x = 1
a.s = "test"

// 1行で初期化。
a2 := A{x: 1, s: "test"}

// フィールド名を省略
a3 := A{1, "test"}

// ポインタを作成
a4 := &A{1, "test"}

// 複数行で初期化
// 最後にカンマが必要。
a5 := A{
    1,
    "test",
}

// 複数行で初期化
// 最後の行にカッコを付ける場合はカンマ不要。
a6 := A{
    1,
    "test}

コピペでフィールドを増やした時にカンマを付け忘れにくいようにしているんでしょうね。

埋め込みの初期化

type A struct {
    x int
    s string
}

type B struct {
    y int
    A
}

func main() {
    b := B{1, A{2, "test"}}
}


改訂2版 基礎からわかる Go言語

改訂2版 基礎からわかる Go言語