我正在尝试编写一个函数,该函数采用将实现某个接口的任何东西作为参数。
我已经定义了一个接口KeyProvider
,它指定了一种GetKey()
方法。我已经定义了使用此接口ToKeys()
的函数。
type KeyProvider interface {
GetKey() *datastore.Key
}
func ToKeys(l []*KeyProvider) []*datastore.Key {
keys := make([]*datastore.Key, len(l))
for i, vp := range l {
v := *vp
keys[i] = v.GetKey()
}
return keys
}
我已经在结构User
上实现了此接口。
type User struct {
Key *datastore.Key
}
func (u *User) GetKey() *datastore.Key {
return u.Key
}
我尝试使用ToKeys()
方法。
func foo(users []*User) {
keys := ToKeys(users)
}
但是我得到这个错误:
cannot use users (type []*User) as type []*KeyProvider in argument to ToKeys
为什么?而我该如何工作呢?
答案 0 :(得分:2)
始终牢记,Go需要显式的类型转换。
1。func ToKeys(l []*KeyProvider) []*datastore.Key
应该是func ToKeys(l []KeyProvider) []*datastore.Key
。
应该几乎永远不要使用指向接口的指针,而应该使用接口。
2。不允许直接将[]*User
转换为[]KeyProvider
,因为内存中的表示形式不同(如果您对slice's internal感兴趣)。
您需要手动转换切片,例如:
func foo(t []*User) {
s := make([]KeyProvider, len(t))
for i, v := range t {
s[i] = v
}
keys := ToKeys(s)
}
检查这两个网址:
https://golang.org/doc/faq#convert_slice_of_interface https://golang.org/doc/faq#convert_slice_with_same_underlying_type