3 回答

TA貢獻1779條經(jīng)驗 獲得超6個贊
在Go語言中,原始類型和僅包含原始類型的結構按值復制,因此您可以通過簡單地分配給新變量(或從函數(shù)返回)來復制它們。例如:
type Person struct{
Name string
Age int
}
alice1 := Person{"Alice", 30}
alice2 := alice1
fmt.Println(alice1 == alice2) // => true, they have the same field values
fmt.Println(&alice1 == &alice2) // => false, they have different addresses
alice2.Age += 10
fmt.Println(alice1 == alice2) // => false, now they have different field values
請注意,正如評論者所提到的,示例中的混亂很可能是由于所使用的測試庫的語義所致。
如果您的結構恰好包含數(shù)組,切片或指針,那么除非您希望在副本之間保留引用,否則您將需要對所引用對象執(zhí)行深層副本。Golang不提供內(nèi)置的深層復制功能,因此您必須實現(xiàn)自己的深層復制功能或使用提供它的許多免費可用庫之一。

TA貢獻1803條經(jīng)驗 獲得超3個贊
您可以使用帶有按值傳遞的函數(shù),并根據(jù)需要返回未更改或更改的參數(shù)。
使用上面的結構:
func main() {
copyOf := func(y Person) Person {
y.name = "Polonius"
y.address = append(y.address, Address{
city: "other city",
state: "other state",
})
return y
}
p := Person{
age: 20,
name: "Jack",
address: []Address{
{
city: "city1",
state: "state1",
}, {
city: "city2",
state: "state2",
},
},
}
q := copyOf(p)
fmt.Printf("Orig %v, \naddrss: %p \n\n", p, &p)
fmt.Printf("Copy %v, \naddress: %p\n\n", q, &q)
}
- 3 回答
- 0 關注
- 434 瀏覽
添加回答
舉報