即使同一接口也不能将X类型用作Y类型

时间:2019-04-13 06:58:05

标签: go types interface

我正在尝试编写一个函数,该函数采用将实现某个接口的任何东西作为参数。

我已经定义了一个接口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

为什么?而我该如何工作呢?

1 个答案:

答案 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