埋め込みとは何ですか? Go は静的ファイルをロードするためにそれをどのように使用しますか?
この記事は、Golang1.16 で embed を使用して静的ファイルをロードする方法を紹介する go 言語 チュートリアル コラムによって提供されています。
#embed とは
embed は Go 1.16 で追加された新しいパッケージです。 //go:embed
ディレクティブを使用して、コンパイル段階で静的リソース ファイルをコンパイル済みプログラムにパッケージ化し、これらのファイルにアクセスできるようにします。
埋め込みが必要な理由
過去には、他の言語から Go 言語に切り替えた多くの友人が尋ねたり、踏み込んだりしていました。ピット : Go 言語によってパッケージ化されたバイナリ ファイルには、構成ファイルの共同コンパイルとパッケージ化が含まれることが想定されています。
その結果、バイナリ ファイルが移動されると、静的ファイルのリソースを読み取ることができないため、アプリケーションを実行できなくなります。
静的リソースをコンパイルしてバイナリ ファイルにパッケージ化できない場合、通常は 2 つの解決策があります。
- 1 つ目は、そのような静的リソースを特定し、プログラムに従う必要があるかどうかを確認することです。
- 2 つ目は、バイナリ ファイルにパッケージ化することです。
2 番目のケースでは、Go は以前はこれをサポートしていなかったので、誰もが次のようなさまざまな派手なオープン ソース ライブラリを使用することになります。 しかし、Go1.16 以降、Go 言語自体がこの機能を正式にサポートしています。
これには次の利点があります。
- 静的リソースをバイナリ パッケージにパッケージ化でき、デプロイメント プロセスがより簡単になります。
- 従来のデプロイメントでは、コンパイルされたプログラムとともに静的リソースをパッケージ化してアップロードするか、docker と
dockerfile
を使用して前者を自動化する必要がありますが、これは非常に面倒です。 プログラムの整合性を確保します - 。動作中の静的リソースの損傷または損失は、通常、プログラムの通常の動作に影響を与えます。 静的リソースへのアクセスには IO 操作はなく、速度は非常に高速になります。
embed の基本的な使用法公式ドキュメントを通じて、文字列、バイト、FS (ファイル システム) という 3 つの埋め込み方法がわかります。このうち、
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))}
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))}
Go1.16 を embed ## にサポートするには# は新しいパッケージ
io/fs にも追加されました。 2 つを結合すると、以前の通常のファイルと同じように操作できます。 1. 読み取り専用
埋め込まれたコンテンツは読み取り専用です。つまり、コンパイル時の埋め込みファイルの内容は何か、次に実行時の内容は何かということです。 FS ファイル システムの値は、オープンおよび読み取りのメソッドを提供しますが、書き込みメソッドはありません。これは、FS インスタンスがスレッドセーフであり、複数の goroutine を同時に使用できることを意味します。
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 hello2.txtvar f embed.FSfunc main() { data, _ := f.ReadFile("hello.txt") fmt.Println(string(data)) data, _ = f.ReadFile("hello2.txt") fmt.Println(string(data))}
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









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

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

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

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

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

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

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

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