var name []T
切片默认指向一段连续内存区域,可以是数组,也可以是数组本身
从连续区域生成切片是常规的操作,格式:
slice [开始位置:结束位置]
var a = [3]int{1,2,3}
b := a[1,2]
从数据或切片生成的新的切片具有以下特性:
a :=[]int{1,2,3}
fmt.Println(a[0:0)
//[]
make([]T,len,cap)
cap : 容量
切片不一定必须经过make() 函数才能使用。生成切片、声明后使用append()函数均可以正常使用切片。
每个切片会指向一片内存空间,这片空间容纳容量的元素,超过容量,切片就会"扩容"。"扩容"操作往往发生在append调用时。
var car []string
car = append(car,"Old Driver")
//添加多个元素
car = append(car,"ice","Monk")
//添加切片
team := []string{"Pig","Flyingcake","Chicken"}
car = append(car,team...)
fmt.PrintLn(car)
切片的增长规律,参考:https://www.jianshu.com/p/54be5b08a21c
简单的理解如下:
a. 当需要的容量超过原切片容量的两倍时,会使用需要的容量作为新容量。
b. 当原切片长度小于1024时,新切片的容量会直接翻倍。而当原切片的容量大于等于1024时,会反复地增加25%,直到新容量超过所需要的容量。
切片底层是数组逻辑的实现,切片在扩充容量时,会产生一个新数组
为了避免因为切片是否发生扩容的问题导致bug,最好的处理办法还是在必要时使用 copy 来复制数据,保证得到一个新的切片,以避免后续操作带来预料之外的副作用
copy()函数,可以迅速的讲一个切片的数据复制到另一个切片空间中。
copy( dest Slice, src Slice []T ) int
copy 的返回值表示实际发生复制的元素个数。
package main
import "fmt"
func main() {
//引用切片数据
ref_Data := src_Data
//预分配足够多的元素切片
copy_data := make([]int,element_Count)
//将数据赋值到新的切片空间中
copy(copy_data,src_Data)
//修改原始数据的第一个元素
src_Data[0] = 999
//打印引用切片的第一个元素
fmt.Println(ref_Data[0])
//打印复制切牌呢的第一个和最后一个元素
fmt.Println(copy_data[0],copy_data[element_Count-1])
// 复制原始数据从4到6(不包含)
copy(copy_data,src_Data[4:6])
for i :=0; i < 5; i++ {
fmt.Printf("%d ",copy_data[i])
}
}
/*
999
0 999
4 5 2 3 4
*/
复制空间 独立空间。
GO并没有对删除切片元素提供的专门语法,需要使用切片本身的特性来删除元素。
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)
}
Go中删除元素的本质:是以删除元素为分界点,将前后两个部分的内存重新连接起来。
原文:https://www.cnblogs.com/followyou/p/12349883.html