Heim >Backend-Entwicklung >Golang >Wie übergebe ich einen Go-Slice-Zeiger an eine C-Funktion?
Beim Aufrufen von C-Funktionen aus Go mit cgo ist es oft notwendig, Zeiger auf Go-Slices als Argumente zu übergeben. Dies kann jedoch eine Herausforderung darstellen, da Go-Slices nicht direkt mit C-Arrays kompatibel sind.
Um dieses Problem zu beheben, ist es notwendig, das Array im C-Speicher zuzuweisen und einen Zeiger auf dieses Array an die C-Funktion zu übergeben. Dadurch wird sichergestellt, dass die C-Funktion das Array ändern und an Go zurückgeben kann.
Hier ist ein Beispiel, das zeigt, wie man ein Array in C zuordnet und einen Zeiger darauf von einem Go-Slice übergibt:
// C function signature: int f(int *count, char ***strs) import "C" func go_f(strs []string) int { count := len(strs) c_count := C.int(count) // Allocate an array in C memory to store the strings cArray := C.malloc(C.size_t(c_count) * C.size_t(unsafe.Sizeof(uintptr(0)))) // Convert the C array to a Go array so we can access its elements a := (*[1<<30 - 1]*C.char)(cArray) // Copy the Go strings into the C array for index, value := range strs { a[index] = C.CString(value) } // Call the C function with a pointer to the C array err := C.f(&c_count, (***C.char)(unsafe.Pointer(&cArray))) // Free the C array C.free(cArray) return int(err) }
Durch die Zuweisung des Arrays im C-Speicher kann die C-Funktion seinen Inhalt ändern und die Änderungen werden zurück an das Go-Slice weitergegeben, wenn die C-Funktion zurückkehrt.
Das obige ist der detaillierte Inhalt vonWie übergebe ich einen Go-Slice-Zeiger an eine C-Funktion?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!