Maison >développement back-end >Golang >Comment passer un pointeur Go Slice à une fonction C ?

Comment passer un pointeur Go Slice à une fonction C ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-05 13:41:11668parcourir

How to Pass a Go Slice Pointer to a C Function?

Passer un pointeur vers une tranche vers une fonction C dans Go

Lors de l'appel de fonctions C depuis Go à l'aide de cgo, il est souvent nécessaire de passer des pointeurs vers des tranches Go comme arguments. Cependant, cela peut être difficile car les tranches Go ne sont pas directement compatibles avec les tableaux C.

Pour résoudre ce problème, il est nécessaire d'allouer le tableau en mémoire C et de transmettre un pointeur vers ce tableau à la fonction C. Cela garantit que la fonction C peut modifier le tableau et le renvoyer à Go.

Voici un exemple qui montre comment allouer un tableau en C et lui passer un pointeur à partir d'une tranche Go :

// 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)
}

En allouant le tableau en mémoire C, la fonction C peut modifier son contenu et les modifications seront propagées à la tranche Go lorsque la fonction C revient.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn