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)) // 7Bayt 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
package main
/*
// C kodu buraya
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
// buraya yaz
}Örnek çözüm
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
p := C.CString("go")
s := C.____(p)
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 |