【2日目】Go言語の学習

構造体

Goには Rubyにおける「クラス」が存在しない。ただクラスと同じような、関連する情報をまとめた「構造体」と呼ばれるものが存在する。

type User struct {
    age int
    name string
}


構造体の初期化。

    u := User{} // 空の User構造体
    u.age = 20
    u.name = "seijin"


一行で。フィールド名は省略可

u := User{age: 20, name: "seijin"} // =>u := User{20, "seijin"}


フィールド名を省略する場合、一部のフィールドのみ値を渡すことはできない。

u := User{20)

# command-line-arguments
./Main.go:20:15: too few values in User literal


フィールド名を明示する場合は、一部のフィールドのみでも可能。

u := User{age: 20)

メソッド

構造体は、構造体内にメソッドを定義することができる。

package main
import "fmt"

type User struct {
    age int
    name string
}

func (u *User) setInfo() {
    u.age = 20
    u.name = "seijin"
}

func main() {
    u := User{}
    u.setInfo()
    fmt.Println(u.age, u.name)
}

// => 20 seijin


Goでは利便性のため、メソッド呼び出し時に、暗黙手にレシーバ変換が行われる。上のポインタレシーバの場合は、以下の通り。

u.setInfo() // (&u).setInfo()


値レシーバにしても同様に変換される。

func (u User) setInfo() { // 値レシーバ
}

func main() {
    u := new(User) // uは *User型
    u.setInfo() // (*u).setInfo()
}