是否可以用 Go for iPhone 编写代码?我认为需要以下步骤
将 Go 编译为 ARM Mach-O 二进制文件(我希望 GCCGO 能够做到这一点)
将 iPhone 应用程序编译为静态库(我认为可以重命名 main() -> main2() 等)
将 Go 编译为与 iPhone 静态库链接的 Mach-O 二进制文件。Go 将不得不调用 main2。
制作一些 plist 文件,压缩,签名
Minux 在此处维护 Go iOS 端口:https ://bitbucket.org/minux/goios/wiki/Home
由于这个问题现在已经有 4 年了,并且从那时起发生了很多事情,我想我会添加到已经存在的答案中:
这个github 项目支持为 Android 和 iOS 编写完全用 Go 编写的原生应用程序(但是可用的 API 子集有限)以及 Android 或 iOS 原生代码通过绑定与 Go 代码通信的 SDK 应用程序。
能够编译和一个 go 程序只是为 iPhone 编写 go 的一部分。您仍然需要绑定到 iOS API 才能用它做任何有趣的事情。其他人已经给出了将语言移植到 iOS 的指针,但在那之后你还有很长的路要走。
对于在搜索如何在 Go 中创建 iOS 框架或库时偶然发现这一点的人,您可以使用cgo
将 GoLang 编译为 ac 库和头文件。
为此,您必须导出一些 Go 编译器环境变量并将CGO_ENABLED=1
标志设置为 enable cgo
。
对于 iOS,您必须启用 Bitcode(减少二进制大小),并将架构设置为arm64
(或amd64
对于 iOS 模拟器),并将操作系统设置为darwin
. 如果您在模拟器上运行,您还需要将您的设置SDK
为iphonesimulator
.
然后您将一些参数传递给您的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 代码中做几件事。
import "C"
//export functionName
您必须通过用注释装饰这些函数来导出要通过 C 头文件公开的任何函数。//export functionName
func functionName() {
// do something
}
C
数据类型,而不是这些变量的 GoLang 对象类型。就这样string
变成了C.CString
。例如://export helloWorld
func helloWorld() *C.char {
return C.CString("Hello world")
}
在Compile GoLang as a Mobile Library上有一篇关于此主题的博客文章