切片

切片

代码

//example.go
package test

import "fmt"

func Slice() {
	//s1为切片类型
	//切片本身是对数组的引用,因此切片是引用类型。
	//如果对切片进行修改,那么他会影响原数组本身
	//如果切片为空,值为nil
	//切片的语法是左闭右开。
	//如果将整个数组全部切片:我们可以有两种写法:
	//	1.	[0:len(array)]
	//	2.	[:]
	//代表,如果从第一个位置开始切片,那么0可以省略
	//如果切片到最后一个位置,那么len(array)也可以省略。
	array := [5]int{1, 2, 3, 4, 5}
	var s1 []int = array[1:4]
	s1[0] = 0
	fmt.Println("array = ", array) //对原数组产生了改变
	s2 := s1[1:]
	s2[0] = 0
	fmt.Println("array = ", array) //原数组又发生了变化

	var s3 []int
	fmt.Println("does s3==nil?", s3 == nil)
	//可以使用make来开辟一段内存空间,之后让切片指向它
	//注意:切片的长度是它所包含的元素个数
	//切片的容量是从它的第一个元素到其底层数组元素末尾的个数
	//因此:切片的底层数组结构就是数组
	//3,5代表:切片的元素个数为3,从切片的第一个元素开始,到其底层数组元素末尾的个数为5
	s3 = make([]int, 3, 5) //make([]type,len,cap),cap可以省略,若省略则跟len相同
	//可以使用len()和cap()来查看长度和容量
	fmt.Printf("len(s3)=%v,cap(s3)=%v,s3=%v\n", len(s3), cap(s3), s3)

	s4 := []int{1, 2, 3} //由系统自动创建底层数组
	fmt.Println("s4=", s4)

	//追加前的长度和容量
	//len(s1)=3 cap(s1)=4
	fmt.Printf("len(s1)=%v cap(s1)=%v\n", len(s1), cap(s1))
	//追加元素
	s1 = append(s1, 6, 7, 8) //底层会创建新的数组,不再引用原数组
	s1[4] = 0
	fmt.Println("array=", array) //array不再发生变化
	fmt.Println("s1=", s1)
	//追加之后,切片的长度和容量会发生变化
	//len(s1)=6 cap(s1)=8
	fmt.Printf("len(s1)=%v cap(s1)=%v\n", len(s1), cap(s1))

	//切片还可以追加切片
	//代表在s1的后面追加一个切片,...代表将切片拆开再添加
	s5 := append(s1, s2...)
	fmt.Println("s5=", s5) //s5= [0 0 4 6 0 8 0 4]

	//复制数组
	s6 := []int{1, 1}
	// copy(s5, s6)
	// fmt.Println("s5", s5)	//s5 [1 1 4 6 0 8 0 4]
	copy(s6, s5) //s6 [0 0]
	fmt.Println("s6", s6)

	fmt.Println("string与[]byte")
	str := "hello world"
	fmt.Printf("[]byte(str)=%v\n[]byte(str)=%s\n", []byte(str), []byte(str))
	//遍历字符串
	for i, v := range str {
		fmt.Printf("下标:%v,值为:%v,值对应的字符:%c\n", i, v, v)
	}

	testFunction("hello", "world", "1", "2", "3", "etc")
}

//代表可以接收任意多个字符串
//text本质是一个切片
func testFunction(text ...string) {
	fmt.Println("text = ", text)      //text =  [hello world 1 2 3 etc]
	fmt.Println(len(text), cap(text)) //6 6
}
//main.go
package main

import "GoExample/test"

func main() {
	test.Slice()
}
    关于切片容量的扩容机制:
        1.  当原切片长度小于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会直接 *2
        2.  当原切片长度大于等于 1024 时,新的切片长度直接加上 append 元素的个数,容量则会增加 1/4
    参考文献:
        https://juejin.cn/post/7159748785176838181
	本博客参考自:
		https://www.bilibili.com/video/BV1s341147US/?spm_id_from=333.337.search-card.all.click&vd_source=a642bb3ddc5b706845426dc41d73fbda
posted @   夏目^_^  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示