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ã§æ¡çšããããšãææ¡ããŸããã
ãã®åé¡ã¯ããã¡ã€ã«ã·ã¹ãã ã€ã³ã¿ãŒãã§ã€ã¹ãã¶ã€ã³ãæ¡çšãããŠããããšãåæãšããŠã
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ã§ã®ãã¹ã-ãšãŠãããmjibson/esc
ã䜿çšãããšãçŸåšãããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ã䜿çšããŠïŒæ°ãããã¡ã€ã«ãååŸããŸãããïŒãã«ãã¿ã°ã䜿çšããŠåäœãå€æŽããããã«æ瀺ããããšãã§ããŸãã ãããææ¡ã«äœãåœãŠã¯ãŸãã®ã ãããïŒ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
ããã±ãŒãžãå¿
èŠã«ãªããŸããïŒ åçãªå€ã«ã¯ãŸã äœããã®ã¿ã€ããå¿
èŠã ãšæããŸãããããã¯äœããã®ããã±ãŒãžã«å«ãŸããŠããŸããïŒ ããã±ãŒãžãè¿œå ããå¿
èŠããªããšããèãã¯ãã©ã¹ã§ãã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
åã蟌ã¿ã¯ããã§ã¯ãããŸããã
ãããããã®ææ¡ããã®ç¹ã«å¯ŸåŠããŠããªãããã«æãããã®ã¯äºå®ã§ãã
æãããã®ããã³ã¡ã³ããããããšãã ãã©ããŒã¢ããããããã«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ã®ã³ã¡ã³ã
//go:embed
ã¢ãããŒãã¯ãå¥ã®ã¬ãã«ã®è€éãããããããŸããã¿ã€ããã§ãã¯ãè¡ãã«ã¯ãéæ³ã®ã³ã¡ã³ãã解æããå¿
èŠããããŸããã³ãŒãããåã蟌ã¿ããã±ãŒãžãã¢ãããŒãã¯ãéçåæã«é©ããŠããããã§ããã ïŒæ³šïŒæ¹èšããã//go:embed
ææ¡ã§ã¯ããã§ãã¯ã³ãŒãã®å
¥åãç°¡åã«ãªããŸãããã¢ãã©ã€ã¶ãŒãå®éã«äœ¿çšãããŠããæååã確èªãããå Žåã¯ãgo / astã«ãªããããç°¡åã§ã¯ãããŸãããïŒgo build -embed example=./path/example.txt
ãšå
¬éããããã±ãŒãžã¢ã¯ã»ã¹ïŒäŸïŒ embed.File("example")
ã䜿çšãã代ããã«go:embed
ïŒ "ïŒ //go:
ãã£ã¬ã¯ãã£ããè¶
ããé¢æ°æ§æãææ¡ããŸããå察祚ãæããŸãããã go build
ææ¡ããã®ã§çãããã§ããã©ã°ãïŒ//go:
ãæ°ããçµã¿èŸŒã¿é¢æ°ã¯å¥œãã§ã¯ãããŸããããã³ã¡ã³ããããã³ãŒãã奜ã¿ãŸããïŒ//go:generate
ãã£ã¬ã¯ãã£ãã¯goãã«ãã§èªåçã«å®è¡ãããªããããgoãã«ãã®åäœã¯å°ãäžè²«ããŠããªãããã«èŠããå ŽåããããŸãïŒ //go:embed
ã¯èªåçã«æ©èœããŸããã //go:generate
å Žåã¯ãæåã§go generateãå®è¡ããå¿
èŠããããŸãïŒ //go:generate
ã¯ããã«ãã«å¿
èŠãª.goãã¡ã€ã«ãçæããå Žåããã§ã«go getãããŒãäžæã§ããŸãïŒã ãã ïŒå®å
šãæãããã«å«ãŸããŠããŸãããæã
ã¯ãã§ã«æã£ãŠãã//go:
è¡ãã圱é¿ã¯ãããŸããäž¡æ¹ãšãããã£ã¬ã¯ãã£ããgo build
ããããã«è¡åã//go:embed
ç§ã¯ãã®åŒæ°ãé
åçãªèŠã€ããããšã¯ãããŸããã®ã§ããïŒ//go:embed
ã«å¯Ÿãããã®ã§ã¯ãããŸãããåãåŒæ°ã¯ã embed.Files
é¢æ°ãªã©ã«ãé©çšãããŸããïŒpackage embed
ã¢ãããŒãã奜ãã§ããimport "C"
ã¢ãããŒãã¯ãã§ã«ãéæ³ã®ãã€ã³ããŒããã¹ã®åäŸãäœã£ãŠããŸããIMOã¯ããªãããŸããããŸããããruntime/embed
ç¹å¥ãªããã±ãŒãžãéžæããã°ããããæºè¶³ãããå°æ¥çã«ç°¡åã«æ¡åŒµã§ããããã«ãªããŸãããgo/ast
/ go/format
ãgo mod edit
ïŒã[...]ã®å Žåç¹å¥ãªããã±ãŒãžã§ãã go.mod
解æïŒ go mod
ããŒã«ïŒãŸãã¯go/ast
ããŒãµãŒã§å€æŽãããã®ã¯äœããããŸããããbinclude.Include(filename)
ãå®è¡ããŸããçŽfs.Embed(filename)
ïŒã//go:embed
æ¹ãäžè¬çã§ããå¯èœæ§ããããŸããã³ã³ãã€ã©ã®å¥ã®æ§æãæ€èšãããšããæ¥ãã®ãããããŸããããã£ã¬ã¯ãã£ãïŒãã³ã¡ã³ããèªãã§ãããšãããŒã«ãå£ããããªå€æŽãé¿ããããšããèŠåãšãšãã«ãåžžã«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
ã
æãåèã«ãªãã³ã¡ã³ã
ã³ã³ã»ã³ãµã¹ã«å€æŽã¯ãªãã®ã§ãåãå ¥ããŸããã