BackEnd

go:embedとGo 1.16、1.17での変更点まとめ

投稿日:

はじめに

8月16日にGo 1,17がリリースされました。今回の記事では一つ前のバージョンであるGo 1.16とGo 1.17での変更点と、その中でも go:embed について紹介します。

変更点一覧

Go 1.16

  • Apple Silicon対応
  • runtime/metrics パッケージの導入( runtimedebug などのメトリクス収集機能が集約された)
  • go:embed の追加(本稿で紹介)
  • io/fsio/ioutil の非推奨化( io/ioutil パッケージの機能が os パッケージと io パッケージへ移行された)
  • go install の新機能追加(バージョンが指定可能になり、 go.mod の書き換えなしでツールなどがインストール可能になった)
  • single.NotifyContext 関数の追加

Go 1.17

  • コンパイラの高速化
  • go mod 関連(必要な依存関係が全て含まれるように。Goバージョンの更新、上書きが可能になど)
  • go get 関連(モジュール外からのインストール時に警告。 -insecure フラグが使えなくなり、代わりに GOINSECURE を使うように)
  • testing に新機能追加( shuffle オプションの追加。テストコード、ベンチマーク中に環境変数をセットできるようになった)

go:embedとは

go:embed は実行ファイルにファイルを埋め込むことができるようにするパッケージです。

例えば、これまではDBのユーザやパスワードなど情報をTOMLファイルなので形式で保存した場合、実行ファイルと一緒にサーバ上に配置し、 ioioutil で読み込む必要がありましたが、 go:embed を使うことで、実行ファイルを配置するだけよくなります。

go:embedの使い方

基本的な使い方

まずはサンプルコードを見てください。

 

import _ "embed" でパッケージをインポートします。この際、単一のファイルを埋め込むのであれば、先頭に _ をつけてインポートすることが推奨されています。

 

//go:embed xxxx.yyy の形式(xxxx.yyyは埋め込むファイル名)でファイルの場所を記述します。

 

必要な記述はこれだけです。非常に簡単に利用できることがわかったかと思います。

複数のファイルを埋め込む

次に、複数のファイルを埋め込む方法を紹介します。サンプルコードを見てください。

 

import "embed" でパッケージをインポートします(複数のファイルを埋め込む場合は _ をつけないでインポートします)。

 

変数の型は embed.FS とし、ファイル名をスペース区切りですべて記述します(この場合は sample1.txtsample2.txt )。

 

埋め込んだファイルを読み込むには、ReadFile(“xxxx.yyyy”)関数で個別に読み込みます(xxxx.yyyは埋め込むファイル名)

異なるディレクトリのファイルを埋め込む

main.go とは異なるディレクトリにあるファイルを埋め込む事もできます。

ちなみに、カレントディレクトリを示す ./ は不要です。また、 ../ で親ディレクトリに遡って読み込むことはできません。

ディレクトリ内のファイルを一括で埋め込む

ファイル名の指定にはワイルドカードを使うことができ、特定のディレクトリとサブディレクトリが再帰的に埋め込まれます。

埋め込んだファイルにアクセスするには、パスも含めて書く必要があります。

ルートディレクトリ以外のファイルで埋め込む場合

埋め込むファイルは、embedを記述するファイルが有る場所からの相対パスになります。例えば、 libs/hoge.go の中でembedする場合、 libs/ 以下のファイルのみ埋め込むことができます。

テキストファイル以外を埋め込む場合

テキスト以外のファイル(例えばJSON)は、一度 byte型 の配列で読み込んでから Unmarshal するなど、一工夫が必要になります。

go:embedの制限

go:embedでのファイルの埋め込みは、関数の内などのスコープでは行えません。

さいごに

Go 1.16とGo 1.17の変更点のなかで、go:embedについて紹介しました。

おすすめ書籍

スターティングGo言語 (CodeZine BOOKS) 改訂2版 みんなのGo言語

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

js

GoogleAppsScriptを使ってmBaaSの定期実行処理を実装する

1 はじめに1.1 簡単な状況説明1.2 定期実行を行う方法2 実装2.1 実装の流れ2.2 JavaScriptの実装2.3 スクリプトをアップロードする2.4 Google Apps Script ...

rails

はじめてのrails、まずはローカル環境構築してみる

1 はじめに2 必要なライブラリ・ツールのインストール2.1 homebrew, rbenv2.2 rbenv-communal-gems3 最新安定版のrubyをインストール4 bundler, r ...

PHPerだけどKotlinを勉強したって良いよね その2〜コンストラクタ編〜

1 はじめに2 コンストラクタ2.1 プライマリコンストラクタ2.2 セカンダリコンストラクタ2.3 ニックネームのみを入力した人2.4 ニックネームと email を入力した人2.5 Faceboo ...

laravel logo

Laravel N+1検出ツールの紹介

1 はじめに2 インストール3 設定4 通知方法の追加5 テスト6 検知結果6.1 画面上アラート6.2 コンソール6.3 ログファイル7 ちなみに8 さいごに9 おすすめ書籍 はじめに DB利用した ...

laravel logo

LaravelでのDB操作の基礎

1 はじめに2 Eloquent2.1 モデルの定義2.2 モデルの取得2.3 モデルの追加2.4 モデルの更新2.5 モデルの削除2.6 クエリスコープ3 マイグレーション3.1 マイグレーションフ ...

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。