Golang中和指针相关的类型有三种:普通指针类型(取地址"&"、指针间接引用"*"), uintptr类型, unsafe.Pointer类型。
创新互联公司-专业网站定制、快速模板网站建设、高性价比景宁畲族自治网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式景宁畲族自治网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖景宁畲族自治地区。费用合理售后完善,10余年实体公司更值得信赖。
普通指针类型(取地址"&"、指针间接引用"*"),用于传递对象地址,不能进行指针运算。Golang会在编译时检查指针的类型安全性,帮助用户避免潜在的指针问题。
package main
import "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 main
import (
"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 main
import (
"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中的指针
URL链接:http://www.csdahua.cn/qtweb/news12/146312.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网