面试题答案
一键面试package main
import (
"encoding/json"
"fmt"
)
func deepCopy(m map[string]interface{}) map[string]interface{} {
data, err := json.Marshal(m)
if err != nil {
panic(err)
}
var newMap map[string]interface{}
err = json.Unmarshal(data, &newMap)
if err != nil {
panic(err)
}
return newMap
}
可以通过以下方式调用这个函数:
func main() {
original := map[string]interface{}{
"key1": 1,
"key2": "value2",
"key3": map[string]interface{}{
"nestedKey": "nestedValue",
},
"key4": []interface{}{1, "two", map[string]interface{}{"subKey": "subValue"}},
}
copied := deepCopy(original)
fmt.Printf("Original: %+v\n", original)
fmt.Printf("Copied: %+v\n", copied)
}
通过 json.Marshal
和 json.Unmarshal
实现深度拷贝,将原 map
编码为JSON格式的字节切片,再将其解码为一个新的 map
,这样就得到了一个完全独立的副本,包括嵌套的 map
和 slice
。
deepCopy
函数:- 首先使用
json.Marshal
将传入的map
编码为JSON字节切片。如果编码过程中出现错误,使用panic
抛出异常。 - 然后声明一个新的
map[string]interface{}
类型变量newMap
,使用json.Unmarshal
将编码后的字节切片解码到newMap
中。如果解码过程出现错误,同样使用panic
抛出异常。 - 最后返回新创建的深度拷贝后的
map
。
- 首先使用
main
函数:- 创建一个包含各种类型值(
int
、string
、嵌套map
、嵌套slice
)的原始map
。 - 调用
deepCopy
函数对原始map
进行深度拷贝,并将结果打印出来,展示原始map
和拷贝后的map
的内容。
- 创建一个包含各种类型值(