Goで構造体のコピーを作成する

Goの構造体変数は、代入ステートメントを使用して非常に簡単に別の変数にコピーできます。

package main

import ( “fmt” )

type Dog struct { age int name string }

func main() { roger := Dog{5, “Roger”} mydog := roger if roger == mydog { fmt.Println(“Roger and mydog are equal structs”) } }

演奏する

mydogそしてrogerは2つの別個の変数ですが、プロパティごとに比較すると、まったく同じです。

他のオブジェクトに影響を与えることなく、これらの変数のすべてのプロパティを変更できるようになりました。Dog構造体には、値によってコピーされる基本型が含まれています。

構造体に参照型がある場合、これはそれほど簡単ではありませんでした。pointer値ではなくコピーされるので、浅いコピー

例えば

type Cat struct {
    age int
    name string
    friends []string
}

私たちの猫の友達のリストはスライス、参照型(ポインター、マップ、関数、チャネルとともに)であるため、猫のオブジェクトがあり、上記の犬の例のようにコピーした場合、コピーすることはできません。他のオブジェクトにも影響を与えずにfriendsプロパティを変更します。

Aディープコピーが必要です。

構造体をディープコピーする

このようなディープコピーは手動で実行できます。スライスの場合、次のようにコピーを実行できます。

package main

import ( “fmt” )

type Cat struct { age int name string friends []string }

func main() { wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}} nikita := wilson

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = make([]<span style="color:#66d9ef">string</span>, len(<span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>))
copy(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#a6e22e">wilson</span>.<span style="color:#a6e22e">friends</span>)

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)

<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)

}

演奏する

上記のコードは次のようになりますウィルソンであること{7 Wilson [Tom Tabata Willie]}そしてニキータであること{7 Wilson [Tom Tabata Willie Syd]}

したがって、スライスは、同じスライスへの参照だけでなく、完全に異なるオブジェクトであることがわかります。

ディープコピーライブラリの使用

https://github.com/jinzhu/copierそこにある(多くの)ディープコピーライブラリ/ヘルパーの1つです。これにより、各フィールドを明示的に管理しなくても、構造体をディープコピーすることが非常に簡単になります。これが例です。必要なのはcopier.Copy(&nikita, &wilson)そして、私たちは設定されています:

package main

import ( “fmt” github.com/jinzhu/copier )

type Cat struct { age int name string friends []string }

func main() { wilson := Cat{7, “Wilson”, []string{“Tom”, “Tabata”, “Willie”}} nikita := Cat{} copier.Copy(&nikita, &wilson)

<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span> = append(<span style="color:#a6e22e">nikita</span>.<span style="color:#a6e22e">friends</span>, <span style="color:#e6db74">"Syd"</span>)

<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">wilson</span>)
<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Println</span>(<span style="color:#a6e22e">nikita</span>)

}


その他のチュートリアル: