基础知识:
-其本身并不是数组,silce指向底层的数组
-作为变长数组的替代方案,可以关联底层数组的局部与全部
-为引用类型
-可以直接创建或从底层数组获取生成
-使用len()获取元素个数,cap()获取容量
-若果多个silce指向相同底层数组,其中一个的值改变会影响全部
声明:make([] T,len,cap)
切片使用:欺骗默认指向一段连续内存区域,可以使数组,也可以是切片本身
从数组生成切片:
var a = [3] int {1,2,3} //创建数组
fmt.Println(a,a[1:2]) //1代表起始位置,2代表终止位置
输出:[1,2,3] [2]
1、从指定位置生成切片
a[x:y] //x是起始位置,y是终止位置
2、表示原有切片
a[:]
3、清空切片:
a[0:0]
声明切片:
var name [ ] T
//声明字符串切片
var strList [ ] string
//声明整型切片
var numList [ ] int
//声明一个空切片
var numListEmpty = [ ] int { }
使用make()函数构造切片
make([ ]T,size,cap) //T切片类型,size分配元素个数,cap切片容量
例子:func函数中
a:= make([ ]int,2) //默认容量为元素个数
b:= make([ ]int,2,10)//元素个数2,容量10 切片的容量根据根据元素个数成倍增长
fmt.Println(a,b)
fmt.Println(len(a),len(b))
输出:[0,0] [0,0]
2 , 2
使用append()函数为切片添加元素
格式:append(数组名,元素1,元素2,元素3……) //元素的添加个数可以是一个也可以是多个
例子:
var car [ ] string
car = append(car,"hello")//单个添加
car = append(car,"world","and","go","!")
添加切片
carComponent := [ ] string (“hello”,“I”,“am”,“C++”) //声明切片
car = append(car,team) //添加切片
fmt.Println(car)
输出结果:[hello world and go ! hello I am C++]
切片的复制:
copy(destSilce,srcSlice [ ] T) int //destSilce为复制目标,srcSlice切片来源
package main
import "fmt"
func main() {
// 设置元素数量为1000
const elementCount = 1000
// 预分配足够多的元素切片
srcData := make([]int, elementCount)
// 将切片赋值
for i := 0; i < elementCount; i++ {
srcData[i] = i
}
// 引用切片数据,此时的切片传递的是地址值
refData := srcData
// 预分配足够多的元素切片
copyData := make([]int, elementCount)
// 将数据复制到新的切片空间中,此时数据复制只存在值的copy过程与地址无关
copy(copyData, srcData)
// 修改原始数据的第一个元素
srcData[0] = 999
// 打印引用切片的第一个元素
fmt.Println(refData[0])
// 打印复制切片的第一个和最后一个元素
fmt.Println(copyData[0], copyData[elementCount-1])
// 复制原始数据从4到6(不包含)
copy(copyData, srcData[4:6])
for i := 0; i < 5; i++ {
fmt.Printf("%d \n", copyData[i])
}
}
输出结果:
999
0 999
4
5
2
3
4
从切片中删除元素:
package main
import "fmt"
func main() {
seq := []string{"a", "b", "c", "d", "e"}
// 指定删除位置
index := 2
// 查看删除位置之前的元素和之后的元素,并依此将删除元素之前的元素按序打印,删除元素之后的元素按序打印
fmt.Println(seq[:index], seq[index+1:])
// 删除指定元素之后,删除点前后元素连接起来,将剩余元素按序打印
seq = append(seq[:index], seq[index+1:]...)
fmt.Println(seq)
}
基础知识:
-其本身并不是数组,silce指向底层的数组
-作为变长数组的替代方案,可以关联底层数组的局部与全部
-为引用类型
-可以直接创建或从底层数组获取生成
-使用len()获取元素个数,cap()获取容量
-若果多个silce指向相同底层数组,其中一个的值改变会影响全部
声明:make([] T,len,cap)
切片使用:欺骗默认指向一段连续内存区域,可以使数组,也可以是切片本身
从数组生成切片:
var a = [3] int {1,2,3} //创建数组
fmt.Println(a,a[1:2]) //1代表起始位置,2代表终止位置
输出:[1,2,3] [2]
1、从指定位置生成切片
a[x:y] //x是起始位置,y是终止位置
2、表示原有切片
a[:]
3、清空切片:
a[0:0]
声明切片:
var name [ ] T
//声明字符串切片
var strList [ ] string
//声明整型切片
var numList [ ] int
//声明一个空切片
var numListEmpty = [ ] int { }
使用make()函数构造切片
make([ ]T,size,cap) //T切片类型,size分配元素个数,cap切片容量
例子:func函数中
a:= make([ ]int,2) //默认容量为元素个数
b:= make([ ]int,2,10)//元素个数2,容量10 切片的容量根据根据元素个数成倍增长
fmt.Println(a,b)
fmt.Println(len(a),len(b))
输出:[0,0] [0,0]
2 , 2
使用append()函数为切片添加元素
格式:append(数组名,元素1,元素2,元素3……) //元素的添加个数可以是一个也可以是多个
例子:
var car [ ] string
car = append(car,"hello")//单个添加
car = append(car,"world","and","go","!")
添加切片
carComponent := [ ] string (“hello”,“I”,“am”,“C++”) //声明切片
car = append(car,team) //添加切片
fmt.Println(car)
输出结果:[hello world and go ! hello I am C++]
切片的复制:
copy(destSilce,srcSlice [ ] T) int //destSilce为复制目标,srcSlice切片来源
package main
import "fmt"
func main() {
// 设置元素数量为1000
const elementCount = 1000
// 预分配足够多的元素切片
srcData := make([]int, elementCount)
// 将切片赋值
for i := 0; i < elementCount; i++ {
srcData[i] = i
}
// 引用切片数据,此时的切片传递的是地址值
refData := srcData
// 预分配足够多的元素切片
copyData := make([]int, elementCount)
// 将数据复制到新的切片空间中,此时数据复制只存在值的copy过程与地址无关
copy(copyData, srcData)
// 修改原始数据的第一个元素
srcData[0] = 999
// 打印引用切片的第一个元素
fmt.Println(refData[0])
// 打印复制切片的第一个和最后一个元素
fmt.Println(copyData[0], copyData[elementCount-1])
// 复制原始数据从4到6(不包含)
copy(copyData, srcData[4:6])
for i := 0; i < 5; i++ {
fmt.Printf("%d \n", copyData[i])
}
}
输出结果:
999
0 999
4
5
2
3
4
从切片中删除元素:
package main
import "fmt"
func main() {
seq := []string{"a", "b", "c", "d", "e"}
// 指定删除位置
index := 2
// 查看删除位置之前的元素和之后的元素,并依此将删除元素之前的元素按序打印,删除元素之后的元素按序打印
fmt.Println(seq[:index], seq[index+1:])
// 删除指定元素之后,删除点前后元素连接起来,将剩余元素按序打印
seq = append(seq[:index], seq[index+1:]...)
fmt.Println(seq)
}