Golang atomic.AddUint64() 函数及其示例
在 Go 语言中, atomic 包提供了更低级别的原子内存,有助于实现同步算法。Go 语言的 AddUint64() 函数用于将 delta 自动添加到 *addr 。此函数在 atomic 包中定义,因此必须导入 “sync/atomic” 包才能使用这些函数。
语法:
func AddUint64(addr *uint64, delta uint64) (new uint64)
在此, addr 表示地址, delta 表示大于零的少量位数。此外,如果您想从 x 中减去一个有符号的正常数 c,则可以通过 AddUint64( &x, ^uint64(c-1)) 完成,并且如果您想单独递减 x,则可以通过 AddUint64( &x, ^uint64(0)) 完成。
注意: (*uint64) 是指向 uint64 值的指针。此外,uint64 包含从 0 到 18446744073709551615 的所有无符号的 64 位整数集合。
返回值: 它会自动添加 addr 和 delta 并返回一个新值。
示例 1:
// Golang 程序,说明
// 如何使用 AddUint64 函数
// 包含 main 包
package main
// 导入 fmt 和 sync/atomic
import (
"fmt"
"sync/atomic"
)
// 主函数
func main() {
// 指定变量
// 值到 uint64
var (
i uint64 = 453
j uint64 = 167
k uint64 = 18446744073709551615
l uint64 = 0
z int = 15
)
// 将常数值指定到 uint64
const (
x uint64 = 7
y uint64 = 12
)
// 调用带有其参数的 AddUint64 方法
a_1 := atomic.AddUint64(&i, -uint64(z))
a_2 := atomic.AddUint64(&j, ^(y - 1))
a_3 := atomic.AddUint64(&k, x-1)
a_4 := atomic.AddUint64(&l, ^uint64(z-1))
// 在自动添加 addr 和 delta 后显示输出
fmt.Println(a_1)
fmt.Println(a_2)
fmt.Println(a_3)
fmt.Println(a_4)
}
输出:
438
155
5
18446744073709551601
示例 2:
// Golang 程序,说明
// 如何使用 AddUint64 函数
// 包含 main 包
package main
// 导入 fmt 和 sync/atomic
import (
"fmt"
"sync/atomic"
)
// 定义类型为 uint64 的 addr
type addr uint64
// 添加 addr 和 delta 的函数
func (u *addr) adds() uint64 {
// 调用 AddUint64()
// 函数和它的
// 参数
return atomic.AddUint64((*uint64)(u), 325)
}
// 主函数
func main() {
// 定义 u 变量
var u addr
// 循环递增 u 的值
for i := 1; i < 11; i *= 3 {
// 在添加 delta 和 addr 后显示新值
fmt.Println(u.adds())
}
}
输出:
325
650
975
在上面的例子中,我们定义了一个名为 adds 的函数,该函数返回从调用 AddUint64 方法返回的输出。在主函数中,我们定义了一个“for”循环,每次调用时都会增加‘u’的值。在这里,AddUint64()方法的第二个参数是常量,只有第一个参数的值是可变的。但是,前一次调用的输出将是AddUint64()方法的第一个参数的值,在循环停止之前,输出将成为下一次调用的第一个参数值。
让我们看一下上面的例子如何工作:
第一个参数=0,第二个参数=325 //返回(0 + 325 = 325)
// 现在,上面的输出是下一次调用AddUint64()方法的第一个参数值
第一个参数为325,第二个参数为325 //返回(325 + 325 = 650)
第一个参数为650,第二个参数为325 //返回(650 + 325 = 975)