目次
公式ドキュメントを通じて、文字列、バイト、FS (ファイル システム) という 3 つの埋め込み方法がわかります。このうち、" >embed の基本的な使用法公式ドキュメントを通じて、文字列、バイト、FS (ファイル システム) という 3 つの埋め込み方法がわかります。このうち、
FS ファイル システムの値は、オープンおよび読み取りのメソッドを提供しますが、書き込みメソッドはありません。これは、FS インスタンスがスレッドセーフであり、複数の goroutine を同時に使用できることを意味します。 " >埋め込まれたコンテンツは読み取り専用です。つまり、コンパイル時の埋め込みファイルの内容は何か、次に実行時の内容は何かということです。 FS ファイル システムの値は、オープンおよび読み取りのメソッドを提供しますが、書き込みメソッドはありません。これは、FS インスタンスがスレッドセーフであり、複数の goroutine を同時に使用できることを意味します。
ホームページ バックエンド開発 Golang 埋め込みとは何ですか? Go は静的ファイルをロードするためにそれをどのように使用しますか?

埋め込みとは何ですか? Go は静的ファイルをロードするためにそれをどのように使用しますか?

Nov 12, 2021 pm 02:31 PM
golang

この記事は、Golang1.16 で embed を使用して静的ファイルをロードする方法を紹介する go 言語 チュートリアル コラムによって提供されています。

#embed とは

embed は Go 1.16 で追加された新しいパッケージです。 //go:embed ディレクティブを使用して、コンパイル段階で静的リソース ファイルをコンパイル済みプログラムにパッケージ化し、これらのファイルにアクセスできるようにします。

埋め込みが必要な理由

過去には、他の言語から Go 言語に切り替えた多くの友人が尋ねたり、踏み込んだりしていました。ピット : Go 言語によってパッケージ化されたバイナリ ファイルには、構成ファイルの共同コンパイルとパッケージ化が含まれることが想定されています。

その結果、バイナリ ファイルが移動されると、静的ファイルのリソースを読み取ることができないため、アプリケーションを実行できなくなります。

静的リソースをコンパイルしてバイナリ ファイルにパッケージ化できない場合、通常は 2 つの解決策があります。

  • 1 つ目は、そのような静的リソースを特定し、プログラムに従う必要があるかどうかを確認することです。
  • 2 つ目は、バイナリ ファイルにパッケージ化することです。

2 番目のケースでは、Go は以前はこれをサポートしていなかったので、誰もが次のようなさまざまな派手なオープン ソース ライブラリを使用することになります。 しかし、Go1.16 以降、Go 言語自体がこの機能を正式にサポートしています。

これには次の利点があります。

    静的リソースをバイナリ パッケージにパッケージ化でき、デプロイメント プロセスがより簡単になります。
  • 従来のデプロイメントでは、コンパイルされたプログラムとともに静的リソースをパッケージ化してアップロードするか、dockerdockerfile を使用して前者を自動化する必要がありますが、これは非常に面倒です。
  • プログラムの整合性を確保します
  • 。動作中の静的リソースの損傷または損失は、通常、プログラムの通常の動作に影響を与えます。
  • 静的リソースへのアクセスには IO 操作はなく、速度は非常に高速になります。
string

型と []byte 型は 1 つのファイルのみに一致するため、複数のファイルまたはディレクトリに一致させたい場合は、embed.FS# を使用する必要があります。 ## タイプ。 特記事項: 埋め込みパッケージをインポートする必要があります。インポートを使用しない場合は、_ を使用してインポートしてください。

1. として埋め込みます。文字列

たとえば、現在のファイルの下にファイル hello.txt があり、ファイルの内容は

hello,world!
です。

go:embed 命令により、コンパイル後、次のプログラムの s 変数の値は hello,world! になります。

package mainimport (
    _ "embed"
    "fmt")//go:embed hello.txtvar s stringfunc main() {
    fmt.Println(s)}
ログイン後にコピー
2. バイト スライスとして埋め込む

単一ファイルの内容をバイトのスライス (バイト配列) として埋め込むこともできます。

package mainimport (
    _ "embed"
    "fmt")//go:embed hello.txtvar b []bytefunc main() {
    fmt.Println(b)}
ログイン後にコピー

3. fs.FS

として埋め込む ファイル システムとして埋め込むこともでき、複数のファイルを埋め込む場合に非常に便利です。


たとえば、ファイルを埋め込みます:

package mainimport (
    "embed"
    "fmt")//go:embed hello.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data))}
ログイン後にコピー
別のローカル ファイル hello2.txt を埋め込み、同じ変数に対する複数の

go:embed

命令をサポートします (文字列または A として埋め込みます)バイト スライスには複数の

go:embed 命令を含めることはできません):

package mainimport (
    "embed"
    "fmt")//go:embed hello.txt//go:embed hello2.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data))
    data, _ = f.ReadFile("hello2.txt")
    fmt.Println(string(data))}
ログイン後にコピー
ログイン後にコピー
現在繰り返されている go:embed 命令の embed.FS への埋め込みがサポートされています。

package mainimport (
    "embed"
    "fmt")//go:embed hello.txt//go:embed hello.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data))}
ログイン後にコピー
サブフォルダーにファイルを埋め込むこともできます:
package mainimport (
    "embed"
    "fmt")//go:embed p/hello.txt//go:embed p/hello2.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("p/hello.txt")
    fmt.Println(string(data))
    data, _ = f.ReadFile("p/hello2.txt")
    fmt.Println(string(data))}
ログイン後にコピー

embed高度な使用法

Go1.16 を embed ## にサポートするには# は新しいパッケージ

io/fs

にも追加されました。 2 つを結合すると、以前の通常のファイルと同じように操作できます。 1. 読み取り専用

embed.FS 構造には、主に次の 3 つの外部メソッドがあります:

// Open 打开要读取的文件,并返回文件的fs.File结构.func (f FS) Open(name string) (fs.File, error)// ReadDir 读取并返回整个命名目录func (f FS) ReadDir(name string) ([]fs.DirEntry, error)// ReadFile 读取并返回name文件的内容.func (f FS) ReadFile(name string) ([]byte, error)
ログイン後にコピー

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

package mainimport (
    "embed"
    "fmt")//go:embed hello.txt hello2.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data))

    data, _ = f.ReadFile("hello2.txt")
    fmt.Println(string(data))}
ログイン後にコピー
もちろん、前の例のように複数行を記述することもできます go:embed

:
package mainimport (
    "embed"
    "fmt")//go:embed hello.txt//go:embed hello2.txtvar f embed.FSfunc main() {
    data, _ := f.ReadFile("hello.txt")
    fmt.Println(string(data))
    data, _ = f.ReadFile("hello2.txt")
    fmt.Println(string(data))}
ログイン後にコピー
ログイン後にコピー

3. フォルダー分離のサポート

文字は使用しますスラッシュ /

、Windows システムでもこのパターンが使用されます。
package mainimport (
    "embed"
    "fmt")//go:embed pvar f embed.FSfunc main() {
    data, _ := f.ReadFile("p/hello.txt")
    fmt.Println(string(data))
    data, _ = f.ReadFile("p/hello2.txt")
    fmt.Println(string(data))}
ログイン後にコピー

应用

在我们的项目中,是将应用的常用的一些配置写在了.env的一个文件上,所以我们在这里就可以使用go:embed指令。

main.go 文件:

//go:embed ".env" "v1d0/.env"var FS embed.FSfunc main(){
    setting.InitSetting(FS)
    manager.InitManager()
    cron.InitCron()
    routersInit := routers.InitRouter()
    readTimeout := setting.ServerSetting.ReadTimeout
    writeTimeout := setting.ServerSetting.WriteTimeout
    endPoint := fmt.Sprintf(":%d", setting.ServerSetting.HttpPort)
    maxHeaderBytes := 1 << 20
    server := &http.Server{
        Addr:           endPoint,
        Handler:        routersInit,
        ReadTimeout:    readTimeout,
        WriteTimeout:   writeTimeout,
        MaxHeaderBytes: maxHeaderBytes,
    }
    server.ListenAndServe()}
ログイン後にコピー

setting.go文件:

func InitSetting(FS embed.FS) {
    // 总配置处理
    var err error
    data, err := FS.ReadFile(".env")
    if err != nil {
        log.Fatalf("Fail to parse '.env': %v", err)
    }
    cfg, err = ini.Load(data)
    if err != nil {
        log.Fatal(err)
    }
    mapTo("server", ServerSetting)
    ServerSetting.ReadTimeout  = ServerSetting.ReadTimeout * time.Second
    ServerSetting.WriteTimeout = ServerSetting.WriteTimeout * time.Second    // 分版本配置引入
    v1d0Setting.InitSetting(FS)}
ログイン後にコピー

以上が埋め込みとは何ですか? Go は静的ファイルをロードするためにそれをどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Jun 06, 2024 am 11:21 AM

Go データベース接続の接続プーリングを構成するにはどうすればよいですか?データベース接続を作成するには、database/sql パッケージの DB タイプを使用します。同時接続の最大数を制御するには、MaxOpenConns を設定します。アイドル状態の接続の最大数を設定するには、ConnMaxLifetime を設定します。

golangフレームワークの長所と短所の比較 golangフレームワークの長所と短所の比較 Jun 05, 2024 pm 09:32 PM

Go フレームワークは、その高いパフォーマンスと同時実行性の利点で際立っていますが、比較的新しい、開発者エコシステムが小さい、一部の機能が欠けているなどの欠点もあります。さらに、急速な変化と学習曲線はフレームワークごとに異なる場合があります。 Gin フレームワークは、効率的なルーティング、組み込みの JSON サポート、強力なエラー処理機能により、RESTful API を構築するための一般的な選択肢です。

Golang フレームワークと Go フレームワーク: 内部アーキテクチャと外部機能の比較 Golang フレームワークと Go フレームワーク: 内部アーキテクチャと外部機能の比較 Jun 06, 2024 pm 12:37 PM

GoLang フレームワークと Go フレームワークの違いは、内部アーキテクチャと外部機能に反映されています。 GoLang フレームワークは Go 標準ライブラリに基づいてその機能を拡張していますが、Go フレームワークは特定の目的を達成するための独立したライブラリで構成されています。 GoLang フレームワークはより柔軟であり、Go フレームワークは使いやすいです。 GoLang フレームワークはパフォーマンスの点でわずかに優れており、Go フレームワークはよりスケーラブルです。ケース: gin-gonic (Go フレームワーク) は REST API の構築に使用され、Echo (GoLang フレームワーク) は Web アプリケーションの構築に使用されます。

Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Jun 05, 2024 pm 10:39 PM

ベスト プラクティス: 明確に定義されたエラー タイプ (エラー パッケージ) を使用してカスタム エラーを作成する 詳細を提供する エラーを適切にログに記録する エラーを正しく伝播し、非表示または抑制しないようにする コンテキストを追加するために必要に応じてエラーをラップする

GolangでJSONデータをデータベースに保存するにはどうすればよいですか? GolangでJSONデータをデータベースに保存するにはどうすればよいですか? Jun 06, 2024 am 11:24 AM

JSON データは、gjson ライブラリまたは json.Unmarshal 関数を使用して MySQL データベースに保存できます。 gjson ライブラリは、JSON フィールドを解析するための便利なメソッドを提供します。json.Unmarshal 関数には、JSON データをアンマーシャリングするためのターゲット型ポインターが必要です。どちらの方法でも、SQL ステートメントを準備し、データをデータベースに永続化するために挿入操作を実行する必要があります。

golang フレームワークでよくあるセキュリティ問題を解決するにはどうすればよいですか? golang フレームワークでよくあるセキュリティ問題を解決するにはどうすればよいですか? Jun 05, 2024 pm 10:38 PM

Go フレームワークで一般的なセキュリティ問題に対処する方法 Web 開発で Go フレームワークが広く採用されているため、そのセキュリティを確保することが重要です。以下は、一般的なセキュリティ問題を解決するための実践的なガイドであり、サンプル コードも含まれています。 1. SQL インジェクション SQL インジェクション攻撃を防ぐには、プリペアド ステートメントまたはパラメータ化されたクエリを使用します。例: constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

Golang の正規表現に一致する最初の部分文字列を見つけるにはどうすればよいですか? Golang の正規表現に一致する最初の部分文字列を見つけるにはどうすればよいですか? Jun 06, 2024 am 10:51 AM

FindStringSubmatch 関数は、正規表現に一致する最初の部分文字列を検索します。この関数は、最初の要素が一致した文字列全体で、後続の要素が個々の部分文字列である、一致する部分文字列を含むスライスを返します。コード例: regexp.FindStringSubmatch(text,pattern) は、一致する部分文字列のスライスを返します。実際のケース: 電子メール アドレスのドメイン名を照合するために使用できます。たとえば、email:="user@example.com", pattern:=@([^\s]+)$ を使用してドメイン名を照合します。 [1]。

See all articles