Golang中和指针相关的中针类型有三种:普通指针类型(取地址"&"、指针间接引用"*"),文搞 uintptr类型, unsafe.Pointer类型。
普通指针类型(取地址"&"、中针指针间接引用"*"),文搞用于传递对象地址,中针不能进行指针运算。文搞Golang会在编译时检查指针的中针类型安全性,帮助用户避免潜在的文搞指针问题。
package mainimport "fmt"type User struct { Name string}func main() { var u User u.Name = "xiaoming" p := &u fmt.Println(p) fmt.Println(*p)}
uintptr是中针一种无符号整型类型,可以保存一个指针值,文搞也可以进行指针运算,但是它并不是一个指针类型,所以不能直接用来取值。想要取值的话,需要通过unsafe.Pointer转换到具体类型指针后,使用"*"号取值。
uintptr在builtin包里的源代码如下:
// uintptr is an integer type that is large enough to hold the bit pattern of// any pointer.type uintptr uintptr
官方的注释是:uintptr是一个能足够容纳指针位数大小的整型类型。
使用示例:
package mainimport ( "fmt" "unsafe")func main() { var num int = 10 ptr := &num addr := uintptr(unsafe.Pointer(ptr)) fmt.Printf("Value: %v, Address: %v\n", *ptr, addr) newAddr := addr + 4 newPtr := (*int)(unsafe.Pointer(newAddr)) fmt.Printf("Value: %v, Address: %v\n", *newPtr, newAddr)}
unsafe.Pointer是unsafe包中的一个类型,用于处理指针的底层操作。可以将任何类型的指针转换为unsafe.Pointer类型,也可以将unsafe.Pointer类型转换为任何类型的指针。使用unsafe.Pointer要特别小心,因为它会忽略类型安全检查,可能会导致内存问题。
unsafe.Pointer可以作为桥梁,将使用"&"取的地址转换成uintptr进行指针运算,也可以再转换为具体类型的指针通过”*“取值。
unsafe.Pointer的四种操作规则如下:
package mainimport ( "fmt" "unsafe")func main() { i := 30 ptr1 := &i var ptr2 *int64 = (*int64)(unsafe.Pointer(ptr1)) *ptr2 = 8 fmt.Println(i)}
上面的代码通过unsafe.Pointer把*int类型的ptr1转换为了*int64类型的ptr2,然后对*int64进行操作,改变了i的值。
本文介绍了普通指针类型、uintptr类型和unsafe.Pointer类以及它们之间的关系,官方不推荐使用unsafe 包,因为它会忽略类型安全检查,可能会导致内存问题。
责任编辑:姜华 来源: 今日头条 指针类型Golang(责任编辑:焦点)
四川阿坝州提高孤儿基本生活最低养育标准 2022年1月起执行
四川省达州市达川区:“春雷行动2022”公益宣传走进农民夜校
南京银行(601009.SH)拟发行不超400亿元金融债券 一次或分次申报