Offsetof
- Go kursu
- İleri seviye
- Ders 10/68
- 4 dk
Offsetof ile struct alan ofsetini öğrenirsin.
Offsetof
unsafe.Offsetof(s.f) bir alanın struct'ın başlangıcından kaç bayt sonra başladığını verir. Dolgunun nereye eklendiğini böyle görürsün.
type K struct { a bool; b int32 }
var k K
fmt.Println(unsafe.Offsetof(k.b)) // 4a 1 bayt, ardından 3 bayt dolgu; b 4'ten başlar.
Alan adresini hesaplamak
Struct başlangıç adresine Offsetof eklenerek alanın adresi bulunabilir; Go 1.17'den beri unsafe.Add bunu okunur hâle getirir:
p := unsafe.Pointer(&k)
pb := (*int32)(unsafe.Add(p, unsafe.Offsetof(k.b)))
*pb = 9Normal kodda doğrudan k.b = 9 yazılır; bu teknik serileştirme ve C ile veri paylaşımında kullanılır.
Uygulama Alan konumları
type R struct { a bool; b int32; c int64 } tanımla. var r R için b ve c alanlarının Offsetof değerlerini tek satırda yazdır.
Başlangıç kodu
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"unsafe"
)
type R struct {
a bool
b int32
c int64
}
func main() {
var r R
fmt.Println(unsafe.Offsetof(r.b), unsafe.Offsetof(r.c))
}Beklenen çıktı
4 8
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>Offsetof</code> neye uygulanır?
- Bir struct alan seçicisine (s.f) Doğru cevap
- Bir türün adına
- Bir işaretçiye
- Bir dilime
Açıklama: Offsetof argüman olarak s.f biçiminde bir alan seçicisi bekler ve o alanın bayt konumunu verir.
2 Konumu bul
var k Kayit
fmt.Println(unsafe.____(k.Yas))
var k Kayit
fmt.Println(unsafe.Offsetof(k.Yas))
Açıklama: Offsetof alanın struct içindeki bayt konumunu verir.
3 Fonksiyon ve argüman
| Kavram | Anlamı |
|---|---|
Offsetof |
k.alan |
Sizeof |
Herhangi bir değer |
unsafe.Add |
Pointer ve bayt sayısı |
unsafe.Pointer |
Bir işaretçi |