在Go中,给定一个接口{},我知道它实现了什么接口,如何转换为它

时间:2015-08-31 03:38:22

标签: go interface

我目前的问题是我正在实现数据结构,我已经为它们编写了迭代器。我有我的数据结构,迭代器和所有其他所需对象的可见接口。在后面我有具体的实现,我希望从最终用户隐藏。

这需要我的许多函数返回interface {}对象,以便我可以存储任何类型的对象(并将验证留给最终用户)。

我遇到的一个问题是我在图表上进行迭代。我的图形实现的迭代器{}返回一个具体的顶点类型,但Iterator接口返回接口{}。由于最终用户只能使用我的基本Vertex接口,因此我必须尝试转换为Vertex接口,以便他们可以使用它。

这是我在这一点上可以想到的最小的例子,它说明了我的问题:

package main

import (
    "fmt"
    "strconv"
)

type Base interface {
    Required() string
}

type Concrete struct {
    _data int
}
func (con *Concrete) Required() string {
    return strconv.Itoa(con._data)
}

func convert(val interface{}) *Base {
    if con,ok := val.(*Base); ok {
        return con
    }
    return nil
}

func main() {
    conc := new(Concrete)
    conc._data = 5

    base := convert(conc)

    fmt.Println(base)
}

在上面的代码中,我真的希望转换将类型转换为* Base。函数convert将返回值nil而不是我希望的值。

编辑:删除了未使用的代码,我以为我已经将其删除但我猜不是。

1 个答案:

答案 0 :(得分:0)

现在我已经完成了这个长篇解释,我有了一个想法,并想出了解决方案:

func convert(val interface{}) Base {
    if con,ok := val.(Base); ok {
        return con
    }
    return nil
}

不要试图转换为指针而只是转换为Base接口。

我不确定为什么会这样。当我在convert里面反射.TypeOf(val)时会给出输出

*main.Concrete

我希望其他人认为这有用,而其他人可以回答此答案的为什么部分。