我目前的问题是我正在实现数据结构,我已经为它们编写了迭代器。我有我的数据结构,迭代器和所有其他所需对象的可见接口。在后面我有具体的实现,我希望从最终用户隐藏。
这需要我的许多函数返回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而不是我希望的值。
编辑:删除了未使用的代码,我以为我已经将其删除但我猜不是。
答案 0 :(得分:0)
现在我已经完成了这个长篇解释,我有了一个想法,并想出了解决方案:
func convert(val interface{}) Base {
if con,ok := val.(Base); ok {
return con
}
return nil
}
不要试图转换为指针而只是转换为Base接口。
我不确定为什么会这样。当我在convert里面反射.TypeOf(val)时会给出输出
*main.Concrete
我希望其他人认为这有用,而其他人可以回答此答案的为什么部分。