亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

Golang中深拷貝與淺拷貝有什么區別

小億
93
2024-01-30 15:31:08
欄目: 編程語言

在Go語言中,深拷貝(deep copy)和淺拷貝(shallow copy)是關于數據復制的兩個概念。

淺拷貝是指對于一個數據結構,只復制其引用(地址),而不復制其實際內容。這意味著新舊兩個數據結構共享同一個底層數據,對其中一個進行修改會影響到另一個。在Go語言中,對于大多數的內置類型(如int、string、slice、map、channel等)的賦值操作都是淺拷貝。

示例代碼:

package main

import "fmt"

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{Name: "Alice", Age: 30}
    p2 := p1 // 淺拷貝

    p1.Name = "Bob"
    p1.Age = 40

    fmt.Println(p1) // 輸出: {Bob 40}
    fmt.Println(p2) // 輸出: {Bob 40}
}

上述示例中,p1和p2共享同一個Person對象,因此對p1的修改也會影響到p2。

深拷貝是指對一個數據結構進行逐層復制,復制其所有的內容,包括底層數據和引用的數據。這意味著新舊兩個數據結構完全獨立,對其中一個進行修改不會影響到另一個。在Go語言中,對于自定義的結構體類型,需要通過一些方式來實現深拷貝,例如使用json.Marshal和json.Unmarshal函數進行序列化和反序列化,或者手動逐層復制每個字段。

示例代碼:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p1 := Person{Name: "Alice", Age: 30}
    p2 := deepCopy(p1) // 深拷貝

    p1.Name = "Bob"
    p1.Age = 40

    fmt.Println(p1) // 輸出: {Bob 40}
    fmt.Println(p2) // 輸出: {Alice 30}
}

func deepCopy(src Person) Person {
    var dst Person
    data, _ := json.Marshal(src)
    json.Unmarshal(data, &dst)
    return dst
}

上述示例中,通過使用json.Marshal和json.Unmarshal函數進行序列化和反序列化,實現了對Person對象的深拷貝,確保了p1和p2是完全獨立的。

0
抚州市| 营口市| 运城市| 莱州市| 长沙县| 滕州市| 延寿县| 左云县| 梁河县| 莱州市| 阿拉善盟| 油尖旺区| 衡山县| 潮州市| 龙陵县| 泰州市| 沂水县| 云浮市| 陆川县| 小金县| 富顺县| 周至县| 屏山县| 崇左市| 新郑市| 当涂县| 东光县| 蒲城县| 宜春市| 乌拉特前旗| 新巴尔虎右旗| 杭州市| 突泉县| 新和县| 若羌县| 平武县| 内黄县| 彩票| 孝感市| 吐鲁番市| 宁津县|