Golang中slice切片的修改操作

本文主要介绍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", "B", "C", "D", "E", "F", "G"}
s = s[2:] //从开始处删除是s[:2]子切片
e := []string{"A", "B", "C", "D", "E", "F", "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{}, start, end int) []interface{} {
    return append(slice[:start], slice[end:]...)
}

相关阅读:

相关推荐