go - 在 Go 中,给定一个接口(interface){},我知道它实现了什么接口(interface),我如何转换成它

标签 go interface

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

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

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

这是我目前能想到的最小示例,它说明了我的问题:

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)
}

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


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

最佳答案

既然我已经写完了这么长的解释,我有了一个想法并找到了解决方案:

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

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

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

*main.Concrete

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

关于go - 在 Go 中,给定一个接口(interface){},我知道它实现了什么接口(interface),我如何转换成它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303655/

相关文章:

unit-testing - 你在哪里存储可重用的模拟?

go - 循环中的 Println 和闭包输出不同的值

go - 追加时数组大小不加倍

java - 考虑 Spring 中的接口(interface)代码?

linq - 尝试字符串。加入 IList

c# - 通过 IKVM 在 C# 中用于 OIM 的 Java interface.class

c# - C# 接口(interface)可以要求或规定特定的类吗?

go - 是否在匿名结构中导出字段有什么区别吗?

go - 使代码更通用

java - 在类中实现接口(interface)方法时出错