简介
在Go 语言中,数组是值类型,长度是固定的;而切片是引用类型,长度可动态增长。切片的内部结构包括地址、大小和容量。
从数组或切片生成新的切片
特性:
1.当省略开始位置时,表示从连续区域开头到结束位置。
2.当省略结束位置时,表示从开始位置到整个连续区域结束位置。
3.两者都省略时,与切片本身等效。
基本格式如下:
slice [开始位置:结束位置]
案例如下:
package main
import "fmt"
func main() {
var student = [3]string{"a", "b", "c"}
//创建一个[0]到[1]的切片
fmt.Println(student,student[0:2])
}
说明:通过上面的语法创建了一个从 a [开始位置] 到a [结束位置-1] 的切片。
表示原有的切片
当开始位置和结束位置都省略时,生成的切片表示和原切片一样的切片,案例如下:
package main
import "fmt"
func main() {
var student = [3]string{"a", "b", "c"}
fmt.Println(student)
//生成与原切片一样的切片
fmt.Println(student[:])
}
运行结果如下:
重置切片
方法:将切片的开始位置和结束位置都设为0。
注意:这种情况生成的切片变为空。
案例:
package main
import "fmt"
func main() {
var student = [3]string{"a", "b", "c"}
fmt.Println(student)
//清空所有元素
fmt.Println(student[0:0])
}
运行结果如下:
切片的长度和容量
切片的长度是切片中元素的个数。切片的容量是指从切片的起始元素开始到其底层数组中的最后一个元素的个数。
案例如下:
package main
import (
"fmt"
)
func main() {
numberarray := [...]int{1, 2, 3, 4, 5}
numberslice := numberarray[1:3]
fmt.Printf("切片的长度是 %d 容量是 %d", len(numberslice), cap(numberslice))
}
运行结果:
注意:切片的长度可以动态的改变(最大为其容量)。
使用make()函数构造切片
基本格式:
make( []T, len, cap )
说明:
T:切片的元素类型
len:分配元素的个数
cap: 容量是可选的,默认与长度相同
案例如下:
package main
import "fmt"
func main() {
a := make( []int, 2)
b := make( []int, 2, 10)
fmt.Println(a,b)
fmt.Println(len(a),len(b))
fmt.Println(cap(a),cap(b))
}
运行结果如下:
说明:b的内部存储空间已经分配了10个,但实际使用了2个元素。另外切片不一定必须要make()函数才能使用。
添加元素到切片
可以使用内置函数 append
添加元素到切片。
说明:当空间不能容纳足够多的元素时,可以进行扩容(容量的扩展一般按2倍进行)
案例如下:
package main
import (
"fmt"
)
func main() {
number := []int{1, 2, 3}
fmt.Println( number, "长度为", len(number), "容量为", cap(number))
//向切片中添加元素
number = append(number, 4)
fmt.Println(number, "新长度为", len(number), "新容量为", cap(number))
}
运行结果如下:
注意:
append()函数除了可以添加一个元素外,还可以一次添加多个元素,而且可以利用 append 函数给一个 nil 切片追加值。案例如下:
package main
import (
"fmt"
)
func main() {
//切片的零值是零
var numbers []int
if numbers == nil {
fmt.Println("切片为0")
numbers = append(numbers, 1, 2, 3)
fmt.Println(numbers)
}
}
运行结果如下:
切片的合并
可以使用 ...
操作符将一个切片整个添加到另一个切片末尾。案例如下:
package main
import (
"fmt"
)
func main() {
number := []int{1, 2, 3}
number2 := []int{4, 5}
//在number2后面添加...表示将number2整个添加到number后面
newnumber := append(number, number2...)
fmt.Println(newnumber)
}
运行结果如下:
从切片中删除元素
Go语言没有对删除切片元素提供专用的接口和语法,我们可以使用切片的特性删除元素。案例如下:
package main
import "fmt"
func main() {
number := []int{1, 2, 3, 4, 5}
//指定删除位置
index := 2
//查看删除位置之前的元素和删除之后的元素
fmt.Println(number[:index],number[index+1:])
//切片拼接
number = append(number[:index],number[index+1:]...)
//打印删除后的切片
fmt.Println(number)
}
运行结果:
切片的不可比性
在Go语言中切片不支持 == 操作符,就是不能直接比较,唯一合法的就是和nil作比较。开发中经常会遇到需要比较两个切片中的元素是否相等的情况,这个时候只能遍历两个切片中的所有元素 ,再比较。
以上就是学习切片的内容,在学习的过程中欢迎大家指正补充,感谢阅读。