【问题标题】:Go language on iPhoneiPhone 上的 Go 语言
【发布时间】:2012-10-02 09:49:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: ios go mach-o gccgo


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我的方案是制作 2 个应用程序。 Go 应用程序和 iOS 应用程序并将它们链接在一起。他们将与一些 API 进行通信。 Go 应用程序将模拟世界并产生定时事件。 iOS 应用将与图形和传感器一起使用。
    • 这可能行得通。假设 go 应用不必访问文件或数据存储。
    • 没有。在围棋中模拟游戏逻辑很棒。例如如果其他事情没有发生,则在某个事件 300 毫秒后播放声音。我们在 Go 中建模逻辑并希望直接在应用程序中使用逻辑。
    • @Max 你能分享你在 iOS 上使用 Go 语言的经验吗?
    • 根据 Clean 架构,如果您在 Go 中编写所有业务逻辑(用例/交互器、域逻辑)和特定于应用程序的逻辑,您可能不需要 iOS 或 Android API 就可以过得很好分别在 Objective-C/Swift 和 Java 中。
    【解决方案4】:

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

    编译器

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

    对于iOS,您必须启用Bitcode(减少二进制大小),并将架构设置为arm64(或amd64,用于iOS Simulator),并将操作系统设置为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 代码中做几件事。

    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有一篇关于这个主题的博客文章

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 2018-11-24
      • 2012-08-31
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多