天天看点

Go:切片、数组的常用函数1.初始化2.遍历3.追加4.删除5.插入6. 复制

目录

  • 1.初始化
    • 切片(引用类型,按地址赋值)
    • 数组(按值赋值)
  • 2.遍历
  • 3.追加
  • 4.删除
  • 5.插入
  • 6. 复制

1.初始化

切片(引用类型,按地址赋值)

arr2 := []int{2,4,6} //1
var arr2 = []int{2,4,6} //2
var arr2[]int = [3]int{2,4,6} //3
var arr2 []int  //4
arr2=[]int{1,3,5}

slice1 := make([]type, len) //5
//also add parameter capacity
//make([]T, length, capacity)
var slice1 []type = make([]type, len) //6


//注意点1
//切片不能直接比较
//切片的唯一比较操作时和nil比较 一个为nil值切片没有底层数组  一个nil值切片的长度和容量都是0
//但我们不能说长度和容量都是0的切片一定是nil,判断切片是否为空 用len(s0)=0    不应该 s0=nil
var s4 []int         //len(s4)=0  cap(s4)=0  s4=nil
s5 := []int{}        //len(s5)=0  cap(s5)=0  s5!=nil
s6 := make([]int, 0) //len(s6)=0  cap(s6)=0  s6!=nil

//注意点2
//什么时候不再相互影响呢?那就是这两个切片的任意一个的cap扩充时,Go会为了给切片分配新的内存,
//从这一刻起两个切片在内存上才正式脱离共享关系
s7 := []int{1, 3, 5} //这是把数组封装成切片
s8 := s7             //  s7和s8都指向了同一个底层数组
fmt.Println(s7, s8)  //[1 3 5] [1 3 5]
s7[0] = 1000
fmt.Println(s7, s8) //[1000 3 5] [1000 3 5]
           

数组(按值赋值)

arr2 := [3]int{2,4,6} //1
arr2 :=[...]int{1,3,7}//2
var arr2 = [3]int{2,4,6} //3
var arr2 [3]int = [3]int{2,4,6} //4
var arr2 [3]int  //5
arr2=[3]int{1,3,5}
var arr2 [3]int //6
var i int
for i=0;i<len(arr2);i++{
arr2[i] = 10+i;
}

//注意点1:
var arr2[3]int = [3]int{2,4,6}
var arr1 = arr2
fmt.Println(arr1, arr2)  //[2 4 6] [2 4 6]
arr1[1]=11
fmt.Println(arr1, arr2) //[2 11 6] [2 4 6]
           

2.遍历

s7 := []int{1000, 3, 5} 
//1.索引遍历
for i := 0; i < len(s7); i++ {
                         //索引    值
	fmt.Println(s7[i])  //  0     1000
	                   //   1      3
}                     //   2      5

//2.for range
for a, b := range s7 {   //索引    值
	fmt.Println(a, b)   // 0     1000
}                      // 1       3
                      //  2       5
           

3.追加

//追加
var car [ ] string

car = append(car,"hello")//单个添加

car = append(car,"world","and","go","!")//多个添加

carComponent:=[ ]string{"aaaaaaa","bbbbbb"} //声明切片
car = append(car,carComponent...) //添加切片

//为切片 a 扩展 j 个元素长度
a = append(a, make([]Type, j)...)
           

4.删除

//删除位于索引 i 的元素
a = append(a[:i], a[i+1:]...)
//切除切片 a 中从索引 i 至 j 位置的元素
a = append(a[:i], a[j:]...)
//取出位于切片 a 最末尾的元素 x
x, a = a[len(a)-1], a[:len(a)-1]


           

5.插入

//在索引 i 的位置插入元素 x
a = append(a[:i], append([]T{x}, a[i:]...)...)
//在索引 i 的位置插入长度为 j 的空白新切片
a = append(a[:i], append(make([]T, j), a[i:]...)...)
//在索引 i 的位置插入切片 b 的所有元素
a = append(a[:i], append(b, a[i:]...)...)


           

6. 复制

//复制切片 a 的元素到新的切片 b 上
a:=[ ]string{"aaaaaaa","bbbbbb"} 
b := make([]string,11)
// 将数据复制到新的切片空间中  
copy(b, a)
fmt.Println(a, b)  //[aaaaaaa bbbbbb] [aaaaaaa bbbbbb         ]

a[1]="ccccccc"
fmt.Println(a, b) //[aaaaaaa ccccccc] [aaaaaaa bbbbbb         ]

b[1]="dddddddd"
fmt.Println(a, b) //[aaaaaaa ccccccc] [aaaaaaa dddddddd         ]

           
go