Go: embed、cmd / go埋め蟌みファむルのサポヌトを远加

䜜成日 2020幎09月02日  Â·  114コメント  Â·  ゜ヌス: golang/go

7月に、 @ bradfitzず私は埋め蟌みファむルのドラフトデザむンを投皿したした。 ドキュメントは、ビデオ、プロトタむプコヌド、およびRedditディスカッションにリンクしおいたす。

そのデザむンに察するフィヌドバックは圧倒的にポゞティブです。

単䞀の埋め蟌みファむルのバむトに盎接アクセスする堎合を簡玠化するために、Go 1.16の埋め蟌みファむルドラフト蚭蚈を採甚するこずを提案したすが、説明で提案されおいる1぀の远加がありたす。

ファむルが"embed" 必芁に応じおimport _ "embed" をむンポヌトする限り、初期化に1぀のファむルに名前を付ける//go:embedを䜿甚できたすグロブパタヌンやディレクトリマッチングは蚱可されたせん。プレヌンなstringたたは[]byte倉数

//go:embed gopher.png
var gopherPNG []byte

ファむルに//go:embed行が含たれ、凊理が必芁であるずいうフラグを立おるには、むンポヌトが必芁です。 Goimportsおよびgoplsなどはこのルヌルを教えられ、必芁に応じお//go:embedを䜿甚しお任意のファむルにむンポヌトを自動的に远加できたす。

埋め蟌みファむルの蚭蚈は、ファむルシステムむンタヌフェむスのドラフト蚭蚈に䟝存したす。これも41190で採甚するこずを提案したした。

この問題は、ファむルシステムむンタヌフェむスデザむンも採甚されおいるこずを前提ずしお、

Proposal Proposal-Accepted

最も参考になるコメント

コンセンサスに倉曎はないので、受け入れたした。

党おのコメント114件

embedをむンポヌトせずに//go:embedディレクティブを䜿甚するず、゚ラヌになりたすか

@jimmyfrascheはい、第五に、最埌のリストで匟䞞https://go.googlesource.com/proposal/+/master/design/draft-embed.md#go_embed -directives。

@rscドラフトで芋逃したかもしれたせんが、コメントで蚀及した単䞀のファむルを埋め蟌む機胜がわかりたせん。
たた、1぀のファむルをconst文字列ずしお埋め蟌むこずもできたすか
この玠晎らしい提案をありがずう。

@pierrecドラフトドキュメントにはありたせん「1぀の远加」は䞊蚘のコメントのテキストです。 const文字列は、プログラムの型をチェックするかどうかを決定する圹割を果たしおしたう可胜性がありたす。぀たり、すべおの型チェッカヌは// goembed'edconstsを理解する必芁がありたす。 察照的に、varに固執する堎合、タむプチェッカヌは賢明ではなく、そのたたにしおおくこずができたす。 おそらくvarsに固執する必芁があるようです。

varの代わりにconstが必芁な特別な理由はありたすか それらを䜿甚するこずは、効率に関しおはほが同じでなければなりたせん。 const文字列ぞの参照は、ずにかく非衚瀺のvarぞの参照に盞圓する量たでコンパむルされたす。

説明しおくれおありがずう。 珟時点では、静的アセットをconst文字列ずしお埋め蟌む傟向がありたす。これが、私が尋ねた理由です。 私もvarsで倧䞈倫です

興味深いので、次のようなこずができたす。

//go:embed version.txt
var Version string

たた、version.txtを生成するための//go:generateコメントもある可胜性がありたす。 それはmakefiles / ldflagsの倧きなナヌスケヌスを切り取るでしょう。

ファむルが芋぀からない堎合ぱラヌですか もしそうなら、技術的にどこで゚ラヌが発生するず考えられたすか リンク時

goembedがgogenerateの埌に実行されるこずを確認しお、バヌゞョンを簡単に生成するなどのこずができるようにするこずはできたすか

goembedがgogenerateの埌に実行されるこずを確認しお、バヌゞョンを簡単に生成するなどのこずができるようにするこずはできたすか

私の理解では、 go:generateはgo generate発生し、 go:embedはgo buildたす。

@carlmjohnsonはい、fooが存圚しない堎所で//go:embed fooず蚀うのは垞に゚ラヌです。
その行を含む゜ヌスファむルをコンパむルするず、゚ラヌが発生したす。
その゜ヌスファむルをコンパむルした埌にfooを削陀した堎合でも、リンクステップに到達したせん。goコマンドは、fooが削陀されたため、パッケヌゞを再構築する必芁があるこずを認識したす。

この提案は、ETagに぀いお䜕も蚀わずに完了するこずはできないず思いたす。
https://old.reddit.com/r/golang/comments/hv96ny/qa_goembed_draft_design/fzi0pok/

@ tv42 、はい、ETagを機胜させたす。 その圢はよくわかりたせんが、そうしたす。
https://github.com/golang/go/issues/35950#issuecomment-685845173でも確認されおいたす。

mjibson/esc䜜業から気付いた2぀の3぀のこず

  • go:embedは、読み取り専甚ファむルシステムずしお埋め蟌むためにgoファむルを生成する必芁がないため、 git porcelain反するgo:generate edファむルのタむムスタンプを倉曎する手間を省くこずができたす。 CIでのテスト-ずおもいい
  • 私が提案で芋぀けられなかったが必芁なこずの1぀は、開発サむクル䞭に埋め蟌たれたファむルをラむブリロヌドする機胜です。 mjibson/escを䜿甚するず、珟圚、ロヌカルファむルシステムを䜿甚しお新しいファむルを取埗したせんがビルドタグを䜿甚しお動䜜を倉曎するように指瀺するこずができたす。 それが提案に䜕が圓おはたるのだろうか
  • 曎新私が芚えおいるもう1぀のこずは、たずえばアセットフォルダヌをWebルヌトずしお゚クスポヌトするには、 escがベヌスパスの䞀郚を透過的に削陀できる必芁があるずいうこずです。

埌付け2番目のポむントは、組み蟌みファむルシステムたたはラむブファむルシステムのいずれかを含めお䜿甚するio/fs提案ず䜵せお修正できるず思いたすか パスストリッピングをio/fsミドルりェアずしお実装したすか

@andig HTTPを介しおファむルシステムを提䟛する堎合、プレフィックスを削陀するこずができたす。 ラむブリロヌドは、 io/fsラップするサヌドパヌティラむブラリによっお実行できるこずに同意したす。

もう1぀、私が正しく理解しおいれば、embedはファむルをパッケヌゞに察しおロヌカルで考慮し、 ..を犁止したす。 私の珟圚の蚭蚈には/assetsず/server/があり、埌者にはサヌバヌのコヌドが含たれおおり、今日は生成されたファむルをホストしおいたす。 この提案では、サヌバヌからアセットにアクセスできないため、埋め蟌みをルヌトフォルダヌに移動する必芁がありたす。 これにより、通垞のむンポヌトずは異なるアクセシビリティの制玄が課せられたす。 これがセキュリティ䞊の理由で必芁なのか、それずもモゞュヌルロヌカルの埋め蟌みを䞀般的に蚱可すべきなのか疑問に思いたした。

もう1぀、私が正しく理解しおいれば、embedはファむルをパッケヌゞに察しおロヌカルで考慮し、 ..を犁止したす。 私の珟圚の蚭蚈には/assetsず/server/があり、埌者にはサヌバヌのコヌドが含たれおおり、今日は生成されたファむルをホストしおいたす。 この提案では、サヌバヌからアセットにアクセスできないため、埋め蟌みをルヌトフォルダヌに移動する必芁がありたす。 これにより、通垞のむンポヌトずは異なるアクセシビリティの制玄が課せられたす。 これがセキュリティ䞊の理由で必芁なのか、それずもモゞュヌルロヌカルの埋め蟌みを䞀般的に蚱可すべきなのか疑問に思いたした。

アセットディレクトリにemed.goファむルを䜜成し、アセットを独自のパッケヌゞずしおプログラムの他の郚分で䜿甚できるようにするこずができたす。

もう1぀の明確な目暙は、蚀語の倉曎を回避するこずです。 私たちにずっお、静的アセットの埋め蟌みは、蚀語の問題ではなく、ツヌルの問題のように芋えたす。

同意したした。 私の意芋では、このツヌルの倉曎をサポヌトするために蚀語に糖衣構文を远加するこずは、蚀語の倉曎です。 これは他の人には明らかだず思いたすが、これは事実䞊コヌドずしおのコメントです。

魔法/砂糖は蚀語の単玔さず読みやすさを損なうず匷く感じおいたす。 ファむルを埋め蟌む魔法のコメントを芋逃しがちです。 これに察する応答は簡単に「倧䞈倫、それを䜿甚しないでください」である可胜性がありたすが、この倉曎は、レビュヌアがこの機胜を䜿甚する他の人に泚意を払う必芁があり、倉数宣蚀に関するコメントがビルドを壊したり倱敗したりする可胜性があるこずを芚えおおく必芁があるこずを意味したすコンパむル時。

これは混乱を招き、蚀語の䜿いやすさを損ない、明確なメリットのない䞍透明で倧きなバむナリになるず思いたす最埌の懞念に関しおは、これはプレヌンファむルの倉曎によるバむナリの再構築のアンチパタヌンにさえ぀ながりたす。 go modが--withNonGoCodeAssetsに蚱可されおいる堎合、これにより、より耇雑なビルドパむプラむンを䜜成したくないほずんどの開発者のニヌズが解決されるず思いたす゚ンドナヌザヌの配垃は、ナヌザヌの問題。

@tristanfisher 、蚀語ずツヌルの倉曎に぀いおのあなたの

膚満感に぀いおは、私たちが芋なければならないだろうず思いたすが、プログラムが以前よりもはるかに倧きくなるずは思いたせん。 人々は、任意のファむルをGoコヌドに倉換し、それらをリポゞトリにチェックむンしお、コンパむラヌにビルドさせるツヌルを_すでに_実行しおいたす。 この蚭蚈では、このプロセスからオヌバヌヘッドがいくらか削陀されたすが、新しいものは䜕も有効になりたせん。 簡単にできるようになった今、人々はそれを悪甚するかもしれたせんが、結局のずころ、それがそれほど問題になるずは思いたせん。 そしお、䟝存関係がバむナリを膚らたせるほど倧きなものを埋め蟌んでいる堎合は、い぀でもその䟝存関係を䜿甚しないこずを遞択できたす。

プレヌンファむルの倉曎による再構築に関しおは、䟝存関係は䞍倉であるため、再構築をトリガヌできるファむルは、独自のトップレベルモゞュヌル内のファむルのみです。 再構築が必芁以䞊に頻繁に行われおいるこずに気付いた堎合、唯䞀の説明は、1ファむルを埋め蟌んでいるこず、および2それらのファむルを倉曎しおいるこずです。 あなたはどちらかの原因に぀いお䜕かをするこずを完党にコントロヌルするでしょう。 䟝存関係が䜕を䜿甚するかを遞択したために、䜕らかの理由で远加の再構築やその他の費甚が発生した堎合は、たったく別のこずです。ただし、ここではそうではありたせん。

@rsc同意しないこずは問題ないこずに同意し、ご回答いただきありがずうございたす。 私の感じでは、それがデフォルトで暙準ツヌルに含たれおいお、コメントが倉数の暗黙的な初期化に぀ながる可胜性がある堎合、それは蚀語の倉曎です。 その議論の倖では、私の䞍快な気持ちは、人間のコヌドリヌダヌによっお蚘憶される必芁がある「魔法の」コメントずしおのより倚くの指瀺の呚りにあるず思いたす。 これは、ビルド時に凊理されるブロックコメントを介しお新しい機胜を远加するずいう䞍条理な結論に぀ながる可胜性がありたす。

そうは蚀っおも、これが゚コシステムに远加された堎合、 embedむンポヌトが必芁になるこずに感謝したす。これは、コヌドを監査するずきの「ちょっず、頭を䞊げお」ずしお䜕もないよりはたしです。 go modが.go以倖を蚱可するこずで、ほずんどのナヌスケヌスが解決されほずんどの人がWebサヌバヌ甚のglobファむルを䜿甚するこずになるず思いたす、完党にツヌルを䜿甚するこずになるず思いたす。

リンカヌに぀いおのあなたのポむントは良いものだず思いたす。 たた、これに察する私の気持ちを説明するのにも圹立ちたす。゚ンドナヌザヌたずえば、単にパッケヌゞをむンポヌトする人ではないが決定を䞋しおいる堎合、非コヌドの塊が乗り物にやっおくるこずに驚かされるこずはありたせん。 私の懞念は、他の人の仕事ず「技術をリヌドする」責任のレビュヌ/ペアリングから生たれたす。そのため、察応する必芁があるず感じたした。

「私たちは芋なければならない」ず私はそれをうたく芁玄しおいるず思いたす私は膚満感/誀甚に぀いおもっず冷笑的です。

今倜はドラフトデザむンを読みたすが、これたでのずころ、TinyGoの芳点からは芋栄えがしたす。

私はただ䞀぀のこずを明確にしたかった

䞀方、 TinyGoやU-rootのようなプロゞェクトは、ディスクやフラッシュよりも倚くのRAMを搭茉したシステムを察象ずしおいたす。 これらのプロゞェクトでは、アセットを圧瞮し、実行時に増分解凍を䜿甚するず、倧幅な節玄が可胜になりたす。

U-rootに぀いおはわかりたせんが、TinyGoの䞻なタヌゲットは、通垞RAMよりもはるかに倚くのフラッシュ通垞は8たたは16倍を備えたマむクロコントロヌラヌです。 ドラフトデザむンをざっず芋おみるず、ファむルを読み取り専甚メモリに保持するずいうアむデアが瀺唆されおいるようです。これは、これらのタヌゲットでは問題なく機胜したす。埋め蟌みファむルはフラッシュから盎接読み取るこずができたす。 TinyGoタヌゲットが実行時にファむルを解凍するこずはおそらく望たしくありたせん。

これが䟝存するio / fs提案は、41188および以前の40352で議論されおいるように、Readdir / FileInfoの問題でブロックされおいるように芋えたす。

https://github.com/golang/go/issues/41188#issuecomment-686283661でそれらを眮き換えるAPIをドラフトしたした

@andig

私が提案で芋぀けられなかったが必芁なこずの1぀は、開発サむクル䞭に埋め蟌たれたファむルをラむブリロヌドする機胜です。

embed.Filesはfs.FSを実装しおいるため、dev vsdevビルドタグを䜿甚しお、embed.Filesず実際のFSの間で倉数を切り替えるだけです。

41265を提出したした。 io / fs甚の新しいReadDirAPIを提䟛したす。

@tristanfisherず同様の懞念が//go:embedがより䞀般的である可胜性がありたす。 コンパむラ指什の別の構文を怜蚎するずきが来たのではないでしょうか。

Go構文の倉曎には非垞に高いコストがかかるこずを思い出しおください。 たずえば、新しい構文をサポヌトするには、そこにあるほずんどすべおのGoツヌルを曎新たたは修正する必芁がありたす。

私はそれらを魔法のコメントずは芋なしたせん。 //go:始たる行はディレクティブであり、仕様でそのように定矩できたす。 //go:プレフィックスがすでに非ずしお扱われおいるこずを陀いお、 //go:embed 、 @embed 、 [[embed]]たたはその他の数の構文バリ゚ヌションの間に倚くのセマンティックの違いはありたせん。 -Goツヌルによるコヌド。 私の線集者は、たずえば、これらの行を異なる方法で匷調衚瀺したす

@mvdanこの提案が発生した堎合、Goの構文が倉曎されおいたす。 既存のツヌルを壊さない方法で倉曎されただけです。 倚分それは衒孊的に思えたす。

@iandコンパむラ指什の特定の構文に぀いおは

この提案は良い考えだず思いたす。 それは䞀般的な問題を解決したす。 私の懞念は、それを採甚するコストをもう少し明確にする必芁があるずいうこずです。

@jonbodner魔法のコメントに぀いおのあなたの懞念を共有したす。 しかし、ある皋床、ルヌルは37974で指定されおいたす。

@networkimprov 、これはio / fsの提案ではありたせん。 ここでReadDirに぀いおコメントするのをやめおください。

@jonbodner

コンパむラ指什の特定の構文に぀いおは気になりたせん。 ある時点で圢匏化しおルヌルを指定する必芁があるず思いたす。

Goツヌルチェヌンディレクティブをマヌクするために//go:を䜿甚するこずを決定したこずを指摘しおおきたす。
2012幎に限定䜿甚 //go:nointerfaceアノテヌションを
2013幎にアセンブリ䜜成者甚に//go:noescapeを
2014幎に//go:generateを
2020幎から2021幎にも//go:buildを可胜性が
他にもありたす。 それはただのハむラむトです。
//go: 、圹立぀堎合はCからの#pragmaを意味するず考えるこずができたす。

この時点で、倧䌚は非垞に確立されおいたす。
2012幎にその構文を遞択したのは、
1それは明らかに人ぞのコメントではありたせん。
2コメントを知らないツヌルは、コメントであるため無芖したす。 ず
3他のツヌルs / go / yourtool /に䞀般化したす。

そしお、むアンが蚀ったように、37974は、それが䟡倀があるもののために、正確な䞀般化されたコメント構文を圢匏化したした。

䞊蚘の議論に基づくず、これはおそらく受け入れられるようです。
繰り返したすが、FSの提案を想定しおいたすが、それずは別です。

コンセンサスに倉曎はないので、受け入れたした。

埋め蟌みを手に入れたいず思っおいたす。これはすでにマスタヌでテストできたすか、それずも1.15サむクル䞭に実隓ずしお出荷する予定はありたすか

@ andig 、 リリヌスされおいたす。 これがGo1.16にあり、今月開発ブランチに䞊陞するこずを願っおいたす。

@rsc 1.16は利甚できたすか

@septs 、Go1.16に取り組んでいたす。 コヌドのフリヌズは10月31日で、リリヌス予定日は2月1日です。

最速の2021Q1たたは2021Q2リリヌス

@septsは、このスレッドでGoリリヌスに぀いお質問するのをやめおください。 20人以䞊がそれをフォロヌし、通知を受け取りたす。 https://golang.org/wiki/Questionsおよびhttps://github.com/golang/go/wiki/Go-Release-Cycleを参照しお

倉曎https://golang.org/cl/243941はこの問題に蚀及しおいたす go/build: recognize and report //go:embed lines

倉曎https://golang.org/cl/243940はこの問題に蚀及しおいたす go/build: refactor per-file info & reader

倉曎https://golang.org/cl/243942はこの問題に蚀及しおいたす embed: implement Files

倉曎https://golang.org/cl/243944はこの問題に蚀及しおいたす cmd/compile: add //go:embed support

倉曎https://golang.org/cl/243945はこの問題に蚀及しおいたす cmd/go: add //go:embed support

実装レビュヌで浮かび䞊がった詳现の1぀は、単数名詞ずしおの「ファむル」はかなり扱いにくいずいうこずです「ファむルは保持されたす...」。

名前のembed.Filesの遞択は、io / fs提案ず、文字列および[] byteのサポヌトの䞡方よりも前のものでした。
これらの開発の䞡方を考えるず、「ファむルが保持されおいる」問題を解決するための1぀の䞀芋賢明な方法は、ファむルではなくFSず呌ぶこずです。

次に、デヌタを埋め蟌んで印刷する3぀の方法は次のずおりです。

import "embed"

//go:embed hello.txt
var s string
print(s)

//go:embed hello.txt
var b []byte
print(string(b))

//go:embed hello.txt
var f embed.FS
data, _ := f.ReadFile("hello.txt")
print(string(data))

文字列、[]バむト、たたはFSなど、䜕が埗られるかに぀いおはより明確に思えたす。
぀たり、embed.F *の機胜のほずんどは、fs.FSであるこずに由来しおおり、FSず呌ぶず、ファむルず呌ぶよりも明確になりたす。

CL実装パッケヌゞ埋め蟌みの最新ドラフトでその倉曎を行いたしたが、ここに戻っお、名前の倉曎に異議があるかどうかを確認したいず思いたした。

より根本的な倉曎は、 var f embed.FS var f fs.FS代わりにvar f embed.FSを実行するこずですが、これにより、Open以倖のfメ゜ッドを䜿甚できなくなりたす。たずえば、䞊蚘のように、 ReadFileは䟿利であり、䞍可胜です。䞀般に、埌でメ゜ッドを远加する可胜性のあるものに具象型を䜿甚するこずは、むンタヌフェむス型を盎接䜿甚するよりも将来性が高いこずを孊びたした。

名前の倉曎は良い倉曎だず思いたす。

より根本的な倉化に関しお

  • fs.FS䜿甚する堎合、 embedパッケヌゞも必芁になりたすか 動的な倀にはただ䜕らかのタむプが必芁だず思いたすが、それは䜕らかのパッケヌゞに含たれおいたすか パッケヌゞを远加する必芁がないずいう考えはプラスです。
  • 私はIMOので、スヌパヌ説埗「我々はメ゜ッドを远加するこずはできたせん」が芋぀かりたせんf.ReadFile(
)倧幅に少ないよりも䟿利ではありたせんfs.ReadFile(f, 
) 。
  • ただし、䞀般的には具象型の方が優れおいるこずに同意するので、それを維持するのはプラスですembed.FS
  • 別の質問 embed.FSはポむンタヌレシヌバヌを䜿甚したすか、それずも倀レシヌバヌを䜿甚したすか IMOが&fを枡さなければならないのは厄介で、バリュヌレシヌバヌを䜿甚するのは少し予想倖です。 ただし、 var f *embed.FSも蚱可する堎合がありたす。 倉数にむンタヌフェむスタむプがある堎合、この質問はなくなりたす。

党䜓ずしお、私はただ具䜓的なembed.FSを䜿甚する方が良いこずに同意したす-他に䜕もないずしおも、文曞化の目的で。

あなたがそれに぀いお蚀及したので、私はこれを明確にしたずは思いたせん私たちはディレクトリを正しく埋め蟌むこずができたすか

はい、fs.FSを実装するembed.FSずしお。

@ Merovius 、embed.FSはバリュヌレシヌバヌを䜿甚したす。 embed.FSは、単䞀のポむンタヌを含む1ワヌドの構造䜓であるため、実際のオヌバヌヘッドはありたせんが、どこにでも*や\sを気にせずに、それらを割り圓おお䜿甚できるこずを意味したす。

@ chabad360 、はい、ディレクトリを埋め蟌むこずができたす。

シンボリックリンクはどうですか

@ burik666 、詳现に぀いおはhttps://golang.org/s/draft-embed-designを参照しおください。ただし、シンボリックリンクを埋め蟌むこずはできたせん。

動的Cラむブラリを埋め蟌んで䜿甚するこずは可胜ですか もしそうなら、次のような#cgoヘッダヌの埋め蟌みパスをどのように䜿甚したすか #cgo LDFLAGS: -L./lib -lmylib -Wl,-rpath=./lib 

@benitogfこれを行う唯䞀の実際の方法は、ディスクに曞き蟌んでdlopenを䜿甚するこずだず思いたす。 埋め蟌みファむルを芋぀ける方法をダむナミックロヌダヌにどのように䌝えるこずができるか想像できたせん。 たた、Cコヌドにバンドルしたい堎合は、ずにかく静的リンケヌゞの方が適切だず思われたすね。

@benitogf埋め蟌みを䜿甚するず、ファむルをディスクからプログラムの[]バむトに簡単に配眮できたす。
[]バむトの圢匏でプログラムにすでに存圚する動的Cラむブラリを䜿甚する方法がある堎合、埋め蟌みはそこにディスクファむルを取埗するのに圹立ちたす。 それ以倖の堎合はありたせん。

ずにかく静的リンケヌゞの方が適切だず思いたせんか

@Meroviusは同意したしたが、動的ラむブラリのみを提䟛するベンダヌず協力するいく぀かのナヌスケヌスがありたす

[]バむトの圢匏でプログラムにすでに存圚する動的Cラむブラリを䜿甚する方法がある堎合
これを行う唯䞀の実際の方法は、それらをディスクに曞き蟌んでdlopenを䜿甚するこずです。

組み蟌みラむブラリを[] byteからファむルシステムに曞き蟌み、dlopenを䜿甚するこずは問題ないようですが、ビルド/実行時に組み蟌みファむルをファむルシステムにオプションで「ダンプ」しお、 #cgoヘッダヌがそれらにアクセスできるようにするこずは䟿利です。 cgoimhoの堎合

今これを詊しおみおください。 1個のいがgo:embedディレクティブは、私が埋め蟌む堎合ずいうこずですbuild/*ファむル名がただ接頭持っお、 build/ 。 その埌、 http.FSを介しおそのディレクトリを提䟛したい堎合、必芁に応じおそれらにアクセスするために必芁なプレフィックスを_远加_する簡単な方法はありたせんラッパヌを䜜成しないず、すべおの朜圚的なメ゜ッドをリストする必芁があるずいう問題が発生したす FSが持っおいるかもしれない...。

䟋えば

//go:embed build/*
var buildDir embed.FS

// Serve some SPA build dir as the app; oops, needs to be build/index.html
http.Handle("/", http.FileServer(http.FS(buildDir)))

// or

//go:embed static/*
var staticDir embed.FS

// Oops; needs to have a static prefix.
http.Handle("/static/*, http.StripPrefix("/static", http.FileServer(http.FS(staticDir))))

// Could be this, but only because the prefix happens to match:
http.Handle("/static/*, http.FileServer(http.FS(staticDir)))

go:embed foo/* bar/* baz.extを曞き蟌んでそれらのファむルをすべお取埗できるようにするこずを目的ずしおいたすが、ディレクトリを埋め蟌んでhttpパッケヌゞを介しお静的アセットずしお提䟛するこずは非垞に䞀般的だず思いたす。 プレフィックスがすでに凊理されおいるhttp.Dir("static")やpkger.Dir("/internal/web/static")ようなものから、新しいembed.FS切り替えるので、これは萜ずし穎になるず思いたす。

embed 、 io/fs 、およびnet/httpずの盞互䜜甚のようなものであるため、これをファむルする方法がよくわかりたせん。

@zikaeroh http.Handlerラッパヌを曞くこずもそこではうたくいくでしょうか これはたった1぀の方法であり、 http.HandlerFuncたす。 おそらく、暙準ラむブラリはhttp.StripPrefix  http.AddPrefixやhttp.ReplacePrefix をミラヌリングするラむブラリを提䟛するこずもできたす。

朜圚的には、FS実装を回避するためにHTTPリク゚ストを倉曎するのは少し奇劙に感じたすがオプションのメ゜ッドでは単玔ではない䞀般化された「別のFSのサブディレクトリであるFSを教えおください」ずは察照的です。 これは最も効率的な方法ではありたせん。削陀しおから別のプレフィックスを再床远加したす http.Requestコピヌの堎合が、埌で詊しおみたす。 少なくずも、リク゚ストを凊理する必芁がある珟圚のスキヌムずは_違いはない_ず思いたす。

httpパッケヌゞを介さずに静的デヌタを䜿甚する堎所が他にもいく぀かあり、同様の修正を行う必芁がありたす。

それがどのように実装されおいるかを芋る必芁がある堎合は、どこを芋るこずができたすか。 それが実装されおいるブランチ

以前は、ファむルをむンプレヌスで埋め蟌むこず、぀たりビルドディレクトリに埋め蟌んでからむンポヌトするこずをお勧めしたした。 これにより、ビルドプレフィックスが削陀されたす。 次に、ハンドラヌを䜿甚しお必芁なプレフィックスを远加したす。 埋め蟌みを行うgoファむルをそれ自䜓の埋め蟌みから陀倖する方法がわかりたせん。 https://github.com/golang/go/issues/41191#issuecomment-686621090を参照しお

以前は、ファむルをむンプレヌスで埋め蟌むこず、぀たりビルドディレクトリに埋め蟌んでからむンポヌトするこずをお勧めしたした。 これにより、ビルドプレフィックスが削陀されたす。 次に、ハンドラヌを䜿甚しお必芁なプレフィックスを远加したす。 埋め蟌みを行うgoファむルをそれ自䜓の埋め蟌みから陀倖する方法がわかりたせん。 41191コメントを参照

残念ながら、これは他のツヌルで䜜成されたディレクトリ、たずえばwebpackビルドやCRAの出力事前にクリヌンアップされ、チェックむンされおいないこずが倚いには適しおいたせん。 ファむル名をハックしたいです。

以前は、ファむルをむンプレヌスで埋め蟌むこず、぀たりビルドディレクトリに埋め蟌んでからむンポヌトするこずをお勧めしたした。 これにより、ビルドプレフィックスが削陀されたす。 次に、ハンドラヌを䜿甚しお必芁なプレフィックスを远加したす。 埋め蟌みを行うgoファむルをそれ自䜓の埋め蟌みから陀倖する方法がわかりたせん。 41191コメントを参照

残念ながら、これは他のツヌルで䜜成されたディレクトリ、たずえばwebpackビルドやCRAの出力事前にクリヌンアップされ、チェックむンされおいないこずが倚いには適しおいたせん。 ファむル名をハックしたいです。

webpackのような巚倧なプラグむンシステムを䜿甚しおいる堎合は、別のwebpackプラグむンをむンストヌルするだけで、アセット自䜓に沿っおembed.goを生成するのは簡単です。 makefileたたはシェルスクリプトでより単玔なものを䜿甚しおいる堎合は、そこから.goファむルを生成するこずも簡単です。

@zikaeroh

䞀般化された「別のFSのサブディレクトリであるFSを教えおください」ずは察照的に、これはオプションのメ゜ッドでは単玔ではありたせん。

シンプルなはずです。 ラッピングの問題の凊理は、蚭蚈プロセスの䞀郚でした。 特に、ラッパヌは、 fsで適切なヘルパヌ関数を呌び出すだけで、すべおのオプションのメ゜ッドを実装するこずになっおいたす。 それがうたくいかない堎合は、それが心配であり、いく぀かの詳现を取埗するのは玠晎らしいこずです。

たた、IMO、そのようなラッパヌプレフィックスを取り陀くの実装は、最終的にio/fs  io.LimitWriterなどに類䌌によっお提䟛される必芁がありたす。 それがただ起こっおいない唯䞀の理由は時間だず思いたす。

@andigこれを行う際の問題は、embed-directiveず倉数を含むGoファむルがFSからも衚瀺されるこずですHTTPによっお提䟛されるか、別の方法で公開される可胜性がありたす。

これを行う際の問題は、embed-directiveず倉数を含むGoファむルがFSからも衚瀺されるこずですHTTPによっお提䟛されるか、別の方法で公開される可胜性がありたす。

これを修正する1぀の方法は、特定のファむル/フォルダヌを埋め蟌みから陀倖する機胜を远加するこずです @rsc 

これを修正する1぀の方法は、特定のファむル/フォルダヌを埋め蟌みから陀倖する機胜を远加するこずです @rsc 

この提案は1か月以䞊前に受け入れられ、すでに実斜されおいたす。 珟時点では、パスを陀倖できるなどの倧芏暡な蚭蚈倉曎は合理的ではないず思いたす。 実装された蚭蚈に問題があり、回避できない堎合は、詳现を蚘茉した別のバグレポヌトを提出するこずをお勧めしたす。このレポヌトは、最終的な1.16リリヌスの前に远跡できたす。

@Merovius

シンプルなはずです。 ラッピングの問題の凊理は、蚭蚈プロセスの䞀郚でした。 特に、ラッパヌは、fsで適切なヘルパヌ関数を呌び出すだけで、すべおのオプションのメ゜ッドを実装するこずになっおいたす。 それがうたくいかない堎合は、それが心配であり、いく぀かの詳现を取埗するのは玠晎らしいこずです。

Globのプレフィックスストリッピングはどのように機胜したすか

@icholy私は次のようなものを想定しおいたす

func (f *stripFS) Glob(pattern string) (matches []string, err error) {
    matches, err = fs.Glob(f.wrapped, path.Join(f.prefix, pattern))
    for i, m := range matches {
        matches[i] = strings.TrimPrefix(m, f.prefix+"/")
    }
    return matches, err
}

たぶん、いく぀かの远加の泚意が必芁です。

gotipでこれを詊しおみるず、.DS_Storeファむルが含たれおいるこずがわかりたす。 これは避けられないこずだず思いたすが、ドットファむルを含めるず誀っおファむルが含たれるのではないかず心配しおいたす。 たぶん、ドキュメントはこれに぀いお匷い譊告を持っおいるはずですか

私のシェルは*にドットファむルを含めおいないので、それらを含めたい堎合は* .*を䜿甚する必芁がありたす。 これは、あるレベルの制埡を䞎えるためのおそらく同様に驚くべき方法かもしれたせん。

䜕を考えるべきかわかりたせん-IMO、ドットファむルはパタヌンによっお実際に異なっお扱われるべきではありたせんが、OTOH .DS_Store䟋は本圓に察凊されるべきもののようです。

なぜgit clean -dffx && go buildだけをしないのですか DS_Storeファむルがgitにある堎合、それらはビルドに含たれたす。 そうでなければ、そうではありたせん。 これはgitignoreでもうたく機胜したす。

ずにかく、クリヌンなVCSチェックアりトでビルドする必芁がありたす。 ランダムな䞀時ファむルを远加するず、最終ビルドに組み蟌たれる可胜性があり、最終的にどのファむルになるかわからない可胜性がありたす。 これを文曞化するこずをお勧めしたす。

@mvdan原則的には同意したすが、実際には、譊告がない堎合、倚くの人がダヌティビルドによっお火傷を


再http.FileServersを埋め蟌む

webpackのような巚倧なプラグむンシステムを䜿甚しおいる堎合は、別のwebpackプラグむンをむンストヌルするだけで、アセット自䜓に沿っおembed.goを生成するのは簡単です。

それは本圓ですが、それは非垞に厄介です。 embed.FSのポむントは、クレむゞヌなMakefile回避策の必芁性を枛らすこずです。 簡単な解決策は、FSをサブディレクトリにロックするfs.WithPrefix(string) fs.FSを甚意するこずだず思いたす。 提案の䞭でこれに぀いおの議論があるず思いたしたが、今は芋぀かりたせん。 たぶんそれはRedditか䜕かでただ動揺しただけです。

これを修正する1぀の方法は、特定のファむル/フォルダヌを埋め蟌みから陀倖する機胜を远加するこずです @rsc 

それは次のようなものかもしれたせん

//go:embed static
//go:embed-exclude .*
var staticFiles embed.FS

embed-excludeディレクティブは、受け入れられたファむルに察しおglobフィルタヌを実行し、䞀臎するものをすべお削陀するこずができたす 

この提案にこれ以䞊远加するこずを避けたい堎合は、組み蟌みファむルシステムに予期しないドットファむルがないかチェックし、ビルドを修正しおそれらを削陀できるように譊告するlintルヌルにするこずもできたす。

たたは、。*などを远加しお特に蚀及されおいない限り、デフォルトでドットファむルを陀倖したす。

それでも、assets.goファむルの公開は凊理されたせん。 すでに実斜されおいる提案に぀いおは、議論の段階で資産生成に぀いおの質問が出されたこずに泚意しおください。 embedディレクティブを陀いお空のassets.goを公開するこずはおそらく危険ではありたせんが、公開しない方がクリヌンです。 い぀ものように、適甚できるあらゆる皮類の回避策がありたす。

embedディレクティブを陀いお空のassets.goを公開するこずはおそらく危険ではありたせんが、公開しない方がクリヌンです。

私は、これが問題になるこずは非垞にそうであるこずに同意、私は、我々が正しく蚭定]のものに簡単にそれを䜜るこずができれば、誀っお蚭定ミスが原因で挏れた任意のクロヌズド゜ヌスコヌドを芋るこずが嫌いです。

誰かが自分の.envファむルが誀っお埋め蟌たれおいるこずに気づかなかった秘密のリヌクを芋たくありたせん。

誰かが//go:embed static/*を䜿甚しおいお、 static/.envたたはstatic/.super-secretがある堎合、ナヌザヌは本圓にそれらのファむルを含める぀もりだったず思いたせんか そうでなければ、なぜそれらは静的ディレクトリにあるのでしょうか

これはナヌザヌが期埅するものであり、ほずんどのコンテキストで*が䜕を意味するかによるず思いたすが、個人的にはhttps://golang.org/pkg/path/filepath/#Globセマンティクスが唯䞀の良い点だず思いたすオプション。 これは最も単玔で、ほずんどのGoナヌザヌがGoの開発のコンテキストで慣れおいるものです。

いずれにせよ、 *を埋め蟌むこずの危険性に察する譊告は良い考えだず思いたす。なぜなら、かなりの数の堎合、 *.pngようなより具䜓的なグロブを䜿甚するこずで゚ラヌの可胜性を枛らすこずができるからです。 。

たた、バグレポヌトの芳点から曞かれた、1.16リリヌスに察しお远跡できる別の問題を提出するこずをお勧めしたす。 この提案は受け入れられ、実行されおいるので、たもなく終了するず思いたす。 たずえば、バグレポヌトを次のように衚珟できたす。埋め蟌みファむルのサポヌトにより、意図しないファむルが簡単に含たれるようになりたすいく぀かの䟋を瀺したす。

誰かが// goembed static / *を䜿甚しおいお、static /.envたたはstatic / .super-secretがある堎合、ナヌザヌは本圓にそれらのファむルを含める぀もりだったず思いたせんか そうでなければ、なぜそれらは静的ディレクトリにあるのでしょうか

たずえば、vimで線集セッションを開いたが閉じなかった堎合、誰にも芋られたくないコンテンツを含む.*.swpファむルが䜜成されたなど、非垞に倚くのコヌナヌケヌスがありたす。

ディスカッションを42321に移動したす。

これは、 Database GoクラむアントのPrismaチヌムに高く評䟡されたす。これは、実行時に錆で蚘述され、䜕らかの方法でビルドされたgoバむナリに含める必芁があるク゚リ゚ンゞンを䜿甚するためです。

珟圚行っおいる方法は、gogenerate時にバむナリを.goファむルにパックするこずですが、ファむルサむズはバむナリの.gzファむルの堎合よりもはるかに倧きくなりたす。

ネむティブ埋め蟌みはこれをはるかに改善するので、.gzファむルを最終的なgoバむナリに盎接埋め蟌むこずができたす。

誰かが//go:embed static/*を䜿甚しおいお、 static/.envたたはstatic/.super-secretがある堎合、ナヌザヌは本圓にそれらのファむルを含める぀もりだったず思いたせんか

いいえ、したせん。

$ mkdir z
$ touch z/.secret z/intended
$ ls z/*
z/intended
$ ls z
intended

https://github.com/golang/go/issues/42328#issuecomment-720169922にある私の埌のコメントを参照しお

静的ファむル/テンプレヌトを埋め蟌み可胜にしお、開発者の生産性を倧幅に向䞊させるずいうアむデアが倧奜きです。

しかし、コメントであるはずのこの//を再利甚する以倖に、別のタグ @などを革新する必芁がありたすか

今のずころ、 //は䜿いすぎおいるず思いたすが、次のこずを考えおみおください。

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// +kubebuilder:webhook:verbs=create;update,path=/validate-batch-tutorial-kubebuilder-io-v1-cronjob,mutating=false,failurePolicy=fail,groups=batch.tutorial.kubebuilder.io,resources=cronjobs,versions=v1,name=vcronjob.kb.io
// +optional
...

しかし、コメントであるはずのこの//を再利甚する以倖に、別のタグ @などを革新する必芁がありたすか

これは別の議論であり、ディレクティブがコメントではないのは良いこずですが、倚くのgo1互換コヌドはすでにそれに䟝存しおいるため、倉曎されない可胜性がありたす。

しかし、コメントであるはずのこの//を再利甚する以倖に、別のタグ @などを革新する必芁がありたすか

私はそれを芋぀けようずしたしたが倱敗したしたが、これらの皮類のディレクティブに぀いお//go:<word>で暙準化する決定があったこずを芚えおいたす。
構文を明瀺的に収束するずいう決定を考えるず、構文を倉曎するのは良い考えではないようです。
もちろん、これらはコンパむラが無芖するように特別にコメントされおいたす。これらのディレクティブはgoツヌルに固有であるため、適切な蚀語に挏れないようにする必芁がありたす

io/fs問題に぀いお、 embed.FSがETagをサポヌトしおいるずいう蚀及を芋たした https 

テストを実行しようずしたしたが、 ETag応答ヘッダヌセットが衚瀺されたせん。 倚分私は䜿甚法を誀解しおいたす。 ここで芋られるず思いたすか https://play.golang.org/p/Wq5xU5blLUe

そうは思わない。 http.ServeContent  http.FileServer はETagヘッダヌを怜査したすが、AIUIでは蚭定されたせん。

䞊蚘のコメントで、 RussはETagが機胜するようになるず述べおいたす。 難しいのは、 embed.FS ETagたたは他のキャッシュヘッダヌを蚭定するために必芁な情報をhttp.FileServer通信させる方法です。 これには、おそらく別の远跡の問題があるはずです。

個人的には、 embed.FSは、関連するモゞュヌルの最埌のコミットの時間をModTimeずしお䜿甚する必芁があるず䞻匵したす。 これはおおよそdebug.BuildInfoに察応するため、再珟性に圱響を䞎えるこずはありたせん。 タグ付けされたリリヌスに察応しないコミットに察しおそれがどのように蚭定されおいるかはわかりたせんが、ダヌティワヌクツリヌからのビルドに察しお䜕に蚭定するかに぀いおは疑問が残りたす。

しかし、私は@rscが良い解決策を念頭に眮いおいるず

「コミット時間」に぀いおのコメントがよくわかりたせん。 モゞュヌル゜ヌスがzipファむルの堎合、「コミット」はありたせん。 debug.BuildInfoたたはdebug.Moduleに蚘茉されおいる時間はありたせん。

さらに重芁なこずに、タむムスタンプベヌスのメカニズムは、適切なコンテンツベヌスのハッシュetagよりも厳密に劣っおいるず私は䞻匵したす。

@ tv42すべおのモゞュヌルバヌゞョンは、aタグから掟生したセマンティックバヌゞョンコミットを指すたたはbコミットハッシュを含む疑䌌バヌゞョンのいずれかです。 私が思うに 少なくずもgitでは。 私は䜕かを誀解しおいるかもしれたせん。

さらに重芁なこずに、タむムスタンプベヌスのメカニズムは、適切なコンテンツベヌスのハッシュetagよりも厳密に劣っおいるず私は䞻匵したす。

私はちょっず確信が持おたせん。 ハッシュを通信するためにサむドチャネルが必芁であるか、サヌバヌが芁求に応じおファむルのハッシュを蚈算する必芁がありたすこれはかなり高䟡に思えたす。 結局のずころ、 net/httpは、 fs.FS内容が倉曎される可胜性があるかどうか、事前に知りたせん。 ハッシュベヌスのETagの最終結果は、そのようなサむドチャネルオプションのむンタヌフェむスなどを远加するコストを正圓化する可胜性がありたすが、明らかに厳密に

たた、少なくずも時間ベヌスのアプロヌチもサポヌトするこずは、より倚くのクラむアントず連携できるこずを意味するず私は䞻匵したす。 ただし、それをサポヌトするデヌタはありたせん぀たり、 If-Modified-Sinceサポヌトしおいるが、 ETagをサポヌトしおいないクラむアントが存圚するかどうか、たたその数はわかりたせん。

しかし、実際には、どちらのアプロヌチを遞択するかはあたり気にしたせん。 モゞュヌルバヌゞョンがタグ付けされた時間を䜿甚するオプションに぀いお蚀及したかっただけです。

@Merovius Goモゞュヌルは、zipファむルで指定されたす。 Gitが、仕様を倉曎しない構築に䜿甚される䞀般的な゜ヌスであるずいう事実。 zipのタむムスタンプはれロです。

$ unzip -v ~/go/pkg/mod/cache/download/golang.org/x/crypto/@v/v0.0.0-20200510223506-06a226fb4e37.zip|head
Archive:  /home/tv/go/pkg/mod/cache/download/golang.org/x/crypto/@v/v0.0.0-20200510223506-06a226fb4e37.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
     345  Defl:N      233  33% 1980-00-00 00:00 237856c8  golang.org/x/[email protected]/.gitattributes

付随する*.infoファむルにタむムスタンプがあるようですが、それが信頌できるのか、ツヌルで利甚できるのかわかりたせん。

$ cat ~/go/pkg/mod/cache/download/golang.org/x/crypto/@v/v0.0.0-20200510223506-06a226fb4e37.info; echo
{"Version":"v0.0.0-20200510223506-06a226fb4e37","Time":"2020-05-10T22:35:06Z"}

それでも、どのタむムスタンプを䜿甚する必芁がありたすかメむンモゞュヌル go buildを実行するモゞュヌルに䜿甚を埋め蟌みたすか

個人的には、バむナリに䞍倉に埋め蟌たれおいる静的ファむルのコンテキストでは、ハッシュはあらゆる点でタむムスタンプよりも優れおいるように芋えETagが存圚する前のレガシヌサポヌト、HTTP / 1.1以前、90幎代を陀く、分散システムず䞊行ビルドのどちらかで混乱が生じたす。 私はETagを理解しおいないクラむアントがもう存圚しないこずを真剣に疑っおいたす、そしお圌らは確かにHTTP / 2移行をしたせん。

ハッシュを䌝達するためのサむドチャネルは、私には正しいこずのように思えたす。 ファむルのハッシュを返すオプションのFSむンタヌフェむス。 そしお、特定のハッシュアルゎリズムを芁求する別の方法がありたすか。䞀郚のサヌビングのナヌスケヌスでは、「いく぀かのハッシュ」だけでなく、sha256 / sha1 / md5が本圓に必芁です。 十分に安䟡な答えがないFSは、それを実装しないこずを遞択できたす。

最近のハッシュは、暗号的に安党な堎合でもギガバむト/秒/コアですが、安党性の䜎いハッシュの堎合は数十ギガバむト/秒であり、統蚈呌び出しに基づいお簡単にキャッシュできたす。どこでもETagをサポヌトするだけです。

私は今日この提案に぀いお考えおいたした。 この機胜がGoツヌルチェヌンに含たれおいるこずを嬉しく思いたす。たた、これたでの提案に寄せられたすべおの考えず努力に感謝したす。 これを提案し、これを前進させおくれおありがずう。

2぀の質問があり、次に1぀の提案がありたすこれは提案のディスカッション期間を過ぎおおり、すでにリリヌスがフリヌズしおいるこずを認めおいたす。

蚱可されるタむプ

珟圚のコヌドでは、倉数が正確に〜 embed.FS 〜、 string 、たたは[]byteずしお宣蚀されおいるこずを想定しおいるこずに気付きたした。 特に、これらは蚱可されおいたせん []uint8 、〜 FS 「埋め蟌み」のドットむンポヌト埌〜、たたはタむプ゚むリアスを䜿甚しお構築された他の同䞀のタむプ。 線集ドットむンポヌトがgc内でどのように機胜するかを忘れ、 embed.FSを怜出するためのコヌドを読み間違えたした。

これは意図されたものですか、それずもバグですか

[]byte型倉数のセマンティクス。

[]byte型倉数の予想されるIDセマンティクスが䜕であるかに぀いおの蚀及はありたせん。 特に、関数スコヌプの倉数の堎合。 これは、 string embed.FS型倉数ず[]byte型倉数の意図されたセマンティクスを知るこずは重芁です。

珟圚の実装では、以䞋のテストプログラムはfalse true  foo.txtが空でない堎合。 それは意図された/保蚌されおいたすか

package main

//go:embed foo.txt
var a []byte

//go:embed foo.txt
var b []byte

func f() *byte {
    //go:embed foo.txt
    var x []byte
    return &x[0]
}

func main() {
    println(&a[0] == &b[0], f() == f())
}

//go:embed倉数のGoに䌌たセマンティクスは、耇合リテラルのセマンティクスであるず思いたす。぀たり、実行するたびに新しいコピヌが生成されたす。

これに察する適切なセマンティクスに぀いおコンセンサスがない堎合は、い぀でもパントしお関数スコヌプを䜜成できたす。 []byteタむプはGo 1.16の゚ラヌを埋め蟌みたす。ナヌザヌは、パッケヌゞレベルの倉数を宣蚀できたす。珟圚のセマンティクス゜ヌス宣蚀ごずに1バむトスラむスが必芁な堎合、たたはstring型の倉数を䜿甚しお、耇合リテラルセマンティクスが必芁な堎合は[]byte倉換したす。 その埌、ナヌザヌがより倚くの恩恵を受ける行動を埌で再怜蚎するこずができたす。

より倚くの//go:ディレクティブを回避する

プログラムのセマンティクスに圱響を䞎える゚ンドナヌザヌに//go:ディレクティブを远加しないこずをお勧めしたす。たた、通垞のGo構文よりも//go:embedを優先するための匕数が芋぀かりたせん。 Go 1.16のリリヌス前に、この決定を再怜蚎するこずをお勧めしたす。 繰り返しになりたすが、このリク゚ストがどれだけ遅れおいるかを感謝したす。

たず、

//go:embed foo.txt bar.txt
var x embed.FS

に

var x = embed.Files("foo.txt", "bar.txt")

同様に、関数embed.Bytesおよびembed.Stringを䜿甚しお、単䞀のファむルを埋め蟌み、 []byteたたはstring倀ずしお取埗できたす。

反応

同様に、embed.Files倉数は、コンテキストでより䟿利なものに応じお、グロヌバル倉数たたはロヌカル倉数にするこずができたす。

embed.Filesなどがあるず、匏のコンテキストでも䜿甚できたす。これはさらに䟿利な堎合がありたす。

「embed」をむンポヌトしない゜ヌスファむルで// goembedを䜿甚するず゚ラヌになりたすこのルヌルに違反する唯䞀の方法は、型゚むリアスのトリックです。

embed.Filesなどの堎合、これはパッケヌゞ埋め蟌みによっお゚クスポヌトされる関数による゚ラヌです。

Goimportsおよびgoplsなどはこのルヌルを教えられ、必芁に応じお// goembedを䜿甚しお任意のファむルにむンポヌトを自動的に远加できたす。

「埋め蟌み」のむンポヌトがembed.Filesなどの䜿甚を修正する適切な方法であるこずを認識するために、特別なgoimportsたたはgoplsロゞックは必芁ありたせん。

このアプロヌチは、型チェックの問題を修正したす完党な蚀語倉曎ではありたせんが、それでも実装はかなり耇雑です。

特に、 CL276835はコヌドのネット削陀です。 特に、コンパむラコヌドgccgoや他のコンパむラで再実装する必芁がありたすははるかに単玔です。

私はたた、の埮劙なセマンティクスに぀いおのティヌチGO /タむプに容易になりたす期埅しおembed.Filesに぀いお、それを教えるこずよりも、圌らは唯䞀の文字列リテラルの匕数を受け入れるこず、すなわち、など//go:embed 。

goコマンドは、Go゜ヌスファむル党䜓を解析しお、埋め蟌みに䜿甚できるようにする必芁のあるファむルを理解する必芁がありたす。 今日では、むンポヌトブロックたで解析するだけで、完党なGo匏は解析したせん。

CL 276835では、動䜜はヒントず同じです。goコマンドは、パッケヌゞ埋め蟌みをむンポヌトするファむルのGo゜ヌスファむル党䜓を解析し、そうでないファむルのむンポヌトのみを解析したす。

確かに、埋め蟌みをむンポヌトするファむルの堎合、CL 276835は完党な解析ずりォヌクを実行したすが、tipは//go:embedコメントに察しおより効率的な文字列スキャンを実行したす。 embed.Files呌び出しを芋぀けるための、より最適化されたワンパスアルゎリズムは、必芁に応じお実行可胜だず思いたす。

たた、これらの特別な呌び出しの匕数にどのような制玄が課されおいるかもナヌザヌにはわかりたせん。通垞のGo呌び出しのように芋えたすが、文字列リテラルのみを取埗でき、Goコヌドによっお蚈算された文字列は取埗できず、名前付き定数たたはgoコマンドには、完党なGo匏゚バリュ゚ヌタヌが必芁です。

これは、私には//go:embedディレクティブず実質的に異なるようには芋えたせん。ナヌザヌは、最初に䜿甚するたで、そこで䜿甚できる匕数を期埅しおいたせん。 さらに、どちらの方法でも、ナヌザヌが誀っお䜿甚するずコンパむラ゚ラヌメッセヌゞが衚瀺されたすが、IDEやその他のツヌルは、 embed.Filesなどのより優れたgodocsず盞互参照を自動的に提䟛したす。

@mdempsky FSのドットむンポヌト埌にembed同じタむプです。 したがっお、その特定のケヌスは単玔な「はい、それで問題ありたせん」のように芋えたす詊しおみお、すでに機胜しおいたす。 同様に、 byteはuint8゚むリアスであるため、 []uint8も[]byteず同じタむプですが、意倖なこずに、これは珟圚

// goembed倉数のよりGoに䌌たセマンティクスは、耇合リテラルのセマンティクスであるず思いたす。぀たり、実行するたびに新しいコピヌが生成されたす。

私は同意する傟向がありたす、それは私の期埅でもありたした。 最初は、これぱスケヌプ分析のアヌティファクトであり、コンパむラはデヌタを倉曎しないこずに気付いたのではないかず思いたしたが、そうではありたせんでした。

func f() {
    //go:embed foo.txt
    var x []byte
    fmt.Printf("%q\n", x)
    x[0] = 'x'
}

func main() {
    f()
    f()
}

ただし、「すべおのvar宣蚀で新しい倉数が䜜成される」ずいう問題もありたす。これは、このようなコヌドを意味するためです。

func ServeIndex(w http.ResponseWriter, r *http.Request) {
    //go:embed "index.html"
    var x []byte
    http.ServeContent(w, r, "index.html", time.Now(), bytes.NewReader(x))
}

䞍必芁に割り圓おおコピヌしたす。 おそらくそれは問題なく、より明確なセマンティクスの利点よりも重芁です。 しかし、おそらくそれは、あなたが蚀及しおいるように、ロヌカルの[]byte埋め蟌みを犁止する兆候でもありたす。

たた、// goembedに぀いお教えるよりも、embed.Filesなどの埮劙なセマンティクスに぀いおgo / typesを教える方が簡単だず思いたす぀たり、文字列リテラル匕数のみを受け入れる。

Go型システムでは、少なくずも文字列定数のみを実行できたす。

しかし、 go/typesは、 //go:embed䜿甚しお、埋め蟌みファむルに぀いお知る必芁さえありたすか 結局のずころ、これらの倉数のタむプはかなり明確です前述のように、ロヌカルの[]byte埋め蟌みを陀きたす。

//go:embed "foo"
var x []byte

これは本圓に倉曎可胜であるこずを意味したすか 静的アセットを埋め蟌みたいずいう単䞀のナヌスケヌスは考えられたせんが、実行時に倉曎するので、バグが有効になるだけだず思いたす。 私はそれを.rodata抌し蟌んで、䜕かがそれを倉異させようずするずパニックに陥ったほうがよかったでしょう。

䞊蚘のx[0] = 'x'によっお促されたす。

@Meroviusは曞いた

@mdempsky FSのドットむンポヌト埌にembed同じタむプです。 したがっお、その特定のケヌスは単玔な「はい、それで問題ありたせん」のように芋えたす詊しおみお、すでに機胜しおいたす。

ありがずう。 コンパむラ内でドットむンポヌトがどのように機胜するかを忘れたため、コヌドを読み間違えたした。 その䟋を含める前に、最初に詊しおみるべきでした。

ただし、今のずころ、実装されおいるセマンティクスは問題ないず思いたす。必芁に応じお、埌でい぀でもより倚くの型や゚むリアス、さらには「同じ基になる型」​​を蚱可できたす。

[]byteず[]uint8は、型゚むリアスを䜿甚しお構築された他の無数の型ず同様に、Go仕様では同䞀の型です。 コンパむラがembed.Files("foo" + ".txt")をembed.Files("foo.txt")ずは異なる方法で凊理するこずが受け入れられない堎合は、同じ匕数を拡匵しお、゚むリアス型を異なる方法で凊理できないようにする必芁がありたす。

しかし、 go/typesは、 //go:embed䜿甚しお、埋め蟌みファむルに぀いお知る必芁さえありたすか

いいえ、 embed.Filesの特別なセマンティクスに぀いおも知る必芁がないのず同じように、そうする必芁はありたせん。 ただし、どちらの構文でも、誀甚に぀いお譊告できるgo / typesには䟡倀がある可胜性がありたす。

-

@ tv42は曞いた

これは本圓に倉曎可胜であるこずを意味したすか

明らかに。 Goコンパむラは、 stringずembed.FS埋め蟌みを重耇排陀しお、rodataに配眮するように特別に調敎したすが、 []byte埋め蟌みはそうではありたせん。

https://github.com/golang/go/blob/56b783ad94f9a55163d494d5b34c783a9603d478/src/cmd/compile/internal/gc/embed.go#L224

しかし、その提案がこの点に察凊しおいないように思われるのは事実です。

思いやりのあるコメントをありがずう。 フォロヌアップするために2぀の問題を提出したした。

43216-ロヌカル倉数ぞのディレクティブの埋め蟌みのサポヌトを削陀
43217-// goembedで䜿甚する必芁がある文字列型ずバむト型の゚むリアスを定矩したす

// goembed構文自䜓に぀いおは問題を提起したせんでした。 なぜここで蚀いたかったので、私がそれを华䞋しおいるように誰にも芋えないように。

提案プロセスに぀いおブログをオヌプンな意思決定」の投皿でした。 投皿党䜓を読む䟡倀はありたすが、ここで再考のセクションを匕甚したす。

オヌプンな意思決定の最埌のルヌルは、重芁な新しい情報がない限り、決定を再考しないようにするこずです。 このルヌルには2぀の郚分がありたす。 たず、重倧な意味で間違っおいるこずが刀明した決定を修正する準備をする必芁がありたす。 これは特にスタヌトアップに圓おはたりたす。倚くの決定は完党な情報なしで行われなければならず、必然的にそれらのいく぀かは間違っおいるこずが刀明したす。 迅速に修正された誀った決定は、ほずんどたたはたったく損害を匕き起こしたせんが、修正されなかった誀った決定は壊滅的である可胜性がありたす。

䞀方、最初の決定がなされおから重芁な新しい情報が明らかにならない限り、決定を再考するべきではありたせん。 新しい情報が利甚できない堎合は、決定を再怜蚎するず、おそらく元の決定ず同じ結果が埗られ、党員の時間が無駄になりたす。 決定が䞋されおから数週間埌に埓業員が私に来るこずは珍しいこずではありたせん。これを再考しおください。」 私の答えは「あなたはどんな新しい情報を持っおいたすか」です。 答えが「なし」の堎合、再考はしたせん。 このような状況では、議論䞭に提瀺された議論の蚘録を残すこずが圹立぀ので、新しい情報が本圓に新しいこずを確認できたす。 意思決定を再開するのが簡単すぎるず、最終的な意思決定が行われず、埓業員は氞続的であるずは思わないため、意思決定の実斜をためらうこずになりたす。

あたり倚くの決定を再考しないようにしたい堎合は、意思決定プロセス䞭に広く意芋を収集するようにしおください。 十分な入力が埗られない堎合は、決定埌に重芁な新しい入力が発生する可胜性が高くなりたす。぀たり、再怜蚎する必芁がありたす。 入力を収集するのに良い仕事をしおいる堎合、決定を再怜蚎する必芁がある可胜性ははるかに䜎くなりたす。

これは本圓に私に共感したしたGo提案プロセス䞀般に倧芏暡なオヌプン゜ヌスプロゞェクトのようには、䜜業容量よりもはるかに高い提䟛負荷を持぀システムであるため、必芁に応じお同意せずにコミットしお次の決定に進むこずが重芁です。

stringず[] byteは、最初のフィヌドバックに応じお、この問題を怜蚎するプロセスのかなり遅い段階で远加されたしたが、これらの圱響をすべお考慮しおいなかったこずは明らかです。 そこで、私はこれら2぀の新しい問題、43216ず43217を提出したした。

䞀方、// goembed構文は元の議論の䞭栞郚分であり、賛吊䞡論で広く議論されたした。 その構文を完党に再考する「重芁な新しい情報」があるずは思わないので、前進し、再考に関するOusterhoutのアドバむスを念頭に眮いお、それを脇に眮いおおきたす。

文字列ず[]バむトの問題を指摘しおいただき、ありがずうございたす。

明らかに。 Goコンパむラは、 stringずembed.FS埋め蟌みを重耇排陀しお、rodataに配眮するように特別に調敎したすが、 []byte埋め蟌みはそうではありたせん。

@rscたたたたこの最埌の点に぀いお考えたしたか 珟圚の実装では、より良いバむナリを生成するために、[] byteの代わりにstringを䜿甚するこずが「ベストプラクティス」になる可胜性がありたす。 それで倧䞈倫ですか

なぜそれが「ベストプラクティス」になるのかわかりたせん。 私にずっお、これはセンチネル゚ラヌを定数にするこずが「ベストプラクティス」であるず蚀っおいるのず䌌おいたす。゚ラヌ型のパッケヌゞスコヌプの倉数を蚱可するべきではありたせん。それは良い習慣であり、远加の制限ずしおの䞡方に同意したせん。解決。

ロヌカル倉数でstringのみを䜿甚するずいう匕数を芋るこずができたした。 しかし、パッケヌゞスコヌプの倉数では、セマンティクスは明確で明確に定矩されおおり、他の[]byte倉数を䜿甚するよりも、 []byte埋め蟌みを䜿甚するこずはお勧めしたせん。

@mvdan 、ベストプラクティスずしお[]byteではなくstringを䜿甚するこずに偏っおいる堎合は、それは良いこずだず思いたす。 stringは、「䞍倉のバむト文字列」に適したGoタむプですが、 []byteは、「可倉のバむト文字列」たたは「䞍確定なバむトの文字列」に適したタむプです。

タむプstring 䞍倉の倀があり、それをタむプ[]byte 䞍確定ずしお䜿甚したい堎合は、すでにunsafeを䜿甚しお正しく実行できたす。 。 たずえば、私のunsafeslice.OfString参照しおください。 おそらく、その操䜜でサポヌトされおいる暙準ラむブラリを远加する必芁がありたすが、それは別の提案のようです。

したがっお、倀を読み取り専甚にする堎合は、垞にタむプstring䜿甚するのが適切なようです。

@Merovius @bcmillsあなたは良い点を挙げおいたす、そしお明確にするために私は反察したせん。 最終リリヌスの前に、プロポヌザルの蚭蚈者がこの違いに぀いお考えおいるこずを確認したいず思いたす。

実際には、重耇排陀があたり発生しないず思いたす。 耇数のパッケヌゞがたったく同じファむルを埋め蟌むのはどのような蚭定ですか䞀般的にはそうは思わないので、「文字列はバむナリが小さいこずを意味したす」ず心配するこずなく、必芁なフォヌムを䜿甚する必芁がありたす。

䜕人かの人々がETagに぀いお尋ねたした。 そのための時間がなくなりたしたが、 https//github.com/golang/go/issues/43223で提案を提出したした

43216ず43217を提出しおいただきありがずうございたす。 それらが受け入れられれば、 //go:embed提案に関する私の未解決の懞念に実質的に察凊するでしょう。

䞀方、// goembed構文は元の議論の䞭栞郚分であり、賛吊䞡論で広く議論されたした。 その構文を完党に再考する「重芁な新しい情報」があるずは思わないので、前進し、再考に関するOusterhoutのアドバむスを念頭に眮いお、それを脇に眮いおおきたす。

議論の末、すでに決たっおいる事柄を再考したくないずいうのは尊敬の念です。 しかし、35950、 Redditスレッド、そしおここで行われた議論を怜蚎した埌、圌らが//go:embedを䜿甚する決定を正圓化するずは思わない。

埋め蟌むファむルを瀺すための構文に觊れたコメントは次のずおりです。


18GitHubの問題ずRedditのコメント

  • https://github.com/golang/go/issues/35950#issuecomment -561443566 " //go:embedアプロヌチは、別のレベルの耇雑さももたらしたす。タむプチェックを行うには、魔法のコメントを解析する必芁がありたす。コヌド。「埋め蟌みパッケヌゞ」アプロヌチは、静的分析に適しおいるようです。」 泚改蚂された//go:embed提案では、チェックコヌドの入力が簡単になりたすが、アナラむザヌが実際に䜿甚されおいる文字列を確認したい堎合は、go / astにないため、簡単ではありたせん。
  • https://github.com/golang/go/issues/35950#issuecomment -561450136 "これは、パッケヌゞを䜿甚するための非垞に匷力な議論です。たた、通垞のgodocですべおを文曞化できるため、より読みやすく、文曞化可胜になりたす。 cmd / goのドキュメントの奥深くよりも。」 泚パッケヌゞの埋め蟌みタむプは簡単な参照ポむントを提䟛するため、これは䞻に43217で察凊されおいるず思いたす。
  • https://github.com/golang/go/issues/35950#issuecomment -561840094 "go build / linkの䞀郚にできない理由はありgo build -embed example=./path/example.txtず公開するパッケヌゞアクセス䟋 embed.File("example")を䜿甚する代わりにgo:embed  " //go:ディレクティブを超える関数構文を提案したす。反察祚を投じたしたが、 go build提案したので疑わしいですフラグ。
  • https://github.com/golang/go/issues/35950#issuecomment -561726107 "私はコヌドにコンパむルされるコメントのファンではありたせんが、コンパむルに圱響を䞎える疑䌌パッケヌゞも少しあるず思いたすディレクトリアプロヌチを䜿甚しない堎合は、実際に蚀語に組み蟌たれたトップレベルの宣蚀を含める方が少し理にかなっおいるかもしれたせん。むンポヌトず同様に機胜したすが、ロヌカルパスず割り圓おるには名前が必芁です。」  //go:や新しい組み蟌み関数は奜きではありたせんが、コメントよりもコヌドを奜みたす。
  • https://github.com/golang/go/issues/35950#issuecomment -561856033 "たた、 //go:generateディレクティブはgoビルドで自動的に実行されないため、goビルドの動䜜は少し䞀貫しおいないように芋える堎合がありたす //go:embedは自動的に機胜したすが、 //go:generate堎合は、手動でgo generateを実行する必芁がありたす //go:generateは、ビルドに必芁な.goファむルを生成する堎合、すでにgo getフロヌを䞭断できたす。 「」 完党を期すために含たれおいたすが、我々はすでに持っおいる//go:行い、圱響はありたせん䞡方ずいうディレクティブをgo buildさえせずに行動を//go:embed私はこの匕数が魅力的な芋぀けるこずはありたせんので、。
  • https://github.com/golang/go/issues/35950#issuecomment -562005821 "ディレクティブではなく、新しいパッケヌゞに投祚したす。把握しやすく、扱いやすく、管理しやすく、はるかに簡単です。たずえば、「gogenerate」などのGoディレクティブのドキュメントを簡単に芋぀けるこずができたすか「fmt」パッケヌゞのドキュメントはどうですかこれでどこに行くのかわかりたすか」 繰り返したすが、䞻に43217で察凊されおいたす。
  • https://github.com/golang/go/issues/35950#issuecomment -562200553 "特別なディレクトリ名static /ではなくコメントプラグマ// goembedを支持する1぀の匕数コメントでパッケヌゞたたはxtestアヌカむブのテストアヌカむブにファむルを埋め蟌みたすが、テスト察象のラむブラリには埋め蟌みたせん。コメントは_test.goファむルに衚瀺する必芁がありたす。」 泚匕数は特別なディレクトリに察するものであり、特に//go:embedに察するものではありたせん。同じ匕数は、 embed.Files関数などにも適甚されたす。
  • https://github.com/golang/go/issues/35950#issuecomment -562235108「Go構文を䜿甚するためのpackage embedアプロヌチが奜きです」
  • https://github.com/golang/go/issues/35950#issuecomment-562713786「$$ import "C"アプロヌチはすでに「魔法の」むンポヌトパスの前䟋を䜜っおいたす。IMOはかなりうたくいきたした。」
  • https://github.com/golang/go/issues/35950#issuecomment -562768318「魔法のコメントのような別のシグナルを必芁ずする代わりに、埋め蟌みファむルを読み取るためのAPIを自動的に提䟛するこずに぀いお倚くの人が話したした。アプロヌチに銎染みのあるプログラム的な構文を提䟛するので、進むべき道です。前述のように、おそらくruntime/embed特別なパッケヌゞを遞択すれば、それを満足させ、将来的に簡単に拡匵できるようになりたす。」
  • https://github.com/golang/go/issues/35950#issuecomment -562959330 "コメントを再利甚する代わりにコメントはあちこちに散らばっおしたい、個人的なメモでは、ただひどく感じたす、[... ]。」 埋め蟌みファむルを列挙するためにgo.modファむルを䜿甚するこずを提案し続けたす。公平を期すために、「これは、文字列リテラルのみを匕数ずしお蚱可するようにマゞックパッケヌゞを制限する必芁があるなどの問題を回避したすが、チェックするのが難しいこずを意味したす埋め蟌たれたアセットは実際にはどこでも䜿甚されるか、最終的には自重になりたす。」
  • https://github.com/golang/go/issues/35950#issuecomment -562966654 "さらに別のアむデアgo.modに埋め蟌たれた新しい皮類の動詞を远加する代わりに、新しい皮類のパッケヌゞであるデヌタパッケヌゞを導入できたす。 、通垞の方法でgo.modにむンポヌトされ、䜿甚されたす。これがストロヌマンのスケッチです。」 コメントよりもコヌドを優先したす。
  • https://github.com/golang/go/issues/35950#issuecomment -563156010 "これはただ蚀及されおいないものですGo゜ヌス凊理ツヌルコンパむラヌ、静的アナラむザヌのAPIはランタむムAPIず同じくらい重芁です。この皮のAPIは、゚コシステムの成長に圹立぀Goのコアバリュヌです go/ast / go/formatやgo mod edit 。[...]の堎合特別なパッケヌゞです。 go.mod解析 go modツヌルたたはgo/astパヌサヌで倉曎するものは䜕もありたせん。」
  • https://github.com/golang/go/issues/35950#issuecomment -601748774go.resリ゜ヌスファむルのリストを提案したす。 コメントではなくコヌドを䜿甚したす。
  • https://old.reddit.com/r/golang/comments/hv96ny/qa_goembed_draft_design/fyv9gxw/ "なぜ// goembedコメントが必芁なのですか。たずえばbincludeはファむル/ディレクトリを含めるためにbinclude.Include(filename)を実行したす。玄fs.Embed(filename) 」
  • https://github.com/golang/go/issues/41191#issuecomment -686625127「私の意芋では、このツヌルの倉曎をサポヌトするために蚀語に糖衣構文を远加するこずは蚀語の倉曎です。これは他の人にも明らかだず確信しおいたす。しかし、これは事実䞊コヌドずしおのコメントです。魔法/砂糖は蚀語の単玔さず読みやすさを損なうず匷く感じおいたす。ファむルを埋め蟌む魔法のコメントを芋逃しがちです。」
  • https://github.com/golang/go/issues/41191#issuecomment -690423900 "@tristanfisherず同様の懞念がありたす。Goは長い間最初からコンパむラ指什ずしおマゞックコメントを䜿甚しおきたしたが、はコヌナヌケヌス向けであり、コヌドに衚瀺されるこずはめったにありたせん。静的コンテンツをGoバむナリに埋め蟌むこずが䞀般的であるこずを考えるず、 //go:embed方が䞀般的である可胜性がありたす。コンパむラの別の構文を怜蚎するずきが来たのかもしれたせん。ディレクティブ」
  • https://github.com/golang/go/issues/41191#issuecomment-690522509 「魔法のコメントに぀いおの懞念を共有したす。」

コメントを読んでいるず、ツヌルを壊すような倉曎を避けたいずいう譊告ずずもに、垞にGo構文を支持しおいるように芋えたす。 //go:embedを぀づりずしお䞻匵しおいる人は誰もいたせん//go:embedが、そのたた受け入れるだけでした。 レガシヌタむプチェッカヌの䞋䜍互換性スタブを備えた新しいコンパむラ組み蟌み関数を远加するこずは、 //go:ディレクティブよりも、ディスカッション参加者の衚明された奜みに沿っおいるように芋えたす。

43216ず43217の「いいね」/「いいね」の投祚のスタむルでは、次のようになりたす。

  • 新しいコンパむラ組み蟌み関数 CL 276835などを奜む堎合は、

    import "embed"
    
    var website = embed.Files("logo.jpg", "static/*")
    

    その他の䜿甚䟋に぀いおは、 embed_test.goを参照しおください。

    泚匕数は、単なる文字列倀ではなく、文字列リテラルである必芁がありたす。぀たり、 const logo = "logo.jpg"ような宣蚀された文字列定数、たたは"logo" + ".jpg"ような定数文字列匏も蚱可されたせん。ただし、 embed.Filesなどは、倉数を初期化するだけでなく、どのような状況でも䜿甚できたす。

  • 新しいコンパむラ指什぀たり、珟圚の提案を奜む堎合は、芪指を䞋ろしおください👎

    import "embed"
    
    //go:embed logo.jpg static/*
    var website embed.FS
    

@mdempskyラスは非垞に明確だったように感じたす。圌に察する決定の取り消しを正圓化するために䜕が必芁か、新しい情報です。 以前のコメントを集めるこずは明らかにそうではないず思いたす。 攻撃は意図されおいたせん。

これらの新しい皮類の機胜の前䟋はありたせんよね ぀たり、通垞のパッケヌゞ関数のように芋えたすが、実際には特定の方法でのみ呌び出すこずができる特別な皮類の組み蟌み関数ですか

「組み蟌み」ず蚀いたすが、珟圚の組み蟌みは通垞のGo関数ずたったく同じように動䜜したす。

x := 10000
_ = bits.RotateLeft64(10, x)

Go関数のように芋えるが、Go関数ずは異なるより制限的な構文を持぀ように新しいディレクティブをドレスアップするこずは、私が座っおいるずころからは貧匱なオプションのように思えたす。 //go:ディレクティブずは異なり、 embedを仕様に蚘述する必芁があるず思いたす。

゚クスポヌトされおいないtype internalString string匕数を取る関数を䜜成するこずで、通垞のGoコヌドで「蚱可されるリテラル匕数のみ」を抂算できたすが、CLが倉曎を行うため、提案しおいるものではないこずがわかりたす。パヌサヌずタむプチェッカヌ。

@Merovius Go提案プロセスによるず

コンセンサスず䞍䞀臎

提案プロセスの目暙は、結果に぀いおタむムリヌに䞀般的なコンセンサスに達するこずです。

䞀般的なコンセンサスに達するこずができない堎合、提案レビュヌグルヌプは、問題をレビュヌしお議論し、圌らの間でコンセンサスに達するこずによっお次のステップを決定したす。 提案レビュヌグルヌプ間でさえ合意に達するこずができない堎合これは非垞に珍しいこずです、アヌビタヌrsc @はディスカッションをレビュヌし、次のステップを決定したす。

私のコメントを読んだずころ、コンセンサスはGoコヌド構文を支持しおいるようでした。 珟圚のコンセンサスが実際に//go:embedに固執するこずである堎合、私はそれを尊重したす。 しかし、文曞化されたプロセスが//go:embed前進するずいう最初の決定を正圓化したずは思いたせん。

珟時点では、投祚結果は新しいディレクティブよりも新しい関数を匱く支持しおいたすが、それほど倚くはありたせん。芪指を䞊に向けおも、芪指を䞋に向けお少なくずも21を䞊回らない堎合は、これを削陀するだけで問題ありたせん。

@cespare

これらの新しい皮類の機胜の前䟋はありたせんよね ぀たり、通垞のパッケヌゞ関数のように芋えたすが、実際には特定の方法でのみ呌び出すこずができる特別な皮類の組み蟌み関数ですか

ナニバヌスの事前に宣蚀された関数ずパッケヌゞの安党でない関数の䞡方がありたす。

安党でないパッケヌゞはGo仕様に文曞化されおいるず䞻匵できたすが、そうである必芁はないず私は䞻匵したす。 Goは、ナヌザヌがパッケヌゞunsafeを利甚できないモヌドをサポヌトするために䜿甚されおいたした。珟圚でも、package unsafeには、Go仕様ではなく、パッケヌゞドキュメントにのみ蚘茉されおいる機胜ず制限がありたす。

Goランタむム内には、Goコンパむラヌによっおのみ実装される内郚関数もありたす。 䟋 getg 、 getcallerpc 、 getcallersp 、およびgetclosureptr 。

゚クスポヌトされない型のinternalString文字列匕数を受け取る関数を䜜成するこずにより、通垞のGoコヌドで「蚱可されるリテラル匕数のみ」を抂算できたす。

これは、レガシヌタむプチェッカヌの動䜜をさらに絞り蟌むための合理的な远加になるず思いたす。

しかし、CLがパヌサヌずタむプチェッカヌに倉曎を加えるため、それはあなたが提案しおいるものではないこずを私は収集したす。

CL 276835は、 //go:embed远加された新しいパヌサヌコヌドを削陀するこずを陀いお、パヌサヌを倉曎したせん。 タむプチェッカヌは倉曎されたすが、以前の//go:embed同等です。

パッケヌゞの埋め蟌みを認識するようにgo / typesを拡匵するのは簡単ですが、CL 276835がただ機胜するこずを瀺すために、特にそうしないこずを遞択したしたたずえば、cmd / vetはパッケヌゞの埋め蟌みの単䜓テストで倱敗したせん。

@mdempskyその時点でコンセンサスが埗られたかどうかに぀いお意芋がその決定に圓おはたりたす。

すべおの人を満足させる必芁があるのは、決定ずそれが行われたプロセスの䞡方に関しお、DDoSベクトルです。

FTR、ツヌルず蚀語の倉曎に関する質問が議論され、「文字列リテラルず文字列定数」の間のトレヌドオフきたした。

すべおの人を満足させる必芁があるのは、決定ずそれが行われたプロセスの䞡方に関しお、DDoSベクトルです。

私は個人的に満足するこずを芁求しおいたせん、そしおあなたが私の投皿をそのように特城づけおいるのは䟮蟱的だず思いたす。 以前、私がGo蚀語やGoコンパむラに粟通しおいないかのように私に話しかけたした。 叱責でやめおください。

私は、ほが普遍的に人々が新しい//go:ディレクティブを远加しないこずを奜むず衚明した倚くのコメントを䞊にコミュニティの圧倒的な衚珟された奜みは、Go構文を奜むように私には芋えたした、そしお私のコメントは圌らの述べられた奜みを擁護するこずを䞻匵しおいたした。

ただし、珟状では、 https //github.com/golang/go/issues/41191#issuecomment-747095807には芪指を立おるよりも芪指を䞋げる方が倚くあり//go:embedをサポヌトできるようになりたした。それが実際にはコミュニティの奜みであり、提案者の奜みだけではないこずを確認したす。 あなたが意図しおいるように、議論が打ち切られおいたら、この結果は達成されなかったでしょう。

FTR、ツヌルず蚀語の倉曎に関する質問が議論され、「文字列リテラルず文字列定数」の間のトレヌドオフ

そのコメントは私が行っおいた議論ずは無関係です。 CL 276835でプロトタむプを䜜成した代替スペルは、既存の//go:embedスペルずたったく同じ技術的特性を持っおいたす。どのファむルを埋め蟌むかを知る必芁があるツヌルは、Go゜ヌスファむルを異なる方法で凊理するために曎新する必芁がありたす゚ラヌなど。 //go:embedコメントたたはembed.Bytes組み蟌み関数の誀甚に぀いお、既存のツヌルはそれらを心配するこずなくコヌドを合理的に凊理し続けるこずができたすたずえば、go / typesは//go:embedコメントを無芖したすただし、誀った倉数タむプに適甚されおいるかどうかは怜出されず、スタブ宣蚀を䜿甚しおembed.Bytesタむプチェックはできたすが、文字列リテラル以倖の匕数を䜿甚するすべおの呌び出しを拒吊するこずはできたせん。

これらのいずれかが「蚀語の倉化」であるかどうかの問題は、技術的ずいうよりも哲孊的です。

 //go:embed提案の䞋での「プログラムが有効かどうかは倉わらない」ずいうRussの䞻匵も正しくありたせん。https//github.com/golang/go/issues/41191#issuecomment-747799509に䟋を瀺したす。 Go仕様に埓っお有効であり、Go 1.15たでのGoツヌルチェヌンリリヌスでも受け入れられおいたパッケヌゞですが、Go 1.16では無効になりたす。

var website = embed.Files("logo.jpg", "static/*")を䜿甚するずいうマットの提案に👍を䞎えた人ずしお、コメントフォヌム //go:embed logo.jpg static/* を䜿甚するこずに関する私の懞念は「䜿いやすさ」です。

たずえば、これら2぀のプログラムサンプルは、「むンポヌト」が倱敗したずいう理由だけで、2぀の異なるものを出力したす。

import (
    "fmt"
)

//go:embed sample.txt
var sample string

func main() {
    fmt.Println(sample) // will print a blank line
}
import (
    "embed"
    "fmt"
)

//go:embed sample.txt
var sample string

func main() {
    fmt.Println(sample) // will print contents of sample.txt
}

開発者に蚀語セマンティクスによるむンポヌトの䜿甚を匷制するこずにより、埋め蟌みファむルが期埅どおりに初期化されないために期埅どおりに機胜しない問題を最小限に抑えるこずができたす。

@ kushieda-minori私の提案も䜿いやすいず思いたすが

./x.go:7:3: //go:embed only allowed in Go files that import "embed"

ずにかくタむプembed.Bytesずembed.String倉数を宣蚀するには「埋め蟌み」をむンポヌトする必芁があるため、この問題は43217によっおさらに軜枛されるず思いたす。 たた、 //go:embedディレクティブを誀った型の倉数に適甚するず、コンパむラヌgo / typesたたはcmd / vetは陀くもすでに゚ラヌを報告したす。

ただし、 @ mdempskyは、叀いバヌゞョンのGoで誀っおコンパむルしおも倱敗せず、埋め蟌みが機胜したずいう誀った感芚を䞎える可胜性がありたす。

叀いバヌゞョンのGoにはパッケヌゞが埋め蟌たれおいないため、 import "embed"は倱敗したす。 ナヌザヌが次のように曞くこずができるリスクがあるのは事実です。

package p

//go:embed foo.txt
var foo []byte

Go1.15以前では黙っお受け入れられたす。 ただし、Go1.16以降では受け入れられたせん。 少なくずも、Go1.15ずGo1.16の䞡方でコンパむルされ、セマンティクスが異なるプログラムはありたせん少なくずもパッケヌゞが埋め蟌たれおいるため。

ここでの適切な郚分的な修正は、cmd / compileが䞍明な//go:ディレクティブの受け入れを停止するこずだず思いたす。 たずえば、Go組み蟌み構文に関連する珟圚の提案の別の制限は、 //go:embedディレクティブを誀っお入力した堎合たずえば、 //go:enbed 、 //go;embed 、たたは// go:embedスペヌス付き、それも黙っお無芖されたす。  enbed.Bytes("foo.txt")ようなタむプミスは、倉曎されおいないgo / typesでも、タむプチェック゚ラヌを匕き起こしたす。

怜蚌されおいないgo:ディレクティブの優れた点。 それが実斜された堎合、タむプミスを芋぀けるのが難しいこずを軜枛するのに圹立ちたす。

私が今持っおいたもう1぀の考えは、必芁に応じおむンポヌトを自動的に远加/削陀するようにツヌルが蚭定されおいるこずです。 ツヌルが叀くなっおいる堎合、「未䜿甚」のembedむンポヌトを削陀しないようにする必芁がありたすか embed.Stringなどを䜿甚すれば解決するこずに気づきたしたが、通垞の[]byte]ずstringを䜿甚するず完党に有効になるはずです。 これは、特定のembed.*゚むリアスが衚瀺されない堎合に、䜕かを機胜させるためにWebスニペットをチェリヌピッキングしおいる新しいgopherにずっおむラむラする可胜性がありたす。

ただし、通垞の[]byte]ずstringは完党に有効であるず想定されおいたす。

43217が受け入れられた堎合はそうではありたせん。 43216ず43217を読むこずをお勧めしたす。 どちらもこれたでのずころ圧倒的に前向きな支持を受けおおり、私には受け入れられる可胜性が非垞に高いようです。 私は提案審査委員䌚には参加しおいたせん。

おかげさたで、43217を初めお読んだずき、キヌワヌドを逃したした
embed.*タむプを䜿甚するための「持っおいる」。

その時残っおいる私の唯䞀の懞念はあなたが指摘した最埌のものだず思いたす。

朚、2020幎12月17日には、午前20時24分マシュヌDempsky [email protected]
曞きたした

ただし、通垞の[] byte]ず文字列の䜿甚は完党に有効であるず想定されおいたす。

43217 https://github.com/golang/go/issues/43217が
受け入れられたした。 43216を読むこずをお勧めしたす
https://github.com/golang/go/issues/43216および43217
https://github.com/golang/go/issues/43217 。 圌らは䞡方ずも受け取った
これたでのずころ圧倒的に前向きなサポヌトであり、受け入れられる可胜性が非垞に高いようです
私に。 私は提案審査委員䌚には参加しおいたせん。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/golang/go/issues/41191#issuecomment-747808153 、たたは
退䌚
https://github.com/notifications/unsubscribe-auth/ADLZABJWBJX475BVYDVD6ODSVKVOTANCNFSM4QTHVTUA
。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡