23

是否可以用 Go for iPhone 编写代码?我认为需要以下步骤

  1. 将 Go 编译为 ARM Mach-O 二进制文件(我希望 GCCGO 能够做到这一点)

  2. 将 iPhone 应用程序编译为静态库(我认为可以重命名 main() -> main2() 等)

  3. 将 Go 编译为与 iPhone 静态库链接的 Mach-O 二进制文件。Go 将不得不调用 main2。

  4. 制作一些 plist 文件,压缩,签名

4

4 回答 4

28

Minux 在此处维护 Go iOS 端口:https ://bitbucket.org/minux/goios/wiki/Home

于 2012-10-02T10:08:38.963 回答
6

由于这个问题现在已经有 4 年了,并且从那时起发生了很多事情,我想我会添加到已经存在的答案中:

这个github 项目支持为 Android 和 iOS 编写完全用 Go 编写的原生应用程序(但是可用的 API 子集有限)以及 Android 或 iOS 原生代码通过绑定与 Go 代码通信的 SDK 应用程序。

于 2017-05-06T19:34:23.503 回答
5

能够编译和一个 go 程序只是为 iPhone 编写 go 的一部分。您仍然需要绑定到 iOS API 才能用它做任何有趣的事情。其他人已经给出了将语言移植到 iOS 的指针,但在那之后你还有很长的路要走。

于 2012-10-02T17:54:37.210 回答
0

对于在搜索如何在 Go 中创建 iOS 框架或库时偶然发现这一点的人,您可以使用cgo将 GoLang 编译为 ac 库和头文件。

编译器

为此,您必须导出一些 Go 编译器环境变量并将CGO_ENABLED=1标志设置为 enable cgo

对于 iOS,您必须启用 Bitcode(减少二进制大小),并将架构设置为arm64(或amd64对于 iOS 模拟器),并将操作系统设置为darwin. 如果您在模拟器上运行,您还需要将您的设置SDKiphonesimulator.

然后您将一些参数传递给您的go build命令,-buildmode c-archive以生成 C 头文件并-trimpath删除路径信息。

总之,看起来像这样:

$ export SDK=iphonesimulator
$ export GOOS=darwin
$ export GOARCH=arm64
$ export CGO_ENABLED=1
$ export CGO_CFLAGS="-fembed-bitcode"
$ go build -buildmode c-archive -trimpath -o outputFilename.a .

代码

你还必须在你的 Go 代码中做几件事。

  1. 您必须导入“C”模块
import "C"
  1. //export functionName您必须通过用注释装饰这些函数来导出要通过 C 头文件公开的任何函数。
//export functionName
func functionName() {
  // do something
}
  1. 如果要传递变量,请确保使用C数据类型,而不是这些变量的 GoLang 对象类型。就这样string变成了C.CString。例如:
//export helloWorld
func helloWorld() *C.char {
    return C.CString("Hello world")
}

在Compile GoLang as a Mobile Library上有一篇关于此主题的博客文章

于 2021-10-29T20:47:28.970 回答