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

如何从用作泛型的接口访问结构属性

如何从用作泛型的接口访问结构属性

Go
慕神8447489 2023-04-17 16:23:08
也许我只是让我的代码变得过于复杂,但我正在努力更好地理解接口和结构在 golang 中的工作方式。基本上,我将满足接口 I 的元素存储在哈希表中。由于所有满足 I 的项目都可以包含在 I 元素中,我想我可以将 I 用作一种“通用”接口,将它们填充到哈希图中,然后稍后将它们拉出并访问“underlyng”结构方法从那里。不幸的是,在拉出元素后,我发现我无法调用结构方法,因为元素是接口类型,并且“原始”结构不再可访问。有没有一种方法可以干净简单地访问满足我的结构?这是我的代码,它在 for 循环中抛出一个“value.name undefined (type I has no field or method name)”:/** * Define the interface */type I interface{    test()}/** * Define the struct */type S struct{    name string}/** *  S now implements the I interface */func (s S) test(){}func main(){    /**     * Declare and initialize s S     */    s := S{name:"testName"}    /**     * Create hash table     * It CAN contains S types as they satisfy I interface     * Assign and index to s S     */    testMap := make(map[string]I)    testMap["testIndex"] = s    /**     * Test the map length     */    fmt.Printf("Test map length: %d\r\n", len(testMap))    for _, value := range testMap{        /**         * This is where the error is thrown, value is of Interface type, and it is not aware of any "name" property         */        fmt.Printf("map element name: %s\r\n", value.name)    }}
查看完整描述

3 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

您应该向您的界面添加一个访问器:


type I interface {

    test()

    Name() string

}

然后确保你的结构实现了这个方法:


func (s S) Name() string {

    return s.name

}

然后使用访问器方法访问名称:


        fmt.Printf("map element name: %s\r\n", value.Name())


查看完整回答
反对 回复 2023-04-17
?
千万里不及你

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

我认为你需要的是type swithes在旅途中

您可以访问底层结构,如下所示:


查看完整回答
反对 回复 2023-04-17
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

for _, value := range testMap {

    switch v := value.(type) {

    case S:

        fmt.Printf("map element name: %s\r\n", v.name)

        // TODO: add other types here

    }

}


查看完整回答
反对 回复 2023-04-17
  • 3 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

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