[Go] 判断字符串是否在切片中踩的坑

因为业务需要,写了一个判断字符串是否在切片中的函数,代码如下:

func InStrSlice(target string , str_arr []string) bool {
	sort.Strings(str_arr)
	index := sort.SearchStrings(str_arr, target)
	if index < len(str_arr) && str_arr[index] == target {
		return true
	}
	return false
}

func main() {
	strs := []string{"b", "c", "a", "e", "f", "d"}
	fmt.Println("目标切片:", strs)
	fmt.Println("待检查的字符串:", "a", "  判断结果:", InStrSlice("a", strs))
	fmt.Println("待检查的字符串:", "h", "  判断结果:", InStrSlice("h", strs))
	fmt.Println("目标切片当前状态:", strs)
}

看起来好像没什么问题,也能达到我的预期目的,执行结果如下:

发现问题了吗?是的,原始切片的顺序被改变了,这并不是我想要的结果!看来直接使用传递过来的切片,是地址传递,所以会改变外部的切片。

我第一时间就想到重新生成一个切片,避免影响到原来的,改进后的代码:

func InStrSlice(target string , str_arr []string) bool {
    temp := make([]string, len(str_array))
  	copy(temp,str_arr)
	sort.Strings(temp)
	index := sort.SearchStrings(temp, target)
	if index < len(temp) && temp[index] == target {
		return true
	}
	return false
}

重新执行,问题解决:

注意,copy的时候,临时切片需要声明长度,不然会copy不成功,copy的长度与你声明的长度有关