4
2

More than 5 years have passed since last update.

Golang 配列にメソッドを追加する

Last updated at Posted at 2018-10-31

はじめに

配列にメソッドを追加しようとしたら,つまずいたのでメモ.

やりたいこと

Humanにしゃべらせたい

type Human struct {
    Name string
}

func (h *Human) Speak(word string) {
    fmt.Printf("I am %s. %s!\n", h.Name, word)
}

func main() {
    bocchi := Human{
        Name: "kafu",
    }
    bocchi.Speak("Hi everyone!!!\n")
}

これでもいいけど,ひとりじゃかわいそう!!!

❯go run main.go
I am kafu. Hi everyone!!!!

やったらできなかったこと

配列に定義する.
型が定義されていないと言ってくる.

func (people []Human) Speak(word string) {
    for h := range people {
        fmt.Printf("I am %s. %s!\n", h.Name, word)
    }
}

やったらできたこと

type alias を使う.※追記参照
type構文を使う.

type People []Human

func (people People) Speak(word string) {
    for h := range people {
        fmt.Printf("I am %s. %s!\n", h.Name, word)
    }
}

func main() {
    bocchi := Human{
        Name: "kafu",
    }
    bocchi2 := Human{
        Name: "Bob",
    }

    people := People{}
    people = append(people, bocchi)
    people = append(people, bocchi2)

    people.Speak("Hello!!!")

}

これでみんなしゃべるようになります.

❯go run main.go
I am kafu. Hello!!!!
I am Bob. Hello!!!!

※追記(type構文とalias構文について)

当初,type構文のことをalias(別名)のようなものだと勘違いしていたのですが,どうやら違うようです.
以下はalias構文というのを使って,会話させようとするコードです.

// alias構文
type People = []Human

func (people People) Speak(word string) {
    for _, h := range people {
    fmt.Printf("I am %s. %s!\n", h.Name, word)
}

=を間に入れただけですが,これでは動きません.「[]Humanは定義されていない型だよ」と言ってきます.ここから察するに,type構文では完全に型を別のものにし区別しますが(そして定義もする),alias構文では型を区別せず,ただ単にコード上で別の名前が使えるようになるものだとわかります.

例えると,aliasというのは,500円玉2枚は1000円札1枚と交換可能であるようなことを言い,
typeというのは,自動販売機の札を入れるところに500円玉を入れようとすると,形が違うので入らないという感じでしょうか.(違ったらごめんなさい(-_-;))

参考文献

Goを学びたての人が誤解しがちなtypeと構造体について #golang
go言語1.9で追加予定の新機能 型エイリアス

4
2
3

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
4
2