本文主要介绍go语言中切片slice的增删修改操作。
如果我们需要往切片中追加元素,可以使用内置的append()函数。这个函数接受一个需要被追加的切片,以及一个或者多个需要被追加的元素。如果我们需要往一个切片中追加另一个切片,那么我们必须使用...操作符来告诉Go语言将被添加进来的切片当成多个元素。例:
s := []string{"A","B","C","D","E","F","G"} t := []string{"K","L","M","N"} u := []string{"m","n","o","p","q","r"} s = append(s,"h","i","j") //添加单一的值 s = append(s,t...) //添加切片中的所有值 s = append(s,u[2:5]...) //添加一个子切片 b := []byte{'U','V'} letters := "WXY" b = append(b,letters...) //将一个字符串字节添加进一个字节切片中 fmt.Printf("%v\n%s\n",s,b) //--------------结果---------------------- [A B C D E F G h i j K L M N o p q] UVwxy
有时我们不仅想往切片的末尾插入项,也想往切片的前面或者中间插入项。下面的例子使用了我们自定义的 Insert() 函数,它接收一个我们要插入切片的参数、一个用于插入的切片以及需插入切片的索引位置:
func Insert(slice,insertion []interface{},index int) []interface{} { result := make([]interface{},len(slice)+len(insertion)) at := copy(result,slice[:index]) at += copy(result[at:],insertion) copy(result[at:],slice[index:]) return result }
注意,如果所传入的索引位置为0,那么第一条语句中的slice[:index]为slice[:0],因此无需进行复制。类似的,如果所传入的索引位置大于等于切片的长度,则最后一条复制语句为slice[len(slice):](即一个空切片),因此也无需复制。
使用Go语言的标准切片语法可以将元素从切片的开头和末尾删除,但是将其从中间删除就费点事儿了。看看下面的例子,分别描述如何从开头,从末尾,从中间删除切片元素:
s := []string{"A","G"} s = s[2:] //从开始处删除是s[:2]子切片 e := []string{"A","G"} e = e[:4] //从末尾处删除是e[4:]子切片
func Remove(slice []interface{},start,end int) []interface{} { result := make([]interface{},len(slice)-(end-start)) at := copy(result,slice[:start]) copy(result[at:],slice[end:]) return result } //--------------------另一种更为简便的写法----------------------- func Remove(slice []interface{},end int) []interface{} { return append(slice[:start],slice[end:]...) }