因为业务需要,写了一个判断字符串是否在切片中的函数,代码如下:
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的长度与你声明的长度有关