登录
首页 >  Golang >  Go问答

如何将结构转换为具有较少字段的不同结构

来源:stackoverflow

时间:2024-04-13 13:27:33 167浏览 收藏

本篇文章给大家分享《如何将结构转换为具有较少字段的不同结构》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我正在尝试将 big 类型的结构复制为 small 类型,而不显式创建具有相同字段的 small 类型的新结构。

我尝试过搜索其他类似的问题,例如 this 和 this,但仅当结构具有相同的字段时,不同结构类型之间的所有转换才会发生。

这是我尝试做的示例:

// big has all the fields that small has including some new ones.
type big struct {
    a int
    b string
    c float
    d byte
}

type small struct {
    a int
    b string
}

// this is the current solution which i hope to not use.
func convertfrombigtosmall(big big) small {
    return small{
        a: big.a,
        b: big.b,
    }
}

我希望能够做这样的事情,但它不起作用:

big := Big{}
small := Small(big)

是否有一种方法可以在不使用 convert 函数的情况下在 bigsmall 之间进行转换(甚至反之亦然)?


解决方案


对此没有内置支持。如果您确实需要这个,您可以编写一个使用反射来复制字段的通用函数。

或者你可以重新设计。如果 bigsmall 加上一些其他附加字段,为什么不在 big 中重用 small

type small struct {
    a int
    b string
}

type big struct {
    s small
    c float
    d byte
}

然后,如果您有一个 big 结构,那么您也有一个 smallbig.s。如果您有 small 并且需要 bigbig{s:small}

如果您担心失去较短字段名称的便利性或不同的编组结果,请使用嵌入而不是命名字段:

type Big struct {
    Small // Embedding
    C float
    D byte
}

那么这些也是有效的:big.abig.b。但如果您需要 small 值,则可以使用非限定类型名称作为字段名称来引用嵌入字段,例如big.small(参见 Golang embedded struct type)。同样,要从 small 创建 bigbig{small:small}

唯一的选择是手动执行此操作,就像您所做的那样。无论您是否将其包装在函数中,都是品味/环境的问题。

今天关于《如何将结构转换为具有较少字段的不同结构》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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