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


関連記事

laravel logo

Laravelでの署名付きURL生成

1 はじめに2 今回のサンプル3 ビュー4 ルーティング5 コントローラー5.1 署名付きURLの生成5.2 期限ありの署名付きURLの生成5.3 署名のチェック6 おまけ6.1 署名の仕組7 さいご ...

Go言語

Go 1.19でGoDocに追加された機能

1 はじめに2 GoDocの機能追加2.1 セクションタイトル(Headings)2.2 リンク2.3 リスト2.4 パッケージの追加3 おまけ4 さいごに5 おすすめ書籍 はじめに 8月2日にGo ...

rails

ShrineでS3に画像をアップロードする

1 はじめに1.1 前提条件1.2 関連記事2 AWS側の準備2.1 S3バケットを作成する2.2 CORSを設定する2.3 アクセス用のユーザを作成する3 Rails側の設定3.1 Initiali ...

docker-syncでファイルの同期を高速化する

1 はじめに2 docker-syncの導入3 設定ファイルの作成3.1 docker-composer.yml3.2 docker-compose-dev.yml3.3 docker-sync.ym ...

rails

Railsで複合主キーのテーブルを扱う

1 はじめに1.1 前提条件2 実装例2.1 config2.2 マイグレーション2.3 モデル3 さいごに はじめに RailsでWebサービスを開発する際のDB設計では基本的にidが主キーになると ...

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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