unsafe.Pointer
- Go kursu
- İleri seviye
- Ders 8/68
- 4 dk
unsafe.Pointer ile evrensel pointer'ı öğrenirsin.
unsafe.Pointer
unsafe.Pointer her türden işaretçinin dönüşebildiği genel bir işaretçidir. Normalde *int64'ü *float64'e çeviremezsin; araya unsafe.Pointer koyarak aynı belleği farklı türle okuyabilirsin.
f := 1.0
bits := *(*uint64)(unsafe.Pointer(&f))
fmt.Printf("%x\n", bits) // 3ff0000000000000math.Float64bits tam olarak bunu güvenli bir fonksiyon içinde yapar.
uintptr tuzağı
uintptr bir adresi sayı olarak tutar; çöp toplayıcı onu işaretçi saymaz. Adresi uintptr'da saklayıp sonra işaretçiye geri çevirmek, nesne taşınmış ya da toplanmışsa geçersiz belleğe erişmek demektir. Aritmetik gerekirse dönüşüm ve hesap aynı ifadede yapılmalıdır.
p2 := unsafe.Pointer(uintptr(p) + off) // tek ifadedeUygulama Bitleri oku
f := 2.0 tanımla. unsafe.Pointer ile *uint64'e çevirip değeri fmt.Printf("%x\n", ...) ile onaltılık yazdır.
Başlangıç kodu
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"unsafe"
)
func main() {
f := 2.0
bits := *(*uint64)(unsafe.Pointer(&f))
fmt.Printf("%x\n", bits)
}Beklenen çıktı
4000000000000000
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>*T1</code> → <code>*T2</code> dönüşümü için doğru yol hangisi?
- T2(p)
- p.(T2)
- (*T2)(unsafe.Pointer(p)) Doğru cevap
- (*T2)(p)
Açıklama: Farklı işaretçi türleri doğrudan dönüştürülemez; önce unsafe.Pointer'a, sonra hedef işaretçi türüne çevrilir.
2 Genel işaretçi
x := int32(7)
p := (*uint32)(unsafe.____(&x))
x := int32(7)
p := (*uint32)(unsafe.Pointer(&x))
Açıklama: unsafe.Pointer iki işaretçi türü arasında köprüdür.
3 İşaretçi türleri
| Kavram | Anlamı |
|---|---|
*int |
Türlü işaretçi |
unsafe.Pointer |
Türsüz işaretçi |
uintptr |
Adres değerini tutan sayı |
math.Float64bits |
Güvenli bit okuma |