多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
> # 是浅拷贝还是深拷贝 > ### 例子一 ``` package main import "fmt" func main() { s1 := []int{1, 2, 3, 4, 5} s2 := make([]int, 0, 3) s3 := make([]int, 3, 3) //尝试将 s1 中的元素复制到 s2。由于 s2 的长度为0,实际并不会复制任何元素。 //n2 表示复制的元素个数,这里将会是0。 n2 := copy(s2, s1) n3 := copy(s3, s1) fmt.Println("S1:", s1) fmt.Println("S2:", s2, n2) fmt.Println("S3:", s3, n3) } ``` >### 例子二 ~~~ package main import "fmt" func main() { s1 := []int{1, 2, 3, 4, 5} s2 := make([]int, len(s1), len(s1)) copy(s2, s1) s1[0] = 2 //当切片的元素类型是引用类型(如映射、切片、指针、通道等)时,copy 函数会复制这些引用,而不是它们引用的值 s3 := []map[string]int{{"A": 1}, {"B": 2}, {"C": 3}, {"D": 4}, {"E": 5}} s4 := make([]map[string]int, len(s3), len(s3)) copy(s4, s3) s3[0]["A"] = 6 fmt.Println("S1:", s1) fmt.Println("S2:", s2) fmt.Println("S3:", s3) fmt.Println("S4:", s4) } ~~~ > ### 例子三 - 解决例子二的问题 ~~~ package main import "fmt" func main() { s3 := []map[string]int{{"A": 1}, {"B": 2}, {"C": 3}, {"D": 4}, {"E": 5}} s4 := DeepCopySliceOfMaps(s3) s3[0]["A"] = 6 fmt.Println("S3:", s3) fmt.Println("S4:", s4) } func DeepCopySliceOfMaps(slice []map[string]int) []map[string]int { // 创建一个新的切片,与原始切片长度相同 newSlice := make([]map[string]int, len(slice)) // 遍历原始切片 for i, m := range slice { // 创建一个新的 map,用于存储拷贝后的数据 newMap := make(map[string]int) // 遍历原始 map for k, v := range m { // 将键值对拷贝到新的 map 中 newMap[k] = v } // 将新的 map 添加到新的切片中 newSlice[i] = newMap } return newSlice } ~~~