Как использовать GoMap в Cgo? - PullRequest
       0

Как использовать GoMap в Cgo?

2 голосов
/ 17 февраля 2020

Я пытаюсь позвонить Go из c ++. Мой код работает с картами, и я не могу заставить карты работать с cgo.

main. go:

package main

import (
    "C"
    "fmt"
)

func main() {}

//export PrintMap
func PrintMap(m map[string]string) {
    fmt.Println(m)
}

Который "компилируется" в main.h:

typedef void *GoMap;

extern void PrintMap(GoMap p0);

Как мне успешно создать GoMap в моем коде c ++ и передать его в код go?

1 Ответ

5 голосов
/ 17 февраля 2020

Вы не можете. На самом деле, вы не можете делать что-либо с этим типом с cgo из-за правил передачи указателей , которые позволяют cgo безопасно работать с Go параллелизмом и сборщиком мусора. Карты находятся в списке типов, которые «всегда включают Go указатели», и поэтому карты не могут быть переданы в качестве аргументов C функциям, возвращены из Go функций, которые вызываются кодом C, или сохранены C.

Трудно дать рекомендацию о том, что вы должны сделать, не видя больше того, что вы пытаетесь выполнить sh, но обычный обходной путь для этого чтобы код Go содержал объекты на карте и передавал код C key с этой карты (например, строку C или int, которые можно передавать или хранить свободно) как дескриптор объекта, содержащегося внутри. C затем выполняет все свое взаимодействие с объектами с помощью функций Go, которые могут использовать клавишу, чтобы найти правильное значение на карте. Срез тоже подойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...