CodeBlanks Logo Icon CodeBlanks

unsafe.Pointer

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)  // 3ff0000000000000

math.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 ifadede

Uygulama 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

main.go
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
x := int32(7)
p := (*uint32)(unsafe.____(&x))
Cevap
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

İleri seviye bölümündeki tüm dersler