go切片的概念及用法
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍"go切片的概念及用法",在日常操作中,相信很多人在go切片的概念及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"go切片的概念及用法"的疑惑有所帮
千家信息网最后更新 2026年11月03日go切片的概念及用法
这篇文章主要介绍"go切片的概念及用法",在日常操作中,相信很多人在go切片的概念及用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"go切片的概念及用法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
go切片原型
// runtime/slice.gotype slice struct { array unsafe.Pointer// 引用底层数组的指针 len int// 引用数组元素的长度,使用下标对元素进行访问的时候,下标不能超过len cap int // 引用数组的容量,cap>=len}定义一个名为baseSlice 的切片
baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}底层结构

定义一个新的切片slice1
slice1 := baseSlice[2:5] //[]int{2,3,4}底层结构
定义一个新的切片slice2
slice2 := slice1[4:7] //[]int{6,7,8}底层结构

源码
package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4} //这里slice1 cap是8,底层引用的数组为[]int{2, 3, 4, 5, 6, 7, 8, 9} //所以slice1 len=3, cap=8 //由于 slice1 cap=8 所以slice1[4:7]并不会发生数组越界 slice2 := slice1[4:7] //[]int{6,7,8} fmt.Printf("slice1:%v.len:%d.cap:%d\n", slice1, len(slice1), cap(slice1)) //slice1:[2 3 4].len:3.cap:8 fmt.Printf("slice2:%v.len:%d.cap:%d\n", slice2, len(slice2), cap(slice2)) //slice2:[6 7 8].len:3.cap:4}切片是值传递
package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4} appendSlice(slice1)fmt.Printf("slice1:%v\n", slice1) //slice1:[2 3 4] fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 2 3 4 10 6 7 8 9]}func appendSlice(s []int) { //值传递 s = append(s, 10) //这里会改变底层数组里的值,如果append的元素个数大于底层引用数组的容量,则会触发一次数组copy fmt.Printf("append slice1:%v\n", s) //append slice1:[2 3 4 10]}引用传递的假象
如果在调用的方法里,修改了传入切片len内的值,导致底层数组对应的值被修改,从调用方法外看,就像传入的切片值被修改了。
package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[2:5] //[]int{2,3,4} appendSlice(slice1)fmt.Printf("slice1:%v\n", slice1) //slice1:[123 3 4],看起来是slice1被修改了,其实是由于底层数组被修改的缘故 fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 123 3 4 5 6 7 8 9]}func appendSlice(s []int) { //值传递 // s = append(s, 10) s[0] = 123 //这里会改变底层数组里的值 fmt.Printf("append slice1:%v. len=%d. cap=%d\n", s, len(s), cap(s)) //append slice1:[123 3 4]. len=3. cap=8}深度copy
package mainimport ("fmt")func main() {baseSlice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}slice1 := baseSlice[4:7] //[]int{6,7,8} fmt.Printf("slice1:%v\n", slice1) //slice1:[4 5 6] //slice 深copy slice2 := make([]int, 3, 3)copy(slice2, slice1)fmt.Printf("slice2:%v. len=%d. cap=%d\n", slice2, len(slice2), cap(slice2)) //slice2:[4 5 6]. len=3. cap=3 slice2[0] = 100fmt.Printf("slice2:%v\n", slice2) //slice2:[100 5 6] fmt.Printf("slice1:%v\n", slice1) //slice1:[4 5 6] fmt.Printf("baseSlice:%v\n", baseSlice) //baseSlice:[0 1 2 3 4 5 6 7 8 9]}扩容
// runtime/slice.go//cap 为满足存放数据的最小容量func growslice(et *_type, old slice, cap int) slice { ... if cap > doublecap { newcap = cap } else { if old.len < 1024 {//如果slice len<1024,扩容时容量增长2倍,也就是2个变4个 newcap = doublecap } else {//如果slice len>=1024,扩容时增加原来容量的四分之一 // Check 0 < newcap to detect overflow // and prevent an infinite loop. for 0 < newcap && newcap < cap {newcap += newcap / 4 } ... } }nil slice和empty slice
empty slice 底层数组指针指向实际存在的空数组的地址;
nil slice 底层数组指针指向的是nil;
package mainimport ( "fmt")func main() { var nilSlice []int emptySlice := make([]int, 0) if emptySlice == nil { fmt.Println("emptySlice is nil.") } if nilSlice == nil { fmt.Println("nilSlice is nil.") //输出 nilSlice is nil. }}tips:
Go 语言的函数参数传递,只有值传递。
到此,关于"go切片的概念及用法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
数组
底层
容量
学习
元素
指针
方法
结构
下标
指向
更多
帮助
实用
最小
接下来
个数
假象
函数
原型
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
天津市摩尔互联网科技
互联网科技网
科技互联网龙头
工业互联网科技新基建
奇酷互联网科技公司
亿人帮互联网科技
小米互联网科技园设置
互联网金融科技公司干啥的
互联网时代科技改变生活
全球顶尖互联网科技公司
广西互联网科技孵化中心
洛阳共同富裕互联网科技有限公司
华夏恒生科技与互联网科技
卓翼科技产业互联网合作
美国互联网科技实力
江苏互联网智能科技软件
江苏互联网科技小贷
广东鹅鹅鹅互联网科技有限公司
艺电能源互联网科技有限公司招聘
互联网科技自媒体灵感
互联网科技公司
中关村互联网 科技集团
苏州互联网科技贷款公司
昊天互联网科技有限公司
辽宁互联网新科技
富国互联网科技002692
新氧科技和美国互联网有关系吗
全球科技与互联网公司市值变化
三亚科技创新互联网基地
杭州融税互联网科技有限公司