登录
首页 >  Golang >  Go问答

Go - 使用嵌套结构在列表中存储具有相同结构的元素

来源:stackoverflow

时间:2024-02-15 17:54:21 446浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Go - 使用嵌套结构在列表中存储具有相同结构的元素》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我有多个具有相同嵌入结构的结构。在其中一个结构中,我想存储嵌入基本结构的任何结构的列表。这是显示案例的小片段。

package main

type Symbol interface{}

type Base struct {
    a int32
}

type Foo struct {
    Base
    b int32
    Symbols []Base
    // Below works
    // Symbols []Symbol
}

type Bar struct {
    Base
    c int32
}

func main () {
    var bar Bar
    var foo Foo
    foo.Symbols = append(foo.Symbols, bar)
}

但是,这不起作用。我得到 ./main.go:25:22: 不能使用 bar (类型 bar) 作为附录 中的类型 base。当我使用空的 symbol 界面时,一切正常。然而,这种方法完全绕过了类型系统,因为现在所有内容都可以存储在列表中。我想以某种方式表示只有 basefoobar 可以存储在列表中,以便编译器可以检查是否满足此要求。我的结构没有任何方法,当然不是那些共享行为并且可以添加到接口的方法。向接口添加一些虚拟方法和虚拟实现似乎非常人为。 go 处理此类场景的惯用方法是什么?


正确答案


我做了一些搜索和阅读。我想要实现的目标需要所谓的“总和类型”。目前 go 不支持 sum 类型。然而,几乎没有其他方法可以模拟求和类型的行为。这里对它们进行了很好的描述 Alternatives to sum types in Go

此外,看起来 go 2 可能会支持 sum 类型。进一步阅读 proposal: spec: add sum types / discriminated unionsspec: generics: use type sets to remove type keyword in constraints

重要的是相同的接口:

package main

import (
    "fmt"
)

type Item interface{
    fmt.Stringer
}

type ItemA struct {
}

func (a ItemA) String() string {
    return "item A"
}

type ItemB struct {
}

func (a ItemB) String() string {
    return "item B"
}

func main() {
    items := make([]Item, 0)
    items = append(items, ItemA{}, ItemB{})
    fmt.Printf("Items: %v", items)
}

终于介绍完啦!小伙伴们,这篇关于《Go - 使用嵌套结构在列表中存储具有相同结构的元素》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>