Go PR

Golang × WebAssembly(wasm)入門

Golang × WebAssembly(wasm)入門
記事内に商品プロモーションを含む場合があります

こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。Go言語(Golang)やフロントエンドを勉強中です。

Golang × WebAssemblyについて勉強したので、備忘録も兼ねて本記事を書きます。

WebAssembly(wasm:ワズム)とは

WebAssembly(wasm:ワズム)とは、ブラウザ上で動作するバイナリ形式のことです。

C/C++、Rust、Go言語(Golang)などのプログラムからコンパイルおよびビルドすることで、ブラウザで動作するバイナリコード(*.wasm)を生成することができます。

GolangからJavaScriptを生成

少し脱線しますが、ブラウザ上で動作するアプリをGolang(以下Go)で開発したいなら、GopherJSを使って、GoからJavaScriptを生成するという手もあります。興味ある人は、以下の記事を参考にして下さい。

【GopherJS入門】GoのソースコードからJavaScriptを生成
【GopherJS入門】GoのソースコードからJavaScriptを生成GoのソースコードからJavaScriptを生成できるGopherJSの基本的な使い方を紹介している記事です。複数のサンプルコードも公開しています。...

今回はGoからバイナリコード(*.wasm)を生成して、ブラウザ上で動かしてみます。

スポンサーリンク

Go × WebAssembly(wasm)入門

Goの開発環境構築から説明します。

DockerでGolangの開発環境構築

まずは以下のコマンドで作業ディレクトリ:go-wasmを作成します。

$ mkdir go-wasm

次にDocker HubからGo公式イメージをpullしてきます。

$ docker pull golang:1.20.1

コンテナ起動時に、-vオプションでホストとコンテナ間のシェアディレクトリ(=作業ディレクトリ)を設定して、作業するのが楽です。

$ docker run -v ${pwd}:/go/src/app –name go-wasm -it golang:1.20.1

以下のコマンドでgo.modを作成します。

$ cd src/app
$ go mod init example.com/myapp

以降からはソースコードを書いていきます。

main.go

コンソールに文字列を出力するだけのシンプルなコードが以下です。

以下のコマンドで動作確認しておきます。

$ go run main.go

問題なければGOOS=js,GOARCH=wasmでコンパイル&ビルドして、main.wasmを生成します。

$ GOOS=js GOARCH=wasm go build -o main.wasm main.go

wasm_exec.js

Go公式リポジトリからwasm_exec.jsをダウンロードして、作業ディレクトリに保存します。このjsファイルを使って、main.wasmをブラウザ上で実行します。

index.html

wasm_exec.htmlを参考に、index.htmlを作成します。

最終的な作業ディレクトリの中身は以下の通りです。

動作確認 -VSCode拡張機能のLive Serverでサーバー起動-

最後にローカルサーバーで動作確認をします。VSCode拡張機能のLive Serverを使えば、下記の3ステップでサーバーを起動できます。

Live Serverの基本的な使い方
  1. VSCodeでindex.htmlを開く
  2. 右クリック
  3. Open with Live Serverクリックでサーバー起動

適当なブラウザから http://127.0.0.1:5500/index.html にアクセスすれば、動作確認できます(以下ツイート)。

サーバー止めるときは「右クリック⇒Stop Live Serverクリック」です。

はやぶさ
はやぶさ
ブラウザ上でGoのコードを実行できた!感動した!!

まとめ

Goのコードからwasmを生成してブラウザ上で実行する簡単な例を紹介しました。

はやぶさ
はやぶさ
本記事が Go × WebAssembly(wasm)入門したい人の参考になれば嬉しいです

以下 Goのオススメ書籍を紹介

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python