内容提要
最近我在一个Elixir项目上工作,想要使用一个用Go编写的开源包。我搜索了不同的方法来与Elixir中的Go代码进行交互。我知道使用NIF可以很容易地与Elixir中的Rust代码进行交互,但是我没有找到类似的方法来与Go进行交互。大部分的研究都指向了使用Ports,我差点放弃,直到意识到WASI(WebAssembly System Interface)也是一个选择。我一直听说过Web Assembly,现在正好是尝试的好时机。我还发现了Wasmex,它似乎是在Elixir中运行WASI二进制文件的好选择。编译Go代码为WASI、在Elixir主机中运行WASI二进制文件、将数据传递给WASI二进制文件、从WASI二进制文件中获取数据,这些都是我需要弄清楚的事情。最后,我成功地实现了这个解决方案。这个方法对于大多数基本用例来说是一个完美的解决方案。
关键要点
-
在Elixir项目中使用Go编写的开源包需要与Go代码进行交互。
-
使用NIF与Rust代码交互简单,但与Go的交互方法较少。
-
WASI(WebAssembly System Interface)是与Go代码交互的一个可选方案。
-
Wasmex是一个在Elixir中运行WASI二进制文件的工具。
-
编译Go代码为WASI需要使用tinygo,支持WASI作为输出目标。
-
运行WASI二进制文件需要在Elixir中使用Wasmex库。
-
通过stdin或共享WASI内存传递数据到WASI二进制文件,但字符串输入不被支持。
-
使用管道(pipes)可以将数据传递给Go代码。
-
从WASI二进制文件获取数据可以使用stdout管道。
-
使用WASI调用Go代码相对简单,适合大多数基本用例。
-
即使Elixir没有相关库,也可以通过Go与Elixir进行交互。