Özet - cgo
- Go kursu
- İleri seviye
- Ders 18/68
- 4 dk
cgo'yu birleştirerek bir C matematik fonksiyonu çağırırsın.
cgo özeti
Bu grupta import "C" ve önsözle C kodu çağırdın, #cgo ile kütüphane bağladın, C.int/C.double dönüşümleri yaptın, C.CString/C.GoString ile metin taşıdın ve C.free ile belleği bıraktın.
Hatırla: cgo çağrısı pahalıdır, çapraz derlemeyi zorlaştırır; saf Go alternatifi varsa onu tercih et.
Tam bir örnek
Bir Go stringini C fonksiyonunda işleyip sonucu geri almak:
/*
#include <ctype.h>
void buyut(char* s) { for (; *s; s++) *s = toupper(*s); }
*/
import "C"
cs := C.CString("go")
defer C.free(unsafe.Pointer(cs))
C.buyut(cs)
fmt.Println(C.GoString(cs)) // GOUygulama Büyük harfe çevir
Önsözde stdlib.h ve ctype.h ekle, void buyut(char* s) fonksiyonunu toupper ile yaz. "gopher" için C.CString oluştur, serbest bırakmayı ayarla, C.buyut çağır ve C.GoString ile 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 <ctype.h>
void buyut(char* s) { for (; *s; s++) *s = toupper(*s); }
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
cs := C.CString("gopher")
defer C.free(unsafe.Pointer(cs))
C.buyut(cs)
fmt.Println(C.GoString(cs))
}Beklenen çıktı
GOPHER
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangisi C belleğinde ayırma yapar ve <code>C.free</code> gerektirir?
- C.int(5)
- float64(C.f())
- C.CString("x") Doğru cevap
- C.GoString(p)
Açıklama: C.CString malloc ile kopya oluşturur; diğerleri ya Go belleği üretir ya da yalnızca tür dönüşümüdür.
2 cgo'yu kapat
GOOS=linux ____=0 go build -o app .
GOOS=linux CGO_ENABLED=0 go build -o app .
Açıklama: CGO_ENABLED=0 saf Go derlemesi yapar; çapraz derleme ve statik ikili için kullanılır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
import "C" |
C'ye kapı |
#cgo LDFLAGS |
Kütüphane bağlama |
C.CString / C.GoString |
Metin taşıma |
C.free |
Bellek bırakma |