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 パッケージの導入( runtime や debug などのメトリクス収集機能が集約された)
  • go:embed の追加(本稿で紹介)
  • io/fs と io/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ファイルなので形式で保存した場合、実行ファイルと一緒にサーバ上に配置し、 io や ioutil で読み込む必要がありましたが、 go:embed を使うことで、実行ファイルを配置するだけよくなります。

go:embedの使い方

基本的な使い方

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

 

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

 

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

 

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

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

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

 

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

 

変数の型は embed.FS とし、ファイル名をスペース区切りですべて記述します(この場合は sample1.txt と sample2.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


関連記事

[Dialogflow + CF] アクア様が罵倒してくれたり天気を教えてくれるSlackボットを作る

はじめに このすば、面白いですよね。 あまりアニメは見ない私ですが、このすばは全部見ました。 OVAか何かで続編があるみたいなので、期待したいです。 アニメ『この素晴らしい世界に祝福を!2』公式サイト ...

Kotlinでのnullの基本的な扱いかた

はじめに こんにちは。今回は改めてKotlinでのnullの扱いについての基本をまとめます。 曖昧な理解のままAndroidStudioの補完に頼りきりでしたので、基本的な書き方を網羅することで、Ko ...

aws

AWS BatchはSaaSの非同期処理に向いているか?

はじめに 今回は、AWS Batchを実際に構築し、SaaSの非同期処理に向いているか検証したいと思います。 AWS Batchの要素 コンピューティング環境 ジョブの実行環境を定義します。実行環境と ...

Go言語

sqlcを使ってSQLファイルからGoのコードを生成する

はじめに Goでデータベースにアクセスする場合、様々なやり方(ORMを使う、クエリを直接書いて実行する等)がありますが、それぞれ良さと辛みがあると思います。 個人的には、RailsのActiveRec ...

php logo

PHP入門 〜文字列と数値の操作〜

はじめに 普段、私はRailsでサーバサイドの開発をしているのですが、業務でPHPの開発をすることになりそうなので勉強をはじめました。これから何回かに渡ってPHPの入門記事を書いていこうと思います。 ...

フォロー

blog-page_side_responsive

2021年9月
日 月 火 水 木 金 土
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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