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管理的那片内存。

posted @ 2014-02-14 10:11  ggaaooppeenngg  阅读(290)  评论(0编辑  收藏  举报