CodeBlanks Logo Icon CodeBlanks

unsafe ve slice

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

Slice'in arkasındaki array'i unsafe ile öğrenirsin.

unsafe ile dilim ve string

Go 1.20 ile gelen unsafe.String, unsafe.StringData, unsafe.Slice ve unsafe.SliceData, eski reflect.SliceHeader hilelerinin yerini aldı. Bir []byte'ı kopyalamadan string olarak görebilirsin:

b := []byte("merhaba")
s := unsafe.String(&b[0], len(b))
fmt.Println(s)  // merhaba

Ters yön: string → []byte

unsafe.Slice(unsafe.StringData(s), len(s)) bir string'in baytlarını kopyasız bir dilim olarak verir. Bu dilime yazmak yasaktır; string sabitleri salt okunur bellekte durabilir ve yazma programı çökertir. Çoğu durumda basit []byte(s) kopyası yeterince hızlıdır.

Uygulama Kopyasız dönüşüm

b := []byte("gopher") tanımla. unsafe.String(&b[0], len(b)) ile string oluştur ve string'i ile uzunluğunu 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() {
    b := []byte("gopher")
    s := unsafe.String(&b[0], len(b))
    fmt.Println(s, len(s))
}

Beklenen çıktı

gopher 6

Soru ve cevaplar

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

1 Kopyasız oluşturulan string için hangisi şarttır?

  • Dilim boş olmalı
  • String küçük harf olmalı
  • GC kapatılmalı
  • Alttaki bayt dilimi sonradan değiştirilmemeli Doğru cevap

Açıklama: Go stringleri değişmez kabul edilir; baytlar değişirse aynı string farklı içerik gösterir ve programın davranışı tanımsız olur.

2 Kopyasız string

Soru
b := []byte("go")
s := unsafe.____(&b[0], len(b))
Cevap
b := []byte("go")
s := unsafe.String(&b[0], len(b))

Açıklama: unsafe.String bir bayt işaretçisi ve uzunluktan string oluşturur.

3 Go 1.20 unsafe fonksiyonları

Kavram Anlamı
unsafe.String Bayttan string
unsafe.StringData String'in bayt işaretçisi
unsafe.Slice İşaretçiden dilim
unsafe.SliceData Dilimin ilk eleman işaretçisi

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