Golang中的赋值操作非常简洁明了,我们可以直接将一个对象赋值给另一个对象,从而实现对象的拷贝赋值。例如,假设我们有一个`Person`结构体,它包含姓名和年龄两个属性:
```
type Person struct {
Name string
Age int
}
```
要将一个`Person`对象的属性值复制给另一个`Person`对象,我们只需要执行类似如下的赋值操作即可:
```
person1 := Person{"Alice", 25}
person2 := person1
```
这样,`person2`就拥有了与`person1`相同的属性值。需要注意的是,这种赋值操作只会进行浅拷贝,即如果`Person`结构体中包含了引用类型的属性,那么`person1`和`person2`将共享同一份引用类型的数据。
使用json.Marshal和json.Unmarshal进行深拷贝
如果我们需要进行深拷贝,也就是说需要复制引用类型的属性,可以使用`encoding/json`包中的`json.Marshal`和`json.Unmarshal`函数。首先,我们需要将源对象转换为JSON字符串,然后再将JSON字符串转换为目标对象。
首先,我们需要为`Person`结构体实现`json.Marshaler`接口和`json.Unmarshaler`接口。这些接口可以分别在`encoding/json`包中找到:
```
func (p Person) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
Name string
Age int
}{
Name: p.Name,
Age: p.Age,
})
}
func (p *Person) UnmarshalJSON(data []byte) error {
aux := &struct {
Name string
Age int
}{}
if err := json.Unmarshal(data, aux); err != nil {
return err
}
p.Name = aux.Name
p.Age = aux.Age
return nil
}
```
接着,我们可以使用`json.Marshal`函数将源对象转换为JSON字符串:
```
person1 := Person{"Alice", 25}
data, _ := json.Marshal(person1)
```
然后,我们可以使用`json.Unmarshal`函数将JSON字符串转换为目标对象:
```
var person2 Person
_ = json.Unmarshal(data, &person2)
```
通过这样的方式,我们可以实现深拷贝操作,确保目标对象和源对象完全独立。