unsafe paketi
- Go kursu
- İleri seviye
- Ders 7/68
- 4 dk
unsafe paketinin risklerini ve kullanımını öğrenirsin.
unsafe paketi
unsafe paketi Go'nun tür güvenliğini bilerek aşmanı sağlar: işaretçileri türler arasında dönüştürebilir, bir türün bellekteki boyutunu ve hizalamasını öğrenebilirsin.
var n int64
fmt.Println(unsafe.Sizeof(n)) // 8Adı bir uyarıdır: bu paketi kullanan kod Go sürümleri ve mimariler arasında taşınabilir olmayabilir.
Ne zaman kullanılır?
Gerçek kullanım alanları dardır: sıfır kopyalı dönüşümler (ör. []byte ↔ string), sistem çağrıları, C ile veri paylaşımı ve çok sıcak kod yollarında optimizasyon. Standart kütüphanede runtime, reflect ve syscall paketleri unsafe kullanır; uygulama kodunda ise neredeyse hiç gerekmez.
Uygulama Boyutları yazdır
unsafe.Sizeof ile bir int8, bir int64 ve bir float32 değerinin boyutlarını tek fmt.Println ile yazdır.
Başlangıç kodu
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"unsafe"
)
func main() {
var a int8
var b int64
var c float32
fmt.Println(unsafe.Sizeof(a), unsafe.Sizeof(b), unsafe.Sizeof(c))
}Beklenen çıktı
1 8 4
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 unsafe kullanan kod için hangisi doğrudur?
- Her zaman daha güvenlidir
- Çöp toplayıcıyı kapatır
- Yalnızca Windows'ta çalışır
- Go uyumluluk sözünün dışında kalabilir Doğru cevap
Açıklama: Go 1 uyumluluk sözü unsafe kullanan programları kapsamaz; derleyici veya çalışma zamanı değişince bozulabilirler.
2 Boyutu öğren
var x int32
fmt.Println(unsafe.____(x)) // 4
var x int32
fmt.Println(unsafe.Sizeof(x)) // 4
Açıklama: unsafe.Sizeof bir değerin bayt cinsinden boyutunu verir; int32 için 4.
3 unsafe araçları
| Kavram | Anlamı |
|---|---|
unsafe.Pointer |
Her işaretçiye dönüşebilir |
unsafe.Sizeof |
Bayt boyutu |
unsafe.Alignof |
Hizalama |
unsafe.Offsetof |
Alanın konumu |