go语言中切片的长度和容量的区别

切片的长度,显而易见的就是元素的个数,根据元素的个数进行返回具体的长度。

切片的长度,更像是一个警戒值,如果长度与容量相等,就会进行容量的扩容,比如

des :=make([]int , 3 , 5)
//此时,长度为3,容量为5,但是如果使用append(),
//切片长度会变为4,再次使用append()切片长度变为5。
//此时,切片长度与容量相同,此时,切片的容量增大变为cap = len*2

也就是通过一个容量设警戒值,如果等于警戒值,就会自动将切片进行扩容

补充:Go语言中切片的长度与容量的变化

在学习go语言的切片信息时,发现切片的容量变化非常让人摸不着头脑,为了更记忆深刻就写下了这篇,如有错误之处,请大家指正

一,当前切片的长度与容量相等情况:

package main
import (
    "fmt"
)
func main() {
	numbers := []int{0,1,2}
	printSlice(numbers)
	//通过append给numbers增加信息,如果当前切片的长度与容量相等,增加信息的长度小于等于原来的长度,
	那么切片的长度变为相加之和,容量变为原来的2倍(图片一的第二行结果)
	numbers = append(numbers, 10,5,6)
	printSlice(numbers)

	//通过append给numbers增加信息,如果当前切片A的长度与容量相等,增加信息B的长度大于切片A原来的长度,
	那么切片的长度变为相加之和,容量变为:B长度+A长度+(B长度-A长度)%2(图片一的第三行结果)
	numbers = append(numbers, 12,13,15,16,17,18,19,20,21,22,23)
	printSlice(numbers)
}
func printSlice(x []int){
   fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}

图片一:

二,如果当前切片的长度小于容量情况:

增加信息的长度与当前长度和小于等于容量

func main() {
   /* 创建切片 */
   numbers := []int{0,1,2}
   printSlice(numbers)
   numbers = append(numbers, 10,5)
   printSlice(numbers)
   //通过append给numbers增加信息,如果当前切片的长度小于容量,增加信息的长度与当前长度和小于等于容量,
   那么numbers的长度变为相加之和,容量不变(图片二的第三行结果)
   numbers = append(numbers, 11)
   printSlice(numbers)
}

图片二:

增加信息B的长度与当前A的长度大于A容量并且小于A容量的2倍

func main() {
   /* 创建切片 */
   numbers := []int{0,1,2}
   printSlice(numbers)
   numbers = append(numbers, 10,5)
   printSlice(numbers)
   //通过append给numbers增加信息,如果当前切片A的长度小于容量,增加信息B的长度与当前A的长度大于A容量并且小于A容量的2倍,
   那么numbers的长度变为相加之和,容量变为:A容量*2(图片三的第三行结果)
   numbers = append(numbers, 11,12)
   printSlice(numbers)
}

图片三:

增加信息B的长度与当前A的长度大于A容量的2倍

func main() {
	/* 创建切片 */
	numbers := []int{0,1,2}
	printSlice(numbers)
	numbers = append(numbers, 10,5)
	printSlice(numbers)
	//通过append给numbers增加信息,如果当前切片A的长度小于容量,增加信息B的长度与当前A的长度大于A容量的2倍,
	那么numbers的长度变为相加之和C。容量变为:B长度+A长度+(B长度-A长度)%2(图片四的第三行结果)
	numbers = append(numbers, 11,12,13,15,16,17,18,19,20)
	printSlice(numbers)
}

图片四:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • go语言求任意类型切片的长度操作

    最近用go写程序时遇到一个问题--求任意类型切片的长度. 作为一个初学者,刚刚学了接口和切片,知道了每个类型都实现了一个空接口interface{},那么如果接口类型作为函数的参数,那它应该是可以接收任意类型的实参的 带着这样的想法就写出了下面的代码: func size(ins []interface{}) int { return len(ins) } 然后调用 a := []int{1, 2, 3, 4} fmt.Println(size(a)) 但编译的时候报了以下错误: cannot

  • go语言中切片与内存复制 memcpy 的实现操作

    Go 语言原则上不支持内存的直接操作访问,但是提供了切片功能. 最初我以为切片就是动态数组,实际程序设计过程中发现,切片是提供数组一个内存片段的一个合法的手段,利用切片功能,实际上我们可以自由访问数组的任何一个片段,因而可以借助 copy 函数,实现内存复制. 不同类型之间的数据复制,可以借助 unsafe 取出变量地址,类型转换为数组后,利用数组切片,实现内存复制. 不罗嗦了,示例代码如下: package main import ( "fmt" "unsafe"

  • 如何在Go中使用切片容量和长度

    来做一个快速测验-以下代码输出什么? vals := make([]int, 5) for i := 0; i < 5; i++ { vals = append(vals, i) } fmt.Println(vals) Run it on the Go Playground → https://play.golang.org/p/7PgUqBdZ6Z 如果猜到了[0 0 0 0 0 0 1 2 3 4],那么你是正确的. 等一下为什么不是[0 1 2 3 4]? 如果答错了,也不担心.从其他语言

  • golang中切片copy复制和等号复制的区别介绍

    结论: copy复制会比等号复制慢.但是copy复制为值复制,改变原切片的值不会影响新切片.而等号复制为指针复制,改变原切片或新切片都会对另一个产生影响. 测试复制速度: func TestArr1(t *testing.T) { var a []int for i := 0; i < 100000000; i++ { a = append(a, i) } start := time.Now().UnixNano() var b = make([]int, 1000000) copy(b, a)

  • Go语言切片前或中间插入项与内置copy()函数详解

    内置append()函数能够在切片末尾位置添加新的项,假设要在切片的前面或者中间某位置插入特定项,可以这样实现 看下代码: package main import "fmt" func main() { s := []string{"M","N","O","P","Q","R"} x := InsertStringSliceCopy(s,[]string{"

  • go语言中的二维切片赋值

    先用append填充一维的,然后将一维append到二维 代码如下 var a [][]int for i := 0; i < 10; i++ { var tmp []int for j:= 0; j < 10; j++ { tmp = append(tmp, j) } a = append(a, tmp) } 补充:Go切片的一些技巧 空切片也是切片 与map不同,尚未分配的切片也是可以用的: 一个nil切片的长度和容量都是0:你可以append到一个空切片,Go会自动分配:你也可以直接迭代

  • 详解Go语言中切片的长度与容量的区别

    目录 切片的声明 切片的长度和容量 切片追加元素后长度和容量的变化 append 函数 切片的源代码学习 切片的结构体 切片的扩容 总结 切片的声明 切片可以看成是数组的引用(实际上切片的底层数据结构确实是数组).在 Go 中,每个数组的大小是固定的,不能随意改变大小,切片可以为数组提供动态增长和缩小的需求,但其本身并不存储任何数据. // 数组的声明 var a [5]int //只指定长度,元素初始化为默认值0 var a [5]int{1,2,3,4,5} // 切片的声明 // 方法1:

  • go语言中切片的长度和容量的区别

    切片的长度,显而易见的就是元素的个数,根据元素的个数进行返回具体的长度. 切片的长度,更像是一个警戒值,如果长度与容量相等,就会进行容量的扩容,比如 des :=make([]int , 3 , 5) //此时,长度为3,容量为5,但是如果使用append(), //切片长度会变为4,再次使用append()切片长度变为5. //此时,切片长度与容量相同,此时,切片的容量增大变为cap = len*2 也就是通过一个容量设警戒值,如果等于警戒值,就会自动将切片进行扩容 补充:Go语言中切片的长度

  • Go语言中切片使用的注意事项小结

    前言 Go 语言中的slice类型可以理解为是数组array类型的描述符,包含了三个因素: 指向底层数组的指针 slice目前使用到的底层数组的元素个数,即长度 底层数组的最大长度,即容量 因此当我们定义一个切片变量,s := make([]int, 5, 10),即为指向了一个最大长度为10的底层数组,目前切片s使用到的长度为5. 在使用切片的时候,有几个注意事项,下面来一起看看吧. 使用append 先看一个例子: // 创建一个整型切片 // 其长度和容量都是 5 个元素 slice :=

  • go语言中切片Slice与数组Array对比以及panic: runtime error: index out of range问题解决

    目录 前言 一.go slice是什么 二.go slice实战案例 1.slice创建.使用 2.slice的长度和容量概念理解 3. 切片扩容及slice panic: runtime error: index out of range 附:go 判断数组下标是否存在 总结 前言 在go语言的学习历程当中,slice数据类型引起了我的好奇心.为啥不直接使用Slice,是人性的扭曲还是道德的沦丧~,下面让我们一探究竟~~ 一.go slice是什么 go语言中的slice是一个基于Array封

  • 一文带你深入了解Go语言中切片的奥秘

    目录 Go语言基础三 切片的定义 创建切片的方式 切片初始化 Go语言基础三 切片的定义 1. 切片:切片是数组的一个引用,因此切片是引用类型.但自身是结构体,值拷贝传递. 2. 切片的长度可以改变,因此,切片是一个可变的数组. 3. 切片遍历方式和数组一样,可以用len()求长度.表示可用元素数量,读写操作不能超过该限制. 4. cap可以求出slice最大扩张容量,不能超出数组限制.0 <= len(slice) <= len(array),其中array是slice引用的数组. 5. 切

  • C语言中求字符串长度的函数的几种实现方法

    1.最常用的方法是创建一个计数器,判断是否遇到'\0',不是'\0'指针就往后加一. int my_strlen(const char *str) { assert(str != NULL); int count = 0; while (*str != '\0') { count++; str++; } return count; } 2.不创建计数器,从前向后遍历一遍,没有遇到'\0'就让指针向后加一,找到最后一个字符,记下来地址,然后用最后一个字符的地址减去起始地址,就得到了字符串的长度.

  • C语言中指针常量和常量指针的区别

    在面试中我们经常会被面试官问到什么是常量指针,什么又是指针常量. 指针常量就是指针本身是常量,指针里面所存储的内容(内存地址)是常量,不能改变.但是,对应内存地址里存的内容是可以通过指针改变的. 常量指针就是指向常量的指针,指针中所存地址中对应的值是常量,不能通过指针来修改它的值.但是,指针自身不是常量,它自身的值可以改变,从而指向另一个地址. 指针常量与常量指针的声明 指针常量的声明:数据类型 * const 变量名. 常量指针的声明:数据类型 const * 变量名 或者 const 数据类

  • C语言中计算字符串长度与分割字符串的方法

    C语言strlen()函数:返回字符串的长度 头文件: #include <string.h> strlen()函数用来计算字符串的长度,其原型为: unsigned int strlen (char *s); [参数说明]s为指定的字符串. strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0". [返回值]返回字符串s 的字符数. 注意一下字符数组,例如 char str[100] = "http://see.xidian.edu.cn/cpp

  • 简要说明C语言中指针函数与函数指针的区别

    指针函数一般是指返回指针的函数: #include <stdio.h> int* fun(int *a) { return a; } int main(int argc, char **argv) { int a = 3; printf("%d", *(fun(&a))); return 0; } 函数指针是表示指向函数开始地址的指针: 首先要了解函数的调用过程: #include <stdio.h> int fun(int i) { return i

随机推荐