Статьи

Программирование на iOS и Android с помощью Go

Хотя язык Go не является новым, за последние два года он вызвал большой интерес, и число крупных проектов, использующих этот язык, быстро растет. Я написал вступительную статью по языку для SitePoint и наткнулся на упоминания о мобильной поддержке, поэтому подумал, что я взгляну на возможности.

Я был очень взволнован, увидев, что такое поддержка Go в Android, так как они обе являются технологиями Google, и от разработчиков была громогласная поддержка языка для замены Java.

Начиная

Вам понадобится GoLang 1.5+ .

Затем установите инструмент GoMobile , который компилирует и запускает уже существующие приложения Go для Android и iOS:

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

Мы будем ссылаться на примеры приложений, поставляемых с пакетом gomobile в GoLang Install dir / src / golang.org / x / mobile / example /. Если они не установлены, загрузите их с помощью этой команды:

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

Сборка и установка приложения Native Go

Для многих случаев использования приложения может подойти компиляция Go в собственное приложение и игнорирование библиотек и интерфейсов платформы. Если это так, то просто скомпилировать существующий код Go с подмножеством доступных функций. Это включает:

  • Контроль и настройка приложений
  • OpenGL ES 2 привязки
  • Управление активами
  • Управление событиями
  • Экспериментальные пакеты включают в себя привязки OpenAL, аудио, шрифты, спрайты и датчики движения

Мы будем использовать один из уже существующих примеров 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 

Развернуть на устройстве

Не существует эквивалентной команды для развертывания на iOS, как на Android, поэтому после создания приложения, приведенного выше, вам придется следовать своему личному любимому способу копирования на устройство или эмулятор, например, инструмент ios-deploy .

Для чего-то более захватывающего, также попробуйте шаги выше с примером golang.org/x/mobile/example/audio .

Давайте посмотрим на аудио-пример (я не буду воспроизводить полный код здесь), и вам не нужно быть слишком знакомым с GoLang (я не знаю), это больше о взгляде на то, что возможно.

Сначала вы видите набор операторов импорта:

 import ( ... "golang.org/x/mobile/app" "golang.org/x/mobile/asset" ... ) 

Если вы покопаетесь в папках и файлах, импортированных в GoLang Install dir / src / golang.org / x / mobile / *, вы заметите различные файлы Java и Objective-C, скомпилированные с вашим кодом.

glctx вы увидите ссылки на некоторые классы, импортированные и используемые в коде, такие как app и glctx .

Собираюсь родной

Мы можем кодировать на Go и создавать компактное и оптимизированное нативное приложение, но сейчас оно не очень «родное», поскольку все необходимые библиотеки поддержки доступны только в Java и Objective-C / Swift. Как мы можем улучшить этот опыт?

Команда Go Mobile создала еще одну опцию, используя пакеты go (ваши приложения) внутри собственного приложения. Идеально подходит для обмена общим кодом Go и привязки к нативному коду. Это легко начать, но может быть сложно поддерживать в долгосрочной перспективе.

Android

Если вы используете Android Studio, импортируйте эталонный проект из GoLang. Установите dir / src / golang.org / x / mobile / example / bind / android и откройте файл build.grade (Module: hello), чтобы обновить ваши GOPATH и GO пути, вот мои (я установил GoLang с Homebrew):

пути

Синхронизируйте 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 / х / мобильный / пример / привязка / Привет / hello.go

 package hello import "fmt" func Greetings(name string) string { return fmt.Sprintf("Hello, %s!", name) } 

Файл go импортируется с помощью import go.hello.Hello а функция Greetings в нем доступна в файле Java через Hello.Greetings . При не слишком большом количестве дополнительных шагов возможна привязка между функциями go и собственными элементами пользовательского интерфейса.

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 в текущей папке, который мы можем использовать в нашем проекте.

Откройте образец проекта iOS, найденный на GoLang. Установите dir / src / golang.org / x / mobile / example / bind / ios / bind.xcodeproj в Xcode и перетащите Hello.framework в проект, отметив при необходимости пункт Копировать элементы . Это должно привести к следующей структуре папок:

Перейти в Xcode

Создайте и запустите приложение, которое, как и приложение 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"); вызывает выставляемую функцию для установки переменной метки.

Можно использовать тот же автоматически сгенерированный файл Objective-C в проекте на основе Swift, а затем использовать что-то вроде:

 let msg = Hello.GoHelloGreetings("gopher") 

Стоит ли оно того?

Ну короче наверное нет. Если вы уже программируете свои приложения на Go и у вас все в порядке с интерфейсами, не похожими на нативные, то вас ничто не остановит, поскольку вы можете легко создавать и развертывать нативные приложения, написанные на Go. Если вы готовы предпринять дополнительные шаги, чтобы следовать обязательному варианту, вы можете пойти еще дальше, но все же с определенными ограничениями.

Если вы не используете Go, то, скорее всего, пока не стоит рассматривать его как вариант для собственного программирования. Но я по-прежнему твердо убежден, что в недалеком будущем достаточно потенциала и интереса, чтобы сделать это возможным, и, конечно же, хотелось бы услышать ваше мнение ниже.