文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一文搞懂Golang中的指针

2024-11-30 12:32

关注

Golang中和指针相关的类型有三种:普通指针类型(取地址"&"、指针间接引用"*"), uintptr类型, unsafe.Pointer类型。

普通指针

普通指针类型(取地址"&"、指针间接引用"*"),用于传递对象地址,不能进行指针运算。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类型

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.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 包,因为它会忽略类型安全检查,可能会导致内存问题。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯