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) // merhabaTers 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
package main
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
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
b := []byte("go")
s := unsafe.____(&b[0], len(b))
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 |