Heim  >  Artikel  >  Backend-Entwicklung  >  Wie greife ich von Go aus korrekt auf ein C-Array von „const char*'-Strings zu?

Wie greife ich von Go aus korrekt auf ein C-Array von „const char*'-Strings zu?

DDD
DDDOriginal
2024-11-19 22:08:03910Durchsuche

How to Correctly Access a C Array of `const char*` Strings from Go?

Zugriff auf C-Array von const char * von Go aus

Sie versuchen, auf ein C-Array von const char von Go mit cgo. Konkret haben Sie ein C-Array von Strings und möchten darin einen Index erstellen und den Array-Eintrag in einen Go-String konvertieren.

Der falsche Ansatz

Ihr aktueller Code versucht dies mit Zeigerarithmetik:

myGoString := C.GoString((*C.char) (unsafe.Pointer(uintptr(unsafe.Pointer(C.myStringArray)) + uintptr(index) * unsafe.Sizeof(C.myStringArray))))
Dieser Ansatz ist jedoch falsch, da er entlang der Zeichen von indiziert die Zeichenfolge und nicht das Array nach oben. Als Ergebnis erhalten Sie die ersten paar Zeichen jeder Zeichenfolge anstelle der gesamten Zeichenfolge.

Die richtige Lösung

Der korrekte Zugriff auf das C-Array ist sicherer und sicherer bequemer, es zuerst in ein Go-Slice umzuwandeln:

import "unsafe"

const arraySize = 3

cStrings := (*[arraySize]*C.char)(unsafe.Pointer(&C.myStringArray))[:arraySize:arraySize]

for _, cString := range cStrings {
    fmt.Println(C.GoString(cString))
}
Durch die Konvertierung des C-Arrays in ein Go-Slice können Sie dann über seine Elemente iterieren und jedes konvertieren Element zu einem Go-String mit C.GoString().

Beispielausgabe

Dieser Ansatz stellt sicher, dass Sie den gesamten String aus dem C-Array erhalten, wie im gezeigt folgende Beispielausgabe:

Das obige ist der detaillierte Inhalt vonWie greife ich von Go aus korrekt auf ein C-Array von „const char*'-Strings zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn