Go言語のお勉強 その2

今日のまとめ

構造体

type User struct {
  name string
  age int
}

func main() {
   var user1 User
   user1.name = "ichiro"
   // ichiro 0
   fmt.Println(user1.name, user1.age)

   user2 := User{"jiro", 30}
   // jiro 30
   fmt.Println(user2.name, user2.age)

   user3 := User{name: "saburo", age: 20}
   // saburo 20
   fmt.Println(user3.name, user3.age)
}
  • Goの構造体は以下の特徴を持っている
    • 構造体はフィールド(フィールド名と値の組)の集まりである
    • 構造体にメソッドを定義することができる
    • 構造体に構造体を埋め込むことができる
  • type 構造体名 struct形式で宣言する.
  • 構造体名.フィールド名でフィールドの値にアクセスすることができる
  • フィールドの初期化の方法はいくつかある
    • 構造体を初期化してから順に値を入れる
    • 構造体の初期化時にフィールドの値を列挙する
    • 構造体の初期化時にフィールド名: 値を列挙する
  • ここで気付いたけど,変数は始めから何かしらの値が入っているようだ
  • 構造体って初めて扱ったけどvalueに色々な型を持てるハッシュみたいなもの?

ポインタ型で初期化

user4 := &User{name: "shiro", age: 15}
// shiro 15
// {shiro 15}
fmt.Println(user4.name, user4.age)
fmt.Println(*user4)
 
user5 := new(User)
user5.name = "goro"
// goro 0
// {goro 0}
fmt.Println(user5.name, user5.age)
fmt.Println(*user5)
  • &構造体名またはnew(構造体名)で初期化するとポインタ型で受け取ることができる.

関数による初期化

func newUser(name string, age int) *User {
  u := new(User)
  u.name = name
  u.age = age
  return u
}
 
var user *User = newUser("taro",30)

ネスト構造体

type Foo struct {
  hoge string
  huga string
}

type Bar struct {
  Foo
  huga string
  piyo string
}

user5 := new(User)
user5.name = "goro"
fmt.Println(user5.name, user5.age)
fmt.Println(*user5)

str1 := Foo{hoge: "HOGE", huga: "HUGA"}
str2 := Bar{Foo: str1, huga: "Huga", piyo: "Piyo"}
// HOGE Huga HUGA Piyo
fmt.Println(str2.hoge, str2.huga, str2.Foo.huga, str2.piyo)
  • フィールドに構造体を指定することで構造体をネストすることができる
  • ネストした構造体のフィールドへアクセスするにはstr2.Foo.hugaのように指定する
  • フィールド名が重複していなければstr2.hugaのように構造体名を省略できる

メソッド定義

func (u User) greet() string {
	return "hello, " + u.name
}

u := User{"taro", 30}
fmt.Println(u.greet())
  • func (レシーバ名 レシーバの型) メソッド名(引数) 返り値形式で記述する

関連記事

comments powered by Disqus