2015-11-13 282 views
-2

我有一個像下面結構:golang結構數組轉換

type Foo struct{ 
    A string 
    B string 
} 

type Bar struct{ 
    C string 
    D Baz 
} 

type Baz struct{ 
    E string 
    F string 
} 

可以說我有[]Bar,如何將其轉換爲[]Foo

A應該C

B應該E

+0

這些結構在語義上是不同的。請描述你爲什麼要進行這種轉換,也許你可以使用一個接口。 –

+0

我正在使用第三方軟件包的東西,這個軟件包返回一個巨大的結構,我想將此結構轉換爲我的本地結構插入到數據庫。 –

回答

4

我不認爲有這樣的轉換任何「神奇」的方式。但是,創建它只是一小部分編碼。像這樣的事情應該做的伎倆。

func BarsToFoos(bs []Bar) []Foo { 
    var acc []Foo 

    for _, b := range bs { 
    newFoo := Foo{A: b.C, B: b.D.E} // pulled out for clarity 
    acc = append(acc, newFoo) 
    } 

    return acc 
} 
+0

這是一種高性能的方式嗎? –

+0

@MelihMucuk是的,它應該是足夠的。過度優化是所有邪惡的根源。 – codefreak

+0

我懷疑有一個更快的方法來實際轉換它們。具體取決於你想要做什麼,最好使用一個接口並跳過顯式轉換。 – Vatine

1

例如,簡明地mininimizing存儲器分配和使用,

package main 

import "fmt" 

type Foo struct { 
    A string 
    B string 
} 

type Bar struct { 
    C string 
    D Baz 
} 

type Baz struct { 
    E string 
    F string 
} 

func FooFromBar(bs []Bar) []Foo { 
    fs := make([]Foo, 0, len(bs)) 
    for _, b := range bs { 
     fs = append(fs, Foo{ 
      A: b.C, 
      B: b.D.E, 
     }) 
    } 
    return fs 
} 

func main() { 
    b := []Bar{{C: "C", D: Baz{E: "E", F: "F"}}} 
    fmt.Println(b) 
    f := FooFromBar(b) 
    fmt.Println(f) 
} 

輸出:

[{C {E F}}] 
[{C E}]