如何使用较少的字段将结构转换为其他结构

Yuv*_*rer 4 struct go

我试图将类型为Big的结构复制为类型Small,而不用相同的字段显式创建类型为Small的新结构。

我试图寻找其他类似问题,比如这个这个尚未完全不同结构类型之间的转换发生只有在结构具有相同的字段。

这是我尝试做的一个例子:

// 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,
    }
}
Run Code Online (Sandbox Code Playgroud)

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

big := Big{}
small := Small(big)
Run Code Online (Sandbox Code Playgroud)

有没有之间进行转换的方式Big,以Small不使用(甚至反之亦然)Convert的功能?

icz*_*cza 5

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

或者您可以重新设计。如果BigSmall再加上一些其他的,额外的领域,为什么不重用SmallBig

type Small struct {
    A int
    B string
}

type Big struct {
    S Small
    C float
    D byte
}
Run Code Online (Sandbox Code Playgroud)

然后,如果您有一个Big结构,那么您也有一个SmallBig.S。如果您有一个Small并且您需要一个BigBig{S: small}

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

type Big struct {
    Small // Embedding
    C float
    D byte
}
Run Code Online (Sandbox Code Playgroud)

那么这些也是有效的:Big.ABig.B。但是,如果需要一个Small值,则可以使用非限定类型名称作为字段名称来引用嵌入式字段,例如Big.Small(请参阅Golang嵌入式结构类型)。同样,从创建Big一个SmallBig{Small: small}