Golang : Is conversion between different struct types possible?

前端 未结 5 821
小蘑菇
小蘑菇 2020-12-01 00:17

Let\'s say I have two similar types set this way :

type type1 []struct {
    Field1 string
    Field2 int
}
type type2 []struct {
    Field1 string
    Field         


        
相关标签:
5条回答
  • 2020-12-01 00:22

    To give a reference to OneOfOne's answer, see the Conversions section of the spec.

    It states that

    A non-constant value x can be converted to type T in any of these cases:

    • x is assignable to T.
    • x's type and T have identical underlying types.
    • x's type and T are unnamed pointer types and their pointer base types have identical underlying types.
    • x's type and T are both integer or floating point types.
    • x's type and T are both complex types.
    • x is an integer or a slice of bytes or runes and T is a string type.
    • x is a string and T is a slice of bytes or runes.

    The first and highlighted case is your case. Both types have the underlying type

    []struct { Field1 string Field2 int }
    

    An underlying type is defined as

    If T is one of the predeclared boolean, numeric, or string types, or a type literal, the corresponding underlying type is T itself. Otherwise, T's underlying type is the underlying type of the type to which T refers in its type declaration. (spec, Types)

    You are using a type literal to define your type so this type literal is your underlying type.

    0 讨论(0)
  • 2020-12-01 00:25

    Nicolas, in your later comment you said you were using field tags on the struct; these count as part of definition, so t1 and t2 as defined below are different and you cannot cast t2(t1):

    type t1 struct {
        Field1 string
    }
    
    type t2 struct {
        Field1 string `json:"field_1"`
    }
    

    UPDATE: This is no longer true as of Go 1.8

    0 讨论(0)
  • 2020-12-01 00:30

    You can manually use a mapper function which maps each element of type t1 to type t2. It will work.

    func GetT2FromT1(ob1 *t1) *t2 {
         ob2 := &t2 { Field1: t1.Field1, }
         return ob2
    }
    
    0 讨论(0)
  • 2020-12-01 00:32

    For your specific example, you can easily convert it playground:

    t1 := type1{{"A", 1}, {"B", 2}}
    t2 := type2(t1)
    fmt.Println(t2)
    
    0 讨论(0)
  • 2020-12-01 00:43

    As of Go 1.8, struct tags are ignored when converting a value from one struct type to another. Types type1 and type2 will be convertible, regardless of their struct tags, in that Go release. https://beta.golang.org/doc/go1.8#language

    0 讨论(0)
提交回复
热议问题