本文概述
尽管不是一种新的语言, 但Go在过去两年中引起了很多兴趣, 并且使用该语言的大型项目的数量正在迅速增长。我写了一篇有关SitePoint语言的介绍性文章, 并提到了有关移动支持的内容, 所以我考虑了一下可能性。
我很高兴看到Android上的Go支持是什么样的, 因为它们都是Google技术, 而且开发人员纷纷要求开发一种支持Java的语言。
Go入门
你将需要安装GoLang 1.5+。
接下来, 安装GoMobile工具, 该工具可以编译并运行适用于Android和iOS的Go应用程序:
go get golang.org/x/mobile/cmd/gomobile
gomobile init
我们将在GoLangInstalldir / src / golang.org / x / mobile / example /中引用gomobile软件包随附的示例应用程序。如果你没有安装它们, 请使用以下命令获取它们:
go get -d golang.org/x/mobile/example/basic
生成并安装本机Go应用程序
对于许多应用程序用例, 编译转到本机应用程序并忽略平台库和接口可能会很好。如果是这样, 则可以使用部分功能来编译现有的Go代码, 这一点很简单。这包括:
- 应用控制和配置
- OpenGL ES 2绑定
- 资产管理
- 事件管理
- 实验包包括OpenAL绑定, 音频, 字体, 子画面和运动传感器
我们将使用一个预先存在的gomobile示例来逐步完成该过程, 但是可以将它们替换为你自己的项目文件。
安卓系统
建立Android APK
gomobile build -target=android golang.org/x/mobile/example/basic
部署到设备
gomobile install golang.org/x/mobile/example/basic
iOS
建立iOS IPA
gomobile build -target=ios golang.org/x/mobile/example/basic
部署到设备
在iOS上没有与在Android上等效的部署命令, 因此在创建上述应用之后, 你将必须按照自己喜欢的方式将其复制到设备或仿真器上, 例如ios-ployy工具。
如果想获得更多令人兴奋的内容, 请尝试使用golang.org/x/mobile/example/audio示例进行上述操作。
让我们看一下音频示例(这里我不会重现完整的代码), 你不需要对GoLang过于熟悉(我不是), 这更多地是关于寻找可能的方法。
首先, 你会看到一组导入语句:
import (
...
"golang.org/x/mobile/app"
"golang.org/x/mobile/asset"
...
)
如果你浏览在GoLangInstalldir / src / golang.org / x / mobile / *中导入的文件夹和文件, 你会注意到用你的代码编译的各种Java和Objective-C文件。
进一步挖掘, 你将看到对在代码中导入和使用的某些类的引用, 例如app和glctx。
在使用开发中使用Go
我们可以使用Go编写代码并构建一个紧凑且经过优化的本机应用程序, 但由于它所需的所有支持库仅在Java和Objective-C / Swift中可用, 因此目前还不是“原生”应用程序。我们如何改善这种体验?
Go Mobile团队使用本机应用程序中的go包(你的应用程序)创建了另一个选项。完美共享一些常见的Go代码并绑定到本机代码。入门很容易, 但从长远来看, 维护起来可能很复杂。
安卓系统
如果你使用的是Android Studio, 请从GoLangInstalldir / src / golang.org / x / mobile / example / bind / android导入参考项目, 然后打开build.grade(模块:hello)文件以更新你的GOPATH和GO路径, 这是我的(我用Homebrew安装了GoLang):
Sync Gradle, 然后将应用程序部署到仿真器或设备。
注意:当前仅基于ARM的设备和仿真器支持此功能。
让我们看一下Java和Go代码:
MainActivity.java
package org.golang.example.bind;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import go.hello.Hello;
public class MainActivity extends Activity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.mytextview);
// Call Go function.
String greetings = Hello.Greetings("Android and Gopher");
mTextView.setText(greetings);
}
}
src / golang.org / x / mobile / example / bind / hello / hello.go
package hello
import "fmt"
func Greetings(name string) string {
return fmt.Sprintf("Hello, %s!", name)
}
go文件通过import go.hello.Hello导入, 并且其中的Greetings函数可通过Hello.Greetings在Java文件中访问。无需太多额外步骤, 就可以在go函数和本机UI元素之间进行绑定。
iOS
将iOS应用程序绑定到Go需要执行不同的步骤。首先执行以下命令:
cd GoLang_Install_dir/src/golang.org/x/mobile/example/bind
gomobile bind -target=ios golang.org/x/mobile/example/bind/hello
这将在我们可以在项目中使用的当前文件夹中创建一个名为Hello.framework的框架包。
在Xcode中打开位于GoLangInstalldir / src / golang.org / x / mobile / example / bind / ios / bind.xcodeproj上的示例iOS项目, 然后将Hello.framework拖到该项目中, 并在需要时选中“复制项目”。这将导致以下文件夹结构:
生成并运行应用程序, 该应用程序与Android应用程序非常相似, 将Go方法调用到Objective-C代码中。
让我们看一下代码:
#import "ViewController.h"
#import "hello/Hello.h" // Gomobile bind generated header file in hello.framework
@interface ViewController ()
@end
@implementation ViewController
@synthesize textLabel;
- (void)loadView {
[super loadView];
textLabel.text = GoHelloGreetings(@"iOS and Gopher");
}
@end
#import“ hello / Hello.h”导入先前生成的框架文件, 并且textLabel.text = GoHelloGreetings(@“ iOS and Gopher”);调用它公开的用于设置标签变量的函数。
可以在基于Swift的项目中使用相同的自动生成的Objective-C框架文件, 然后使用以下方法:
let msg = Hello.GoHelloGreetings("gopher")
使用Go值得么?
好吧, 简而言之, 可能不是。如果你已经在Go中编写了应用程序, 并且可以使用非本机外观的界面, 那么没有什么可以阻止你的, 因为你会发现构建和部署用Go编写的本机应用程序很容易。如果你愿意采取额外的步骤来遵循绑定选项, 则可以采取进一步的措施, 但仍要在一定的限制内。
如果你不使用Go, 则可能不值得考虑将其作为移动原生编程选项。但是我仍然坚信, 有足够的潜力和兴趣使它在不久的将来成为可能, 当然, 我很乐意在下面听听你的意见。