Golang 切片元素问题

下面代码中其实真正有效的元素就 2 个,如果用 len() 方法会得到 7go 中有什么方法能得到结果为 2

package main

import "fmt"

type abc string

func main() {
    tslice := make([]abc, 5, 10)
    tslice = append(tslice, "测试数组", "第二个值")
    for _, val := range tslice {
        fmt.Printf("结果为 %v \n", val)
    }
}
阅读 2.3k
2 个回答

make([]abc, 5, 10)已经初始化切片了.你打印前五个值实际值为''你也可以把切片类型改成int类型,那么前五个元素会输出0,所以你除非遍历计算非空元素的个数,基本是没办法区分的

详细解释。

len计算的是元素数量,是容器里有效、已经初始化、可以被读取的元素数量。cap计算的是容量,是容器分配好的空间,在不重新分配内存的情况下可以直接使用的大小,包括已经初始化的(len计算的部分)和未初始化的部分。

打个比方来说,cap就是杯子容量,len就是杯子里的水。

make有两种形式,一种是make(type, len),这种形式下make创建的容器会分配并初始化一定数量的元素。比如make([]int,10)分配并且初始化了10个元素,此时len得到的元素数量是10,cap得到的大小是10。

以水和杯做比喻,就是make了一个10ml容量的杯,并装满了10ml的水。

make的第二种形式是make(type,len,cap),这种形式下make创建的容器会分配cap那么大的空间,并初始化len那么多的元素,比如make([]int, 5, 10),此时len5cap10

以水和杯做比喻,就是make了一个10ml容量的杯,并装了5ml的水。

最后说appendappend是在已初始化的元素后添加新元素。举例来说make([]int, 5, 10),此时已初始化的元素数量是5,append添加一个元素,新添加的元素就是第6个元素。

就像是你已经装了5ml的水,再倒1ml进去,那你得到的只能是6ml的的水,而不是1ml。


最后回答你的问题,把 make([]abc, 5, 10) 改成 make([]abc, 0, 10) 就行了。

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