go语言中 slice当作参数传递的时候 会将slice本身指针的值copy一份传递过去,但是由于slice本身指针的值也是一个指针,所以当原地修改这个slice本身的值的时候会发生外部的值一起被改的情况。
示例
func SliceTest(str []string) {
for k,v :=range str{
str[k] =1 //外部slice会发生改变
str = append(str,1) //外部slice不会发生改变 因为这个str的本身指针非原来的指针
}
fmt.Printf("%p\r\n",&str)
fmt.Printf("%p\r\n",str)
}
func main() {
list := make([]string, 30)
// 待处理的字符串列表
list = []string{
"go scanner",
"go parser",
"go compiler",
"go printer",
"go formater",
}
fmt.Printf("%p\r\n",&list)
fmt.Printf("%p\r\n",list)
SliceTest(list)
}
//打印结果
//0xc000048420
//0xc000088000
//0xc000048480
//0xc000088000