unsafe.Pointer — указатель, который можно конвертировать в любой тип. Обходит систему типов Go.
import "unsafe"
// Получение размера и смещения
fmt.Println(unsafe.Sizeof(int64(0))) // 8
fmt.Println(unsafe.Alignof(int64(0))) // 8
type User struct {
Age int32
Name string
}
fmt.Println(unsafe.Offsetof(User{}.Name)) // 8 (после padding)
Конвертация между типами указателей:
var x float64 = 1.0
bits := *(*uint64)(unsafe.Pointer(&x)) // reinterpret cast
unsafe.Pointer — единственный способ конвертировать между *T и *U. Правила:
1. *T → unsafe.Pointer → *U — легально
2. unsafe.Pointer → uintptr — для арифметики, но uintptr не удерживает объект от GC
3. Никогда не храни uintptr в переменной — GC может переместить объект
В реальности нужен для: взаимодействия с C (cgo), low-level оптимизаций, реализации sync пакета. В прикладном коде — почти никогда.