type AttributeValue struct {
	attr       []*proto_product.Attribute // slice被直接赋值
	expireTime int64
}

func (cache *AttributeCache) BatchGetCache(pids []int32) (map[int32][]*proto_product.Attribute, []int32) {
	cache.attributeMutex.RLock()
	defer cache.attributeMutex.RUnlock()
	missIds := []int32{}
	attrList := map[int32][]*proto_product.Attribute{}
	for _, pid := range  pids {
		if attr, ok := cache.attributes[pid]; ok {
			attrList[pid] = attr.attr // slice直接赋值,那么修改attrList[pid]本质上会修改cache.attributes[pid]
		} else {
			missIds = append(missIds, pid)
		}
	}

	return attrList, missIds
}

参考

slice作为参数传递,在函数中进行修改,函数返回后,修改能否保留?

Another option is to use slices. Even though your function gets a copy of the slice variable it still references the original data. 即使函数内部得到的是 slice 的值拷贝,但依旧会更新 slice 的原始数据(底层 array)

func main() {  
    x := []int{1,2,3}

    func(arr []int) {
        arr[0] = 7
        fmt.Println(arr) //prints [7 2 3]
    }(x)

    fmt.Println(x) //prints [7 2 3]
}

3.1 大量内存得不到释放 TODO

大量内存得不到释放

在已有切片的基础上进行切片,不会创建新的底层数组。因为原来的底层数组没有发生变化,内存会一直占用,直到没有变量引用该数组。 因此很可能出现这么一种情况,原切片由大量的元素构成,但是我们在原切片的基础上切片,虽然只使用了很小一段,但底层数组在内存中仍然占据了大量空间,得不到释放。 比较推荐的做法,使用 copy 替代 re-slice。

参考

1.Golang 新手可能会踩的 50 个坑–12. Array|slice的值作为函数参数

原创文章转载请注明出处: Code Review - 如何对slice赋值|slice深拷贝,浅拷贝