作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 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
函数的情况下在Big
和Small
之间进行转换(甚至反之亦然)?
最佳答案
对此没有内置支持。如果您确实需要这个,您可以编写一个使用反射来复制字段的通用函数。
或者你可以重新设计。如果 Big
是 Small
加上一些其他附加字段,为什么不在 Big
中重用 Small
呢?
type Small struct {
A int
B string
}
type Big struct {
S Small
C float
D byte
}
然后,如果您有一个 Big
结构,那么您也有一个 Small
:Big.S
。如果您有一个Small
并且需要一个Big
:Big{S:small}
。
如果您担心失去较短字段名称的便利性或不同的编码结果,请使用嵌入而不是命名字段:
type Big struct {
Small // Embedding
C float
D byte
}
那么这些也是有效的:Big.A
、Big.B
。但如果您需要 Small
值,则可以使用非限定类型名称作为字段名称来引用嵌入字段,例如大.小
(参见Golang embedded struct type)。同样,要从 Small
创建 Big
:Big{Small:small}
。
关于go - 如何将结构转换为具有较少字段的不同结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006857/
我是一名优秀的程序员,十分优秀!