首页 > 其他分享 >Golang学习笔记_14——切片

Golang学习笔记_14——切片

时间:2024-12-21 21:30:02浏览次数:6  
标签:切片 14 int fmt Golang func Println s1

Golang学习笔记_11——指针
Golang学习笔记_12——结构体
Golang学习笔记_13——数组


文章目录


切片

Go语言中的切片(slice)是一种非常强大且灵活的数据结构,它基于数组,但提供了更加动态和方便的接口。

1. 定义

切片是对数组的抽象和封装,它包含三个关键部分:

  1. 指向数组的指针:切片存储了数组的首地址,指向数组中的某个元素。
  2. 切片的长度(len):切片中元素的数量。
  3. 切片的容量(cap):从切片的首元素到数组末尾的元素数量,表示在不需要重新分配底层数组的情况下,切片可以增长的最大长度。

2. 创建

func sliceDemo1() {
	// 通过字面量创建
	s1 := []int{1, 2, 3}

	// 通过make函数创建
	// 创建一个长度为3,容量为5的切片
	s2 := make([]int, 3, 5)

	// 基于数组创建
	arr := [5]int{1, 2, 3, 4, 5}
	s3 := arr[1:4]

	fmt.Println(s1, s2, s3)

}

3. 基本操作

func sliceDemo2() {
	// 访问和修改元素
	s1 := []int{1, 2, 3}
	fmt.Println(s1[0]) // 输出1
	s1[0] = 10

	fmt.Println(s1)

	// 切片多重赋值
	a, b, c := s1[0], s1[1], s1[2]
	fmt.Println(a, b, c)

	// 切片的长度和容量
	s := []int{1, 2, 3, 4, 5}
	fmt.Println(len(s)) // 输出5
	fmt.Println(cap(s)) // 输出5,因为是基于字面量创建的,默认容量等于长度

}

测试方法

func Test_sliceDemo2(t *testing.T) {
	sliceDemo2()
}

输出结果

=== RUN   Test_sliceDemo2
1
[10 2 3]
10 2 3
5
5
--- PASS: Test_sliceDemo2 (0.00s)
PASS

4. 动态性

func sliceDemo3() {
	s := []int{1, 2, 3}
	s = append(s, 4, 5) // s现在是[1, 2, 3, 4, 5]
	fmt.Println(s)
}

测试方法

func Test_sliceDemo3(t *testing.T) {
	sliceDemo3()
}

输出结果

=== RUN   Test_sliceDemo3
[1 2 3 4 5]
--- PASS: Test_sliceDemo3 (0.00s)
PASS

当向切片中追加元素时,如果切片的容量不足,Go会自动分配一个更大的底层数组,并将原有元素复制到新的数组中。新数组的容量通常是原容量的两倍。

5. 子切片

func sliceDemo4() {
	s := []int{1, 2, 3, 4, 5}
	subSlice := s[1:4] // subSlice是[2, 3, 4]
	fmt.Println(subSlice)
}

测试方法

func Test_sliceDemo4(t *testing.T) {
	sliceDemo4()
}

输出结果

=== RUN   Test_sliceDemo4
[2 3 4]
--- PASS: Test_sliceDemo4 (0.00s)
PASS

6. 数组和切片

  1. 长度:数组的长度是固定的,而切片的长度是动态的。
  2. 内存分配:数组直接存储数据,切片是对数组的抽象,存储的是指向数组的指针、长度和容量。
  3. 效率:数组在栈上分配内存,效率较高,但长度固定;切片在堆上分配内存,且可以动态扩展,但有一定性能开销。

7. 注意

  1. 共享底层数组:多个切片可以共享同一个底层数组,修改一个切片可能影响其他切片。

  2. 越界访问:访问切片时,如果索引超出范围,会导致运行时错误(panic)。

  3. nil切片:未初始化的切片值为nil,长度为0,容量为0。

  4. 在进行切片时,你可以利用它的默认行为来忽略上下界。切片下界的默认值为 0,上界则是该切片的长度。

    var a [10]int
    
    a[0:10]
    a[:10]
    a[0:]
    a[:]
    // 上述表达是等价的
    

8. 高级用法

func sliceDemo5() {
	// 切片拷贝
	s := []int{1, 2, 3}
	var s_dst = make([]int, len(s))
	copy(s, s_dst)
	fmt.Println(s_dst)

	// 切片分割
	s1 := []int{1, 2, 3}
	s2 := []int{4, 5, 6}
	s3 := append(s1, s2...) // s3是[1, 2, 3, 4, 5, 6]
	fmt.Println(s3)
}

测试方法

func Test_sliceDemo5(t *testing.T) {
	sliceDemo5()
}

输出结果

=== RUN   Test_sliceDemo5
[0 0 0]
[1 2 3 4 5 6]
--- PASS: Test_sliceDemo5 (0.00s)
PASS

源码

// slice_demo.go 文件
package _4_slice_demo

import "fmt"

func sliceDemo1() {
	// 通过字面量创建
	s1 := []int{1, 2, 3}

	// 通过make函数创建
	// 创建一个长度为3,容量为5的切片
	s2 := make([]int, 3, 5)

	// 基于数组创建
	arr := [5]int{1, 2, 3, 4, 5}
	s3 := arr[1:4]

	fmt.Println(s1, s2, s3)

}

func sliceDemo2() {
	// 访问和修改元素
	s1 := []int{1, 2, 3}
	fmt.Println(s1[0]) // 输出1
	s1[0] = 10

	fmt.Println(s1)

	// 切片多重赋值
	a, b, c := s1[0], s1[1], s1[2]
	fmt.Println(a, b, c)

	// 切片的长度和容量
	s := []int{1, 2, 3, 4, 5}
	fmt.Println(len(s)) // 输出5
	fmt.Println(cap(s)) // 输出5,因为是基于字面量创建的,默认容量等于长度

}

func sliceDemo3() {
	s := []int{1, 2, 3}
	s = append(s, 4, 5) // s现在是[1, 2, 3, 4, 5]
	fmt.Println(s)
}

func sliceDemo4() {
	s := []int{1, 2, 3, 4, 5}
	subSlice := s[1:4] // subSlice是[2, 3, 4]
	fmt.Println(subSlice)
}

func sliceDemo5() {
	// 切片拷贝
	s := []int{1, 2, 3}
	var s_dst = make([]int, len(s))
	copy(s, s_dst)
	fmt.Println(s_dst)

	// 切片分割
	s1 := []int{1, 2, 3}
	s2 := []int{4, 5, 6}
	s3 := append(s1, s2...) // s3是[1, 2, 3, 4, 5, 6]
	fmt.Println(s3)
}
// 14_slice_demo_test.go 文件
package _4_slice_demo

import "testing"

func Test_sliceDemo2(t *testing.T) {
	sliceDemo2()
}

func Test_sliceDemo3(t *testing.T) {
	sliceDemo3()
}

func Test_sliceDemo4(t *testing.T) {
	sliceDemo4()
}

func Test_sliceDemo5(t *testing.T) {
	sliceDemo5()
}

标签:切片,14,int,fmt,Golang,func,Println,s1
From: https://blog.csdn.net/LuckyLay/article/details/144559374

相关文章

  • 【每日一练 基础题】[蓝桥杯 2014 国 C] 拼接平方数
    [蓝桥杯2014国C]拼接平方数拼接平方数小明发现49很有趣,首先,它是个平方数。它可以拆分为4和9,拆分出来的部分也是平方数。169也有这个性质,我们权且称它们为:拼接平方数。100可拆分1,00,这有点勉强,我们规定,0,00,000等都不算平方数。小明想:还有哪些数字是这样的......
  • 大数据新视界 -- Hive 集群性能监控与故障排查(2 - 16 - 14)
           ......
  • 2024/12/14课堂记录
    今天是我生日!!!目录扫描烽火传递最大连续和(作业)扫描单调队列模板题先上代码 #include<iostream>usingnamespacestd;inta[2000010],q[2000010];intmain(){ intn,k; cin>>n>>k; for(inti=1;i<=n;i++)cin>>a[i]; inth=0,t=0;//队尾在前面跑,对头在......
  • 2024-2025-1 20231420《计算机基础与程序设计》第十二周助教总结
    课程答疑C语言:指针、结构体、文件C语言中,指针、结构体十分重要,也较为困难;大家刚接触文件的操作,可能比较陌生,未能掌握文件的相关操作。大家要深入学习指针、结构体、文件的相关语法,这对之后的课程也很有帮助,可以借助网络资源学习,也要多敲代码,多多练习。课程作业中出现的问题格......
  • Golang学习历程【第四篇 运算符&流程控制】
    Golang学习历程【第四篇运算符&流程控制】1.运算符1.1算术运算符1.2关系运算符1.3逻辑运算符1.4赋值运算符1.5其他运算符2.二进制运算3.流程控制3.1条件表达式if3.2for循环3.3forrange(键值循环)3.4switch...case3.5break,continue,goto1.运算符1.......
  • 2024-2025-1 20241413 《计算机基础与程序设计》 第十三周学习总结
    |班级链接|https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP||----|----|----||作业要求|https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13||----|----|----|教材学习内容总结《C语言程序设计》第12章结构体定义:结构体是一种用户自定......
  • 学期2024-2025-1 学号20241424 《计算机基础与程序设计》第13周学习总结
    学期2024-2025-1学号20241424《计算机基础与程序设计》第13周学习总结作业信息|这个作业属于2024-2025-1-计算机基础与程序设计)||-- |-- ||这个作业要求在2024-2025-1计算机基础与程序设计第13周作业||这个作业的目标|<学习《C语言程序设计》第12章并完成云班课测试>||作......
  • 2024-2025-1 20241417 《计算机基础与程序设计》第十三周学习总结
    2024-2025-120241417《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>2024-2025-1计算机基础与程序设计第十三周作业这个作业的目标<复习前面所学,完成......
  • 学期(2024-2025-1) 学号(20241420) 《计算机基础与程序设计》第十三周学习总结
    学期(2024-2025-1)学号(20241420)《计算机基础与程序设计》第十三周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第十三周作业)这个作业的目标<《C语......
  • golang:第三方库:用vipper解析yaml配置文件
    一,安装第三方库$gogetgithub.com/spf13/viper二,代码1,配置文件Database:DBType:mysqlUserName:dbusernamePassword:dbpasswordHost:127.0.0.1:3306DBName:dbnameCharset:utf8ParseTime:TrueMaxIdleConns:10MaxOpenConns:30 2,代码:......