golang切片的长度与容量是什么

golang中,切片长度就是切片中元素的数量;切片容量是从创建切片的索引开始的底层数组中元素的数量,即从切片的第一个元素开始数,到其底层数组元素末尾的个数。切片的长度与容量是可以计算的,内置方法len()可获取长度,cap()可获取容量;在使用切片的过程中,如果使用append()让切片的长度大于了切片的容量,那么切片的容量会以双倍的形式自动扩容。

golang切片的长度与容量是什么

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go 语言 的 切片 拥有长度和容量。

切片的长度是切片中元素的数量

切片的容量是从创建切片的索引开始的底层数组中元素的数量,即从它的第一个元素开始数,到其底层数组元素末尾的个数。

立即学习“go语言免费学习笔记(深入)”;

切片是可索引的,并且可以由len()方法获取长度,切片提供了计算容量的方法cap(),可以测量切片最长可以达到多少。我们在使用切片的过程中,如果使用 append 使切片的长度大于了切片的容量,那么切片的容量会以双倍的形式自动扩容。

切片实际的是获取数组的某一部分,len切片

cap()的结果决定了切片截取的注意细节

var sTest01 []intfunc sliceTest01() {fmt.Printf("%T  cap(sTest01) = %v ", sTest01, cap(sTest01)) sTest01 = append(sTest01, 1, 2, 3, 4, 5, 6)fmt.Printf("%T  cap(sTest01) = %v ", sTest01, cap(sTest01)) }

登录后复制

运行结果:

[]int  cap(sTest01) = 0 []int  cap(sTest01) = 6

登录后复制

由此可以看到,在初始时,切片长度为0,在添加元素后,实际长度为6

证明数组是值类型,切片是引用类型的例子:

func sliceTest02() {x := [...]int{1, 2, 3, 4, 5, 6}y := []int{100, 200, 300, 400}w := xz := yw[0] = 777z[0] = 999fmt.Println("x = ", x, "w = ", w)fmt.Println("y = ", y, "z = ", z)}

登录后复制

运行结果:

x =  [1 2 3 4 5 6]w =  [777 2 3 4 5 6]y =  [999 200 300 400]z =  [999 200 300 400]

登录后复制

从运行结果可以看到,z的改变影响到了y的值,说明切片是引用类型。

slice没有自己的任何数据,它只是底层数组的一个引用,对slice所做的任何修改都将反映在底层数组中数组是值类型,而切片是引用类型

func sliceCap() {arr := [...]string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"}fmt.Println("cap(arr) = ", cap(arr), arr)//截取数组,形成切片s1 := arr[2:8]fmt.Printf("%T ", s1) fmt.Println("cap(s1) = ", cap(s1), s1)//截取数组,形成切片s2 := arr[4:7]fmt.Printf("%T ", s2)fmt.Println("cap(s2) = ", cap(s2), s2) //截取数组,形成切片s3 := s1[3:9]fmt.Printf("%T ", s3)fmt.Println("cap(s3) = ", cap(s3), s3) //截取数组,形成切片s4 := s2[4:7]fmt.Printf("%T ", s4)fmt.Println("cap(s4) = ", cap(s4), s4) //证明切片是引用类型s4[0] = "x"fmt.Println(arr, s1, s2, s3, s4)}

登录后复制

运行结果:

cap(arr) =  11 [a b c d e f g h i j k][]string cap(s1) =  9 [c d e f g h][]string cap(s2) =  7 [e f g][]string cap(s3) =  6 [f g h i j k][]string cap(s4) =  3 [i j k][a b c d e f g h x j k] [c d e f g h] [e f g] [f g h x j k] [x j k]

登录后复制

由结果我们可以看到,切片的截取只能生成切片,如果内容不够截取,会从底层数组给出后面的值。如果长度不够,会报错。

判断一个切片是否为空,如果直接使用nil来判断,是不准确的。

Golang允许len为0但是cap不为0,或者两者都为的0的切片,所以一般通过len获取切片长度来判断是否为空切片,而不是直接将切片和nil做直接的比较。

【相关推荐:Go视频教程、编程教学】

以上就是golang切片的长度与容量是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2415001.html

(0)
上一篇 2025年3月3日 00:49:43
下一篇 2025年2月25日 17:46:12

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • go语言中数组与切片有什么区别

    数组与切片的区别:1、切片是指针类型,数组是值类型;2、数组的赋值形式为值传递,切片的赋值形式为引用传递;3、数组的长度是固定的,而切片长度可以任意调整(切片是动态的数组);4、数组的长度是固定的,而切片长度可以任意调整(切片是动态的数组)…

    2025年3月3日
    200
  • go语言怎么比较字符串

    比较方法:1、直接使用“==”运算符比较,语法“str1 == str2”,该方法区分大小写。2、利用strings包的Compare()函数比较,语法“strings.Compare(a,b)”;返回值为int类型,0表示两数相等,1表示…

    2025年3月3日
    200
  • golang怎么添加list元素

    添加方法:1、用InsertBefore()函数在列表指定元素(mark点)前插入元素,语法“InsertBefore(v,mark)”;2、用InsertAfter()函数在列表指定元素(mark点)后插入元素,语法“InsertAfte…

    2025年3月3日 编程技术
    200
  • go语言怎么获取list长度

    在go语言中,可以使用列表内置的Len()函数来获取list长度,语法“列表list.Len()”,返回值为指定list的长度。Len()函数可用于计算数组(包括数组指针)、切片(slice)、map、channel、字符串等数据类型的长度…

    2025年3月3日
    100
  • golang循环遍历map的方式有几种

    golang循环遍历map的方式有1种,就是利用“for range”语句。“for range”是Go语言特有的一种的迭代结构,语法“for key, value := range mapName{…}”,返回的第一个是map…

    2025年3月3日 编程技术
    200
  • go语言怎么获取map元素

    两种方法:1、利用“for range”语句遍历map来获取全部元素,语法“for key, value := range mapName{…}”。2、使用key做为索引的形式来获取指定元素,语法“value, isOk := …

    2025年3月3日
    200
  • go语言中list怎么删除元素

    在go语言中,可以使用remove()函数来删除list元素,语法“list对象.Remove(element)”,参数element表示要删除列表元素。element元素不能为空,如果不为空则返回被删除的元素的值,如果为空则会报异常。 本…

    2025年3月3日
    200
  • go语言中join方法有什么用

    在go语言中,join()是strings包的一个字符串处理函数,可以将数组(切片)转为字符串,即将字符串切片(数组)中存在的所有元素连接为单个字符串;语法“strings.Join(s,sep) ”,参数“s”为用来连接元素的字符串切片(…

    2025年3月3日
    200
  • go语言扩容方法有哪几种

    go语言扩容方法有:1、Slice扩容,在使用append向Slice追加元素时,如果Slice空间不足,将会触发Slice扩容;2、Map扩容。触发Map扩容的条件有二个:1、负载因子大于6.5时,也即平均每个bucket存储的键值对达到…

    2025年3月3日 编程技术
    200
  • Go语言怎么判断指定字符是否存在

    判断方法:1、使用index()函数判断,可以在字符串中查找指定字符第一次出现的位置,语法“strings.Index(str,指定字符)”,如果返回“-1”则不存在,否则存在。2、使用ContainsRune()函数判断,可以判断字符是否…

    2025年3月3日
    200

发表回复

登录后才能评论