go语言中切片使用详解:添加,删除,复制

go语言里切片是一个动态数组,在创建时候长度不固定,后期随着使用会动态变化,通过一个append方法就能实现添加和删除的功能,复制是通过copy,用于两个切片之间的内存拷贝,要注意和直接赋值=的区别。

而数组是长度固定的,无法在后续使用进行灵活变化。

有关他们的使用区别,看下面代码就足够了,有详细注释:

package main

import (
    "fmt"
)

func printslice(s []int,name string) {
	for _,s:= range s {
		fmt.Printf("%v\t",s)
	}	
	fmt.Printf("\n打印%s: len=%d cap=%d ---\n",name,len(s),cap(s))	
}
func main() {
	var ar1 =[...]int{1,2,3,4,5,6,7,8}//这里在数组[]里的长度用...,表示根据后面初始化列表来自己计算。是个数组
	var ar2 [4]int=[4]int{21,22,23,24}//也是数组,固定长度的。
	var ar3 =[]int{9,10,11}	//这是一个切片,是不固定长度的动态数组,类似c++中的vector容器。
	ar4:=make([]int,2)
	//只有切片才能进行动态添加元素
	ar3=append(ar3,ar2[1:4]...)//这里...的作用是将切片参数的指定元素展开后传递给 append 函数,是在ar3尾部添加
	ar3=append([]int{33,34},ar3[:]...)//这里是在头部添加元素的方法,是添加了一个切片
	ar3=append(ar3,97,98,99,100)//在尾部直接追加4个元素,想添加几个元素就添加几个,只是手工较累。一般按上边切片参数方法添加,比较省事。
	printslice(ar3,"ar3")
	
	fmt.Printf("从数组里编辑...\n")	
	ar3=append(ar1[:4],ar3[:5]...)//对于数组来说,它的长度是固定,ar1本身只有8个长度,这里你要从第4个开始追加5个元素,肯定是无法修改ar1的,
	//但是追加后是9个元素的,是可以再赋值给ar3的。如改成ar1[:3]从第3个元素后追加,或者把后面改成ar3[:4]就可以了,就可以直接修改ar1也能赋值给ar3,因为是8个长度
	for _,s:= range ar1 { //忽略前面的索引,用_表示
		fmt.Printf("%v\n",s)
	}	
	fmt.Printf("ar1 len=%d cap=%d ---\n",len(ar1),cap(ar1))		
	printslice(ar3,"ar3")
	fmt.Printf("从中间删除某几个元素...\n")
	ar3=append(ar3[:2],ar3[2+3:]...)//从中间第2个开始,删除3个
	printslice(ar3,"ar3")
	
	fmt.Printf("从尾部删除某几个元素...\n")	
	ar3=append(ar3[:0],ar3[:len(ar3)-2]...)//删除尾部2个	
	printslice(ar3,"ar3")
	
	fmt.Printf("切片复制...\n")		
	printslice(ar4,"ar4")
	copy(ar4,ar3) //copy复制是相当于两个切片的内存空间各自独立,互不干扰,最终拷贝结果以其中元素数目小的那个切片为准。因为这里ar4只有2个长度,所以最终只拷贝2个。
	printslice(ar4,"ar4")	
	fmt.Printf("修改ar4第1个元素为100...\n")			
	ar4[0]=100
	printslice(ar3,"ar3")	
	printslice(ar4,"ar4")		
	fmt.Printf("切片直接赋值...\n")		
	ar4=ar3 //直接赋值,相当于两个切片指向同一个内存空间,修改其中一个切片会影响到另一个切片。
	printslice(ar4,"ar4")
	fmt.Printf("修改ar4第1个元素为200...\n")		
	ar4[0]=200
	printslice(ar3,"ar3")	
	printslice(ar4,"ar4")	
}

 

你可能感兴趣的:(go)