美文网首页
len为0但是cap容量不为0的切片有什么用

len为0但是cap容量不为0的切片有什么用

作者: 我是聪 | 来源:发表于2023-04-22 11:16 被阅读0次

在 Go 语言中,切片(slice)是对底层数组的一个连续片段的引用,每个切片都有一个关联的容量和长度。容量是指底层数组从切片开始位置到数组末尾的元素个数,长度是指切片的元素个数。

对于一个长度为 0 的切片,它不包含任何元素,但是它的底层数组可能是存在的,这时候容量就表示了这个底层数组的大小。这种情况下,虽然这个切片没有任何实际的元素,但它仍然可以作为参数传递给某些函数,这些函数会将新的元素加入这个底层数组中。

举个例子:

var s []int // 声明一个长度为0的切片
fmt.Println(len(s), cap(s)) // 输出 0 0

s = make([]int, 0, 10) // 创建一个长度为0、容量为10的切片
fmt.Println(len(s), cap(s)) // 输出 0 10

s = append(s, 1, 2, 3) // 往切片中添加3个元素
fmt.Println(len(s), cap(s)) // 输出 3 10

可以看到,通过 make 创建一个长度为 0、容量为 10 的切片时,虽然长度为 0,但是它的容量是 10,这意味着这个切片底层关联的数组大小为 10。在往这个切片中添加元素时,由于容量足够,新的元素会直接添加到底层数组中,而不需要创建新的数组,这可以提高程序的性能。

对于切片来说,len为0但是cap容量不为0的切片可以用于缓存池等场景。缓存池是一种常见的技术,用于缓存频繁创建和销毁的对象,以提高系统性能。在实现缓存池时,可以预先分配一定数量的对象,并将它们保存在一个len为0但是cap容量不为0的切片中,当需要使用对象时,可以从切片中取出一个对象,使用后再将对象放回切片中,以达到重复利用对象的目的。

下面是一个简单的缓存池示例,它使用一个切片来保存预分配的对象。在程序启动时,会预先分配10个对象,并将它们保存在一个长度为0但容量为10的切片中。当需要使用对象时,从切片中取出一个对象,使用后再将对象放回切片中

package main

import (
    "fmt"
)

type Object struct {
    value int
}

var pool []*Object

func init() {
    for i := 0; i < 10; i++ {
        obj := &Object{value: i}
        pool = append(pool, obj)
    }
}

func getObject() *Object {
    if len(pool) == 0 {
        fmt.Println("Pool is empty. Creating new object.")
        obj := &Object{}
        return obj
    }
    obj := pool[0]
    pool = pool[1:]
    fmt.Printf("Retrieved object with value: %d\n", obj.value)
    return obj
}

func putObject(obj *Object) {
    pool = append(pool, obj)
    fmt.Printf("Returned object with value: %d\n", obj.value)
}

func main() {
    obj1 := getObject()
    obj2 := getObject()
    obj3 := getObject()
    putObject(obj1)
    putObject(obj2)
    putObject(obj3)
}

运行程序,输出如下:

Retrieved object with value: 0
Retrieved object with value: 1
Retrieved object with value: 2
Returned object with value: 0
Returned object with value: 1
Returned object with value: 2

相关文章

  • day02-07clice

    切片slise 切片的定义 初始化 长度len和容量cap 由数组得到切片 切片的容量cap是指底层数组从切片的第...

  • 【golang】slice底层函数传参原理易错点

    切片底层结构 切片的底层结构主要包括引用数组的地址data,切片长度len与切片容量cap。 以切片为参数调用函数...

  • 3.Golang 切片(重点,哪里不对,请多多指点)

    切片拥有自己的长度和容量,我们可以通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量 切片在...

  • Golang slice

    创建切片,len、cap、append 上述代码是生成默认占用5个0值的切片,下面的输出结果是另一回事 上述代码是...

  • 15.Go_Slice(切片)

    Go 切片 定义切片 切片初始化 len()和cap()函数 空(nil)切片 切片拦截 append() 和co...

  • golang make创建slice,map,channel

    1.slice make([]Type,len) //cap=len make([]Type,len,cap) 2...

  • Go 语言程序设计——集合类型(2)

    索引与分割切片 任何切片的第一个索引位置都是 0, 最后一个则为 len(s) - 1 与字符串不同的是,切片不支...

  • day07_元组

    切片 切片[a:b:c] 下标从a开始,截止到b,b是不可取的 a默认是0b默认是len(列表) c是间隔,默认是...

  • 切片

    定义 定义的空切片内存地址指向编号为0(nil)的空间 append 若超出容量 则容量*2 截取。copy 截取...

  • 【python】切片、迭代、列表生成器

    切片切片 L [起始 : 结束(不包含) : 方向(负数为倒着间隔)]L[0:3]取L[0]、L[1]、L[2],...

网友评论

      本文标题:len为0但是cap容量不为0的切片有什么用

      本文链接:https://www.haomeiwen.com/subject/ykxkjdtx.html