Übergabe eines Zeigers auf ein Slice an eine C-Funktion in Go
In Go ist die Übergabe komplexer Aufgaben eine häufige Aufgabe bei der Interaktion mit C-Funktionen Datenstrukturen wie Slices. Go-Slices und C-Arrays weisen jedoch grundlegende Unterschiede auf, die eine besondere Behandlung erfordern.
Betrachten Sie die folgende C-Funktion mit der Signatur int f(int *count, char ***strs). Es braucht zwei Zeiger: count zeigt auf die Länge eines Arrays von Strings und strs zeigt auf ein Array von String-Zeigern.
In Go können wir ein Slice nicht direkt an eine solche Funktion übergeben, da Slices dies tun eine Go-spezifische Datenstruktur und unterscheiden sich von C-Arrays. Darüber hinaus enthalten Go-Slices einen Go-Zeiger, der cgo die Übergabe an C-Funktionen verbietet.
Um dies zu umgehen, müssen wir das Array in C manuell zuweisen und verfolgen, wo das äußere Array freigegeben werden soll . Für jeden String im Go-Slice konvertieren wir ihn mit C.CString in einen C-String und zeichnen die entsprechenden C-String-Zeiger im zugewiesenen C-Array auf.
Hier ist eine modifizierte Version des Go-Codes:
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go Array for easy indexing a := (*[1<<30 - 1]*C.char)(cArray) for index, value := range strs { a[index] = C.CString(value) } err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray)))
Dieser Ansatz stellt sicher, dass die C-Funktion Zugriff auf ein manipulierbares C hat Array, während wir das manipulierte Array zur weiteren Verwendung zurück in ein Go-Slice konvertieren können.
Das obige ist der detaillierte Inhalt vonWie kann ich ein Go-Slice an eine C-Funktion übergeben, die einen Zeiger auf ein Array von C-Strings erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!