golang "%p"学习记录随笔
2024-09-01 16:47:09
对于获取slice的指针地址, 通过unsafe.Pointer 和 "%p"占位符两种方式得到的地址是不同的
s := make([]int, 1)
t.Log(unsafe.Pointer(&s),unsafe.Pointer(&(s[0])),len(s),cap(s))
t.Logf("%p\n",s)
unsafe.Pointer获取得到的是当前slice结构实例的指针
//runtime包下
type slice struct {
array unsafe.Pointer
len int
cap int
}
而"%p"获取到的是当前slice中存储的数组指针
// reflect包下的方法
func (v Value) Pointer() uintptr {
// TODO: deprecate
k := v.kind()
switch k {
case Chan, Map, Ptr, UnsafePointer:
return uintptr(v.pointer())
case Func:
if v.flag&flagMethod != 0 {
// As the doc comment says, the returned pointer is an
// underlying code pointer but not necessarily enough to
// identify a single function uniquely. All method expressions
// created via reflect have the same underlying code pointer,
// so their Pointers are equal. The function used here must
// match the one used in makeMethodValue.
f := methodValueCall
return **(**uintptr)(unsafe.Pointer(&f))
}
p := v.pointer()
// Non-nil func value points at data block.
// First word of data block is actual code.
if p != nil {
p = *(*unsafe.Pointer)(p)
}
return uintptr(p) case Slice: // 这里获取的当前slice中存储的数组引用的内存地址
return (*SliceHeader)(v.ptr).Data
}
panic(&ValueError{"reflect.Value.Pointer", v.kind()})
}
最新文章
- 20145208《信息安全系统设计基础》实验五 简单嵌入式WEB 服务器实验
- HAProxy学习笔记
- 2.精通前端系列技术之JS模块化开发-深入学习seaJs(四)
- hdu 5265 pog loves szh II STL
- 从算法入手讲解如何在SQL Server中实现最优最简
- [转]ASP.NET MVC 2: Model Validation
- Quartz定时任务学习(五)触发器
- MapReduce实战:查找相同字母组成的单词
- ruby+rt标签的效果
- python开发concurent.furtrue模块:concurent.furtrue的多进程与多线程&;协程
- linux服务器中毒可疑进程sfewfesfs CPU80%
- 在Python中用Request库模拟登录(四):哔哩哔哩(有加密,有验证码)
- JAVA的下载与安装和环境变量配置等详细教程
- GUI:GUI的方式创建/训练/仿真/预测神经网络—Jason niu
- python之装饰器函数
- STL的基本介绍
- vue中为对象添加值的问题
- plsql免安装客户端的配置
- 【学习笔记】python2和python3的input()
- 大数据技术Hadoop面试题