Golangでのディープコピーとシャローコピーの使い方は何ですか?

Golangでは、深いコピーと浅いコピーとは、オブジェクトをコピーする際にその参照型データをコピーするかどうかを指します。以下は深いコピーと浅いコピーの使用方法です:

浅いコピーは、オブジェクトの値のみをコピーし、参照型データを複製しないことを指します。Golangでは、代入演算子=やcopy関数を使用して浅いコピーを行うことができます。

サンプルコード:

package main

import (
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	// 创建一个Person对象
	p1 := Person{Name: "Alice", Age: 20}

	// 使用赋值操作符进行浅拷贝
	p2 := p1

	// 修改p2的Name属性
	p2.Name = "Bob"

	// 打印p1和p2的Name属性
	fmt.Println(p1.Name) // 输出:Alice
	fmt.Println(p2.Name) // 输出:Bob
}

ディープコピーとは、オブジェクトをコピーする際に参照型のデータもコピーすることを指します。Golangでは、json.Marshalとjson.Unmarshal関数を使用してディープコピーを行うことができます。

サンプルコード:

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	// 创建一个Person对象
	p1 := Person{Name: "Alice", Age: 20}

	// 使用json.Marshal和json.Unmarshal进行深拷贝
	data, _ := json.Marshal(p1)
	var p2 Person
	json.Unmarshal(data, &p2)

	// 修改p2的Name属性
	p2.Name = "Bob"

	// 打印p1和p2的Name属性
	fmt.Println(p1.Name) // 输出:Alice
	fmt.Println(p2.Name) // 输出:Bob
}

深いコピーを行う際に注意することは、オブジェクトのメンバ変数がエクスポート可能でなければならないことです(つまり、先頭文字が大文字である必要があります)。それ以外の場合、適切な深いコピーができません。

bannerAds