**前一篇**介绍了用React-Native做跨平台开发,其实Golang在1.5发布以后也是支持做移动端的跨平台开发的,Golang的移动端开发支持两种模式,一种是使用Golang开发整个应用,另外一种便是使用Golang开发common library。这两种各有优缺点,前者没有完善的UI库,如用来开发一个完整的应用需要的工作量着实有点不小,或者用来开发游戏可能也是一个不错的选择,亦或者寄望于Google可以开发出完善的UI库,至于后者想对于前者就方便多了,Google的GoMobile项目已经完善了大部分的工作,现在的缺点就是支持的数据类型还是远远不够,而且现只支持ARM架构。所以现阶段二者都还有些限制,但是作为一个跨平台的备选方案还是有其可取之处的。

How it works
gobindgobind
package mypkg

type Counter struct {
	Value int
}

func (c *Counter) Inc() { c.Value++ }

func New() *Counter { return &Counter{ 5 } }

生成的Java Bindings是

public abstract class Mypkg {
	private Mypkg() {}
	public static final class Counter {
		public void Inc();
		public long GetValue();
		public void SetValue(long value);
	}
	public static Counter New();
}

Objective-C 代码如下:

@class GoMypkgCounter;

@interface GoMypkgCounter : NSObject {
}

@property(strong, readonly) GoSeqRef *ref;
- (void)Inc;
- (int64_t)Value;
- (void)setValue:(int64_t)v;
@end

FOUNDATION_EXPORT GoMypkgCounter* GoMypkgNewCounter();

其实简单的来说就是将Golang翻译成Java和Objective-C,只不过bindings只是提供访问Golang编译后的二进制文件的接口。

How to build it
test.go
package mypkg
type Counter struct {
	Value int
}
func (c *Counter) Inc() { c.Value++ }
func New() *Counter { return &Counter{ 5 } }
ANDROID_HOME=your_android_sdk_path gomobile bind -target=android -o file_path_for_android_library.aar -v test.gofile_path_for_android_library.aar.so.jniJava bindings classesaar
Counter c = Mypkg.New();
c.Inc();
c.GetValue();
gomobile bind -target=iOS -o file_path_for_android_library.framework -v test.gofile_path_for_android_library.framework
GoMypkgCounter *c = [GoMypkgCounter init];
c.Inc();
c.Value();