Go by Example: 構造体の埋め込み

Goは、構造体のよりシームレスな構成を表現するためのstructとインターフェースの埋め込みをサポートしています。これは、アプリケーションバイナリにファイルとフォルダーを埋め込むためにGoバージョン1.16以降で導入されたgoディレクティブである//go:embedと混同しないでください。

package main
import "fmt"
type base struct {
    num int
}
func (b base) describe() string {
    return fmt.Sprintf("base with num=%v", b.num)
}

containerbase埋め込みます。埋め込みは名前のないフィールドのように見えます。

type container struct {
    base
    str string
}
func main() {

リテラルを使用して構造体を作成する場合、埋め込みを明示的に初期化する必要があります。ここで、埋め込みタイプはフィールド名として機能します。

    co := container{
        base: base{
            num: 1,
        },
        str: "some name",
    }

たとえばcoco.numとして、ベースのフィールドに直接アクセスできます。

    fmt.Printf("co={num: %v, str: %v}\n", co.num, co.str)

または、埋め込みタイプの名前を使用して完全なパスを記述できます。

    fmt.Println("also num:", co.base.num)

containerbaseを埋め込んでいるため、baseのメソッドもcontainerのメソッドになります。ここでは、baseから埋め込まれたメソッドをcoで直接呼び出して。

    fmt.Println("describe:", co.describe())
    type describer interface {
        describe() string
    }

メソッドを持つ構造体を埋め込むことは、他の構造体にインターフェースの実装を付与するために使用できます。ここでは、baseが埋め込まれているため、containerdescriberインターフェースを実装していることがわかります。

    var d describer = co
    fmt.Println("describer:", d.describe())
}
$ go run struct-embedding.go
co={num: 1, str: some name}
also num: 1
describe: base with num=1
describer: base with num=1

次の例: ジェネリクス