Golang atomic.SwapPointer() 函数及示例
在 Go 语言中,atomic 包提供了低级别的原子内存,有助于实现同步算法。Golang 中的 SwapPointer() 函数用于原子地将新值存储到 *addr 中,并返回之前的 *addr 值。此函数在 atomic 包中定义。在这里,您需要导入 “sync/atomic” 包才能使用这些函数。
语法:
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
这里,addr 表示地址。new 是新的 unsafe.Pointer 值,old 是旧的 unsafe.Pointer 值。
注意:(*unsafe.Pointer) 是指向 unsafe.Pointer 值的指针。而 unsafe.Pointer 类型有助于使任意类型与内置的 uintptr 类型之间转换。此外,unsafe 是一个有助于 Go 程序类型安全的包。
返回值:它将新的 unsafe.Pointer 值存储到 *addr 中,并返回之前的 *addr 值。
示例 1:
// 展示 Go 中 SwapPointer 函数用法的程序
// 引入 main 包
package main
// 引入 fmt 和 sync/atomic
import (
"fmt"
"sync/atomic"
"unsafe"
)
// 定义一个 L 结构体类型
type L struct{ x, y, z int }
//声明 L 结构体类型的指针
var PL *L
// 主函数
func main() {
// 定义 *addr unsafe.Pointer
var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL;))
// 定义 unsafe.Pointer 的值
var px, py L
// 存储指针的值
atomic.StorePointer(
unsafepL, unsafe.Pointer(&px;))
// 调用 SwapPointer() 方法
px1 := atomic.SwapPointer(unsafepL,
unsafe.Pointer(&py;))
// 如果交换成功返回 true
fmt.Println((*L)(px1) == &px;)
// 打印输出
fmt.Println(px1)
}
输出:
true
0xc0000c2000 // 可能会在不同的运行时有所不同
在这里,StorePointer 方法向 *addr 中添加值,然后 SwapPointer 方法原子地将新的值存储到 *addr 中并返回旧值。在这里,进行了交换,因此返回 true,这里返回的 unsafe.Pointer 值可能会在不同的运行时有所不同。
示例 2:
// 展示 Go 中 SwapPointer 函数用法的程序
// 引入 main 包
package main
// 引入 fmt 和 sync/atomic
import (
"fmt"
"sync/atomic"
"unsafe"
)
// 定义一个 L 结构体类型
type L struct{ x, y, z int }
// 声明 L 结构体类型的指针
var PL *L
// 主函数
func main() {
// 定义 *addr unsafe.Pointer
var unsafepL = (*unsafe.Pointer)(unsafe.Pointer(&PL;))
// 定义 unsafe.Pointer 值
var px, py L
// 调用 SwapPointer() 方法
px1 := atomic.SwapPointer(unsafepL,
unsafe.Pointer(&py;))
// 如果交换成功返回 true
fmt.Println((*L)(px1) == &px;)
// 打印输出
fmt.Println(&px1;)
}
输出:
false
0xc00000e028 // 可能会在不同的运行时有所不同
在这里,因为未存储 unsafe.pointer,因此 SwapPointer() 方法无法交换所述值,所以返回 false。此外,此处返回的地址值是 px1 的地址,而 px1 的值将为 nil,因为未执行交换操作。
极客教程