go 用指针交换两个数怎么没用?

a, b := 5, 3
swap2(&a, &b)
log.Println(a)
log.Println(b)

func swap2(a, b *int)  {
    a, b = b, a
}

结果是a,b的值没有交换。

共 6 个回复


wanglihua

*a, *b = *b, *a

这样行不行

# 0

dyllen

@wanglihua 为什么在这里需要显示用指针了?

# 1

jimmykuu

第二种可以的,你刚开始的写法,只是交换了两个指针变量的值,这样写你就明白了。

pointA = &a
pointB = &b
swap2(pointA, pointB)
// 交换 pointA 和 pointB,不会对 a 和 b 造成影响
# 2

fisherFIAF

3L说的对,传参是值传递,传参中如果是传指针,改变的是指针指向的数据,指针不改,
如果要改一个指针,就要传指针的指针,**int这样,
但是Go和C不同,对指针的操作没有C那样灵活,而且这种场景实际上也很少,不建议修改指针,通过指针操作数据就好了

# 3

Beter

image

这张图比较容易理解,因为老说指针指针的,那是个名词,不好理解,从内存的角度去看就很清晰了

# 4

focus

没看清楚时间,坟贴了居然.
还是说一下吧.
亲, 指针的地址是不能交换的.
但是指针的内容可以...
所以需要显式的调用 *a
go语言不错但是社区太冷清了

# 5