为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMMHUHU 2021-11-01 17:10:44
我目前的问题是我正在实现数据结构并且我已经为它们编写了迭代器。我的数据结构、迭代器和所有其他必需的对象都有可见的接口。在后面,我有我希望对最终用户隐藏的具体实现。这需要我的许多函数返回 interface{} 对象,以便我可以存储任何类型的对象(并将验证留给最终用户)。我遇到的一个问题是我迭代了一个 Graph。我的图实现的迭代器{} 返回一个具体的顶点类型,但迭代器接口返回接口{}。由于最终用户只能使用我的基本 Vertex 界面,因此我必须尝试转换为 Vertex 界面,以便他们可以使用它。这是我此时能想到的最小示例,它说明了我的问题:package mainimport (    "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)}在上面的代码中,我真的希望 convert 将类型转换为 *Base。函数 convert 将返回值 nil 而不是我希望的可爱值。编辑:删除了未使用的代码,我以为我已经删除了它,但我想没有。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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


func convert(val interface{}) Base {

    if con,ok := val.(Base); ok {

        return con

    }

    return nil

}

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


我不确定为什么会这样。当我在 convert 内部进行 reflect.TypeOf(val) 时,它会给出输出


*main.Concrete

我希望其他人觉得这很有用,并且其他人可以回答这个答案的原因部分。


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信