【问题标题】:How do I use a cgo-based package on Windows?如何在 Windows 上使用基于 cgo 的包?
【发布时间】:2017-02-25 13:01:12
【问题描述】:

Go 的标准库中的regexp 很差,所以我需要一个更强大的引擎,比如 Python 中的正则表达式(pip install regex),支持递归、反向引用、前瞻/后视等。

我发现: https://godoc.org/github.com/dlclark/regexp2 .NET 兼容,非常好;但是,递归无法正常工作。

还有几个与 PCRE 的绑定,例如: https://godoc.org/github.com/glenn-brown/golang-pkg-pcre/src/pkg/pcre

那么,如何在 Win64 上使用此绑定?

【问题讨论】:

  • 顺便说一句,你知道 Go 有它的 regexp 包以这种方式实现 for a reason 吗?要了解允许不确定性 RE 执行时间的 RE 引擎可能导致哪些问题,请从 this 开始。
  • 是的,我读过这个。但我不在乎。我在 python 中使用了正则表达式模块来解析我自己编写的“蜘蛛”机器人中的网页。一切正常 =) 有时会崩溃,很少挂起 - 常见问题。
  • 在 python 上我使用了多处理,在进行中,我想我需要像超时中止这样的东西
  • 顺便说一下,来自 dlclark 的 regexp2 包有超时选项。也许要求 dlclarck 修复递归是合理的......
  • «有时会崩溃,很少挂起 - 常见问题» -- 我真诚地希望您不要在 NASA 或其他关键任务软件上工作。 “让它早早崩溃”是一个很好的范例,但只有当它得到运行时的支持时,它才会发生这种情况,并且能够恢复。但它被命名为 Erlang,而不是 Python。

标签: windows go build


【解决方案1】:

您可以考虑使用 C++ 标准库std::regex(无第三方库)。将逻辑封装在try 块中,使用catch(...){return ERROR;} 捕获任何错误,并声明C 函数extern "C" 以便您可以使用cgo 调用。


来自https://github.com/golang/go/wiki/cgo(有一部分是关于Windows的):

为了在 Windows 上使用 cgo,您还需要先安装一个 gcc 编译器(例如,mingw-w64)并在您的 使用 cgo 编译之前的 PATH 环境变量将起作用。


话虽如此,我仍然认为您应该考虑坚持使用regexp 包并尝试使正则表达式尽可能简单。因为复杂的正则表达式可能会损害代码的可读性。另一个问题是有时它们会引入难以发现和修复的细微错误。因此,在 Go 中编写更多代码而不是正则表达式实际上可能会让生活更轻松。

【讨论】:

  • 感谢答案)但“复杂的正则表达式可能会损害代码的可读性” - 我使用自己编写的正则表达式生成器脚本来完成我的任务(例如,HTML 解析)。生成新的比编辑现有的更容易。
  • 嘿,我有类似的错误消息,但使用 python、setup.py 和构建为丢失的文件。我有 gcc 并且可以使用gcc -v hello.c,并且过去曾用它编译过。它没有说明错误在哪些文件中(我试图直接从github“获取”)。你们有什么想法可以在这里提供帮助吗?
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2017-09-09
  • 2014-11-05
  • 2015-11-25
相关资源
最近更新 更多