Что значит**?

# #go #hashmap

Вопрос:

Я читаю map.go , чтобы глубже взглянуть на то, как map это реализовано в Go.

Я не понимаю, что делает этот фрагмент кода:

 func (b *bmap) overflow(t *maptype) *bmap {
    return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-sys.PtrSize))
}
 

Кто-нибудь может помочь мне понять, что *(**bmap) здесь происходит? Заранее спасибо.

Ответ №1:

Если 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 .