go 当对map和string 重新赋值,产生的结果不一样
//make 一个map,然后循环对map进行重新赋值,最后追加到一个slice里
func main(){
var data = make(map[string]interface{}, 0)
var res []map[string]interface{}
var testSlice = []int{1,2,3,4,5}
for _,v :=range testSlice{
data["key"] = v
fmt.Println(data)
//打印结果
//[map[key:1]
//map[key:2]
//map[key:3]
//map[key:4]
//map[key:5]
res = append(res, data)
}
fmt.Println(res)
// 结果很奇怪不是[map[key:1] map[key:2] map[key:3] map[key:4] map[key:5]]
//而是 [map[key:5] map[key:5] map[key:5] map[key:5] map[key:5]]
//再用string试一下,然后循环对string进行重新赋值,最后追加到一个slice里
func main(){
var s string
var ss []string
var i = []int{1,2,3,4,5}
for _,v :=range i{
s = cast.ToString(v)//int转换string
ss = append(ss, s)
}
fmt.Println(ss)
//而是 [1,2,3,4,5]
}
为什么string重新赋值可以,而map不行呢(其实slice也不行)
map若不是深拷贝并没有生成新的空间,就是所谓的浅拷贝,不管你怎么改变他,最后都会有同根性,最后一个改的是啥前面的都是那个值不懂深拷贝参考这篇深拷贝和浅拷贝文章
当然这个例子要正确返回值很简单,只要make在循环里面就好了
//make 一个map,然后循环对map进行重新赋值,最后追加到一个slice里
func main(){
var res []map[string]interface{}
var testSlice = []int{1,2,3,4,5}
for _,v :=range testSlice{
//这样每次都是一个新的空间
var data = make(map[string]interface{}, 0)
data["key"] = v
fmt.Println(data)
//打印结果
//[map[key:1]
//map[key:2]
//map[key:3]
//map[key:4]
//map[key:5]
res = append(res, data)
}
fmt.Println(res)
//[map[key:5] map[key:5] map[key:5] map[key:5] map[key:5]]