CodeBlanks Logo Icon CodeBlanks

Özet - unsafe

  • Go kursu
  • İleri seviye
  • Ders 12/68
  • 4 dk

unsafe.Pointer ve Sizeof'ı birleştirerek bir bellek inceleyici yazarsın.

unsafe özeti

Bu grupta Sizeof, Alignof ve Offsetof ile bellek yerleşimini ölçtün; unsafe.Pointer ile işaretçi türlerini dönüştürdün; unsafe.String ve unsafe.Slice ile kopyasız dönüşüm yaptın.

Üç kural: uintptr'ı saklama, kopyasız string'in baytlarını değiştirme, önce güvenli alternatifi (ör. math.Float64bits) ara.

Struct'ı inceleyen araç

Üç fonksiyonu birlikte kullanarak bir struct'ın yerleşim raporunu çıkarabilirsin:

var h Hesap
fmt.Println("boyut:", unsafe.Sizeof(h))
fmt.Println("bakiye:", unsafe.Offsetof(h.Bakiye))

Bu rapor, sık kullanılan struct'larda alan sırasını değiştirip bellek kazanıp kazanamayacağını gösterir.

Uygulama Yerleşim raporu

type Kayit struct { Aktif bool; ID int64; Puan int32 } tanımla. Struct'ın Sizeof değerini ve ID ile Puan alanlarının Offsetof değerlerini tek satırda 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"
)

type Kayit struct {
    Aktif bool
    ID    int64
    Puan  int32
}

func main() {
    var k Kayit
    fmt.Println(unsafe.Sizeof(k), unsafe.Offsetof(k.ID), unsafe.Offsetof(k.Puan))
}

Beklenen çıktı

24 8 16

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangisi derleme anında hesaplanan bir sabittir?

  • unsafe.String(p, n)
  • uintptr(p)
  • unsafe.Sizeof(x) Doğru cevap
  • unsafe.Pointer(&x)

Açıklama: Sizeof, Alignof ve Offsetof derleme anında hesaplanır; dönüşümler ise çalışma anında yapılır.

2 Adres aritmetiği

Soru
pb := (*int32)(unsafe.____(p, unsafe.Offsetof(k.b)))
Cevap
pb := (*int32)(unsafe.Add(p, unsafe.Offsetof(k.b)))

Açıklama: unsafe.Add bir işaretçiye bayt ekler; uintptr dönüşümüne gerek bırakmaz.

3 Kural ve nedeni

Kavram Anlamı
uintptr saklama GC onu işaretçi saymaz
Baytları değiştirme String değişmezdir
Alanları sırala Dolgu azalır
Güvenli alternatif Taşınabilir kod

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