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


関連記事

【Ruby Advent Calender 2017】Rubyでスクレイピングをしてみる【11日目】

1 はじめに1.1 概要2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 他のサイトの記事でも試してみ ...

rails

Rails5で出力される「alias_method_chain is deprecated.」について

1 はじめに2 alias_method_chainとは3 Module#prependとは4 とりあえず、DEPRECATION WARNINGの出力をなくしたい5 さいごに はじめに 直近のプロジ ...

rails

RailsでAjax処理で画面を更新する

1 はじめに2 View(遷移元)の設定3 Controllerの実装4 View(遷移先)の実装5 参考6 さいごに はじめに RailsでAjax処理で画面を更新する方法を簡単に紹介します。 Vi ...

Go言語

Go言語、ゴルーチン(goroutine)で並列処理を

1 はじめに2 ゴルーチン2.1 go文2.2 ゴルーチンの終了条件2.3 WaitGroup3 チャネル3.1 チャネルの型3.2 チャネルの生成3.3 チャネルの送受信3.4 チャネルとゴルーチン ...

rails

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

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

フォロー

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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