首页 > 解决方案 > 为什么这个 go slice 的长度是 4,为什么输出在 slice 中有空间?

问题描述

我是 golang 的新手,在运行此代码片段时,我将 len 设为 4,试图理解为什么会这样?

package main

import "fmt"

type phone struct {
    model  string
    camera Camera
    ram    int
}

type Camera struct {
    lens      string
    aparature int
}

func main() {

    var m = make(map[string]phone)

    myphn1 := phone{model: "iphone", camera: Camera{"20", 4}, ram: 6}
    myphn2 := phone{model: "pixel", camera: Camera{"50", 2}, ram: 6}

    m["myphn1"] = myphn1
    m["myphn2"] = myphn2

    var k = make([]string, len(m))

    for key, _ := range m {
        k = append(k, key)
    }

    fmt.Println(k)
    fmt.Println(len(k))

}

我知道这在创建时增加了 2 的大小,但是在打印时它给出了类似的结果,是 2 个未分配条目的答案空间吗?

[  myphn2 myphn1]
4

标签: go

解决方案


这将创建一个长度为 2 的切片(len(m)此处为 2):

var k = make([]string, len(m))

这增加了两个元素,总共 4 个:

for key, _ := range m {
    k = append(k, key)
}

如果要预分配切片,则需要提供长度为零以及所需容量:

var k = make([]string, 0, len(m))

围棋之旅中的示例对此进行了介绍。


推荐阅读