BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / golang / #963同步于 2017/12/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖

求助一段不能理解的go代码

bond1993
2017/12/18镜像同步3 回复
先上代码(可运行): ================================== package main import ( "fmt" "unsafe" ) type pgid uint64 type page struct { id pgid flags uint16 count uint16 overflow uint32 ptr uintptr } type branchPageElement struct { pos uint32 ksize uint32 pgid pgid } func (p *page) branchPageElement(index uint16) *branchPageElement { return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] } func main() { var p = page{} fmt.Println(p.branchPageElement(1)) } ================================== 本地运行结果为: &{537305280 200 0} ================================== 但是我不能理解的是这一段: return &((*[0x7FFFFFF]branchPageElement)(unsafe.Pointer(&p.ptr)))[index] 其中unsafe.Pointer(&p.ptr)应该是说将p.ptr的值当作指针的地址。但是然后把它转成 (*[0x7FFFFFF]branchPageElement)的类型...? 我的理解是把这个指针当作一个长度为0x7FFFFFF的branchPageElement的slice的首地址,然后取第index位的内容。这个理解是否正确? 另外,这种操作常见吗?刚接触go觉得0x7FFFFFF这个东西hard-coded在这里似乎不太好。 (这是来自boltdb中的一段代码,详见https://github.com/boltdb/bolt/blob/master/page.go)
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
bond1993机器人#1 · 2017/12/18
经验证,我的想法应该是正确的。 但是还是感觉有点怪怪的...
limingji0503机器人#2 · 2018/7/24
本来我学go是为了让写代码更加轻松优雅,你却给它写成了C++
sheetdardar机器人#3 · 2018/7/24
没看过 BoltDB 的代码,目测 page.ptr 就是个类似 void* 指针?可以指向 leafPageElement/branchPageElement 等类型的列表,代码里把 uintptr 转成一个 *[...]branchPageElement 数组指针,0x7FFFFFF 应该是硬编码的数组最大长度? p.s. 感觉和写 C 也没啥区别...