复制
a := []int{1,2,3,4,5}
b := make([]int, len(a))
copy(b, a)
注意:copy(b, a)将a中的值复制到b,复制多少位取决于b的长度,若b的长度位2,则a只会复制前两位给b
删除
func Remove(s []int, index int) ([]int, error) {
lens := len(s)
if index < 0 || index >= lens {
return nil, errors.New("Bad Index!")
}
// 若s的元素是指针类型或包含指针字段的结构体类型,删除指定元素之后,元素并不会被GC回收,需添加下列代码进行清理
// s[index] = nil
if index == lens -1 {
return s[:lens-1], nil
}else {
return append(s[:index], s[index+1:]...), nil
}
}
插入
func Insert(s []int, elem, index int) ([]int, error) {
if index < 0 || index > len(s) {
return nil, errors.New("Bad Index!")
}
s = append(s, 0)
copy(s[index+1:], s[index:])
s[index] = elem
return s, nil
}
func main() {
var s = [10]int{1,2,3,4,5,6,7,8,9}
// len=3 cap = 9
s1 := s[1:4]
fmt.Println(s1) // s1 = [2 3 4]
// 编译错误: 越界
s2 := s[:11]
// 编译错误:索引必须非负
s3 := s1[-1:]
// s1中只有三个元素,此处复制5个元素
s4 := s1[:5]
fmt.Println(s4) // 不会报错,s4 = [2 3 4 5 6]
// s1的cap是9,此处复制10个元素
s5 := s1[:10]
fmt.Println(s5) // panic range [:10] with capacity 9
}
append可能存在的陷阱
使用append之后,底层数组可能是同一个,也可能不是,这就会导致对原有数组的修改会影响新数组,也可能不会有影响,从而导致代码的不确定性
a := []int{1, 2, 3}
fmt.Println("a的cap:", cap(a)) //3
b := append(a, 4)
fmt.Println("a的cap:", cap(b)) //6
b[2] = 99
c := append(b, 5)
fmt.Println("a的cap:", cap(c)) //6
c[3] = 88
fmt.Println(a) // [1 2 3]
fmt.Println(b) // [1 2 99 88]
fmt.Println(c) // [1 2 99 88 5]