GO 学习笔记之三 基础语法(5) 切片

一、定义

Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

其存在容量和长度的说法,长度是实际数据的长度,容量是可容纳的数组长度。容量也可以进行扩充或缩减。

1、初始化时直接赋值

//1.直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
s := []int{1, 2, 3}

2、从已有的动态数组中初始化

//初始化切片 s1,是数组 s 的引用。  将数组s的值全部给s1,s\s1 数组内容一样
s1 := s[:]
//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]

3、初始化时不赋值,使用默认值

//使用make初始化切片 make(数组变量,长度,容量)
s3 := make([]int, 3)   #定义了长度为3的数组
s4 := make([]int, 3,5)  #定义了长度为3,容量为5 的数组,有长度的下标0,1,2 才有初始值 0, 剩下两个容量无

4、定义空数组(空切片)

     仅进行了声明,但是长度和容量都未定义,且未进行数组的赋值

复制代码
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//3.空切片
var numbers []int
printSlice(numbers)
if numbers == nil {
fmt.Println("切片是空的呢")
}
}
复制代码

完整如下:

复制代码
package main
 
import "fmt"
 
func main() {
//1.直接初始化切片,[] 表示是切片类型,{1,2,3} 初始化值依次是 1,2,3,其 cap=len=3。
s := []int{1, 2, 3}
fmt.Println("切片s:", s)
//初始化切片 s1,是数组 s 的引用。
s1 := s[:]
fmt.Println("切片s1:", s1)
//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]
fmt.Println("切片s2:", s2)
//使用make初始化切片
s3 := make([]int, 3)
fmt.Println("切片s3:", s3)
}
复制代码

二、使用

1、从已有的动态数组中截取出子数组

  数组名2 := 数组名1[startIndex:endIndex]       #表示从数组中截取下表为startIndex的项一直到endIndex-1的项

//初始化切片 s2,是从下标 startIndex 到 endIndex-1 下的元素创建为一个新的切片。
s2 := s[1:3]
复制代码
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//切片截取举例
/* 创建切片 */
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
printSlice(numbers)
 
/* 打印原始切片 */
fmt.Println("numbers ==", numbers)
 
/* 打印子切片从索引1(包含) 到索引4(不包含)*/
fmt.Println("numbers[1:4] ==", numbers[1:4])
 
/* 默认下限为 0*/
fmt.Println("numbers[:3] ==", numbers[:3])
 
/* 默认上限为 len(s)*/
fmt.Println("numbers[4:] ==", numbers[4:])
 
numbers1 := make([]int, 0, 5)
printSlice(numbers1)
 
/* 打印子切片从索引 0(包含) 到索引 2(不包含) */
number2 := numbers[:2]
printSlice(number2)
 
/* 打印子切片从索引 2(包含) 到索引 5(不包含) */
number3 := numbers[2:5]
printSlice(number3)
}
复制代码

2、计算数组的长度和容量

  • len() 方法获取切片的长度
  • cap()方法 可以测量切片最长可以达到多少
复制代码
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//2调用printSlice方法获取切片的长度与容量
var numbers = make([]int, 3, 5)
printSlice(numbers)
}
复制代码

3、扩容

如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。

  • append()     #当长度和容量相同时,通过append 方式增加元素,长度和容量都会增加
  • copy() 
复制代码
package main
 
import "fmt"
 
func printSlice(x []int) {
fmt.Printf("len=%d cap=%d slice=%v\n", len(x), cap(x), x)
}
 
func main() {
 
//5.append() 和 copy() 函数
var numbers []int
printSlice(numbers)
 
/* 允许追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
 
/* 向切片添加一个元素 */
numbers = append(numbers, 1)
printSlice(numbers)
 
/* 同时添加多个元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
 
/* 创建切片 numbers1 是之前切片的两倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
 
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
复制代码

 4、将字符串根据分隔符转成切片

   strings.Split(字符串,分割符)

func auth() gin.HandlerFunc {
    _token_ignored_urls := service.GetStringFromInneral("token.ignored")   // 从properties文件中读取 token.ignored 配置项的值
    _token_ignored_urls = strings.TrimSpace(_token_ignored_urls)   //去掉空格
    if len(_token_ignored_urls) != 0 {   
        return authWhitelist(strings.Split(_token_ignored_urls, ","))   将字符串 _token_ignored_urls 按照 逗号 进行分割形成 切片
} return authWhitelist(nil) }

 5、遍历切片

 for .... range  

5.1 遍历切片所有值(不修改)

amounts:=[]float64{237.81,261.87,273.93,279.99}
sum:=0.0
for _,amount:=range amounts{
   sum+=amount
}

 

 for _,amount:=range amounts 说明

  • _ 是切片的索引,本示例中由于不需要用索引,所以直接通过_进行了丢弃
  • amount 是 amounts 对应索引上的值的副本

5.2 遍历切换指定起止之间的子切片

for _,amount:=range amounts[:5]{
   sum+=amount
}

 表示遍历前5个元素

5.3 修改切片元素内容(直接使用索引)

for i:=range amounts{
   amounts[i]+=1.5
   sum+=amount[i]
}

 

posted @   夏之夜  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示