golang切片使用的坑

40 阅读1分钟

环境:go 1.17

append是从len处开始的

s:=make([]int,1)
s=append(s,1)
fmt.Println(s) //[0 1]

解释:len=1,所以,append的时候,会从下标1的地方开始

copy不会进行扩容

a:=[]int{1,2,3,4}
b:=make([]int,0,5)
copy(b,a)
fmt.Println(b) //[] 因为len=0所以,一个也没复制进去
c:=make([]int,1,5)
copy(c,a)
fmt.Println(c) //[1] 因为len=1所以,复制进去了一个
copy的时候,len有多少,则最多能copy多少个

另外一种切片复制的方法

a:=[]int{1,2,3}
b:=append([]int{},a...)
fmt.Printf("a:%p,b:%p",a,b) //a:0xc0000140a8,b:0xc0000140c0 二者地址不一样

切片边便利,边删除

适用于批量请求过滤场景

package main

import "fmt"

/*slice 遍历删除示例*/
func main() {
    //定义一个数字切片
    ageList := []int{1, 3, 7, 7, 8, 2, 5}

    //遍历删除6以下的
    for i := 0; i < len(ageList); {
        if ageList[i] < 6 {
            ageList = append(ageList[:i], ageList[i+1:]...)
        } else {
            i++
        }
    }
    fmt.Printf("after del:%v", ageList)
}

去除切片首位的item

func TrimItem() {
	arr := []uint64{1, 1, 2, 2, 3, 1, 3, 1, 1}
	//去除前面的1
	for i := 0; i < len(arr); {
		if arr[i] == 1 {
			arr = append(arr[:i], arr[i+1:]...)
		} else {
			break
		}
	}

	//去除后面的1
	for i := len(arr) - 1; i > 0; {
		if arr[i] == 1 {
			arr = append(arr[:i])
			i--
		} else {
			break
		}
	}
	fmt.Println(arr) //[2 2 3 1 3]
}