Golang atomic.AddUint32() 函数及示例
在 Go 语言中, atomic 包提供了较低级别的原子内存,有助于实现同步算法。在 Go 语言中, AddUint32() 函数用于自动将 delta 添加到 *addr 。此函数在 atomic 包中定义。在此,您需要导入 “sync/atomic” 包才能使用这些函数。
语法:
func AddUint32(addr *uint32, delta uint32) (new uint32)
在这里, addr 表示地址, delta 表示大于零的少量位数。而且,如果您想从 x 中减去一个有符号的正常数值 c,则可以通过 AddUint32( &x, ^uint32(c-1)) 来完成。如果您想特别地递减 x,则可以通过 AddUint32( &x, ^uint32(0)) 来完成。
注意: (*uint32) 是指向 uint32 值的指针。而 uint32 是大小为 32 位比特的无符号整数类型。而且,uint32 包含所有从 0 到 4294967295 的无符号 32 位整数的集合。
返回值: 它自动添加 addr 和 delta,并返回一个新值。
示例 1:
// Golang程序,演示
//AddUint32函数的用法
//包括主要包
包括主要
//导入fmt和sync/atomic
import (
"fmt"
"sync/atomic"
)
//主函数
func main() {
//赋值给uint32
var (
i uint32 = 45
j uint32 = 67
k uint32 = 4294967295
l uint32 = 0
z int = 5
)
//将常量值分配给uint32
const (
x uint32 = 6
y uint32 = 3
)
//使用AddUint32方法
//及其参数
a_1 := atomic.AddUint32(&i, -uint32(z))
a_2 := atomic.AddUint32(&j, ^(y - 1))
a_3 := atomic.AddUint32(&k, x-1)
a_4 := atomic.AddUint32(&l, ^uint32(z-1))
//显示自动添加后的输出
//地址和delta
fmt.Println(a_1)
fmt.Println(a_2)
fmt.Println(a_3)
fmt.Println(a_4)
}
输出:
40
64
4
4294967291
示例 2:
// Golang程序,演示
//AddUint32函数的用法
//包括主要包
包括主要
//导入fmt和sync/atomic
import (
"fmt"
"sync/atomic"
)
//定义uint32类型的addr
type addr uint32
//函数添加addr和delta
func (u *addr) add() uint32 {
//调用AddUint32()函数
//及其参数
return atomic.AddUint32((*uint32)(u), 4)
}
//主函数
func main() {
//定义u
var u addr
//循环增加u的值
for i := 0; i < 17; i += 2{
//显示添加delta和addr后的新值
fmt.Println(u.add())
}
}
输出:
4
8
12
16
20
24
28
32
36
在上面的示例中,我们定义了一个函数 add ,它返回从调用 AddUint32 方法返回的输出。在主函数中,我们定义了一个“for”循环,每次调用都会增加 ‘u’ 的值。这里, AddUint32() 方法的第二个参数是固定的,只有第一个参数的值是可变的。然而,上一个调用的输出将是下一个调用中 AddUint32() 方法的第一个参数的值,直到循环停止。 让我们看看上面的示例如何工作:
1st parameter = 0,2nd parameter = 4 // 返回 (0 + 4 = 4)
// 现在,上面的输出是下一次调用 AddUint32() 方法的第一个参数
1st parameter = 4,2nd parameter = 4 // 返回 (4 + 4 = 8)
1st parameter = 8,2nd parameter = 4 // 返回 (8 + 4 = 12) 然后一直如此。