Что такое unsafe.Pointer?

Senior
471 просмотров
AFK Offer AI

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. *Tunsafe.Pointer*U — легально 2. unsafe.Pointeruintptr — для арифметики, но uintptr не удерживает объект от GC 3. Никогда не храни uintptr в переменной — GC может переместить объект

В реальности нужен для: взаимодействия с C (cgo), low-level оптимизаций, реализации sync пакета. В прикладном коде — почти никогда.

Следующий вопрос

Что такое HTTP?