# #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
.