从 Go 迭代 `std::vector<std::string>`?

Iterate `std::vector<std::string>` from Go?

我正在尝试使用 Go 中的 C++ 库。我对 Go 也没什么经验。

我的 C++ 方法如下所示:

std::vector<std::string> getAttribute(const std::string key);

我的 .swigcxx 文件中有这个:

%include "std_string.i"
%include "std_vector.i"

%include "MyCode.h"

%template(StringVector) std::vector<std::string>;

%{
  #include "MyCode.h"
%}

但是 Go 不想让我访问它。我通过以下方式打印了一些信息:

attribs := ipuInfo.GetAttribute("foo")
fmt.Printf("%T\n", attribs)
fmt.Printf("%+v\n", attribs)

然后我得到:

bar.SwigcptrStringVector
<random number - address perhaps?>

但我不知道如何获取向量的各个内容。我试过:

for index, val := range bar.GetAttribute("foo") {
}

但这给出了:

cannot range over bar.GetAttribute("foo") (type interface {})

我也试过对其调用 .Capacity() 方法,但未声明(来自 https://blog.nobugware.com/post/2020/c-bindings-in-go-and-swig/)。我也试过 attribs[0] 但它也不喜欢那样。

有人有什么建议吗?

非常感谢。

看起来是函数重载的问题。我有 2 个具有相同名称和不同参数的 getAttribute 函数。当我重命名该方法使其唯一时,Capacity()Get() 起作用(尽管 range 不起作用)。

看起来 Swig 试图生成包装器代码来调用正确的方法,但无法处理不同的 return 类型