Heim >Backend-Entwicklung >Golang >Wie übergebe ich Go-Slices an C-Funktionen und behandle Zeigeränderungen?
Zeiger auf Slices an C-Funktionen in Go übergeben
Beim Aufrufen von C-Funktionen aus Go mit cgo kann es schwierig sein, Zeiger an diese zu übergeben Scheiben. Betrachten Sie eine C-Funktion wie:
int f(int *count, char ***strs);
wobei count die Länge des strs-Arrays ist, strs ein Array von Strings ist und der Rückgabewert einen Fehlerstatus angibt.
In Go, man könnte zunächst versuchen, count und strs wie folgt zu übergeben:
C.f((*C.int)(&count), (**C.char)(&strs[0]))
Dadurch sind jedoch keine Änderungen an strs in C möglich. Um dies zu ermöglichen, ist es erforderlich, um das Array in C zuzuweisen. Ähnlich wie bei C.CString ist es wichtig, den Überblick darüber zu behalten, wo das äußere Array freigegeben werden soll, insbesondere wenn die C-Funktion möglicherweise ein neues Array zuweist.
Der folgende Code zeigt, wie das geht Ordnen Sie das C-Array zu:
cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array for 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)))
In diesem Code wird cArray in C zugewiesen, a ist ein Slice-Wrapper um dieses Array, um die Indizierung zu ermöglichen, und jede Zeichenfolge wird kopiert in den C-Speicher. Die Funktion f kann nun Zeichenfolgen in C ändern und den geänderten Wert an Go zurückgeben.
Das obige ist der detaillierte Inhalt vonWie übergebe ich Go-Slices an C-Funktionen und behandle Zeigeränderungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!