【发布时间】:2019-09-03 21:14:24
【问题描述】:
我正在尝试编写一个函数,它将实现某个接口的任何东西作为参数。
我已经定义了一个接口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
为什么?我怎样才能得到这样的工作?
【问题讨论】:
-
*User实现了KeyProvider,它没有实现*KeyProvider。但即便如此[]*User也不能直接转换为[]KeyProvider。您需要遍历用户切片并从其各个元素创建一个新的密钥提供程序切片。