发布时间:2024-11-22 05:08:15
例如:
``` type Person struct { Name string Age int } func main() { p1 := Person{Name: "Alice", Age: 18} p2 := p1 fmt.Println(p2) } ``` 在上述代码中,我们直接将p1赋值给了p2,p1和p2共享同一块内存,它们的值是相等的。例如:
``` type Address struct { Province string City string } type Person struct { Name string Age int Address *Address } func main() { p1 := Person{Name: "Alice", Age: 18, Address: &Address{Province: "Beijing", City: "Beijing"}} p2 := new(Person) *p2 = *p1 fmt.Println(p2) } ``` 在上述代码中,我们使用了指针来进行结构体赋值操作。通过`*p2 = *p1`可以将p1的值赋给p2,它们也共享同一块内存。例如:
``` type Person struct { Name string Skills []string } func main() { p1 := Person{Name: "Alice", Skills: []string{"coding", "reading"}} p2 := new(Person) *p2 = p1 p2.Skills = make([]string, len(p1.Skills)) copy(p2.Skills, p1.Skills) fmt.Println(p2) } ``` 在上述代码中,我们首先使用`*p2 = p1`将p1的值赋给p2,然后对p2的Skills字段进行复制。通过copy函数,我们创建了一个新的切片,避免了引用传递的问题。例如:
``` type Person struct { Name string Age int } func main() { p1 := Person{Name: "Alice", Age: 18} p2 := reflect.New(reflect.TypeOf(p1).Elem()).Interface() reflect.ValueOf(p2).Elem().Set(reflect.ValueOf(p1)) fmt.Println(p2) } ``` 在上述代码中,我们使用反射创建了一个新的结构体实例p2,并将p1的值赋给p2。这种方式比较复杂,对性能有一定的影响,非必要情况下可以避免使用。