LoginSignup
0
0

More than 3 years have passed since last update.

Goの構造体に埋め込んで、フィールドやメソッドを明示的に指定しなくてもアクセスできる

Posted at

はじめに

Goの構造体で明示的に指定しなくてもメソッドもしくはフィールドにアクセスできる方法を記しています。
ようするに埋め込みです。
Embedding言葉を知らない人でもHitするようなタイトルにしてます。

フィールド名もしくはメソッド名は同じでない場合は明示的に指定しなくてよい
逆に同じ名前があるなら明示的にしてければならない

main.go
type Hoge struct {
  Aaa string
  Bbb string
  Ccc string
}

func(h *Hoge) Get() string {
  return "fuga"
}

func(h *Hoge) GetHoge() string {
  return "get hoge"
}

type Fuga struct {
  Aaa string
  Bbb string
  Ddd string
}

func(f *Fuga) Get() string {
  return "fuga"
}

func(f *Fuga) GetFuga() string {
  return "get fuga"
}

type HogeFuga struct {
  Hoge
  Fuga
}

func main() {
  hoge := Hoge{
    Aaa: "hoge",
    Bbb: "hogehoge",
    Ccc: "hogehogehoge",
  }

  fuga := Fuga{
    Aaa: "fuga",
    Bbb: "fugafuga",
    Ddd: "fugafugafuga",
  }

  hogefuga := HogeFuga{
    Hoge: hoge,
    Fuga: fuga,
  }

  //- フィールド名
  fmt.Println(hogefuga.Aaa) //- エラーが発生 フィールド名が一緒なので
  fmt.Println(hogefuga.Bbb) //- エラーが発生 フィールド名が一緒なので
  fmt.Println(hogefuga.Ccc) //- hogehogehoge
  fmt.Println(hogefuga.Ddd) //- fugafugafuga
  fmt.Println(hogefuga.Hoge.Aaa) //- hoge
  fmt.Println(hogefuga.Hoge.Bbb) //- hogehoge
  fmt.Println(hogefuga.Hoge.Ccc) //- hogehogehoge
  fmt.Println(hogefuga.Fuga.Aaa) //- fuga
  fmt.Println(hogefuga.Fuga.Bbb) //- fugafuga
  fmt.Println(hogefuga.Fuga.Ddd) //- fugafugafuga

  //- メソッド名
  fmt.Println(hogefuga.Get()) //- エラーが発生 メソッド名が一緒なので
  fmt.Println(hogefuga.GetHoge()) //- get hoge
  fmt.Println(hogefuga.GetFuga()) //- get fuga
  fmt.Println(hogefuga.Hoge.Get()) //- hoge
  fmt.Println(hogefuga.Fuga.Get()) //- fuga
  fmt.Println(hogefuga.Hoge.GetHoge()) //- get hoge
  fmt.Println(hogefuga.Fuga.GetFuga()) //- get fuga
}

まとめ

埋め込みをする場合はフィールド名とメソッド名が同じでも問題ないが
呼び出すときに同じ命名は明示的に指定して呼び出すこと

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0