首页 > 其他 > 详细

go slice

时间:2014-02-15 01:00:23      阅读:344      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
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()
}
bubuko.com,布布扣

这段代码最后输出的是

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

go slice

原文:http://www.cnblogs.com/ggaaooppeennngg/p/3549085.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!