やりたかったこと
interfaceのpointerの配列を作りたかった。
やったこと
- interfaceのポインタ配列を作る。
- interfaceを実装した構造体を作る。
- その構造体のポインタをinterfaceのポインタ配列に入れる。
作成したサンプルコードは下記の通り。
vehicle.go
package main
import "fmt"
type Vehicle interface {
Name() string
}
type Car struct {
name string
}
type Train struct {
name string
}
func (c *Car) Name() string {
return c.name
}
func (t *Train) Name() string {
return t.name
}
func main() {
vs := make([]*Vehicle, 2)
var car Car
var train Train
car.name = "car"
train.name = "train"
vs[0] = &car
vs[1] = &train
for i := range vs {
fmt.Println("vs[i] is " + vs[i].Name())
}
}
上のコードを作成して実行してみると、
cannot use &car (type *Car) as type *Vehicle in assignment:
*Vehicle is pointer to interface, not interfacego
と出る。 調べると
stackoverflow で
An interface can store either a struct directly or a pointer to a struct.
と書いてあった。
なので、下記のようにすれば解決。
vs := make([]Vehicle, 2)