go - slice 的容量

标签 go

我是 Golang 的新手,我正在关注 Tour。下面的代码产生以下结果:

一个 len=5 cap=5 [0 0 0 0 0]

b len=0 cap=5 []

c len=2 cap=5 [0 0]

d len=3 cap=3 [0 0 0]

当 c 根本没有指定时,c 怎么会和 b 有相同的上限呢?

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)

    b := make([]int, 0, 5)
    printSlice("b", b)

    c := b[:2]
    printSlice("c", c)

    d := c[2:5]
    printSlice("d", d)
}

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

最佳答案

每个 slice 都是指向底层数组的指针类型。当你制作 b 时,你创建了一个 b 指向的基础数组。当您通过重新复制 b 创建 c 时,您将创建一个指向与 b 相同的底层数组的新 slice 。

当您更改 b 中的某些条目时,您会注意到这些值在 c 中也发生了变化。

有一个官方博客条目,详细解释了所有这些:https://blog.golang.org/go-slices-usage-and-internals

关于go - slice 的容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52647891/

相关文章:

logging - 构造系统日志消息时的乱码输出

http - 去 block 上传

go - decodeRuneInternal 和 decodeRuneInStringInternal 有什么区别

go - 如何访问gohtml中 slice 结构内的结构元素?

go - 主机 key 不匹配

api - 502错误接二连三地调用API

docker - Golang dep 不下载所有库文件

c - 如何使用 "foreign function interface"从 Go 调用 C

postgresql - 在准备好的语句中查找 Postgres 查询,Golang

go - 如何通过嵌入式接口(interface)嵌入结构值: Composable Structs