CodeBlanks Logo Icon CodeBlanks

Go ve C dönüşümü

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

Go string ve C.CString arasında dönüşüm öğrenirsin.

String dönüşümü

Go stringleri uzunluk bilgisi taşır, C stringleri ise \0 ile biter. C.CString(s) Go stringini C belleğine kopyalar; C.GoString(p) bir *C.char'ı Go stringine çevirir.

cs := C.CString("merhaba")
defer C.free(unsafe.Pointer(cs))
fmt.Println(C.strlen(cs))  // 7

Bayt dilimleri

Bayt verisi için C.CBytes(b) bir []byte'ı C belleğine kopyalar; C.GoBytes(p, n) C belleğinden n baytı Go dilimine kopyalar. Bu dönüşümlerin hepsi kopya yapar; büyük veride maliyeti göz önüne alınmalıdır.

Uygulama String uzunluğu

Önsözde #include <stdlib.h> ve #include <string.h> ekle. "gopher" için C.CString oluştur, defer C.free(unsafe.Pointer(cs)) ile serbest bırak ve C.strlen(cs) sonucunu yazdır.

Başlangıç kodu

main.go
package main

/*
// C kodu buraya
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

/*
#include <stdlib.h>
#include <string.h>
*/
import "C"

import (
    "fmt"
    "unsafe"
)

func main() {
    cs := C.CString("gopher")
    defer C.free(unsafe.Pointer(cs))
    fmt.Println(C.strlen(cs))
}

Beklenen çıktı

6

Soru ve cevaplar

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

1 <code>C.CString</code> ile ayrılan belleği kim serbest bırakır?

  • Sen, C.free ile Doğru cevap
  • Go çöp toplayıcısı
  • Program kapanınca otomatik
  • C.GoString çağrısı

Açıklama: C.CString malloc ile C belleği ayırır; GC bu belleği görmez, bu yüzden C.free ile serbest bırakılmazsa sızıntı olur.

2 C stringini Go'ya çevir

Soru
p := C.CString("go")
s := C.____(p)
Cevap
p := C.CString("go")
s := C.GoString(p)

Açıklama: C.GoString *C.char'ı Go stringine kopyalar.

3 Dönüşüm fonksiyonları

Kavram Anlamı
C.CString Go → C string
C.GoString C → Go string
C.CBytes Go → C bayt
C.GoBytes C → Go bayt

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