Zugriff auf das C-Char-Array in Go mit cgo
In C stoßen wir häufig auf Arrays mit konstanten Zeichenzeigern (z. B. const char *myStringArray []). Der Zugriff auf solche Arrays von Go aus mit cgo kann sich als Herausforderung erweisen.
Falscher Ansatz:
Zunächst können Sie versuchen, das Array direkt mit unsicherer Zeigerarithmetik zu indizieren:
myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
Dieser Ansatz navigiert jedoch durch Zeichen innerhalb einer Zeichenfolge, nicht durch das Array selbst.
Richtige Lösung:
Eine zuverlässigere Lösung besteht darin, das C-Array in ein Go-Slice umzuwandeln.
// Define array size arraySize := 3 // Create Go slice cStrings := (*[1 << 30]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize] // Iterate over slice for _, cString := range cStrings { fmt.Println(C.GoString(cString)) }
Dieser Ansatz gewährleistet die ordnungsgemäße Ausführung Indizierung des Arrays, wodurch Zugriff auf jedes String-Element in seiner Gesamtheit ermöglicht wird.
Durch das Verständnis der Feinheiten der Zeigermanipulation und des Nutzens von Go Slices können Sie die Lücke zwischen C- und Go-Speicherstrukturen effektiv schließen.
Das obige ist der detaillierte Inhalt vonWie kann ich mit cgo sicher auf ein C-Char-Array in Go zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!