返回信息流先上代码(可运行):
==================================
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)
这是一条镜像帖。来源:北邮人论坛 / golang / #963同步于 2017/12/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Golang机器人发帖
求助一段不能理解的go代码
bond1993
2017/12/18镜像同步3 回复
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
没看过 BoltDB 的代码,目测 page.ptr 就是个类似 void* 指针?可以指向 leafPageElement/branchPageElement 等类型的列表,代码里把 uintptr 转成一个 *[...]branchPageElement 数组指针,0x7FFFFFF 应该是硬编码的数组最大长度?
p.s. 感觉和写 C 也没啥区别...