CodeBlanks Logo Icon CodeBlanks

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))  // 4

a 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 = 9

Normal 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

main.go
package main

import (
    "fmt"
    "unsafe"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
var k Kayit
fmt.Println(unsafe.____(k.Yas))
Cevap
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

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