go slice
package main import ( "fmt" ) type Pair struct { a int b int } type PairAndFreq struct { Pair Freq int } type PairSlice []PairAndFreq type PairSliceSlice []PairSlice func (pss PairSliceSlice) Weed() { fmt.Println(pss[0]) weed(pss[0]) fmt.Println(pss[0]) } func weed(ps PairSlice) { m := make(map[Pair]int) for _, v := range ps { m[v.Pair]++ } ps = ps[:0] for k, v := range m { ps = append(ps, PairAndFreq{k, v}) } fmt.Println(ps) } func main() { pss := make(PairSliceSlice, 12) pss[0] = PairSlice{PairAndFreq{Pair{1, 1}, 1}, PairAndFreq{Pair{1, 1}, 1}} pss.Weed() }
这段代码最后输出的是
{1 1} 1} {{1 1} 1}] [{{1 1} 2}] [{{1 1} 2} {{1 1} 1}]
这是因为传了slice,而不是slice的指针,它最后只变成了[{{1,1},2}],但是函数外面的那个slice还存在,也就是说函数外面的slice还留有着后面那个{{1,1},1},所以才会出现这种情况。
range的v只是值的复制并不是真正的值,像操作切片的切片就不能有range v来操作,只能直接按下标访问。
slice 只存了 len cap 和 address 。自己也有地址。如果在栈的上层操作一个slice的复制,不会影响栈的下层的slice,但是会影响下层slice管理的那片内存。