首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展长度并保留值

扩展长度并保留值
EN

Stack Overflow用户
提问于 2018-06-06 06:35:59
回答 1查看 229关注 0票数 1

我跟着去学习GOLANG的旅行。

我在这一步有一个问题:https://tour.golang.org/moretypes/11

代码语言:javascript
复制
  package main

  import "fmt"

  func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Step1 Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Step2 Extend its length.
    // Why after extend the length of the slice, the value in this slice is still  [2 3 5 7]
    s = s[:4]
    printSlice(s)

    // Step 3 Drop its first two values.
    s = s[2:]
    printSlice(s)
  }

  func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
  }

产出:

代码语言:javascript
复制
len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]

为什么在第二步扩展了切片的长度之后,这个切片中的值仍然是2 3 5 7?我认为这个切片中的值是0 0 0,因为我在第一步就对原始切片进行了切片。

我还有另外一个问题,为什么第三步可以改变切片的容量,而第一秒钟却不能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-06 07:08:37

因为第一次扩展不会改变片的指针地址。因此,s还指向[2 3 5 7 11 13]地址。

代码语言:javascript
复制
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    s := []int{2, 3, 5, 7, 11, 13}
    printSlice(s)

    // Slice the slice to give it zero length.
    s = s[:0]
    printSlice(s)

    // Extend its length.
    s = s[:4]
    printSlice(s)

    // Drop its first two values.
    s = s[2:]
    printSlice(s)
}

func printSlice(s []int) {
    fmt.Printf("len=%d cap=%d %v array ptr: %v \n", len(s), cap(s), s,(*unsafe.Pointer)(unsafe.Pointer(&s)))
}

终点站显示:

代码语言:javascript
复制
len=6 cap=6 [2 3 5 7 11 13] array ptr: 0xc04200a2a0
len=0 cap=6 [] array ptr: 0xc04200a2a0
len=4 cap=6 [2 3 5 7] array ptr: 0xc04200a2a0
len=2 cap=4 [5 7] array ptr: 0xc04200a2b0

您可以看到,第三步更改了ptr地址,因为第一项被更改了。所以你知道..。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50713681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档