atomic包的CompareAndSwapInt32/64函数可以实现原子性的读取和修改操作,函数原型如下:
func CompareAndSwapInt32(addr *int32, old, new int32) (swapped bool)
func CompareAndSwapInt64(addr *int64, old, new int64) (swapped bool)
其中,addr为操作的地址,old为期望值,new为更新值。如果addr指向的值等于old,则将其设置为new,并返回true,否则返回false。
举个例子:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var value int32 = 100
atomic.CompareAndSwapInt32(&value, 100, 200)
fmt.Println(value) // 输出200
}
在上面的例子中,首先声明了一个int32类型的变量value,并初始化为100。然后使用CompareAndSwapInt32函数将value的值从100修改为200,因为value的值原来就是100,所以操作成功,最终输出200。
需要注意的是,使用atomic包的函数时一定要保证多个goroutine之间同时操作同一个地址,否则可能会出现数据竞争的问题。