天天看點

使用 Go 進行 iOS 和 Android 程式設計

我很高興 android 是支援 go 語言的,這一方面應該是二者都是 google 的技術,另一方面恐怕也與開發者希望用 go 替換 java 的願望有關。

使用 Go 進行 iOS 和 Android 程式設計

開始

go get golang.org/x/mobile/cmd/gomobile

gomobile init

我們會參考 gomobile 包裡的例子,位于 golanginstalldir/src/golang.org/x/mobile/example/。如果你沒有安裝這些例子,參考下面的指令來安裝:

go get -d golang.org/x/mobile/example/basic

建構和安裝 go 的 native 應用

對于很多應用,編譯 go 的 native 應用時,忽略那些平台相關的庫和接口是可以接受的。如果是這樣的情況,編譯已有的 go 代碼是很輕松的,我們可以選擇使用一個功能子集,這些功能包括:

app 控制和配置

opengl es 2

資源管理

事件管理

一些實驗性的包,包括 openal、audio、font、sprite 和運動傳感器

我們将從已有的 gomobile 項目裡的一些例子開始,你可以用自己項目裡的檔案替換它們。

android

建構一個 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

部署到裝置

可以用上面的步驟,試試 golang.org/x/mobile/example/audio 這個例子。

讓我們深入了解一下 audio 這個例子(詳細的代碼就不列出了了),你并不需要對 go 語言非常精通(我就是不太精通),我們先了解一下都能幹些啥。

首先你可以看到一些 import 語句:

import (...

    "golang.org/x/mobile/app"

    "golang.org/x/mobile/asset"...)

如果你檢視一下 import 的這些包所在的目錄 golanginstalldir/src/golang.org/x/mobile/* 下的檔案,你可以發現那些編譯到你的代碼裡的那些 java 和 objective-c 檔案。

再進一步了解一下,你可以在代碼裡找到對這些 import 的包(例如 app 和 glctx)的引用。

going native

我們可以用 go 寫代碼,然後建構一個緊湊的優化過的 native 應用,但是目前這個應用還不是完全的 native 的風格,因為所有依賴的庫還都是 java 或者 objective-c / swift 的。我們怎樣來改善這個體驗呢?

go mobile 團隊給我們了另一個選擇,可以在一個 native 應用裡使用 go 的包(也即你的程式)。特别是共享一些公共的 go 代碼,把它們綁定到 native 的代碼上是非常好用的。這種方式上手很快,不過長期來說維護會比較麻煩一些。

如果使用 android studio,可以導入項目

golanginstalldir/src/golang.org/x/mobile/example/bind/android,打開

build.grade (hello 子產品)檔案,更新一下 gopath 和 go 的路徑,下面是我的檔案内容(我是用 homebrew 安裝的

golang):

使用 Go 進行 iOS 和 Android 程式設計

同步 gradle 後,應用就可以部署到仿真器或者真實裝置上了。

注意: 目前這種方式隻支援基于 arm 的裝置和仿真器。

讓我們看一下 java 和 go 的代碼:

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)}

通過 import go.hello.hello 來 import 對應的 go 檔案,檔案裡的 greetings 函數在 java

代碼裡可以通過 hello.greetings 來調用。并不需要太複雜的步驟,在go 函數和 native 的 ui

元素之間就可以建立上綁定關系。

把一個 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 的 bundle,在項目裡可以使用它。

在 xcode 打開例子中的 ios 項目,位于

golanginstalldir/src/golang.org/x/mobile/example/bind/ios/bind.xcodeproj

,把 hello.framework 拖到項目裡,如果需要,選擇”copy items”。目錄結構現在看上去是下面這樣:

使用 Go 進行 iOS 和 Android 程式設計

建構和運作這個應用(更像 android 應用),我們可以看到在 objective-c 代碼裡進行 go 函數的調用。

看一下現在的代碼:

#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");

}

#import “hello/hello.h”導入了之前生成的 framework,textlabel.text = gohellogreetings(@”ios and gopher”);調用了它暴露出的一個函數來設定一個 label 的值。

let msg = hello.gohellogreetings("gopher")

是否值得?

嗯,簡單的說可能是不值得。如果你已經在使用 go 來寫應用了,并且不在乎應用是否 native

的,那麼你可以放開手繼續做,因為你已經知道了建構和部署用 go 寫的 native

應用是很簡單的。如果你打算花更多的精力嘗試一下綁定,你可以走的更遠一些,不過還是需要稍微控制一下。

如果你沒在用 go,那麼就不太值的現在就在開發 native 的移動應用時考慮 go。不過我有很強烈的預感,在不久的将來,go 會成為這方面很有潛力的選擇的。最後歡迎你的建議和意見。

來源:51cto

繼續閱讀