Я пытаюсь написать функцию, которая принимает в качестве аргумента все, что реализует определенный интерфейс.
Я определил интерфейс 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
Почему? И как мне заставить что-то подобное работать?