
复制
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] = nilif 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] = elemreturn s, nil}
func main() {var s = [10]int{1,2,3,4,5,6,7,8,9}// len=3 cap = 9s1 := 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)) //3b := append(a, 4)fmt.Println("a的cap:", cap(b)) //6b[2] = 99c := append(b, 5)fmt.Println("a的cap:", cap(c)) //6c[3] = 88fmt.Println(a) // [1 2 3]fmt.Println(b) // [1 2 99 88]fmt.Println(c) // [1 2 99 88 5]
