CodeBlanks Logo Icon CodeBlanks

Ö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))  // GO

Uygulama 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

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 <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

Soru
GOOS=linux ____=0 go build -o app .
Cevap
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

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