在Go中復制結構

使用賦值語句,可以很容易地將Go中的struct變量複製到另一個變量:

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”) } }

mydogroger是兩個單獨的變量,但按屬性進行比較時,它們是完全相同的。

現在,我們可以修改這些變量的每個屬性,而不會影響其他對象,因為Dogstruct包含基本類型,它們按值複製。

如果我們在結構體中有一個引用類型,這並不是那麼容易,因為pointer將被複製,而不是值,因此它應該是淺拷貝

例如

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

我們的貓的朋友列表是一個切片,一個引用類型(以及指針,地圖,函數和通道),因此,如果您有一個貓對象,並且像上面的Dog示例一樣進行複制,則無法修改friends屬性,而不影響其他對象。

一種深拷貝是必需的。

深度複製結構

您可以手動執行這種深層複製。對於切片,可以執行以下複製:

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是(其中眾多)深層複製庫/幫助程序。無需顯式管理每個字段,就可以很輕鬆地對結構進行深層複製。這是一個例子,我們需要的是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>)

}


更多教程: