猿问

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

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


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


我遇到的一个问题是我迭代了一个 Graph。我的图实现的迭代器{} 返回一个具体的顶点类型,但迭代器接口返回接口{}。由于最终用户只能使用我的基本 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)

}

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


编辑:删除了未使用的代码,我以为我已经删除了它,但我想没有。



MMMHUHU
浏览 185回答 1
1回答

函数式编程

现在我已经写完了这篇长篇解释,我有了一个想法并找到了解决方案:func convert(val interface{}) Base {    if con,ok := val.(Base); ok {        return con    }    return nil}不要尝试转换为指针,而只是转换为 Base 接口。我不确定为什么会这样。当我在 convert 内部进行 reflect.TypeOf(val) 时,它会给出输出*main.Concrete我希望其他人觉得这很有用,并且其他人可以回答这个答案的原因部分。
随时随地看视频慕课网APP

相关分类

Go
我要回答