【问题标题】:Cannot use type X as type Y even if same interface即使接口相同,也不能将 X 类型用作 Y 类型
【发布时间】: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。您需要遍历用户切片并从其各个元素创建一个新的密钥提供程序切片。

标签: go types interface


【解决方案1】:

始终牢记,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多