Golang 切片

1. 为什么需要切片,和数组区别?

数组是定长的,切片是变长的

底层是数组存储

声明

var identifier []type

区分数组是[]中没有数字

var arr = [3]int {1, 2, 3}
fmt.Println(arr)
var sl = []int {1, 2, 3}
fmt.Println(sl)
fmt.Printf("类型 arr:%T, sl:%T", arr, sl

输出

[1 2 3]
[1 2 3]
类型 arr:[3]int, sl:[]int

2. 声明

2.1 通过 var identifier []type

2.2 通过make,如

var slice1 []type = make([]type, len,capacity)

其中 capacity 是容量,可省略;len是长度;需capacity >= len

3. 定义

3.1 直接初始化

var sl = []int {1, 2, 3}

3.2 引用数组、切片

s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}var num3 = s[6:7]

4. 添加元素、扩容

4.1 通过下标直接复制

4.2 通过append追加

var nums2 = make([]int, 3, 4)
fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)
nums2 = append(nums2, 1, 2,3)
fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

输出

len:3 cap:4 slice:[0 0 0]len:6 cap:8 slice:[0 0 0 1 2 3]

说明:make([]int, 3, 4) 已经给前三个元素复制0了,append的时候在后面追加;当切片长度大于容量时会自动扩容,容量变为原来的二倍

另外,不仅可以扩容单个元素,还可以扩容数组、切片

var num_tmp = []int{5,5,5}
nums2 = append(nums2, num_tmp...)

此时注意num_tmp后面需要加...表示添加里面的元素

5. 长度len, 容量cap

var nums2 = make([]int, 3, 4)
nums2[0] = 0
nums2[1] = 1
nums2[2] = 2
fmt.Printf("len:%d cap:%d slice:%v", len(nums2), cap(nums2), nums2)

输出

len:3 cap:4 slice:[0 1 2]

:此时访问nums2[3]是不行的,因为并未初始化

panic: runtime error: index out of range [3] with length 3

6. copy

num4 := make([]int, len(nums2), 2 * len(nums2))
copy(num4, nums2)
nums2[0] = 1000
fmt.Println(num4, nums2)
fmt.Printf("%p, %p", num4, nums2)

拷贝后两个切片指向不同的数组(地址不同),nums2改了其中的一个元素,对num4没影响(深拷贝)

输出

[0 0 0 1 2 3 5 5 5] [1000 0 0 1 2 3 5 5 5]
0xc000098090, 0xc000096000

原文地址:https://www.cnblogs.com/kaituorensheng/p/12239111.html

时间: 2024-11-09 03:53:46

Golang 切片的相关文章

golang切片slice

切片slice是引用类型 len()函数获取元素的个数 cap()获取数组的容量 1.申明方式 (1)var a []int 与数组不同的是他不申明长度(2)s2 := make([]int, 3, 10) //元素的类型,元素的数量,元素的容量  fmt.Println(len(s2), cap(s2)) 输出元素的数量和容量 2.讲数组转换成切片 2 a := [10]int{} 3 fmt.Println(a) 4 s1 := a[:10] //取前10个元素 [5:]取 5-最后的元素

golang切片类型

切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 一般使用make()创建 如果多个slice指向相同底层数组,其中一个的值改变会影响全部 make([]T,len,cap) 其中cap可以省略,则和len的值相同 len表示存数的元素个数,cap表示容量 slice的定义方式 package main import ( "fmt" )

golang 切片和map查询比较

package main import ( "fmt" "time" ) var testTimeSlice = []string{"aa", "bb", "cc", "dd", "ee", "aa", "zz"} var testTimeMap = map[string]bool{"aa": true, &

golang切片

切片与数组 go的数组是这样的 array := [3]int{1,2,3} array := [...]int{1,2,3} go的切片 array := []int{1,2,3} //1 array := make([]int,2) //2 arr := [5]int{1,2,3,4,5} array :=arr[1:3] //底层数组可见 会修改原数组 len和cap的区别 make切片有两个参数len和cap len:代表底层数组可访问的范围 用索引访问不可越过这个界限 cap:代表底层

Golang 入门 : 切片(slice)

切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append() 来实现的,这个函数可以快速且高效地增长切片,也可以通过对切片再次切割,缩小一个切片的大小.因为切片的底层也是在连续的内存块中分配的,所以切片还能获得索引.迭代以及为垃圾回收优化的好处.本文将介绍 Golang 切片的基本概念和用法,演示环境为 ubuntu 18.04 & go1.10.1. 切

Google资深工程师深度讲解Go语言☆

准备工作 ######课程导读: Go语言的历史起源??? 为什么会有Go出现?? Go的发展趋势?? 怎么样学习Go?? ######安装与环境: 视频地址:安装与环境 ######Go的参考资料汇总:1.GO语言零基础入门资料整理2.Restful接口开发(PHP)3.Go入门指南4.Learngobyexample 巩固语法基础的Demo,初学者“抄”(学习)代码的地方5.Go 初学者成长之路6.Go 标准库中文文档7.<编程之法:面试和算法心得>8.目录: 第1章 课程介绍    欢迎

Go语言的那些坑

Golang是我最喜欢的一门语言,它简洁.高效.易学习.开发效率高.还可以编译成机器码… 虽然它一出世,就饱受关注,而且现在在市面上逐渐流行开来,但是,它毕竟是一门新兴语言,还有很多让人不太习惯的地方(即坑,(^__^)),我作为新手,一边学习,一边踩坑,希望对其他人有借鉴作用. 文件名字不要轻易以__test.go为结尾 Golang的source文件的命名和其他语言本无差别,但是Golang自带Unit test,它的unit test有个小规范:所有unit test文件都要以__test

学习Golang语言(6):类型--切片

学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Golang语言(5):类型--数组 学习Golang语言(6):类型--切片 在很多应用场景中,数组不能够满足我们的需求.在初始定义数组时,我们并不知道数组所需的长度.因此,我们需要一个大小可以动态变化的数组(动态数组) 在Go语言中,这种"动态数组"成为slice(切片). 但是实际上slic

golang中的数组切片

概念:基于数组,数组切片添加了一系列管理功能,可以随时动态扩充存放空间,并且不会导致所管理的元素被重复复制. 创建数组切片: 方法一,基于数组: package main import "fmt" func main() { //define an array var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //create a slice based on array var mySlice []int = m