go 切片语法

func main() {
    type Map map[string][]int
    m := make(Map)
    s := []int{1, 2}
    s = append(s, 3)
    fmt.Printf("%+v\n", s)
    m["q1mi"] = s
    s = append(s[:1], s[2:]...)
    fmt.Printf("%+v\n", s)
    fmt.Printf("%+v\n", m["q1mi"])
}

结果:

[1,2,3]
[1,3]
[1,3,3]

为什么m["q1mi"]是[1,3,3]

阅读 1.5k
1 个回答

s[2:]... : 表示得到index等于2以及以后所有元素的切片;并且把该切片展开

   
    var  q []int = []int{1, 2, 3,4,5,6,7,8}
    var s []int =  []int{}

    var c = append(s,q[3:]...)  //q[3:]... 得到index等于3以及以后所有元素的切片;并且把该切片展开
    
    fmt.Print(c)  //[4 5 6 7 8]

为什么m["q1mi"]是[1,3,3]


func main() {
    type Map map[string][]int
    m := make(Map)
    s := []int{1, 2}
    s = append(s, 3)
    fmt.Printf("%+v\n", s)
    m["q1mi"] = s
    s = append(s[:1], s[2:]...)
    fmt.Printf("%+v\n", s)
    fmt.Printf("%+v\n", m["q1mi"])
}
结果:
[1,2,3]
[1,3]
[1,3,3]
    s := []int{1, 2} //创建一个数组
    s = append(s, 3) //给数组扩容 {1,2,3} len = 3;capacity = 4   
   //capacity 这个值可能会随着数组动态扩容的算法的改变而改变
    m["q1mi"] = s // 把数组赋值给 map
    
    //s1 = s[:1] 创建一个新的切片并且该底层共享 s数组;
    //s1 当前的startIndex = 0; len = 1; capacity = 4
  
    //s2 = s[2:] 建一个新的切片并且该底层共享 s数组;
   //s2 当前startIndex = 2; len = 1; capacity = 4

    s = append(s[:1], s[2:]...) 
    //相当于 s = append(s1, s2...) 
    //也就是把先把底层 s[1] = s[2],s[2] = s[2];  然后再把这个s重新赋值给s ;所以现在 s 为 {1,3,3}
 

看一下我给出的链接中 slice 相关内容

https://books.studygolang.com...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题