golang学习之二:切片slice

golang--slice(切片) 切片的长度表示切片中当前存储的元素个数,它不能超过切片的容量。切片可以通过设置下限和上限来截取一个新的切片,语法为slice[start:end],其中start和end表示切片的元素索引,如果省略start,则默认为0,如果省略end,则默认为切片的长度。切片可以使用copy()函数来复制另一个切片的所有元素,语法为copy(dst, src),其中dst表示目标切片,src表示源切片。对切片再次截取时,新切片和原切片会共享底层数组,所以修改其中一个切片的元素会影响另一个切片。 阅读详情

为什么会有切片?

golang中数组的特点(缺点)
1、数组的长度在定义之后无法再次修改;
2、数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片(slice)来弥补数组的不足。
为了解决这两个缺点,所以才有了切片

切片并不是数组或数组指针,它只是一个数据结构,它通过内部指针和相关属性引用数组片段,以实现变⻓方案。 slice 并不是真正意义上的动态数组,而是一个引用类型。slice 总是指向一个底层 array,slice
的声明也可以像 array 一样,只是不需要长度。

golang的切片实现是在包runtime/slice.go,切片结构体包含array指向数组的指针,是一块连续的内存空间,len代表切片的长度,cap代表切片的容量,cap总是大于等于len。
我们来看一下切片的源码:

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

在这里插入图片描述

切片的创建和初始化

切片与数组的区别

slice和数组的区别:声明数组时,方括号内写明了数组的长度,而声明slice时,方括号内没有任何字符或者…。

// 数组的定义,数组里面的长度是固定的一个常量,数组不能修改长度,len和cap永远都是7
a := [7]int{1, 2, 3, 4, 5, 6, 7}
fmt.Println("slice=", a,"\nlen=", len(a), "\ncap=", cap(a))
// 切片的定义:[]里面为空,或者为...切片的长度或容量可以不固定
b := [] int {}
fmt.Println("b=", b,"\nb=", len(b), "\ncap=", cap(b))// [],0,0
// 给切片末尾追加一个成员,再次打印发现长度和容量均发生了变化
b = append(b, 11)// [11],1,1
// 创建切片并初始化
c := []int{1, 2, 3} 
// 总之一句话,声明slice时,方括号内没有任何数字,或者为...

切片的创建

1、自动推导类型

	// 自动推导类型
	s1 := []int{1, 2, 3, 4}
	fmt.Println("s1= ", s1)

控制台

s1=  [1 2 3 4]

2、借助make函数

借助make函数,格式 make(切片类型,长度,容量)

	s2 := make([]int, 5, 10)
	fmt.Printf("len = %d, cap = %d\n", len(s2), cap(s2))

控制台

len = 5, cap = 10

如果没有指定容量,那么容量和长度一样

	s3 := make([]int, 5)
	fmt.Printf("len = %d, cap = %d\n", len(s3), cap(s3))

控制台

len = 5, cap = 5

切片属性(起始下标、长度、容量)

下面我们来从数组里截取一个切片

array := []int{10, 20, 30, 0, 0}
// array[low,high,max]
slice := array[0:3:5]
fmt.Println("slice=", slice,"\nlen=", len(slice), "\ncap=", cap(slice))

// 控制台打印
slice= [10 20 30] 
len= 3 
cap= 5

上述代码:0,3代表:从数组中的第一个元素开始截取,到索引为3的元素为止(不包括索引为3的元素,即10、20、30),然后切片当前的元素共有10、20、30这三个元素,所以该切片的长度为3。最后一个5表示该切片的容量为5,也就是当前切片在不扩容的情况下最多能放的元素的个数为5个元素,当然了如果再多,切片会自动扩容,新容量为之前容量的2倍。
所以新切片的信息为

// 控制台打印
slice= [10 20 30] 
len= 3 
cap= 5

我们来详细的看看这个array[0:3:5]可以把它看成array[low:high:max]
low:下标起点(切片中第一个元素在原数组中的索引下标)
high:下标的终点(不包括此下标),[a[low], a[high])左闭右开
len = high - low,(长度:切片当前所存放的元素的个数)
cap = max - low, (容量: 切片在不扩容的情况下最多能放的元素的个数)

cap:绝对不会错的cap计算方式,其实切片的容量就是在原数组中从切片的第一个元素开始,到原数组最后一个元素的元素的个数(包括切片的第一个和原数组最后一个元素)。
如下代码,cap就是5 -1 = 4。即切片第一个元素为20,20在原素组中开始数到最后一个元素0为止,即20、30、0、0,一共有4个元素,所以cap为4。此时切片的长度为4-1=3,即当前切片中所存有的元素个数,20、30、0,一共是3个。

array := []int{10, 20, 30, 0, 0}

slice := array[1:4:5]

可以把切片看成一个杯子,长度就是杯子里当前的水量,容量就是杯子体积在不发生变化时最多能盛的水量(这里不太恰当,切片会自动扩容)。

切片的结构有三部分:

  • 1、地址指针
  • 2、长度(切片当前所存放的元素的个数)
  • 3、容量(切片里最多能放的元素的个数)

在这里插入图片描述

切片的操作

切片截取

在这里插入图片描述
示例说明

 array := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
 // [low:high:max] 取下标从low开始的元素,len=high-low, cap=max-low
 s1 := array[:] // [0:len(array):len(array)] 不指定容量,容量和长度一样

在这里插入图片描述
注:切片的容量:切片的容量就是在原数组中从切片的第一个元素开始,到原数组最后一个元素的元素的个数(包括切片的第一个和原数组最后一个元素)。

切片和底层数组关系

修改切片中某个元素的值,对应的原数组中的值也会被改变,所以切片依旧指向原底层数组。
如下代码,注释很详细,这里不再解释

a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	// 新切片
	s1 := a[2:5]
	// s1: [3 4 5] len: 3 cap: 7
	fmt.Println("s1:", s1, "len:", len(s1), "cap:", cap(s1))

	// 修改切片的第一个元素的值
	s1[0] = 666
	// 打印s1: [666 4 5] len: 3 cap: 7
	fmt.Println("s1:", s1, "len:", len(s1), "cap:", cap(s1))
	// 原数组对应的元素也发生了改变
	// a: [1 2 666 4 5 6 7 8 9]
	fmt.Println("a:", a)

	// 创建一个新的切片,该切片是从s1:[3,4,5]的下标索引为2的元素对应原数组的元素5开始至下标为6结束,即5678
	// 故,新切片长度为4,容量为5
	s2:= s1[2:7]
	// 打印:s2: [5 6 7 8 9] len: 5 cap: 5
	fmt.Println("s2:", s2, "len:", len(s2), "cap:", cap(s2))

	// 修改切片s2的元素
	s2[0] = 777
	// 打印 s2: [777 6 7 8 9]
	fmt.Println("s2:", s2)
	// 打印 a: [1 2 666 4 777 6 7 8 9]
	fmt.Println("a:", a)

内建函数

1、append

append函数向 slice 尾部添加数据,返回新的 slice 对象,而且如果切片的容量不够,它还会自动帮切片扩容。

添加数据
	var s1 []int //创建nil切换
    //s1 := make([]int, 0)
	// 在原切片的末尾添加元素
    s1 = append(s1, 1)       //追加1个元素
    s1 = append(s1, 2, 3)    //追加2个元素
    s1 = append(s1, 4, 5, 6) //追加3个元素
    fmt.Println(s1)          //[1 2 3 4 5 6]

    s2 := make([]int, 5)
    s2 = append(s2, 6)
    fmt.Println(s2) //[0 0 0 0 0 6]

    s3 := []int{1, 2, 3}
    s3 = append(s3, 4, 5)
    fmt.Println(s3)//[1 2 3 4 5]
自动扩容

append函数会智能地底层数组的容量增长,一旦超过原底层数组容量,通常以2倍容量重新分配底层数组,并复制原来的数据:
由一下代码可以看出,当添加的元素超过了切片的容量时,append会将切片的容量变为原先的2倍。

s := make([]int, 0, 1)
	for i := 0; i < 50; i++ {
		s = append(s, i)
		fmt.Println("切片中存放的元素个数:", len(s), ", cap:", cap(s))
	}
	/*
	切片中存放的元素个数: 1 , cap: 1
	切片中存放的元素个数: 2 , cap: 2
	切片中存放的元素个数: 3 , cap: 4
	切片中存放的元素个数: 4 , cap: 4
	切片中存放的元素个数: 5 , cap: 8
	切片中存放的元素个数: 6 , cap: 8
	切片中存放的元素个数: 7 , cap: 8
	切片中存放的元素个数: 8 , cap: 8
	切片中存放的元素个数: 9 , cap: 16
	切片中存放的元素个数: 10 , cap: 16
	切片中存放的元素个数: 11 , cap: 16
	切片中存放的元素个数: 12 , cap: 16
	切片中存放的元素个数: 13 , cap: 16
	切片中存放的元素个数: 14 , cap: 16
	切片中存放的元素个数: 15 , cap: 16
	切片中存放的元素个数: 16 , cap: 16
	切片中存放的元素个数: 17 , cap: 32
	切片中存放的元素个数: 18 , cap: 32
	切片中存放的元素个数: 19 , cap: 32
	切片中存放的元素个数: 20 , cap: 32
	切片中存放的元素个数: 21 , cap: 32
	切片中存放的元素个数: 22 , cap: 32
	切片中存放的元素个数: 23 , cap: 32
	切片中存放的元素个数: 24 , cap: 32
	切片中存放的元素个数: 25 , cap: 32
	切片中存放的元素个数: 26 , cap: 32
	切片中存放的元素个数: 27 , cap: 32
	切片中存放的元素个数: 28 , cap: 32
	切片中存放的元素个数: 29 , cap: 32
	切片中存放的元素个数: 30 , cap: 32
	切片中存放的元素个数: 31 , cap: 32
	切片中存放的元素个数: 32 , cap: 32
	切片中存放的元素个数: 33 , cap: 64
	切片中存放的元素个数: 34 , cap: 64
	切片中存放的元素个数: 35 , cap: 64
	切片中存放的元素个数: 36 , cap: 64
	切片中存放的元素个数: 37 , cap: 64
	切片中存放的元素个数: 38 , cap: 64
	切片中存放的元素个数: 39 , cap: 64
	切片中存放的元素个数: 40 , cap: 64
	切片中存放的元素个数: 41 , cap: 64
	切片中存放的元素个数: 42 , cap: 64
	切片中存放的元素个数: 43 , cap: 64
	切片中存放的元素个数: 44 , cap: 64
	切片中存放的元素个数: 45 , cap: 64
	切片中存放的元素个数: 46 , cap: 64
	切片中存放的元素个数: 47 , cap: 64
	切片中存放的元素个数: 48 , cap: 64
	切片中存放的元素个数: 49 , cap: 64
	切片中存放的元素个数: 50 , cap: 64
	*/

2、copy

函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 可指向同⼀底层数组。
就是将短的切片的元素替换掉长的切片的部分元素
如下代码

	srcSlice := []int{1, 2}
	dstSlice := []int{6, 6, 6, 6, 6}
	// 将srcSlice复制到dstSlice里
	copy(dstSlice, srcSlice)
	// dst=  [1 2 6 6 6]
	fmt.Println("dst= ", dstSlice)
	// dst=  [1 2]
	fmt.Println("dst= ", srcSlice)

切片做函数参数

值传递 还是 引用传递?

Go语言中的函数传参方式全部都是值传递,不存在引用传递。
切片在当成参数传递的时候也是值传递,那为啥在函数里修改了切片的数据,且未将切片返回,但是函数外的切片取到的值也会修改呢?

原理:
Go语言中的切片事实上就是是一个结构体,其运行时结构如下:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

这一点非常重要,这也就意味着,将切片作为函数参数时,其传递机制与结构体传递机制一样,都是值传递,也即传递的是原切片的拷贝。

另外一个非常重要的点就是,切片结构体中的array是一个指针,意味着array的值是底层数组的地址,通过函数传参后,这个值依然没有改变。

因此可以看到,当把切片作为函数参数传递时,在函数中对切片进行某些修改操作,会影响到函数外的原始切片。

切片做函数参数的好处

1、当切片作为函数参数传递给函数是,实际传递的是切片的内部表述,也就是runtime.slice结构体实例,因此无论有切片描述的底层数组有多大,切片最为参数传递带来的性能损耗都是很小且恒定的,甚至小到可以忽略不计,这就是函数在参数中多使用切片而不用数组指针的原因之一。
2、切片可以提供比指针更为强大的功能,比如下标访问、边界益出校验、动态扩容等等。

切片扩容

切片扩容大致过程:append会根据切片的需要,在当前底层数组容量无法满足的情况下,动态分配新的数组,新数组长度会按一定算法扩展(可参见$GOROOT/src/runtime/slice.go中的growslice函数)。新数组建立后,append会把旧数组中的数据复制到新数组中,之后新数组便成为切片的底层数组,旧数组后续会被垃圾回收掉。这样的append操作有时会给大家带来一些困惑,比如通过语法u[low:high]形式进行数组切片化而创建的切片,一旦切片cap触碰到数组的上界,再对切片进行append操作,切片就会和原数组解除绑定。

上面是理论,下面来段代码实战一下,下面这段代码先不看答案,你能写对吗?

package main

import "fmt"

func main() {
	u := [...]int{11, 12, 13, 14, 15}
	fmt.Println("array:", u) // [11, 12, 13, 14, 15]
	s := u[1:3]
	fmt.Printf("slice(len=%d, cap=%d): %v\n", len(s), cap(s), s) // [12, 13]
	s = append(s, 24)
	fmt.Println("after append 24, array:", u)
	fmt.Printf("after append 24, slice(len=%d, cap=%d): %v\n", len(s), cap(s), s)
	s = append(s, 25)
	fmt.Println("after append 25, array:", u)
	fmt.Printf("after append 25, slice(len=%d, cap=%d): %v\n", len(s), cap(s), s)
	s = append(s, 26)
	fmt.Println("after append 26, array:", u)
	fmt.Printf("after append 26, slice(len=%d, cap=%d): %v\n", len(s), cap(s), s)

	s[0] = 22
	fmt.Println("after reassign 1st elem of slice, array:", u)
	fmt.Printf("after reassign 1st elem of slice, slice(len=%d, cap=%d): %v\n", len(s), cap(s), s)
}

控制台打印:

array: [11 12 13 14 15]
slice(len=2, cap=4): [12 13]
after append 24, array: [11 12 13 24 15]
after append 24, slice(len=3, cap=4): [12 13 24]
after append 25, array: [11 12 13 24 25]
after append 25, slice(len=4, cap=4): [12 13 24 25]
after append 26, array: [11 12 13 24 25]
after append 26, slice(len=5, cap=8): [12 13 24 25 26]
after reassign 1st elem of slice, array: [11 12 13 24 25]
after reassign 1st elem of slice, slice(len=5, cap=8): [22 13 24 25 26]

我们看到当 append 25 之后,切片的元素已经触碰到了底层数组 u 的边界;此后再 append 26 后,append 发现底层数组已经无法满足 append 的要求,于是新创建了一个底层数组(数组长度为 cap(s)的 2 倍,即 8),并将 slice 的元素拷贝到新数组中了。这之后,我们即便再修改 slice 的第一个元素值,原数组 u 的元素也没有发生任何改变了,因为此时切片 s 与数组 u 已经解除了“绑定关系”,s 已经不再是数组 u 的“描述符”了,s是扩容后的新数组的描述符。

这就好比有一个容量为1的切片叫丁原(u),然后吕布(s)认他做了义父,但是董卓向该切片里放了一匹赤兔马(append操作),但是切片放不下,不过董卓财大气粗啊,就对吕布说:奉先吾儿,跟咱家保准你吃香的喝辣的,于是吕布就认了董卓当义父(s指向了新数组),所以以后再骂吕布的义父就是在骂董卓了,和丁原无关了(通过s改变切片的元素的值,原切片u的值不会发生变化)。忍不住感叹,好一个贼吕布,好一个三姓家奴。

尽量使用 cap 参数创建 slice

我们看到 append 操作是一并利器,它让 slice 类型部分满足了“零值可用”的理念。但从 append 的原理中我们也能看到重新分配底层数组并拷贝元素的操作代价还是蛮大的,尤其是当元素较多的情况下。那么如何减少或避免为过多内存分配和拷贝付出的代价呢?一种有效的方法就是根据 slice 的使用场景在为新创建的 slice 赋初值时使用 cap 参数。

s := make([]T, 0, cap)

个人学习笔记,不喜勿喷

小白学习go之基础篇2 -- Slice切片的原理 文章目录前言一、为什么要有切片?二、切片是怎么实现的呢?1.Go的切片结构体 -- SliceHeader2.初始化切片的两种方式3.切片是在栈上分配内存的还是在堆?3.切片的扩容:三、切片的使用有什么坑需要注意呢?总结 前言 本文主要记录: 1.Slice切片的实现原理。 2.切片的指针是存储在堆中还是栈中的。 3.切片使用中的一些坑。 一、为什么要有切片? 由于go中的数组是值类型的,使用的时候是固定大小的 如arr := [3]int{1,2,3} 之后就无法再改变数组的长度了。 所以gola 阅读详情

相关推荐

Python中的切片操作

2、如果不指定第一个数,Python就从序列首开始;如果没有指定第二个数,则Python会停止在序列尾;如果没有指定第三个数,则步长默认为1。1、切片操作符中的第一个数表示切片开始的位置,第二个数表示切片到哪里结束,第三个数表示切片步长。切片操作符是序列名后跟一个方括号,方括号中有3个可选的数字,并用冒号分割。在很多编程语言中,针对字符串提供了截取函数,其实目的就是对字符串切片。

北辰 1757

【go】切片截取总结

【代码】【go】切片截取总结。

微雨停了的博客 2451

Go迷之切片截取分析(下标与append)

Go迷之切片截取分析(下标与append)

空山新雨后,天气晚来秋 733

14golang基础-slice切片追加与截取

golang学习笔记-slice切片追加与截取

FISH 2556

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别?

例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。

chinansa的博客 1529

2.数字芯片时序正确的前提—Max-transition

芯片物理设计中最基本的Max-transition检查

weixin_43868998的博客 5418

你的go学长在线学习golang:切片(Slice)基础

切片是 Go 中非常核心的一种动态数组类型,可以存储任意个数的元素,而且可以随时扩容。它是对数组(array)的一种更灵活的封装,使用得比数组多得多。操作示例创建添加元素访问元素s[0]遍历长度len(s)

Kritop的博客 360

300Kg载重履带式无人车底盘定制开发技术详解

通过精准的需求分析、科学的方案设计、严格的研发与测试以及完善的交付与培训流程,可以打造出符合客户需求的优质产品。300Kg载重履带式无人车底盘的定制开发,旨在打造一款承载能力强、行驶稳定、适应复杂地形的无人运输平台。根据应用场景选择合适的动力源,并进行性能优化,确保无人车在载重情况下仍能保持稳定的行驶速度和动力输出。根据需求分析结果,设计无人车底盘的总体方案,包括动力系统选择、结构设计、负载管理策略等。进行详细的研发工作,包括零部件的选型与采购、样机的制作与调试等。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 958

Go学习:切片slice的循环机制及性能

使用range来循环切片时,每一轮都会向同一个临时变量进行赋值即赋值拷贝,这是一个性能上的开销。从下面的测试输出能看得出临时变量的地址是不会变的,而且与切片的地址完全不同。如果切片元素包含字符串的话,用range遍历和直接寻址遍历的性能差别还是很显著的。 package main import ( "fmt" "time" ) type Person struct { Name ...

pengpengzhou的博客 2125

C语言实战:最小二乘法在传感器数据校准中的应用(附完整代码)

本文详细介绍了如何使用C语言实现最小二乘法,对传感器数据进行线性校准。通过模拟带噪声的传感器数据,手把手演示了从核心算法实现、参数计算到效果验证的完整流程,并提供了可直接编译运行的完整源码,帮助嵌入式开发者解决传感器数据不准的常见问题,提升系统测量精度。

weixin_28025327的博客 515

最新Anaconda3的安装配置及使用教程(详细过程)

最新Anaconda3安装使用Anaconda下载方式一:官网下载方式二:清华镜像下载(推荐)Anaconda安装 Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项 Anaconda + Jupyter 基本上已经是大部分机器学习/数据分析等开发者标配的开发环境, 不多介绍,直接进去正题: Anaconda下载 方式一:官网下载 下载地址传送门: 官网首页:https://www.anaconda.com/ 官网下载页:https://www

HowieXue 薛永浩的博客 34万+

golang学习(九):切片(slice)

简介 在Go 语言中,数组是值类型,长度是固定的;而切片是引用类型,长度可动态增长。切片的内部结构包括地址、大小和容量。 从数组或切片生成新的切片 特性: 1.当省略开始位置时,表示从连续区域开头到结束位置。 2.当省略结束位置时,表示从开始位置到整个连续区域结束位置。 3.两者都省略时,与切片本身等效。 基本格式如下: slice [开始位置:结束位置] 案例如下: pa...

weixin_44079228的博客 701

手把手教你学Simulink——基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的PR(比例谐振)控制器在单相整流系统中的应用。通过与传统PI控制器的对比,阐述了PR控制器在交流信号跟踪中的优势:可实现50Hz正弦电流的无静差跟踪,THD低于2%,功率因数接近1。文章从PR控制器原理出发,提供了Simulink建模的具体步骤,包括主电路搭建、电压外环设计、PR控制器实现方法(推荐MATLAB Function方式)以及SPWM调制。通过仿真验证了PR控制在稳态和负载突变情况下的优越性能,并探讨了工程实践中的电网频率自适应、多谐振PR等关键技术。该教程为

MHD0815的博客 123

Go:从源码角度学习Go中的动态数组——切片(Slice)

从源码角度学习Go中的动态数组——切片(Slice)

Liu_y_xin的博客 1118

Halcon那些事:Halcon缺陷检测检测印刷数字完整性

创建模板 create_shape_model模板匹配 find_shape_model。

十多年IT经验,专注机器视觉,智能制造半导体行业 764

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第3题)

王老师青少年编程 989

Go语言学习8:深入理解切片slice

slice定义 slice是个结构体,源码如下: // runtime/slice.go type slice struct { array unsafe.Pointer // 元素指针 len int // 长度 cap int // 容量 } slice 共有三个属性: 指针,指向底层数组; 长度,表示切片可用元素的个数,也就是说使用下标对 slice 的...

login_sonata的博客 688

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Go学习(二):切片Slice、指针

会报错,没有分配内存空间。要分配内存,就引出来今天的new和make。使用make进行初始化,然后才可以对它们进行操作。

Lay_XZ的博客 440

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

学习 Go 语言 0x02:对切片 Slice 的理解

学习 Go 语言 0x02:对切片 Slice 的理解 只是我自己的理解,仅供参考。如果理解的不对,请不吝指正。谢谢:) ★ 例1 代码源自 Go 语言之旅,可能会稍有改动。 package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} fmt.Println(len(s), cap(s),s) s ...

Abracadabra的专栏 357

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Go语言学习11:切片Slice

package main import "fmt" func main() { /* 数组array: 存储一组相同数据类型的数据结构。 特点:定长 切片slice: 同数组类似,也叫做变长数组或者动态数组。 特点:变长 是一个引用类型的容器,指向了一个底层数组。 make() func make(t Type, size ...IntegerType) Type 第一个参数:类型 slice, map, chan 第二.

up1292的博客 482

Go语言学习笔记十一: 切片(slice)

Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用。不像java语言写起来就比较繁琐。不过我觉得未来java语法也会支持的。 定义切片 切片可以使用make函数来定义,也可以像变量声明一样创建个未指定大小的切片。 var x []int = make([]int, 3); y := make([]int, 3); z...

kriszhang的博客 495

Go语言学习八:切片(slice)和范围(range)

// Go 语言切片是对数组的抽象。切片的单词来源于可以对其他数组和切片进行片段截取 // Go 数组的长度不可改变,在特定场景中这样的集合就不太适用, // Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"), // 与数组相比切片的长度是不固定的,可以追加元素, // 在追加时可能使切片的容量增大。 package main import "fmt" func mai

风哥有点田 4162

Golang学习笔记.slice切片

对数组切片: var arr [5]int = [...]int{1, 2, 3, 4, 5} slice := arr[1:3] fmt.Printf("%v %v\n%v %v\n", arr[1], slice[0], &arr[1], &slice[0]) 由此可见slice切片直接引用arr数组的地址 append方法 var arr [5]int = [...]int{1, 2, 3, 4, 5} slice := arr[1:3] var sli

weixin_53905185的博客 136

【Go学习笔记】数据类型之切片(slice)

切片 是Go中一种比较特殊的数据结构,它的内部包含地址、长度和容量三个字段,是围绕动态数组的概念构建的,可以按需自动增长和缩小。它非常灵活,支持自动扩容。 切片的声明 切片声明的基本语法如下: var 切片名 []元素的类型 切片的长度和容量 使用内置函数len(切片名)可以获得切片的长度,使用内置函数cap(切片名)可以获得切片的容量。 切片表达式 切片表达式从字符串、数组、指向数组或切片的指针构造子字符串或切片。它有两种变体:一种指定low和high两个索引界限值的简单的形式,另一种是除了low和h

weixin_42859873的博客 2521

【Golang】slice切片

可以声明一个未指定大小的数组来定义切片(切片不需要说明长度)

m0_62645012的博客 2407
上一篇: Go 互斥锁(sync.Mutex)和 读写锁(sync.RWMutex)
下一篇: golang学习之三:Go语言切片面试真题8连问
java_xxxx
博客等级 码龄9年 127粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值