demo1.go:
```
func swap01(x, y *int) {
fmt.Printf("swap value a,b -- %p,%p -- %d,%d\n",x,y,*x,*y)
*x, *y = *y, *x
fmt.Printf("swap value a,b -- %p,%p -- %d,%d\n",x,y,*x,*y)
}
func main() {
a:=10
b:=20
fmt.Printf("mian a,b -- %p,%p,%d -- %d\n",&a,&b,a,b)
swap01(&a,&b)
fmt.Printf("mian a,b -- %p,%p,%d -- %d\n",&a,&b,a,b)
}
swap01(&a,&b)输出:
mian a,b -- 0xc000064080,0xc000064088,10 -- 20
swap value a,b -- 0xc000064080,0xc000064088 -- 10,20
swap value a,b -- 0xc000064080,0xc000064088 -- 20,10
mian a,b -- 0xc000064080,0xc000064088,20 -- 10
```
demo2.go:
```
func swap02(x, y *int) {
fmt.Printf("swap address a,b -- %p,%p -- %d,%d\n",x,y,*x,*y)
x, y = y, x
fmt.Printf("swap address a,b -- %p,%p -- %d,%d\n",x,y,*x,*y)
}
func main() {
a:=10
b:=20
fmt.Printf("mian a,b -- %p,%p,%d -- %d\n",&a,&b,a,b)
swap02(&a,&b)
fmt.Printf("mian a,b -- %p,%p,%d -- %d\n",&a,&b,a,b)
}
swap02(&a,&b)输出:
mian a,b -- 0xc000064080,0xc000064088,10 -- 20
swap address a,b -- 0xc000064080,0xc000064088 -- 10,20
swap address a,b -- 0xc000064088,0xc000064080 -- 20,10
mian a,b -- 0xc000064080,0xc000064088,10 -- 20
```
疑惑:
swap01交换值,swap02交换了地址,为什么swap02的a,b值没有变?
亲, 指针是无法交换地址的, 不仅是go, 在任何语言都不能交换,
你只能交换指针所指向的内容数据.并且是永久的交换.
你的swap02只是新生成了2个指针的副本(虽然也叫x, y, 但此x, y非彼x, y),
然后交换指向了原来传入的指针的数据,
传入的指针没有被真正的改变, 所以出了函数还是原来的x,y.
#2