使用 Go 進行 iOS 和 Android 程式設計
雖然 Go 並不是一門新語言,不過最近兩年來 Go 還是增加了很多有趣的特性,而且使用這門語言的知名專案的數量也在快速的增長。我寫過一篇文章,介紹了 SitePoint 用到的程式語言,其中提到了移動端的支援,所以我覺得需要研究一下可能性。
我很高興 Android 是支援 Go 語言的,這一方面應該是二者都是 Google 的技術,另一方面恐怕也與開發者希望用 Go 替換 Java 的願望有關。
開始
你需要安裝 Golang 1.5+。
接下來需要安裝 GoMobile 工具,用於編譯和執行 Android 和 iOS 的應用:
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
部署到裝置
跟 Android 不一樣,對於 iOS 來說沒有一個統一的部署命令,你需要用你熟知的方式把包拷貝到裝置或者模擬器上,例如使用 ios-deploy 工具。
可以用上面的步驟,試試 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
如果使用 Android Studio,可以匯入專案 GoLangInstalldir/src/golang.org/x/mobile/example/bind/android,開啟 build.grade (hello 模組)檔案,更新一下 GOPATH 和 GO 的路徑,下面是我的檔案內容(我是用 Homebrew 安裝的 GoLang):
同步 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)}
通過 import go.hello.Hello 來 import 對應的 go 檔案,檔案裡的 Greetings 函式在 Java 程式碼裡可以通過 Hello.Greetings 來呼叫。並不需要太複雜的步驟,在go 函式和 native 的 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 的 bundle,在專案裡可以使用它。
在 Xcode 開啟例子中的 iOS 專案,位於 GoLangInstalldir/src/golang.org/x/mobile/example/bind/ios/bind.xcodeproj ,把 Hello.framework 拖到專案裡,如果需要,選擇”Copy items”。目錄結構現在看上去是下面這樣:
構建和執行這個應用(更像 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"); } @end
#import “hello/Hello.h”匯入了之前生成的 framework,textLabel.text = GoHelloGreetings(@”iOS and Gopher”);呼叫了它暴露出的一個函式來設定一個 label 的值。
也可以使用同樣是自動生成的基於 Swift 的專案裡的 Objective-C 的 framework,像下面這樣:
let msg = Hello.GoHelloGreetings("gopher")
是否值得?
嗯,簡單的說可能是不值得。如果你已經在使用 Go 來寫應用了,並且不在乎應用是否 native 的,那麼你可以放開手繼續做,因為你已經知道了構建和部署用 Go 寫的 native 應用是很簡單的。如果你打算花更多的精力嘗試一下繫結,你可以走的更遠一些,不過還是需要稍微控制一下。
如果你沒在用 Go,那麼就不太值的現在就在開發 native 的移動應用時考慮 Go。不過我有很強烈的預感,在不久的將來,Go 會成為這方面很有潛力的選擇的。最後歡迎你的建議和意見。
相關文章
- 使用 JSBridge 與原生 IOS、Android 進行互動(含 H5、Android、IOS 端程式碼,附 Demo)JSiOSAndroidH5
- 使用 VS Code 進行 Python 程式設計Python程式設計
- 快速使用 vscode 進行 Java 程式設計VSCodeJava程式設計
- 使用Cassandra進行.Net程式設計NY程式設計
- 使用Visual Studio Code進行MicroPython程式設計Python程式設計
- iOS多執行緒程式設計三:Operation和OperationQueueiOS執行緒程式設計
- python教程:使用 async 和 await 協程進行併發程式設計PythonAI程式設計
- iOS進階課程-Newsstand程式設計iOS程式設計
- android和java程式設計師使用web3j進行區塊鏈以太坊開發詳解AndroidJava程式設計師Web區塊鏈
- Go進階之網路程式設計Go程式設計
- 【Go進階—併發程式設計】ContextGo程式設計Context
- 【Go進階—併發程式設計】WaitGroupGo程式設計AI
- 【Go進階—併發程式設計】MutexGo程式設計Mutex
- 美顏SDK如何進行Android和iOS雙端開發?AndroidiOS
- 使用Java 9 Flow進行響應式程式設計Java程式設計
- 譯:原生iOS應用程式和原生Android應用程式設計之間的差異iOSAndroid程式設計
- 十.Go併發程式設計--channel使用Go程式設計
- iOS開發-多執行緒程式設計iOS執行緒程式設計
- 【go網路程式設計】-HTTP程式設計Go程式設計HTTP
- Go併發程式設計--正確使用goroutineGo程式設計
- 【Go併發程式設計】Goroutine的基本使用Go程式設計
- go程式設計題Go程式設計
- [譯] iOS 設計模式進階iOS設計模式
- Android 網路程式設計系列(4)使用 HttpUrlConnectionAndroid程式設計HTTP
- 六、GO 程式設計模式:GO GENERATIONGo程式設計設計模式
- 十、GO程式設計模式 : 泛型程式設計Go程式設計設計模式泛型
- Shell程式設計-建立和執行程式設計
- 在Javascript中進行面向切面程式設計JavaScript程式設計
- Go程式設計基礎Go程式設計
- Go程式設計實踐Go程式設計
- Go 併發程式設計Go程式設計
- 對iOS端支付寶和微信支付程式碼進行整合iOS
- 使用React Native和Expo快速構建原生移動iOS和Android應用程式React NativeiOSAndroid
- android程式和執行緒Android執行緒
- [java設計模式]單例設計模式,程式也要進行計劃生育。Java設計模式單例
- Go Web 程式設計--使用 bcrpyt 雜湊使用者密碼GoWeb程式設計密碼
- 使用 Go 泛型的函數語言程式設計Go泛型函數程式設計
- 積夢高薪大量招聘 Go 和 React 程式設計師高薪GoReact程式設計師
- 一、Go程式設計模式:切片,介面,時間和效能Go程式設計設計模式