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言語

page_footer_responsive




-BackEnd
-

執筆者:

         

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

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

CAPTCHA


関連記事

Go言語

Go言語で使えるmigrationライブラリ

1 はじめに2 migrationライブラリ2.1 goose2.2 sql-migrate2.3 migu2.4 pop2.5 sqldef3 sqldefを使ってみる3.1 導入3.2 テーブルを ...

laravel logo

[Laravel]データベースの暗号化について考えてみる

1 はじめに2 環境3 Laravelでの暗号化4 暗号化されたカラムは、そのままではLIKE検索ができない4.1 問題点4.2 解決案1:全件取得してPHP側でがんばって検索する4.3 解決案2:暗 ...

rails

Shrineを使って画像をアップロードする

1 はじめに2 Shrineとは2.1 簡単な説明2.2 作者2.3 特徴3 下準備3.1 Gemを追加3.2 初期設定3.3 テーブルを作成する4 実装4.1 Uploaderの実装4.2 Mode ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

aws

CodeWhispererを使ってみた

1 はじめに2 CodeWhispererとは3 導入4 使い方5 データの取り扱い6 さいごに7 おすすめ書籍 はじめに AWSからコード生成サービスのCodeWhispererが一般公開されたので ...

フォロー

follow us in feedly

blog-page_side_responsive

2021年9月
 1234
567891011
12131415161718
19202122232425
2627282930  

アプリ情報

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