我正在阅读 map.go 以更深入地了解 map 在 Go 中的实现方式。
我对这段 code 的作用感到困惑:

func (b *bmap) overflow(t *maptype) *bmap {
    return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-sys.PtrSize))
}
谁能帮我理解 *(**bmap) 在这里做什么?提前致谢。

最佳答案

如果 T 是一种类型,那么 *T 也是一种类型,特别是指针类型,因为 *T 是一种类型,那么 **T 也是一种类型。 https://golang.org/ref/spec#Pointer_types
如果 x 是一个产生值的表达式,那么 *x 是一个指针间接引用或指针解引用。 https://golang.org/ref/spec#Address_operators
如果 T 是一个类型而 x 是一个表达式,那么 T(x) 是一个转换。 https://golang.org/ref/spec#Conversions

所以 **bmap 是一种类型,特别是“指向指向 bmap 的指针的指针”类型。
然后 (**bmap)(add(...)) 是一种转换,它将 add(...) 表达式返回的任何内容转换为 **bmap 类型的值。
最后 *(**bmap)(...) 通过一个指针取消引用该转换的结果,为您留下一个 *bmap 类型的值。

关于go - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63089509/

10-12 03:03