はじめに
配列にメソッドを追加しようとしたら,つまずいたのでメモ.
やりたいこと
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で追加予定の新機能 型エイリアス