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

Posted

技术标签:

【中文标题】从 Go 中迭代`std::vector<std::string>`?【英文标题】:Iterate `std::vector<std::string>` from Go? 【发布时间】:2021-04-20 14:54:53 【问题描述】:

我正在尝试使用 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],它也不喜欢那样。

有人有什么建议吗?

非常感谢。

【问题讨论】:

做,例如this帮助? 这就是我提到调用.Capacity() 的地方。遗憾的是,它也失败了,因为 CapacityGet 未定义。 【参考方案1】:

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

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

【讨论】:

range 在 Go 中仅为内置的可迭代类型(切片、数组、映射、通道、字符串)定义。不能用于接口值。

以上是关于从 Go 中迭代`std::vector<std::string>`?的主要内容,如果未能解决你的问题,请参考以下文章

在 std::vector<T> 和 std::vector<unique_ptr<T>> 上均匀迭代

C++,如何从迭代器返回对成员变量的引用

用于向量向量的 c++ 迭代器

vector 迭代 删除指定的元素

使用对 std::vector 的某些元素的引用,或这些元素在向量中的位置来迭代它们

std::map迭代器有效性分析