éçã¢ã»ãããã¡ã€ã«ããã€ããªã«åã蟌ãããã®ããŒã«ã¯ãããããããŸãã
å®éã https ïŒ
äžåºŠãããããŸããããéè€ãæžããããã¡ã€ã«ãªãœãŒã¹ãcmd / goããŒã«ã«åã蟌ãããã®å ¬åŒãµããŒããè¿œå ããæãæ¥ããšæããŸãã
go install
ã§ããªãããšããŸãã¯äººã
ã«ç¬èªã®Makefileãäœæãããããšãªã©ãæå³ããŸããgo install
/ go build
ã«åã蟌ã¿ãèªåçã«è¡ãããfunc() io.Reader
ã io.ReaderAt
ãªã©ïŒio.Reader
ã®ã¿ãå¿
èŠãšããå ŽåïŒïŒ ïŒç·šéïŒãããããããããã§ã¯ãããŸãã;以äžã®ã³ã¡ã³ããåç
§ããŠãã ããïŒgo build
ãŸãã¯go install
ã¯ãã€ã³ã¹ããŒã«æã«go:generate
ãèªåçã«å®è¡ãããªãã®ãšåæ§ã«ãä»»æã®ã³ãŒããå®è¡ã§ããŸããã2ã€ã®äž»èŠãªå®è£
ã¢ãããŒãã¯ã //go:embed Logo logo.jpg
ãŸãã¯ããç¥ãããããã±ãŒãžïŒ var Logo = embed.File("logo.jpg")
ïŒã§ãã
go:embed
ã¢ãããŒãã®å Žåã go/build
éžæããã*.go
ãã¡ã€ã«ã«ã¯æ¬¡ã®ãããªãã®ãå«ããããšãã§ããŸãã
//go:embed Logo logo.jpg
ããšãã°ã次ã®ããã«ã³ã³ãã€ã«ãããŸãã
func Logo() *io.SectionReader
ïŒ io
ããã±ãŒãžã«äŸåé¢ä¿ãè¿œå ããŸãïŒ
ãŸãã¯ïŒ
//go:embedglob Assets assets/*.css assets/*.js
ã³ã³ãã€ã«ãããšã次ã®ããã«ãªããŸãã
var Assets interface{
Files() []string
Open func(name string) *io.SectionReader
} = runtime.EmbedAsset(123)
æããã«ãããã¯å®å
šã«å
·äœåãããŠããŸããã io.Reader
ã ããçæããå§çž®ãã¡ã€ã«çšã®äœããå¿
èŠã§ãã
ãã1ã€ã®é«ã¬ãã«ã®ã¢ãããŒãã¯ãéæ³ã®//go:embed
æ§æã䜿çšããã代ããã«ãŠãŒã¶ãŒãæ°ãã"embed"
ãŸãã¯"golang.org/x/foo/embed"
ããã±ãŒãžã§Goã³ãŒããèšè¿°ã§ããããã«ããããšã§ãã
var Static = embed.Dir("static")
var Logo = embed.File("images/logo.jpg")
var Words = embed.CompressedReader("dict/words")
次ã«ãcmd / goã«embed.FooïŒ "foo / *ãjs"ïŒãªã©ã®åŒã³åºããèªèãããglobã«å®è¡æã§ã¯ãªãcmd / goã§äœæ¥ãå®è¡ãããŸãã ãŸãã¯ãç¹å®ã®ãã«ãã¿ã°ãŸãã¯ãã©ã°ã䜿çšãããšã代ããã«å®è¡æã«å®è¡ã«ãã©ãŒã«ããã¯ããå¯èœæ§ããããŸãã PerkeepïŒäžèšã§ãªã³ã¯ïŒã«ã¯ãã®ãããªã¢ãŒããããã1ã€ã®å€§ããªãã€ããªããªã³ã¯ããå¿ èŠããªãå¢åéçºãã¹ããŒãã¢ããããã®ã«äŸ¿å©ã§ãã
../../../../../../../../../../etc/shadow
.git
ãå°éããã®ããããã¯ããŸãembedglob
ãå®å
šãªãã¡ã€ã«ããªãŒããµããŒãããå¿
èŠããããã©ãããæ€èšãã䟡å€ããããŸãããããããäžéšã®Unixã·ã§ã«ã§ãµããŒããããŠãã**
æ§æã䜿çšããŸãã
http.FileServer
ã䜿çšããŠHTTPã§åã蟌ã¿ã¢ã»ãããæäŸããæ©èœãå¿
èŠãªäººãããŸãã
ç§ã¯å人çã«mjibson / escïŒãããè¡ãïŒã䜿çšããããå Žåã«ãã£ãŠã¯ããã¡ã€ã«ã®ååãå€æŽããŠäžæã®ãã¹ãäœæããå
ã®ãã¹ããæ°ãããã¹ã«ããããè¿œå ããç¬èªã®ãã¡ã€ã«åã蟌ã¿å®è£
ã䜿çšããŸãïŒäŸïŒ "/js/bootstrap.min.js": "/js/bootstrap.min.827ccb0eea8a706c4c34a16891f84e7b.js"
ã 次ã«ã次ã®ãããªãã³ãã¬ãŒãã§ãã®ãããã䜿çšã§ããŸãïŒ href="{{ static_path "/css/bootstrap.min.css" }}"
ã
ãã®çµæãããã°ã©ã ãæ§ç¯ããããã«ã©ã®ãã¡ã€ã«ãå¿ èŠããç解ããã®ã¯ç°¡åã§ã¯ãªããšæããŸãã
//go:embed
ã¢ãããŒãã¯ãå¥ã®ã¬ãã«ã®è€éãããããããŸãã ã³ãŒããã¿ã€ããã§ãã¯ããããã«ããéæ³ã®ã³ã¡ã³ãã解æããå¿
èŠããããŸãã ãåã蟌ã¿ããã±ãŒãžãã¢ãããŒãã¯ãéçåæã«é©ããŠããããã§ãã
ïŒããã§å€§å£°ã§é»æ³ããã ãã§ããïŒ
@opennota ã
http.FileServer
ã䜿çšããŠHTTPã§åã蟌ã¿ã¢ã»ãããæäŸããæ©èœãå¿ èŠã«ãªããŸãã
ã¯ããäžèšã®æåã®ãªã³ã¯ã¯ç§ãäœæããããã±ãŒãžïŒ 2011幎ã«Go 1ããåïŒã§ãããçŸåšã䜿çšãããŠãããhttp.FileServerã®äœ¿çšããµããŒãããŠããŸãïŒ https ïŒ//godoc.org/perkeep.org/pkg/fileembed#Files.Open
@cespare ã
// goïŒembedã¢ãããŒãã¯ãå¥ã®ã¬ãã«ã®è€éãããããããŸãã ã³ãŒããã¿ã€ããã§ãã¯ããããã«ããéæ³ã®ã³ã¡ã³ãã解æããå¿ èŠããããŸãã ãåã蟌ã¿ããã±ãŒãžãã¢ãããŒãã¯ãéçåæã«é©ããŠããããã§ãã
ã¯ããè¯ãç¹ã§ãã ããã¯ãããã±ãŒãžã䜿çšããããã®éåžžã«åŒ·åãªè°è«ã§ãã ãŸããcmd / goã®ããã¥ã¡ã³ãã®å¥¥æ·±ãã§ã¯ãªããéåžžã®godocã䜿çšããŠãã¹ãŠãããã¥ã¡ã³ãåã§ãããããèªã¿ããããããã¥ã¡ã³ãåã容æã«ãªããŸãã
@ bradfitz-ãã®https://github.com/golang/go/issues/3035ãéã
@agnivade ããããèŠã€ããŠãããŠããããšãïŒ èŠããŠãããšæã£ãã®ã§ããèŠã€ãããŸããã§ããã ãšããããéãããŸãŸã«ããŠãä»ã®äººã®èããèŠãŠã¿ãŸãããã
ããžãã¯ããã±ãŒãžã䜿çšããå Žåã¯ããšã¯ã¹ããŒããããŠããªãåã®ããªãã¯ã䜿çšããŠãåŒã³åºãå ãã³ã³ãã€ã«æã®å®æ°ãåŒæ°ãšããŠæž¡ãããã«ããããšãã§ããŸãïŒ https ïŒ
ïŒããã¯ããã§åç §ãããŠããæŠç¥ã§ãïŒhttpsïŒ//groups.google.com/forum/#ïŒtopic / golang-nuts / RDA9Hag8RZw / discussionïŒ
ç§ãæžå¿µããŠããããšã®1ã€ã¯ãã€ã³ãããããŸãã¯ãã¹ãŠã®ã¢ã»ããã倧ããããŠã¡ã¢ãªã«åãŸããªãããšãã©ã®ããã«åŠçããããã¢ã¯ã»ã¹æéãšã¡ã¢ãªãããããªã³ãã®åªå é äœä»ãããŸãã¯äžéçãªå®è£ ã®ã©ã¡ãããéžæãããã«ãã¿ã°ãŸãã¯ãã¡ã€ã«ããšã®ã¢ã¯ã»ã¹ãªãã·ã§ã³ããããã©ããã§ãã
ç§ããã®åé¡ã解決ããæ¹æ³ïŒãã¡ããç§ãèªåã®å®è£ ãæã£ãŠããã®ã§:)ïŒã¯ããã¹ãŠã®åã蟌ã¿ã¢ã»ãããæäŸããhttp.FileSystemå®è£ ãæäŸããããšã§ãã ããããã°ãã¿ã€ããã§ãã«ãŒããªã ããããã«éæ³ã®ã³ã¡ã³ãã«é Œãå¿ èŠã¯ãããŸãããã¢ã»ããã¯httpã§ç°¡åã«æäŸã§ãããã©ãŒã«ããã¯å®è£ ã¯ã³ãŒããå€æŽããã«éçºç®çïŒhttp.DirïŒã§æäŸã§ããæçµçã«ã¯http.FileSystemã¯ããã¡ã€ã«ã®èªã¿åãã ãã§ãªãããã£ã¬ã¯ããªã®äžèŠ§è¡šç€ºãããªãã«ããŒããŠãããããå®è£ ã¯éåžžã«çšéãåºãã§ãã
ãã¬ãŒã³ããã¹ããã¡ã€ã«ãä»ããŠãã¹ãŠã®ã°ãããæå®ããæ¹ãããããç°¡åã§ãããããžãã¯ã³ã¡ã³ããªã©ã䜿çšããŠãåã蟌ãå¿ èŠããããã®ãæå®ããããšãã§ããŸãã
@AlexRouSgãã®ææ¡ã¯ãæçµçãªå®è¡å¯èœãã¡ã€ã«ã«çŽæ¥å«ããã®ã«é©åãªãã¡ã€ã«ã®ã¿ã察象ãšããŠããŸãã 倧ããããŠã¡ã¢ãªã«åãŸããªããã¡ã€ã«ã«ããã䜿çšããããšã¯é©åã§ã¯ãããŸããã ãã®å ŽåãåŠçããããã«ãã®ããŒã«ãè€éã«ããçç±ã¯ãããŸããã ãã®å Žåã¯ããã®ããŒã«ã䜿çšããªãã§ãã ããã
@ ianlancetaylor ã @ AlexRouSgãè¡ã£ãŠãã[]byte
ãšããŠæäŸããããšïŒããŒãžã³ã°ã§ããªããæžã蟌ã¿å¯èœãªå¯èœæ§ã®ããã¡ã¢ãªïŒãšãELFã»ã¯ã·ã§ã³ã®èªã¿åãå°çšã®ãªã³ããã³ããã¥ãŒãæäŸããããšã®éãã ãšæããŸããéåžžã *io.SectionReader
ãè¿ãOpen
åŒã³åºããä»ããããã«ãïŒå®è¡å¯èœãã¡ã€ã«å
ã®ïŒãã£ã¹ã¯äžã«ååšããŸãã ïŒ http.File
ãŸãã¯http.FileSystem
ãcmd / goãŸãã¯runtimeã«çŒãä»ããããããŸãã... net / httpã¯ã¢ããã¿ãŒãæäŸã§ããŸããïŒ
@bradfitzäž¡æ¹ã®http.Fileèªäœã¯ã http
ããã±ãŒãžãžã®æè¡çãªäŸåé¢ä¿ã®ãªãã€ã³ã¿ãŒãã§ã€ã¹ã§ãã Stat
Readdir
ã¡ãœãããšOpen
ã¡ãœããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«æºæ ããå®è£
ãæäŸããããšã¯è¯ãèããããããŸããã
@urandom ããã ãããhttp.FileãåïŒhttps://play.golang.org/p/-r3KjG1Gp-8ïŒãåç §ããã«ãhttp.FileSystemãå®è£ ããããšã¯ã§ããŸããã§ããã
@robpikeãšç§ã¯ããã®æ°å¹ŽåïŒææ¡ããã»ã¹ãè¡ãããåïŒã«è¡ãããã®ææ¡ã«ã€ããŠè©±ãåããŸããããäœãããããšã«æ»ãããšã¯ãããŸããã§ããã ç§ãã¡ããããããçµããªãã£ãããšã¯äœå¹Žãã®éç§ãæ©ãŸããŠããŸããã ç§ãèŠããŠããã¢ã€ãã¢ã¯ãéçããŒã¿ãå«ããstaticãã®ãããªç¹å¥ãªãã£ã¬ã¯ããªåãèšå®ãã泚éãå¿ èŠãšããã«APIãä»ããŠèªåçã«å©çšã§ããããã«ããããšã§ããã
ãå§çž®vsãªããããã®è€éãã«ã€ããŠã¯ç¢ºä¿¡ãæãŠãŸããã ããããã°ã人ã ã¯ç§ãã¡ã«ã©ã®å§çž®ãå§çž®ã¬ãã«ãªã©ã®å¶åŸ¡ãè¿œå ããããšãæãã§ããã§ãããã è¿œå ããå¿ èŠãããã®ã¯ããã¬ãŒã³ãã€ãã®ãã¡ã€ã«ãåã蟌ãæ©èœã ãã§ãã ãŠãŒã¶ãŒãå§çž®ããŒã¿ããã®ãã¡ã€ã«ã«ä¿åãããå Žåã¯ã詳现ã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãããGoåŽã«APIã¯ãŸã£ããå¿ èŠãããŸããã
ããã€ãã®èãïŒ
//go:embed
ã³ã¡ã³ãã䜿çšãããŠããå ŽåïŒãŸãã¯ç¹å®ã®ãµããã£ã¬ã¯ããªïŒ static
ã䜿çšãããŠããå ŽåïŒã«åã蟌ãããã«å¶éããæ¹ãç°¡åã ãšæããŸãã ããã«ãããããã±ãŒãžãšåã蟌ã¿ãã¡ã€ã«ã®é¢ä¿ãéåžžã«ç°¡åã«ç解ã§ããããã«ãªããŸãããããã«ãããããã¯/etc/shadow
ãŸãã¯.git
åã蟌ã¿ããããã¯ããŸãã ã©ã¡ããã¢ãžã¥ãŒã«zipã«å«ããããšã¯ã§ããŸããã
äžè¬çã«ãgoã³ãã³ãã®ç¯å²ãæ¡å€§ããããã®ã§ã¯ãªãããšå¿é ããŠããŸãã ãã ãããã®åé¡ã«å¯Ÿãã解決çãéåžžã«å€ããšããäºå®ã¯ããããã1ã€ã®å ¬åŒãªè§£æ±ºçãããã¯ãã§ããããšãæå³ããŸãã
ç§ã¯go_embed_data
ãšgo-bindata
ïŒããã€ãã®ãã©ãŒã¯ããããŸãïŒã«ç²ŸéããŠãããããã¯ãããã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠããããã§ãã ãããã«ããŒããŠããªãä»ã®äººã解決ããéèŠãªåé¡ã¯ãããŸããïŒ
ç¹ã«static
ãŸãã¯embed
ãã£ã¬ã¯ããªã䜿çšããŠããå Žåã¯ãç¹å®ã®ãã¡ã€ã«ããããã¯ããã®ã¯ããã»ã©é£ãããããŸããã ã·ã³ããªãã¯ãªã³ã¯ã¯ãããå°ãè€éã«ãããããããŸããããçŸåšã®ã¢ãžã¥ãŒã«ã®å€éšããŸãã¯GOPATHã䜿çšããŠããå Žåã¯ããã£ã¬ã¯ããªãå«ãããã±ãŒãžã®å€éšã«äœããåã蟌ãŸããªãããã«ããããšãã§ããŸãã
ç§ã¯ã³ãŒãã«ã³ã³ãã€ã«ãããã³ã¡ã³ãã®ãã¡ã³ã§ã¯ãããŸããããã³ã³ãã€ã«ã«åœ±é¿ãäžããç䌌ããã±ãŒãžãå°ãå¥åŠã ãšæããŸãã ãã£ã¬ã¯ããªã¢ãããŒãã䜿çšããªãå Žåã¯ãããçš®ã®embed
ãããã¬ãã«å®£èšãå®éã«èšèªã«çµã¿èŸŒãæ¹ãå°ãçã«ããªã£ãŠãããããããŸããã import
ãšåæ§ã«æ©èœããŸãããããŒã«ã«ãã¹ã®ã¿ããµããŒãããå²ãåœãŠãããã®ååãå¿
èŠã«ãªããŸãã äŸãã°ã
embed ui "./ui/build"
func main() {
file, err := ui.Open("version.txt")
if err != nil {
panic(err)
}
version, err = ioutil.ReadAll(file)
if err != nil {
panic(err)
}
file.Close()
log.Printf("UI Version: %s\n", bytes.TrimSpace(version))
http.ListenAndServe(":8080", http.EmbeddedDir(ui))
}
ç·šéïŒããªãã¯ããã«ç§ãæã¡è² ãããŸããã@ jayconrodã
https://github.com/golang/go/issues/35950#issuecomment -561703346ãæ¡åŒµããã«ã¯ãå
¬éãããAPIã«é¢ããããºã«ããããŸãã ããŒã¿ãå
¬éããæçœãªæ¹æ³ã¯ã []byte
ã string
ãããã³Read
ã£ãœãã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
å
žåçãªã±ãŒã¹ã¯ãåã蟌ãŸããããŒã¿ãäžå€ã«ãããå Žåã§ãã ãã ãã []byte
ïŒ io.Reader
ã io.SectionReader
ãªã©ãå«ãïŒãå
¬éãããã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãïŒ1ïŒã³ããŒãäœæããããïŒ2ïŒå¯å€æ§ãèš±å¯ããããïŒ3ïŒ []byte
ã§ããã«ãããããããäžå€ã§ããã ããŒã¿ãstring
ãšããŠå
¬éããããšã§ããã解決ã§ããŸãããAPIãç ç²ã«ããŠãåã蟌ã¿ãã¡ã€ã«ãæ¶è²»ããå€ãã®ã³ãŒããæçµçã«äœããã®æ¹æ³ã§ãã€ãã¹ã©ã€ã¹ãå¿
èŠãšããããããšã«ããã³ããŒãå¿
èŠã«ãªãããšããããããŸãã
ã«ãŒãïŒ3ïŒããå§ãããŸãïŒ []byte
ã§ããã«ããããããäžå€ã§ããã ãããã³ã°é
åã«èªã¿åãå°çšã·ã³ãã«ã䜿çšããããšã§ããããå®äŸ¡ã«å®æœã§ããŸãã ããã«ããã []byte
ããã³string
ãšåãããŒã¿ãå®å
šã«å
¬éããããšãã§ããŸãã ããŒã¿ãå€æŽããããšãããšå€±æããŸãã ã³ã³ãã€ã©ãŒã¯äžå€æ§ãå©çšã§ããŸããããããã¯ããã»ã©å€§ããªæ倱ã§ã¯ãããŸããã ããã¯ãããŒã«ãã§ãŒã³ã®ãµããŒããããŒãã«ã«ããããããšãã§ãããã®ã§ãããïŒç§ãç¥ãéãïŒæ¢åã®codegenããã±ãŒãžã®ã©ããããŸããã
ïŒãµãŒãããŒãã£ã®codegenããã±ãŒãžã¯ãèªã¿åãå°çšãšããŠããŒã¯ãããDATA
ã·ã³ãã«ãå«ãæ±çšã¢ã»ã³ããªãã¡ã€ã«ãçæãããããã®ã·ã³ãã«ãstring
圢åŒã§å
¬éããçãã¢ãŒãåºæã®ã¢ã»ã³ããªãã¡ã€ã«ãçæããããšã§ãããè¡ãããšãã§ããŸãã sãããã³[]byte
sã®ãç§ãæžããCL 163747ãç¹ã«å¿µé ã«çœ®ããŠããã®ãŠãŒã¹ã±ãŒã¹ã§ã決ããŠä»»æã®ã³ãŒãçæããã±ãŒãžã«çµ±åããæããïŒ
äžå€æ§ã®èŠ³ç¹ããããªããäœã«ã€ããŠè©±ããŠããã®ãããããŸããã io.Reader
ãã§ã«äžå€æ§ã匷å¶ããŠããŸãã ãããå
šäœã®ãã€ã³ãã§ãã Read(buf)
ãåŒã³åºããšã_you_ãæäŸãããããã¡ã«ããŒã¿ãã³ããŒãããŸãã ãã®åŸbuf
å€æŽããŠãã io.Reader
ã®å
éšã«ã¯åœ±é¿ããŸããã
@DeedleFakeã«åæããŸãã éæ³ã®[]byte
é
åãããã³ã°ã§ã²ãŒã ãããããããŸããã ãã€ããªãããŠãŒã¶ãŒæäŸã®ãããã¡ã«ã³ããŒããŠãåé¡ãããŸããã
ããã§ãã1ã€ã®åé¡ããããŸããDTraceãœãŒã¹ã³ãŒãïŒåã蟌ã¿ïŒã䜿çšããå¥ã®ãããžã§ã¯ãããããŸãã ããã¯ã\ nãš\ r \ nã®éãã«ææã§ãã ïŒãããDTraceã®éŠ¬é¹¿ããããšã§ãããã©ãããè°è«ããããšãã§ããŸã-ããã¯éèŠãªããšã§ã¯ãªããä»æ¥ã®ç¶æ³ã§ããïŒ
ããã¯ãã£ãã¯æååããœãŒã¹ã§ã®è¡šç€ºæ¹æ³ã«é¢ä¿ãªãäž¡æ¹ã\ nãšããŠæ±ãããšã¯éåžžã«äŸ¿å©ã§ãããDTraceãåã蟌ãããã«go-generateã§ããã«äŸåããŠããŸãã
ãããã£ãŠãgoã³ãã³ãã«åã蟌ã¿ãã¡ã€ã«ãè¿œå ãããŠããå Žåã¯ãCR / CRLFã®åŠçãå€æŽãããªãã·ã§ã³ãéåžžã«åœ¹ç«ã€å¯èœæ§ãããããšããå§ãããŸããç¹ã«ãããã©ã«ãã®è¡æ«ãå¯èœãªããŸããŸãªã·ã¹ãã ã§éçºããŠããå Žåã¯ããã§ããèœãšãç©Žã
å§çž®ã®å Žåãšåæ§ã«ãããã¡ã€ã«ãã€ãããã€ããªã«ã³ããŒãããããšã§åæ¢ããããšæããŸãã CR / CRLFæ£èŠåãUnicodeæ£èŠåãgofmt'ingããã®ä»ãã¹ãŠã«å±ããŸãã å¿ èŠãªæ£ç¢ºãªãã€ããå«ããã¡ã€ã«ããã§ãã¯ã€ã³ããŸãã ïŒããŒãžã§ã³ç®¡çã§ãããããã®ãŸãŸã«ã§ããªãå Žåã¯ãgzipã§å§çž®ãããã³ã³ãã³ãããã§ãã¯ã€ã³ããå®è¡æã«ããããgunzipã§å§çž®ããŸããïŒè¿œå ããããšãæ³åã§ãã_å€ãã®_ãã¡ã€ã«å€æŽããããããŸãã 0ã§åæ¢ããŸãããã
ç§ãæãéããæ°ããäºçŽæžã¿ãã£ã¬ã¯ããªåãå°å
¥ããã«ã¯é
ããããããããŸããã
ïŒ2014幎ã«ã¯é
ãããŸããã§ããããããããä»ã§ã¯é
ãããŸããïŒ
ãããã£ãŠãäœããã®ãªããã€ã³ã³ã¡ã³ããå¿
èŠã«ãªãå ŽåããããŸãã
ã¿ã€ãruntime.Filesãå®çŸ©ãããšããŸãã 次ã«ãããªãã¯æžãããšãæ³åããããšãã§ããŸãïŒ
//go:embed *.html (or static/* etc)
var files runtime.Files
次ã«ãå®è¡æã«files.OpenãåŒã³åºãã ãã§ãããŒã¿ãå«ãinterface { io.ReadSeeker; io.ReaderAt }
ãååŸã§ããŸãã varã¯ãšã¯ã¹ããŒããããŠããªããããããããã±ãŒãžãå¥ã®ããã±ãŒãžã®åã蟌ã¿ãã¡ã€ã«ãã°ã©ãããããšã¯ã§ããŸããã
TBDãšããååã§ãããã¡ã«ããºã ã«é¢ããŠã¯ããã§ååã§ããããã«æããããããåçŽåããæ¹æ³ãããããŸããã ïŒãã¡ããç°¡ç¥åã¯å€§æè¿ã§ãïŒïŒ
äœãããã«ããŠããBazelãšGazelleã§ãµããŒãã§ããå¿ èŠããããŸãã ã€ãŸããGazelleã«ã³ã¡ã³ããèªèãããã°ããã瀺ãBazelã«ãŒã«ãæžãåºãããšãæå³ããŸãã次ã«ããã«ãã«å«ããè¿œå ã®ãã¡ã€ã«ãçæããããã®ããŒã«ïŒgo tool embedgenãªã©ïŒãå ¬éããå¿ èŠããããŸãïŒgoã³ãã³ãã¯ãããèªåçã«è¡ããå®éã«äœåãªãã¡ã€ã«ã衚瀺ããããšã¯ãããŸããïŒã ããã¯ååã«ç°¡åã«æããŸãã
ããŸããŸãªå€æŽã§ããŸããããªãå Žåãããã¯ãã®æ°ããæ©èœã䜿çšããããšã«å察ããè°è«ã§ãã ããã¯ç§ã«ãšã£ãŠã¹ããããŒã§ã¯ãããŸãã-ç§ã¯ä»ãŸã§ãšåãããã«gogenerateã䜿çšã§ããŸãããããã¯ç§ãæ°æ©èœã®æ©æµãåããããšãã§ããªãããšãæå³ããŸãã
äžè¬çãªå€æŽã«é¢ããŠã¯ã誰ããã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãæäŸãããœãªã¥ãŒã·ã§ã³ãæ³åã§ããŸãïŒäžæ¹ã«ReaderïŒïŒã®ãããªãã®ãããäžæ¹ã«ãã¡ã€ã«ãåä¿¡ãããã®ïŒãããããio.Readerã§ã€ã³ã¹ã¿ã³ã¹åãããŸãããã¡ã€ã«èªäœããïŒ-go cmdããã«ãããŠå®è¡ããåã蟌ã¿åã«ãã¡ã€ã«ãäºåã«ãã£ã«ã¿ãªã³ã°ããŸãã ãã®åŸã人ã ã¯åœŒããæãã©ããªãã£ã«ã¿ãŒãæäŸããããšãã§ããŸãã dos2unixã®å®è£ ãå§çž®ãªã©ã®æºæšæºãã£ã«ã¿ãŒãæäŸãã人ããããšæããŸãïŒãã¶ããããã¯ãã§ãŒã³å¯èœã§ããå¿ èŠããããŸãïŒã
çµã¿èŸŒã¿ããã»ããµãäœã§ããããã®ç®çã®ããã«äžæçãªãã€ãã£ãããŒã«ãæ§ç¯ããã®ã§ããã¹ãŠã®ãã«ãã·ã¹ãã ã§ã³ã³ãã€ã«å¯èœã§ãªããã°ãªããªããšããä»®å®ãå¿ èŠã ãšæããŸãã
ç§ãæãéããæ°ããäºçŽæžã¿ãã£ã¬ã¯ããªåãå°å ¥ããã«ã¯é ããããããããŸããã [...]ããçš®ã®ãªããã€ã³ã³ã¡ã³ããå¿ èŠãªå ŽåããããŸãã
runtime/embed
ãªã©ã®ç¹å¥ãªããã±ãŒãžãä»ããŠã®ã¿ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããå Žåã¯ããã®ããã±ãŒãžãã€ã³ããŒãããããšããªããã€ã³ã·ã°ãã«ã§ããå¯èœæ§ããããŸãã
io.Read
ã¢ãããŒãã¯ã strings.Contains
ïŒ cmd/go/internal/cfg
ïŒããæ¹å€çã«ã template.Parse
ã
ãããã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãåŒã³åºãå
ãBLOBå
šäœãïŒããããã¡ã¢ãªããããããïŒ string
ãšããŠæ±ããio.ReaderAt
ãšããŠæ±ãããéžæã§ããããã«ããã®ãçæ³çã§ãã
ãã ããããã¯äžè¬çãªruntime.Files
ã¢ãããŒããšäºææ§ãããããã§ãã runtime.Files.Open
ããè¿ããããã®ã«ã¯ãã¡ã¢ãªãããè¡šçŸãè¿ãReadString() string
ã¡ãœãããå«ãŸããŠããå¯èœæ§ããããŸãã
äœããã®ãªããã€ã³ã³ã¡ã³ããå¿ èŠã«ãªãå ŽåããããŸãã
go.mod
ãã¡ã€ã«ã®go
ããŒãžã§ã³ã§ãããè¡ãããšãã§ããŸãã 1.15
ïŒãŸãã¯ãã®ä»ïŒã®åã¯ã static
ãµããã£ã¬ã¯ããªã«ããã±ãŒãžãå«ãŸãã 1.15
以äžã§ã¯åã蟌ã¿ã¢ã»ãããå«ãŸããŠããŸããã
ïŒãã ãã GOPATH
ã¢ãŒãã§ã¯å®éã«ã¯åœ¹ã«ç«ã¡ãŸãããïŒ
ãå§çž®vsãªããããã®è€éãã«ã€ããŠã¯ç¢ºä¿¡ãæãŠãŸããã ããããã°ã人ã ã¯ç§ãã¡ã«ã©ã®å§çž®ãå§çž®ã¬ãã«ãªã©ã®å¶åŸ¡ãè¿œå ããããšãæãã§ããã§ãããã è¿œå ããå¿ èŠãããã®ã¯ããã¬ãŒã³ãã€ãã®ãã¡ã€ã«ãåã蟌ãæ©èœã ãã§ãã
ã·ã³ãã«ããžã®æ欲ã«æè¬ããŸããããŠãŒã¶ãŒã®ããŒãºãæºãããŠããããšã確èªããå¿ èŠããããŸãã
https://tech.townsourced.com/post/embedding-static-files-in-go/#comparisonã«ãªã¹ããããŠãã14åã®ããŒã«ã®ãã¡12åã¯å§çž®ããµããŒãããŠãããããã¯ããªãäžè¬çãªèŠä»¶ã§ããããšã瀺ããŠããŸãã
goã®å€ã§ãã«ãåã®ã¹ããããšããŠå§çž®ãè¡ãããšãã§ããã®ã¯äºå®ã§ãããããã§ã1ïŒå§çž®ãè¡ãããã®ããŒã«2ïŒããçš®ã®assets.zip
ããããvcsã«ãã§ãã¯ã€ã³ãã3ïŒãããããŠãŒãã£ãªãã£ãå¿
èŠã§ãå§çž®ãå
ã«æ»ãããã®åã蟌ã¿APIåšèŸºã®ã©ã€ãã©ãªã ãã®æç¹ã§ãã©ã®ãããªã¡ãªãããããã®ãââã¯ãŸã£ããäžæã§ãã
æåã®ææ¡ã«èšèŒããã3ã€ã®ç®æšã¯æ¬¡ã®ãšããã§ãã
ãããã®2çªç®ããåã蟌ã¿ã«å¥ã®ããŒã«ãå¿ èŠãšããªãããšèªãã å Žåãå§çž®ãã¡ã€ã«ãçŽæ¥çãŸãã¯éæ¥çã«ãµããŒãããªããšãããã3ã€ã®ç®æšãã¹ãŠãéæã§ããŸããã
ããã¯ããã±ãŒãžã¬ãã«ã§ããå¿ èŠããããŸããïŒ ã»ãšãã©ã®å Žåã1ã€ã®ã¢ãžã¥ãŒã«= 1ã€ã®ãããžã§ã¯ãã§ãããããã¢ãžã¥ãŒã«ã¬ãã«ã®ç²åºŠã¯åªããŠããããã§ãã
ãã®ãã£ã¬ã¯ããªã«ã¯Goã³ãŒãâ ãå«ãŸããŠããªãã®ã§ã _static
ãããªãã®ã§ããããïŒ
â ãŸãã¯ãããã§ããå Žåã¯ãã³ã³ãã€ã«ãããGoã³ãŒããšããŠã§ã¯ãªããååãã.goãã§çµããä»»æã®ãã€ããšããŠæ±ãããŸãã
ããã1ã€ã®ç¹å¥ãªãã£ã¬ã¯ããªã§ããå Žåãããžãã¯ã¯ãã®ãã£ã¬ã¯ããªããªãŒå
ã®ãã¹ãŠã®ãã®ãäžžåã¿ã«ããå¯èœæ§ããããŸãã éæ³ã®åã蟌ã¿ããã±ãŒãžã䜿çšãããšã embed.Open("img/logo.svg")
ãããªæäœãå®è¡ããŠãã¢ã»ããããªãŒã®ãµããã£ã¬ã¯ããªã«ãããã¡ã€ã«ãéãããšãã§ããŸãã
æååã§ååãªããã§ãã ãããã¯ç°¡åã«[]byte
ã³ããŒãããã Reader
å€æãããã§ããŸãã ã³ãŒãçæãŸãã¯ã©ã€ãã©ãªã䜿çšããŠãããæŽç·ŽãããAPIãæäŸãã init
éã«åŠçãè¡ãããšãã§ããŸãã ããã«ã¯ã解åãŸãã¯http.FileSystem
äœæãå«ãŸããå¯èœæ§ããããŸãã
Windowsã«ã¯ãã¢ã»ãããåã蟌ãããã®ç¹å¥ãªåœ¢åŒã¯ãããŸããã Windowså®è¡å¯èœãã¡ã€ã«ããã«ããããšãã«ããã䜿çšããå¿ èŠããããŸããïŒ ãããããªããããã¯æäŸã§ããæäœã®çš®é¡ã«åœ±é¿ãåãŒããŸããïŒ
gitfsãå¿ããªãã§ãã ããð
go build / linkã®äžéšã«ã§ããªãçç±ã¯ãããŸãã...äŸïŒ go build -embed example=./path/example.txt
ãšãããã«ã¢ã¯ã»ã¹ã§ããããã±ãŒãžïŒäŸïŒ go:embed
ã䜿çšãã代ããã«embed.File("example")
ïŒ go:embed
ïŒ
ãã ããã³ãŒãã«ã¯ãã®ããã®ã¹ã¿ããå¿ èŠã§ã
@egonelbre go build -embed
ã®åé¡ã¯ããã¹ãŠã®ãŠãŒã¶ãŒããããé©åã«äœ¿çšããå¿
èŠããããšããããšã§ãã ããã¯å®å
šã«ééçã§èªåã§ããå¿
èŠããããŸãã æ¢åã®go install
ãŸãã¯go get
ã³ãã³ãã¯ãæ£ããããšããããããšã¯ã§ããŸããã
@bradfitzPackrãããhttps://github.com/markbates/pkgerããå§ãã
func run() error {
f, err := pkger.Open("/public/index.html")
if err != nil {
return err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return err
}
fmt.Println("Name: ", info.Name())
fmt.Println("Size: ", info.Size())
fmt.Println("Mode: ", info.Mode())
fmt.Println("ModTime: ", info.ModTime())
if _, err := io.Copy(os.Stdout, f); err != nil {
return err
}
return nil
}
ãŸãã¯ãç¹å®ã®ãã«ãã¿ã°ãŸãã¯ãã©ã°ã䜿çšãããšã代ããã«å®è¡æã«å®è¡ã«ãã©ãŒã«ããã¯ããå¯èœæ§ããããŸãã PerkeepïŒäžèšã§ãªã³ã¯ïŒã«ã¯ãã®ãããªã¢ãŒããããã1ã€ã®å€§ããªãã€ããªããªã³ã¯ããå¿ èŠããªãå¢åéçºãã¹ããŒãã¢ããããã®ã«äŸ¿å©ã§ãã
mjibson / escããããè¡ããŸããããã¯ãWebã¢ããªãéçºããéã®ç掻ã®è³ªã®å€§å¹ ãªåäžã§ãã ãªã³ã¯æéãç¯çŽã§ããã ãã§ãªããWebã¢ããªã®å®è£ ã«ãã£ãŠã¯ãã¢ããªã±ãŒã·ã§ã³ãåèµ·åããå¿ èŠããªããªããŸããããã«ã¯ãããªãã®æéããããããå€æŽããã¹ãããããã«è¿œå ã®æé ãç¹°ãè¿ãå¿ èŠããããŸãã
çŸåšã®ç¶æ³ã«é¢ããåé¡ïŒ
- goïŒgenerateããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãåãã¡ã€ã«ã®2çªç®ã®ïŒãããŠå°ã倧ããïŒã³ããŒã§gitå±¥æŽãè¥å€§åããŸãã
ç®æšïŒ
- çæããããã¡ã€ã«ããã§ãã¯ã€ã³ããªãã§ãã ãã
ãã®éšåã¯ãçæããããã¡ã€ã«ã.gitignore
ãã¡ã€ã«ãŸãã¯åçã®ãã®ã«è¿œå ããã ãã§ç°¡åã«è§£æ±ºã§ããŸãã ç§ã¯ãã€ããããããŸãã...
ãããã£ãŠã代ããã«ãGoã¯ãããã©ã«ãã§go build
ã§å®è¡ãããç¬èªã®ãå
¬åŒãåã蟌ã¿ããŒã«ãæã¡ãæ
£äŸãšããŠãããã®ãã¡ã€ã«ãç¡èŠããããã«äººã
ã«äŸé Œããããšãã§ããŸãã ããã¯ãå©çšã§ããéæ³ã®è§£æ±ºçã§ã¯ãããŸããïŒãããŠãæ¢åã®GoããŒãžã§ã³ãšã®äžäœäºææ§ããããŸãïŒã
ç§ã¯ããã§ãã¬ã€ã³ã¹ããŒãã³ã°/声ãåºããŠèããŠããã ãã§ã...ããããç§ã¯å®éã«ææ¡ãããã¢ã€ãã¢ãå šäœçã«å¥œãã§ãã ð
ãŸãã以æ¥ã //go:generate
ãã£ã¬ã¯ãã£ããèªåçã«å®è¡ãããŸããgo build
ã®æ¯ãèãgo build
ãããã®ççŸã«èŠãããããããŸããïŒ //go:embed
èªåçã«åäœããŸããã®ããã®//go:generate
go generate
æåã§//go:generate
ã¯ããã«ãã«å¿
èŠãª.go
ãã¡ã€ã«ãçæããå Žåããã§ã«go get
ãããŒãäžæããå¯èœæ§ããããŸãïŒã
//go:generate
ã¯ããã«ãã«å¿ èŠãª.go
ãã¡ã€ã«ãçæããå Žåããã§ã«gogetãããŒãäžæããå¯èœæ§ããããŸã
ãã®ããã®éåžžã®ãããŒãšãç§ãäžè¬çã«äœ¿çšããŠãããããŒã¯ãå°ãæ
£ããå¿
èŠã§ããã go generate
éçºçµäºããŒã«ãšããŠå®å
šã«äœ¿çšãã次ã®ãã¡ã€ã«ãã³ãããããããšã ãšæããŸããçæããŸãã
@bradfitz http.FileSystem
èªäœãå®è£
ããå¿
èŠã¯ãããŸããã å®è£
ãhttp.File
ãå®è£
ããåãæäŸããå Žåãstdlib httpããã±ãŒãžãå«ãã Open
é¢æ°ã®ã©ãããŒãæäŸããŠãåãhttp.File
ã«å€æããããšã¯ã誰ã«ãšã£ãŠãç°¡åã§ãã http.FileSystem
ãã ãã@ andreynering //go:generate
ãš//go:embed
ã¯å€§ããç°ãªããŸãã ãã®ã¡ã«ããºã ã¯ãä»»æã®ã³ãŒããå®è¡ããªãããããã«ãæã«ã·ãŒã ã¬ã¹ã«çºçããå¯èœæ§ããããŸãã ããã¯ãcgoãgo build
äžéšãšããŠã³ãŒããçæããæ¹æ³ãšäŒŒãŠãããšæããŸãã
ãå§çž®vsãªããããã®è€éãã«ã€ããŠã¯ç¢ºä¿¡ãæãŠãŸããã ããããã°ã人ã ã¯ç§ãã¡ã«ã©ã®å§çž®ãå§çž®ã¬ãã«ãªã©ã®å¶åŸ¡ãè¿œå ããããšãæãã§ããã§ãããã è¿œå ããå¿ èŠãããã®ã¯ããã¬ãŒã³ãã€ãã®ãã¡ã€ã«ãåã蟌ãæ©èœã ãã§ãã
ã·ã³ãã«ããžã®æ欲ã«æè¬ããŸããããŠãŒã¶ãŒã®ããŒãºãæºãããŠããããšã確èªããå¿ èŠããããŸãã
https://tech.townsourced.com/post/embedding-static-files-in-go/#comparisonã«ãªã¹ããããŠãã14åã®ããŒã«ã®ãã¡12åã¯å§çž®ããµããŒãããŠãããããã¯ããªãäžè¬çãªèŠä»¶ã§ããããšã瀺ããŠããŸãã
ç§ã¯ãã®æšè«ã«åæãããã©ããããããŸããã
ä»ã®ã©ã€ãã©ãªã«ãã£ãŠè¡ãããå§çž®ã¯ããã®ææ¡ã«è¿œå ããããšãšã¯ç°ãªãã代æ¿ã¯äžè¬çã«ãã«ãæã§ã¯ãªããã«ãåã«çæããããããåŸç¶ã®ãã«ãã®ããã©ãŒãã³ã¹ãäœäžããããšã¯ãããŸããã
ãã«ãæéãçãããšã¯ãä»ã®èšèªãããåªããŠããããšã«ããæãããªä»å 䟡å€ã§ãããå§çž®ã¯CPUæéããã¬ãŒãããŠã¹ãã¬ãŒãž/転éãããããªã³ããåæžããŸãã å€ãã®Goããã±ãŒãžãgo build
å§çž®ã®å®è¡ãéå§ããå Žåããã«ãäžã«ã¢ã»ãããã³ããŒããã ãã§è¿œå ãããæéãããããã«å€ãã®ãã«ãæéãè¿œå ãããŸãã ä»ã®äººãå§çž®ãè¡ã£ãŠãããããå§çž®ãè¿œå ããããšã«æççã§ãã åæèšèšãèšèšäžãã€ãŸãå§çž®ã®ãµããŒããè¿œå ããå°æ¥ã®æ¡åŒµã劚ããªãéãããããããã«çœ®ãããšã¯ãäžå¿
èŠãªãããžã®ããã«æããããããããªãã®ã§ãããã«å
¥ããŸãã
ãã¡ã€ã«ã®åã蟌ã¿ãå§çž®ãªãã§ã¯åœ¹ã«ç«ããªããšããããã§ã¯ãããŸãããå§çž®ã¯ããã€ããªãµã€ãºããããã100MBãã50MBã«æžããã®ã«äŸ¿å©ã§ããããã¯çŽ æŽãããããšã§ãããç§ãèããããšãã§ããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã®æ確ãªååŒã劚ãããã®ã§ããããŸããã ã ç¹ã«ããéããã¢ã»ããã®ã»ãšãã©ãããã§ã«ããªãååã«å§çž®ãããŠããJPEGãPNGãªã©ã®ãã¡ã€ã«ã§ããå Žåã¯ããã§ã¯ãããŸããã
ä»ã®ãšããå§çž®ãé¿ããŠãå®éã«å€ãã®äººãèŠéããŠããå Žåã¯è¿œå ããã®ã¯ã©ãã§ããïŒ ïŒãããŠãé床ã®ã³ã¹ããªãã§è¡ãããšãã§ããŸãïŒ
äžèšã®@sakjurã®ã³ã¡ã³ãã«è¿œå ããã«ã¯ïŒå§çž®ã¯ç§ã«çŽäº€ããŠããããã§ãã ç§ã¯éåžžãã¢ã»ããã ãã§ãªãããââã€ããªå šäœãŸãã¯ãªãªãŒã¹ã¢ãŒã«ã€ãå šäœãå§çž®ããããšèããŠããŸãã ç¹ã«ãGoã®Goãã€ããªããã¢ã»ãããªãã§æ°åã¡ã¬ãã€ãã«ç°¡åã«å ¥ãå¯èœæ§ãããå Žåã
@mvdanç§ã®æžå¿µã®1ã€ã¯ãåã蟌ã¿ãä»ã®ååŠçïŒçž®å°ãã¿ã€ãã¹ã¯ãªããã®ã³ã³ãã€ã«ãããŒã¿å§çž®ãç»åã®ã¯ã©ã³ããç»åã®ãµã€ãºå€æŽãã¹ãã©ã€ãã·ãŒãïŒãšäžç·ã«è¡ãããããšãããèŠãããšã§ãã å¯äžã®äŸå€ã¯ã html/template
ã®ã¿ã䜿çšããWebãµã€ãã§ãã ãããã£ãŠãæçµçã«ã¯ããšã«ããäœããã®ãMakefileãã䜿çšããããååŠçãããã³ã³ãã³ããã¢ããããŒããããããå¯èœæ§ããããŸãã ãã®æå³ã§ãã³ãã³ãã©ã€ã³ãã©ã°ã¯ã³ã¡ã³ã以å€ã®ããŒã«ã§ããŸãæ©èœãããšæããŸãã
ç§ã®æžå¿µã®1ã€ã¯ãåã蟌ã¿ãä»ã®ååŠçïŒçž®å°ãã¿ã€ãã¹ã¯ãªããã®ã³ã³ãã€ã«ãããŒã¿å§çž®ãç»åã®ã¯ã©ã³ããç»åã®ãµã€ãºå€æŽãã¹ãã©ã€ãã·ãŒãïŒãšäžç·ã«è¡ãããããšãããèŠãããšã§ãã å¯äžã®äŸå€ã¯ãhtml / templateã®ã¿ã䜿çšããWebãµã€ãã§ãã
ãããã§ãããã¯æçšãªããŒã¿ãã€ã³ãã§ãã ãããããå§çž®ã®å¿ èŠæ§ã¯èŠãç®ã»ã©äžè¬çã§ã¯ãããŸããã ãããããªããç§ã¯ãããçãããšã¯çã«ããªã£ãŠããããšã«åæããŸãã
ãã¡ã€ã«ã®åã蟌ã¿ãå§çž®ãªãã§ã¯åœ¹ã«ç«ããªããšããããã§ã¯ãããŸãããå§çž®ã¯ããã€ããªãµã€ãºããããã100MBãã50MBã«æžããã®ã«äŸ¿å©ã§ããããã¯çŽ æŽãããããšã§ãããç§ãèããããšãã§ããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã®æ確ãªååŒã劚ãããã®ã§ããããŸããã ã
ãã€ããªãµã€ãºã¯ãå€ãã®Goéçºè ã«ãšã£ãŠå€§ããªåé¡ã§ãïŒhttps://github.com/golang/go/issues/6853ïŒã Goã¯ããªã³ã¯æéã«ã³ã¹ããããããŸãããç¹ã«ãã€ããªãµã€ãºãåæžããããã«DWARFãããã°æ å ±ãå§çž®ããŸãïŒhttps://github.com/golang/go/issues/11799ãhttps://github.com/golang/go/çºè¡/ 26074ïŒã ãã€ããªãµã€ãºãååã«æžããç°¡åãªæ¹æ³ãããã°ãéçºè ã¯ãã®æ©äŒã«é£èºãããšæããŸãïŒãã ããããã§ã®å©çãã»ãŒããã»ã©éèŠã«ãªããšã¯æããŸããïŒã
ãã ããGOPATHã¢ãŒãã§ã¯å®éã«ã¯åœ¹ã«ç«ã¡ãŸããã
ãã¶ããGOPATHã¢ãŒãã®å ŽåãGoããŒã ãGOPATHã®æ©èœããªãã£ãæ°žä¹ ã«å®è¡ããäºå®ã¯ãªããšæãã®ã§ããã®æ©èœã¯åã«é©çšãããŸãããïŒ GOPATHã§ãµããŒããããŠããªãæ©èœããã§ã«ãããŸãïŒãã§ãã¯ãµã ããŒã¿ããŒã¹ã䜿çšããã»ãã¥ãªãã£ããããã·ãµãŒããŒãä»ããäŸåé¢ä¿ã®ããŠã³ããŒããã»ãã³ãã£ãã¯ã€ã³ããŒãã®ããŒãžã§ã³ç®¡çãªã©ïŒ
@bcmillsãè¿°ã¹ãããã«ãgo.modãã¡ã€ã«ã«éçãã£ã¬ã¯ããªåãå«ããããšã¯ã<= go1.14å¥ãæã€go.modãã¡ã€ã«ã§ãã®æ©èœãèªåçã«ãªãã«ã§ãããããGo1.15ã§ãã®æ©èœãå°å ¥ããããã®åªããæ¹æ³ã§ãã
ãšã¯ãããããã¯ããŠãŒã¶ãŒãéçãã£ã¬ã¯ããªãã¹ãæåã§æžã蟌ãå¿ èŠãããããšãæå³ããŸãã
ãã³ããŒãã£ã¬ã¯ããªãš_test.goã®èŠåã¯ãGoãšããã2ã€ã®æ©èœã®æäœãã¯ããã«ç°¡åã«ããæ¹æ³ã®è¯ãäŸã ãšæããŸãã
ãã³ããŒã®ãã£ã¬ã¯ããªåãã«ã¹ã¿ãã€ãºãããªãã·ã§ã³ãèŠæ±ãããã _test.go
èŠåãå¥ã®ãã®ã«å€æŽãããããæ©èœãæã£ãŠãã人ã¯ããŸãããŸããã ããããGoã_test.goæ©èœãå°å
¥ããªãå ŽåãGoã§ã®ãã¹ãã¯ä»æ¥ã§ã¯å€§ããç°ãªã£ãŠèŠããŸãã
ãããã£ãŠã static
ãããäžè¬çã§ãªãååã䜿çšãããšãè¡çªãçºçããªãå¯èœæ§ãé«ããªããŸãããããã£ãŠãåŸæ¥ã®ãã£ã¬ã¯ããªïŒvendorã_test.goãšåæ§ïŒã䜿çšãããšãéæ³ã®ã³ã¡ã³ãããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããå¯èœæ§ããããŸãã
è¡çªãå°ãªãå¯èœæ§ã®ããååã®äŸïŒ
_embed
- _test.go
èŠåã«åŸããŸãgo_binary_assets
.gobin
ã¯.gitã®èŠåã«åŸããŸãruntime_files
- runtime.Files
æ§é äœãšäžèŽããããã«æåŸã«ã vendor
ãã£ã¬ã¯ããªãGo1.5ã§è¿œå ãããŸããã ãã£ãããä»æ°ããã³ã³ãã³ã·ã§ã³ãè¿œå ããã®ã¯ããã»ã©æªããªãã®ã§ããããïŒ ð
mmap-readonly []byte
ãå
¬ââéããå¿
èŠããããšæããŸãã å¿
èŠã«å¿ããŠOSã«ãã£ãŠããŒãžã€ã³ããããå®è¡å¯èœãã¡ã€ã«ããã®ããŒãžãžã®çã®ã¢ã¯ã»ã¹ã ãã®äžã«ã bytes.NewReader
ã ãã§ä»ã®ãã¹ãŠãæäŸã§ããŸãã
ãããäœããã®çç±ã§åãå
¥ããããªãå Žåã¯ã ReadSeeker
ã ãã§ãªãReaderAt
ãæäŸããŠãã ããã åŸè
ã¯åè
ããæ§ç¯ããã®ã¯ç°¡åã§ãããä»ã®æ¹æ³ã¯ããã»ã©è¯ããããŸãããåäžã®ãªãã»ãããä¿è·ããããã«ãã¥ãŒããã¯ã¹ãå¿
èŠã«ãªããããã©ãŒãã³ã¹ãå°ç¡ãã«ãªããŸãã
ãã¡ã€ã«ã®åã蟌ã¿ãå§çž®ãªãã§ã¯åœ¹ã«ç«ããªããšããããã§ã¯ãããŸãããå§çž®ã¯ããã€ããªãµã€ãºããããã100MBãã50MBã«æžããã®ã«äŸ¿å©ã§ããããã¯çŽ æŽãããããšã§ãããç§ãèããããšãã§ããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã®æ確ãªååŒã劚ãããã®ã§ããããŸããã ã
ãã€ããªãµã€ãºã¯ãå€ãã®Goéçºè ã«ãšã£ãŠå€§ããªåé¡ã§ãïŒïŒ6853ïŒã Goã¯DWARFãããã°æ å ±ãå§çž®ããŠãç¹ã«ãã€ããªãµã€ãºãåæžããŸãããããã«ã¯ãªã³ã¯æéãããããŸãïŒïŒ11799ãïŒ26074ïŒã ãã€ããªãµã€ãºãååã«æžããç°¡åãªæ¹æ³ãããã°ãéçºè ã¯ãã®æ©äŒã«é£èºãããšæããŸãïŒãã ããããã§ã®å©çãã»ãŒããã»ã©éèŠã«ãªããšã¯æããŸããïŒã
ããã¯ééããªãå ¬æ£ãªç¹ã§ãããç§ã®è°è«ããã¡ã€ã«ãµã€ãºã«é¢ããäžæ³šæãæ¯æããè°è«ãšããŠã©ã®ããã«èŠãããããèŠãããšãã§ããŸãã ããã¯ç§ã®æå³ã§ã¯ãããŸããã§ããã ç§ã®ãã€ã³ãã¯ãå§çž®ãªãã§ãã®æ©èœãåºè·ããããšãšäžèŽããŠãããããã§ãäžéšã®äººã«ãšã£ãŠã¯æçšã§ãããé·æçã«é©åã«æããæ¹æ³ã§å§çž®ãé©åã«è¿œå ããæ¹æ³ã«é¢ããæçšãªãã£ãŒãããã¯ãšæŽå¯ãæäŸã§ããŸãã ã¢ã»ããã¯ããããã°æ å ±ãå®è¡ããããã«ãªãæ¹æ³ã§èšããå¯èœæ§ããããå®è£ ã«ãã£ãŠç°¡åã«å®è¡ã§ããå Žåã¯ãä»ã®ãŠãŒã¶ãŒã«ãã£ãŠã€ã³ã¹ããŒã«/ã€ã³ããŒããããããã±ãŒãžã®éçºè ããã«ãã®ããã©ãŒãã³ã¹ãäžå¿ èŠã«äœäžãããããšã容æã«ãªããŸãã
ãã1ã€ã®ãªãã·ã§ã³ã¯ãã¢ã»ããã®å§çž®ããã«ããã©ã°ã«ãããã«ããµã€ãºãšæéã®éã®åŠ¥åç¹ãéçºè ã§ã¯ãªããã«ããŒã«ä»»ããããšã§ãã ããã«ãããå§çž®ã䟡å€ããããã©ãããå€æã§ãããã€ããªã®ãšã³ããŠãŒã¶ãŒã«æ±ºå®ãè¿ã¥ããŸãã é³ãããã¯éçºãšæ¬çªã®éãã§è¡šé¢ç©ãå¢ãããªã¹ã¯ãããã®ã§ãä»ã®äœãããæ確ãªæ¹æ³ã§ã¯ãªããç§ã䞻匵ããããšæããã®ã§ããããŸããã
ç§ã®çŸåšã®ã¢ã»ããåã蟌ã¿ããŒã«ã¯ã -tags dev
ãã«ããããšãã¢ã»ãããã¡ã€ã«ããã³ã³ãã³ããããŒãããŸãã ãã®ãããªããã€ãã®èŠåã¯ãããããããã§ã圹ç«ã€ã§ãããã HTMLããã³ãã¬ãŒãããããå Žåãªã©ãéçºãµã€ã¯ã«ã倧å¹
ã«ççž®ãããŸãã
ããã§ãªãå ŽåãåŒã³åºãå
ã¯ãã®äœã¬ãã«ã®ã¡ã«ããºã ãããã€ãã®*_dev.go
ããã³*_nodev.go
ã©ãããŒã§ã©ãããã dev
ã·ããªãªã®éåã蟌ã¿ããŒããå®è£
ããå¿
èŠããããŸãã é£ããããšã§ã¯ãããŸãããããã®éã¯ããã®åé¡ã«é¢ããæåã®ã³ã¡ã³ãã§èª¬æãããŠããã®ãšåæ§ã®ããŒã«ã®ççºã«ã€ãªããã ãã§ãã ãããã®ããŒã«ã¯ãä»æ¥ãããå°ãªãäœæ¥ã§æžã¿ãŸãããããã§ãå¢å ããŸãã
Goã¢ãžã¥ãŒã«ã®å€éšã§å®è¡ãããšãã«-tags dev
ãæ©èœããªãã®ã¯åççã ãšæããŸãïŒã¢ã»ãããã©ãããããŒãããããããããŸããïŒã
å
¥åãåãåããã³ã³ãã¥ãŒã¿ãŒã«ãã£ãŠåã蟌ã¿ãã¡ã€ã«ãšããŠèªèããã runtime/emved
ãªã©ãä»ããŠã¢ã¯ã»ã¹ã§ããç¹å¥ãªåœ¢åŒã®Goåºåãã¡ã€ã«ãçæããgo tool embed
ã«ã€ããŠã¯ã©ãã§ããããã 次ã«ãåçŽãª//go:generate gzip -o - static.txt | go tool embed -o static.go
å®è¡ã§ããŸãã
ãã¡ããã倧ããªæ¬ ç¹ã¯ãçæããããã¡ã€ã«ãã³ãããããå¿ èŠãããããšã§ãã
@DeedleFakeãã®åé¡ã¯
goïŒgenerateããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãåãã¡ã€ã«ã®2çªç®ã®ïŒãããŠå°ã倧ããïŒã³ããŒã§gitå±¥æŽãè¥å€§åããŸãã
ãããŒã ã©ãã§ãã ãããã
ãã¡ã€ã«ã®åã蟌ã¿ãå§çž®ãªãã§ã¯åœ¹ã«ç«ããªããšããããã§ã¯ãããŸãããå§çž®ã¯ããã€ããªãµã€ãºããããã100MBãã50MBã«æžããã®ã«äŸ¿å©ã§ããããã¯çŽ æŽãããããšã§ãããç§ãèããããšãã§ããã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã®æ©èœã®æ確ãªååŒã劚ãããã®ã§ããããŸããã ã
ãã€ããªãµã€ãºã¯ãå€ãã®Goéçºè ã«ãšã£ãŠå€§ããªåé¡ã§ãïŒïŒ6853ïŒã Goã¯DWARFãããã°æ å ±ãå§çž®ããŠãç¹ã«ãã€ããªãµã€ãºãåæžããŸãããããã«ã¯ãªã³ã¯æéãããããŸãïŒïŒ11799ãïŒ26074ïŒã ãã€ããªãµã€ãºãååã«æžããç°¡åãªæ¹æ³ãããã°ãéçºè ã¯ãã®æ©äŒã«é£èºãããšæããŸãïŒãã ããããã§ã®å©çãã»ãŒããã»ã©éèŠã«ãªããšã¯æããŸããïŒã
ãããå¿
èŠãªå Žåã人ã
ã¯å§çž®ããŒã¿ãã³ãããããŠåã蟌ãããšãã§ãã runtime.Embed
ãšãšã³ãã³ã³ã·ã¥ãŒããŒã®éã«ã€ã³ã©ã€ã³ã§è§£åãè¡ãã¬ã€ã€ãŒãæäŸããããã±ãŒãžããããŸãã
ãããŠãä»ãã1ã2幎åŸã«ã¯ãå§çž®ã®è¿œå ã«é¢ããæ°ããåé¡ãçºçããããã䞊ã¹æ¿ããããšãã§ããŸãã
ç§ãgoembedãæžãããšããç§ã¯ããã15ã®ç«¶åããæšæºã®1ã€ãšããŠèšããŸã:)
@ tv42ã¯æžããïŒ
mmap-readonly
[]byte
ãå ¬ââéããå¿ èŠããããšæããŸãã å¿ èŠã«å¿ããŠOSã«ãã£ãŠããŒãžã€ã³ããããå®è¡å¯èœãã¡ã€ã«ããã®ããŒãžãžã®çã®ã¢ã¯ã»ã¹ã
ãã®ã³ã¡ã³ãã¯ç°¡åã«èŠèœãšãããé©ãã»ã©äŸ¡å€ããããŸãã
@ tv42 ã
mmap-readonly [] byteãå ¬éããå¿ èŠããããšæããŸãã å¿ èŠã«å¿ããŠOSã«ãã£ãŠããŒãžã€ã³ããããå®è¡å¯èœãã¡ã€ã«ããã®ããŒãžãžã®çã®ã¢ã¯ã»ã¹ã ãã®äžã«ãbytes.NewReaderã ãã§ä»ã®ãã¹ãŠãæäŸã§ããŸãã
ãã§ã«èªã¿åãå°çšã«ãªã£ãŠããã¿ã€ãã¯string
ã§ãã ãŸãã io.ReaderAt
ãšã¯ç°ãªãããµã€ãºãæäŸããæšæºã©ã€ãã©ãªã«äŸåããŸããã ããã¯ããããç§ãã¡ãå
¬éããããã®ã§ãã
ãã§ã«èªã¿åãå°çšã«ãªã£ãŠããã¿ã€ãã¯
string
ã§ãã
ãããã Write
ãªã©ã®ãšã³ã·ã¹ãã å
šäœã¯[]byte
ãŸãã ããã¯åçŽãªå®çšäž»çŸ©ã§ãã io.Writer.Write
ããã¥ã¡ã³ããèšã£ãŠãã以äžã«ãèªã¿åãå°çšããããã£ãåé¡ã«ãªãããšã¯ãªããšæããŸãã
æžã蟌ã¿ã¯ãäžæçã§ãã£ãŠããã¹ã©ã€ã¹ããŒã¿ãå€æŽããŠã¯ãªããŸããã
ãã1ã€ã®æœåšçãªæ¬ ç¹ã¯ããã£ã¬ã¯ããªã«go:generate
ãåã蟌ããšãã«ã git diff
ã®åºåããã§ãã¯ããŠã誀ã£ãŠãã¡ã€ã«ãååšãããã©ããã確èªã§ããããšã§ãã ãã®ææ¡ã§-ïŒ ãããããgoã³ãã³ãã¯ãããåã蟌ãã§ãããã¡ã€ã«ã®ãªã¹ããåºåããã§ããããïŒ
@ tv42
ããããWriteãªã©ã®ãšã³ã·ã¹ãã å šäœã¯[]ãã€ãã§æ©èœããŸãã
ãã ãã html/template
ã¯æååã§æ©èœããŸãã
ãã§ã«-ldflags-Xã䜿çšããŠããã€ãã®æååãèšå®ã§ããŸãïŒgitããŒãžã§ã³ãã³ã³ãã€ã«æããµãŒããŒããŠãŒã¶ãŒãªã©ã®èšå®ã«åœ¹ç«ã¡ãŸãïŒããã®ã¡ã«ããºã ãæ¡åŒµããŠãæååã®ä»£ããã«io.Readersãèšå®ã§ããŸããïŒ
@bradfitzããã¹ãã§ã¯ãªãããŒã¿ã«å¯ŸããŠããããã§æååã䜿çšããããšãææ¡ããŠããŸããïŒ ã¢ã€ã³ã³ãå°ããªç»åãªã©ã®å°ããªãã€ããªãã¡ã€ã«ãåã蟌ãã®ã¯äžè¬çã§ãã
@ tv42 Write
ãšãã£ããããŸãããã Read
ãæå³ããŠãããšæããŸãã ããªãã¯å€ããããšãã§ããŸãstring
ã«io.ReaderAt
䜿çšããŠstrings.NewReader
ããã®æååã䜿çšãããšãããã«éå£ã®ããã«èŠããããŠããŸãããã
@andreynering string
ã¯ãä»»æã®ãã€ãã·ãŒã±ã³ã¹ãä¿æã§ããŸãã
string
ã¯ãä»»æã®ãã€ãã·ãŒã±ã³ã¹ãä¿æã§ããŸãã
ãããã§ããã®äž»ãªç®çã¯ããã¹ããä¿æããããšã§ãããä»»æã®ããŒã¿ãä¿æããããšã§ã¯ãããŸããã ããã¯ãç¹ã«çµéšã®æµ ãGoéçºè ã«ãšã£ãŠãå°ãæ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããšæããŸãã
ããããç§ã¯å®å šã«ãã®èããæãã€ããŸããã æ確ã«ããŠããã ãããããšãããããŸãã
@ianlancetaylor
Read
ã¯ãæž¡ãããã¹ã©ã€ã¹ãå€æŽããããšã«ãªã£ãŠããŸãã Write
ã¯å€æŽãããŸããã ãããã£ãŠã Write
ããã¥ã¡ã³ãã«ã¯ãããã¯èš±å¯ãããŠããªããšèšèŒãããŠããŸãã ãŠãŒã¶ãŒãè¿ããã[]byte
æžã蟌ã¿ãããŠã¯ãªããªãããšãææžåãã以å€ã«ãäœãå¿
èŠãšãããŠããŸããã
strings.Reader
ãååšãããããšãã£ãŠã io.WriteString
ãæååãæžãå¹ççãªå®è£
ãèŠã€ãããšã¯éããŸããã ããšãã°ã TCPConn
ã¯WriteString
ããããŸããã
ãœã±ããã«æžã蟌ãããã ãã«ãã¹ãŠã®ããŒã¿ã匷å¶çã«ã³ããŒããããã ãã«ããã®ãããªæ°æ©èœãGoã«å«ããã®ã¯å«ã§ãã
ãŸããäžè¬çãªä»®å®ã§ã¯ãæååã¯äººéãå°å·ã§ãããã®ã§ããã []byte
ã¯å°å·ã§ããªãããšããããããŸãã JPEGãæååã«å
¥ãããšã端æ«ããã¡ããã¡ãã«ãªããŸãã
@opennota
ãã ããhtml / templateã¯æååã§æ©èœããŸãã
ãããããã¯å¥åŠãªãã®ã§ããããã¯ãªãŒããŒãšããŠã§ã¯ãªããã¹åã§ãã¡ã€ã«ããšãã ãã§ãã 2ã€ã®å¿çïŒ
åã蟌ãŸããããŒã¿ãBytes() []byte
ãšString() string
äž¡æ¹ã®ã¡ãœãããæã€ããšãã§ããªãã£ãçç±ã¯ãããŸããã
ããŸãããã°ããªã¯ãšã¹ãããšã«ãã³ãã¬ãŒãã解æããŠããããã§ã¯ãããŸããã äžæ¹ãå®éã«ã¯ãJPEGã®ããŒã¿ãèŠæ±ãããã¹ãŠã®èŠæ±ã«å¯ŸããŠTCPãœã±ããã«éä¿¡ããå¿ èŠããããŸãã
@ tv42å¿
èŠã«å¿ããŠã WriteString
ã¡ãœãããè¿œå ã§ããŸãã
ãã®æ©èœã®æãäžè¬çãªäœ¿çšæ³ã¯ãå€æŽãããŠããªãããŒã¿ãæžã蟌ãããšã§ã¯ãªããšæããŸãããã®ããããã®å Žåã«æé©åããå¿ èŠã¯ãªããšæããŸãã
ãã®æ©èœã®æãäžè¬çãªäœ¿çšæ³ã¯ãå€æŽãããŠããªãããŒã¿ãæžã蟌ãããšã§ã¯ãªããšæããŸãã
ãã®æ©èœã®çµ¶å¯Ÿçã«æãäžè¬çãªäœ¿çšæ³ã¯ãå€æŽãããŠããªãWebã¢ã»ãããimages / js / cssãæäŸããããšã ãšæããŸãã
ããããç§ã®èšèãä¿¡ããªãã§ãã ããããã©ããã®fileembedã®ã€ã³ããŒã¿ãŒã®ããã€ããèŠãŠã¿ãŸãããã
#fileembed pattern .+\.(js|css|html|png|svg|js.map)$
#fileembed pattern .*\.png
md5-f8b48fccd03599094034bf2b507e9e67
#fileembed pattern .*\.js$
çã ..
äºäŸããŒã¿ã®å ŽåïŒãããå®è£
ãããŠããã°ãããã«2ã€ã®å Žæã§äœ¿çšããã©ã¡ããéçããã¹ããã¡ã€ã«ãžã®å€æŽãããŠããªãã¢ã¯ã»ã¹ãæäŸããããšã«ãªããŸãã çŸåšã //go:generate
ã¹ãããã䜿çšããŠããã¡ã€ã«ãå®æ°ïŒ16é²åœ¢åŒïŒæååã«å€æããŠããŸãã
æ什ã§ã¯ãªããæ°ããããã±ãŒãžã«æ祚ããŸãã ææ¡ãããããåãæ±ã/管çãã¯ããã«ç°¡åã§ãææžåãšæ¡åŒµãã¯ããã«ç°¡åã§ãã ããšãã°ããgoïŒgenerateããªã©ã®Goãã£ã¬ã¯ãã£ãã®ããã¥ã¡ã³ããç°¡åã«èŠã€ããããšãã§ããŸããïŒ ãfmtãããã±ãŒãžã®ããã¥ã¡ã³ãã¯ã©ãã§ããïŒ ç§ãããã§ã©ãã«è¡ãã®ãåãããŸããïŒ
ãããã£ãŠã代ããã«ãGoã¯ãããã©ã«ãã§
go build
ã§å®è¡ãããç¬èªã®ãå ¬åŒãåã蟌ã¿ããŒã«ãæã€ããšãã§ããŸã
@andreyneringä»ã®ããã±ãŒãžãããŒãžã£ãŒãèšèªããŒã«ã§èš±å¯ãããŠããããšã¯ç¥ã£ãŠããŸããããã«ãæã«ä»»æã®ã³ãŒã/ã³ãã³ããå®è¡ããããšã¯ã»ãã¥ãªãã£ã®è匱æ§ã§ãïŒæãããªçç±ã§ãããšæããŸãïŒã
ãã®æ©èœã«ã€ããŠèãããšããããã«2ã€ã®ããšãé ã«æµ®ãã³ãŸãã
æåã®ã³ã¡ã³ãã§ãªã³ã¯ãããŠããstuffbinã¯ãäž»ã«èªå·±ãã¹ãåWebã¢ããªã±ãŒã·ã§ã³ãéçïŒHTMLãJS ...ïŒã¢ã»ãããåã蟌ãããšãã§ããããã«æ§ç¯ãããŸããã ããã¯äžè¬çãªäœ¿çšäŸã®ããã§ãã
ã³ã³ãã€ã«/å§çž®ã®è°è«ãé€ãã°ããã1ã€ã®åé¡ç¹ã¯ãstdlibã«ãã¡ã€ã«ã·ã¹ãã ã®æœè±¡åããªãããšã§ããçç±ã¯æ¬¡ã®ãšããã§ãã
éçºè
ã®ãã·ã³ã§ã¯ãå€æ°ã®go run
ãšãã«ãããã¢ã»ããã®åã蟌ã¿ïŒãªãã·ã§ã³ã§å§çž®äžïŒã®ãªãŒããŒãããã«ãã£ãŠè² æ
ãããå¿
èŠã¯ãããŸããã ãã¡ã€ã«ã·ã¹ãã ã®æœè±¡åã«ãããéçºäžã«ããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ã«ç°¡åã«ãã§ã€ã«ãªãŒããŒã§ããŸãã
ã¢ã»ããã¯ãéçºäžã«ã¢ã¯ãã£ãã«å€æŽãããå¯èœæ§ããããŸããããšãã°ãWebã¢ããªã±ãŒã·ã§ã³ã®å®å šãªJavascriptããã³ããšã³ãã§ãã åã蟌ã¿ã¢ã»ããã®ä»£ããã«åã蟌ã¿ãšããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ãã·ãŒã ã¬ã¹ã«åãæ¿ããæ©èœã«ãããã¢ã»ãããå€æŽããããšããçç±ã ãã§Goãã€ããªã®ã³ã³ãã€ã«ãšåå®è¡ãåé¿ã§ããŸãã
ç·šéïŒçµè«ãšããŠãåã蟌ã¿ããã±ãŒãžãhttp.FileSystemãããåªãããã¡ã€ã«ã·ã¹ãã ã®ãããªã€ã³ã¿ãŒãã§ã€ã¹ãå ¬éã§ããã°ããããã®æžå¿µã¯è§£æ±ºãããŸãã
åã蟌ã¿ãšããŒã«ã«ãã¡ã€ã«ã·ã¹ãã ãã·ãŒã ã¬ã¹ã«åãæ¿ããæ©èœ
確ãã«ãããã¯ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§å®è£ ã§ãããã®ææ¡ã®ç¯å²ãè¶ ããŠããŸããã
確ãã«ãããã¯ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã§å®è£ ã§ãããã®ææ¡ã®ç¯å²ãè¶ ããŠããŸããã
ç³ãèš³ãããŸããããæ°ä»ããã°ããã§ãããç§ãèšã£ãæ¹æ³ã¯ãããŸãã§ãã ç§ã¯embedããã±ãŒãžå
ã«ãã¡ã€ã«ã·ã¹ãã ã®å®è£
ãææ¡ããŠããŸããã§ãããã http.FileSystem
ãããåªããã€ã³ã¿ãŒãã§ã€ã¹ã ããææ¡ããŠããŸããã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã¯ããããçš®é¡ã®æœè±¡åãå®è£
ã§ããããã«ãªããŸãã
ç·šéïŒã¿ã€ããã¹ã
@knadh go run
䜿çšããã ãã§ãæ©èœããã¯ãã§ããããšã«å®å
šã«åæããŸããããã¯ãPackrããããåŠçããæ¹æ³ãéåžžã«åªããŠããŸãã ãã¡ã€ã«ãã¢ããªã«åã蟌ãŸããŠããªãå Žåã¯ããã¡ã€ã«ãã©ãã«ããããèªèããåºæ¬çã«ãéçºã¢ãŒããã§ãããšæ³å®ããŠããã£ã¹ã¯ãããã¡ã€ã«ãããŒãããŸãã
Packrã®äœè ã¯ãGoã¢ãžã¥ãŒã«ã«éç¹ã眮ããæ°ããããŒã«PkgerããªãªãŒã¹ããŸããã ããã«ãããã¡ã€ã«ã¯ãã¹ãŠãGoModuleã«ãŒãã«é¢é£ããŠããŸãã ç§ã¯ãã®ã¢ã€ãã¢ãæ¬åœã«å¥œãã§ãããPkgerã¯ãã£ã¹ã¯ããã®ããŒã«ã«éçºããŒããå®è£ ããŠããªãããã§ãã äž¡æ¹ã®çµã¿åããã¯çŽ æŽãããIMOã«ãªããŸãã
ãã§ã«å®è¡ãããŠããªããã©ããã¯ããããŸãããããåã蟌ã¿ããã±ãŒãžã¢ãããŒããã¯ããªãéæ³ã®ããã§ãããããŒã«ãåŒã³åºãã«åºã¥ããŠãã¡ã€ã«ã«äœãããããæšæž¬ã§ãããããããã€ãã®çŽ æŽãããæ©èœãæäŸããŸãã ããšãã°ãAPIã¯æ¬¡ã®ããã«ãªããŸã
package embed
func FileReader(name string) io.Reader {âŠ}
func FileReaderAt(name string) io.ReaderAt {âŠ}
func FileBytes(name string) []byte {âŠ}
func FileString(name string) string {âŠ}
goããŒã«ãFileReaderAt
åŒã³åºããæ€åºãããšãããŒã¿ã解åããå¿
èŠãããããšãããããŸãã FileReader
åŒã³åºãã®ã¿ãæ€åºãããå Žåãå§çž®ããŒã¿ãæ ŒçŽã§ããããšãããããŸãã FileBytes
åŒã³åºããèŠã€ãã£ãå Žåã¯ãã³ããŒãå®è¡ããå¿
èŠãããããšãèªèãã FileString
ã®ã¿ãæ€åºãããå Žåã¯ãèªã¿åãå°çšã¡ã¢ãªãããµãŒãã¹ãæäŸã§ããããšãèªèããŸãã çã
ã
ãããgoããŒã«ã«é©åã«å®è£ ããããã®åççãªæ¹æ³ã§ãããšã¯ç¢ºä¿¡ããŠããŸããã ããããå®éã®ããããªããŠããå§çž®ãšãŒãã³ããŒåã蟌ã¿ã®å©ç¹ãåŸãããšãã§ããã®ã§ãããã«ã€ããŠèšåããããšæããŸãã
[ç·šé]ãŸãããã¡ãããæåã«ãã£ãšæå°éã®æ©èœã»ããã«çŠç¹ãåœãŠãŠãäºåŸã«ãããã®äœåãªãã³ã°ãªã³ã°ãè¿œå ããŸããã[/ç·šé]
FileReaderåŒã³åºãã®ã¿ãèŠã€ãã£ãå Žå...
ããã«ããããªãã¬ã¯ã·ã§ã³ãä»ããŠä»ã®æ¹æ³ã䜿çšã§ããªããªããŸãã
[ç·šé]å®éããã®åœ±é¿ã¯ãããããåºããšæããŸãã FileReaderAt
ã®äœ¿çšãããŒã¿ãéå§çž®ã«ããå¿
èŠãããããšã瀺ããŠããå Žåã const
å
¥åã§FileReaderAt()
ã䜿çšãããšããã¹ãŠã®ãã¡ã€ã«ãéå§çž®ã§ä¿åããå¿
èŠããããŸãã
ãããè¯ãã®ãæªãã®ãããããŸããã éæ³ã®ãã¥ãŒãªã¹ãã£ãã¯ã¯ãæåã¯èµ€é¢ããŠããããã«èŠããã»ã©æçšã§ã¯ãªããšæããŸãã
ç¹å¥ãªãã£ã¬ã¯ããªåïŒ static/
ïŒã®ä»£ããã«ã³ã¡ã³ããã©ã°ãïŒ //go:embed
ïŒãæ¯æãã1ã€ã®åŒæ°ïŒã³ã¡ã³ãã䜿çšãããšãããã±ãŒãžïŒãŸãã¯xtestã¢ãŒã«ã€ãïŒã®ãã¹ãã¢ãŒã«ã€ãã«ãã¡ã€ã«ãåã蟌ãããšãã§ããŸãã ïŒãã ãããã¹ãäžã®ã©ã€ãã©ãªã§ã¯ãããŸããã ã³ã¡ã³ãã¯_test.go
ãã¡ã€ã«ã«è¡šç€ºããå¿
èŠããããŸãã
ããã«ãããã¢ãžã¥ãŒã«ã®äžè¬çãªåé¡ã解決ããããšæããŸããå¥ã®ããã±ãŒãžãå¥ã®ã¢ãžã¥ãŒã«ã«ããå Žåããã®ããã±ãŒãžã®ãã¹ãããŒã¿ã«ã¢ã¯ã»ã¹ããã®ã¯å°é£ã§ãã ããã±ãŒãžã¯ã _test.go
ãã¡ã€ã«ã«//go:embedglob testdata/*
ãããªã³ã¡ã³ããä»ããŠãä»ã®ãã¹ãã®ããŒã¿ãæäŸã§ããŸãã ããã±ãŒãžã¯ããããã®ãã¡ã€ã«ããã«ããã«ãéåžžã®éãã¹ããã€ããªã«ã€ã³ããŒãã§ããŸãã
@ fd0 ã
åã蟌ã¿ãã¡ã€ã«ã¯ãã«ããã£ãã·ã¥ã§ã©ã®ããã«èªåçã«æ©èœããŸããïŒ
ããã§ãæ©èœããŸãã åã蟌ãŸãããã¡ã€ã«ã³ã³ãã³ãã®ããã·ã¥ã¯ããã£ãã·ã¥ããŒã«æ··åãããŸãã
ã¢ããªã±ãŒã·ã§ã³å ãã次ã®ãããªãã¹ãéãããšããã ãã®ããã«ãå®è³ªçã«ééçãªã¢ãžã¥ãŒã«/ããã±ãŒãž/ã¡ã«ããºã ãæã€ããšã¯å¯èœã§ããããïŒãŸãã¯è¯ãã¢ã€ãã¢ã§ãããããŸããïŒã
internal://static/default.css
ãã¡ã€ã«é¢æ°ã¯ããã€ããªå
ããããŸãã¯å¥ã®å ŽæããããŒã¿ãèªã¿åããŸã
äŸPackage.Mount("internal[/<folder>.]", binary_path + "/resources/")
ãã€ããªå ã®ãã¹ãŠã®ãã¡ã€ã«ã§ãinternalïŒ//ããäœæããã«ã¯ãå®è¡å¯èœãã¹/ãªãœãŒã¹ã«ãã©ãŒã«ããã¯ããŸã/éçºã¢ãŒãã®å ŽåããŸãã¯ãã¡ã€ã«ããã€ããªã«èŠã€ãããªãå ŽåïŒãããŠãããããã®ã³ã°ç®çã§èŠåãªã©ãã¹ããŒããŸãïŒ
ããã«ãããããšãã°ã
Package.Mount("internal", binary_path + "/resources/private/")
Package.Mount("anotherkeyword", binary_path + "/resources/content/")
'release'ã¢ãŒãã§ã¯ãå®è¡å¯èœãã¡ã€ã«ã®ãã¹ã«ä»£æ¿ã®å Žæãããã¯ããã®ãããããæåã§ãããdevã¢ãŒãã§ã¯ãããç·©åããŸãïŒgo_pathãªã©ã®ãã©ã«ããŒã®ã¿ãèš±å¯ããŸãïŒ
ããã©ã«ãã§ã¯ãããã±ãŒãžã¯internalïŒ//ãŸãã¯ãã®ä»ã®ããŒã¯ãŒãããããŠã³ããããŸãããå¿ èŠã«å¿ããŠãŠãŒã¶ãŒãååãå€æŽã§ããããã«ããŸããäŸïŒReMountïŒ "internal"ã "myCustomName"ïŒãªã©ã
å¥ã®ããš...å¥ã®å Žæã§æçµå€æŽ/å€æŽæå»ã確èªããã¢ããªã±ãŒã·ã§ã³ã®å€éšã«ãã®ãããªãã¡ã€ã«ãããå Žåã¯å
éšãã¡ã€ã«ãèªåçã«ãªãŒããŒã©ã€ãããããšã¯çã«ããªã£ãŠããŸãïŒãããå¯èœã«ãããã©ã°ãããããã«ãåã«ããã°ã©ããŒãæ§æã§ããŸãïŒ
ããã¯ãæ°ãããã«ããäœæãããŠé
åžãããã®ãåŸ
ã¡ãããªãã¢ããªã±ãŒã·ã§ã³ã®è¶
é«éãããã«å¿
èŠãªå ŽåããããŸãããã©ã«ããäœæããŠããã«ãã¡ã€ã«ãã³ããŒããã ãã§ããã€ããªãæ°ãããã®ã«åãæ¿ãããŸãããã¡ã€ã«ã
Windowsã§ã¯ããªãœãŒã¹ã䜿çšããããšã¯å¯èœã§ããããããŸãã¯æå³ããããŸããïŒãªãœãŒã¹å
ã®ãã€ããªããŒã¿ãããã®ããã«ïŒ
å°ãé¢ä¿ãããŸãããããã®ããã±ãŒãžã¯ãå®è¡å¯èœãã¡ã€ã«ããããã§ã¹ãããŒã¿ããŸãã¯ãã®ä»ã®ãªãœãŒã¹å
ã®ã¢ã€ã³ã³ã®ãã³ãã«ãåŠçã§ããå¯èœæ§ããããŸããïŒ ç§ã¯ãããWindowsã ãã ãšæ°ã¥ããŸã...
ãã«ããŒã¯ã代æ¿ãã©ã«ããŒå
ã®ãã¡ã€ã«ã®æçµå€æŽæ¥/å€æŽæ¥ããã°ã«èšé²ãããã¡ã€ã«ãå€æŽãããŠãã®BLOBãã©ããã«ãã£ãã·ã¥ããå Žåã«ã®ã¿ããããŒã¿ã®BLOBã®äœæããããªã¬ãŒã§ãããšæããŸãã
ãã¶ããããã£ãã·ã¥ããã¡ã€ã«ãäœæããã ãã§ããŠãŒã¶ãŒã¯ãããã®ãã³ãã«ãã¡ã€ã«ã®å§çž®ãæå¹ã«ããããšãéžæããŸãïŒæçµçã«ããããå§çž®ããããšã決å®ãããå ŽåïŒ...å§çž®ãéžæãããå Žåãå€æŽãããç¹å®ã®ãã¡ã€ã«ã®ã¿ããã«ãæã«åå§çž®ããå¿
èŠããããŸããä»ã®ãã¡ã€ã«ã¯ãã£ãã·ã¥ãããã€ããªã«ã³ããŒãããã ãã§ãã
ç§ãèŠãåé¡ã®1ã€ã¯ãããã±ãŒãžã§ã«ã¹ã¿ã åãèš±å¯ãããŠããå Žåããudpãfileãftpãhttpãhttpsãããã³ãã®ä»ã®ããŸããŸãªäžè¬çãªããŒã¯ãŒãããèš±å¯ããªããªã©ãäœããã®ãã©ãã¯ãªã¹ããå¿ èŠã«ãªãããšã§ãã
ãã€ãé å/æååãŸãã¯å§çž®ãšããŠä¿åããããšã«é¢ããŠã¯...ã©ããªæ±ºå®ããªãããŠããå°æ¥ç°¡åã«æŽæ°ããäœå°ãæ®ãå¿ èŠããããŸã...äŸïŒå§çž®ãªãã§éå§ãããªãã»ãããšãã¡ã€ã«ãµã€ãºã®ãªã¹ããæã£ãŠããã ãã§ãã¡ã€ã«åã§ãããå°æ¥çã«ç°¡åã«å§çž®ãè¿œå ã§ããããã«ããŸãïŒexã¡ãœããzlibãlzmaãå§çž®ãµã€ãºããã£ã³ã¯ã解åããã®ã«ååãªã¡ã¢ãªãå²ãåœãŠãå¿ èŠãããå Žåã¯éå§çž®ãµã€ãºãªã©ïŒã
å®è¡å¯èœãã¡ã€ã«ãUPXãŸãã¯åçã®ãã®ãšäžç·ã«ããã¯ã§ããã°ãå人çã«ã¯å¬ããã§ãããã€ããªãã¡ã¢ãªã«ã¢ã³ããã¯ããããã¹ãŠãæ©èœãããšæããŸãã
éæ¥çã«é¢é£ããããã€ãã®èãïŒ
package embed
ã¢ãããŒãã奜ãã§ãembed
ã€ã³ã¿ã©ã¯ã·ã§ã³ããªãã·ã§ã³ã§ãã³ãŒããã¯ããæäŸã§ããå Žåãç¹å®ã®å§çž®/å€æãã¢ã¯ãã£ãã«ãµããŒãããå¿
èŠãããããŒã«ãã§ãŒã³ã®å¿
èŠæ§ãåé¿ã§ãããšæããŸãã ã³ãŒããã¯ãæ£ç¢ºã«å®çŸ©ããæ¹æ³ã¯çµ±åæ§æã«äŸåããŸãããç§ã¯æ¬¡ã®ãããªãã®ãæ³åããŸãpackage embed
type Codec interface {
// Encode transforms a source representation to an in-binary encoded asset.
Encode(io.Writer, io.Reader) error
// Decode transforms an in-binary asset to its active representation that the embedded application wants to use.
Decode(io.Writer, io.Reader) error
}
ããã¯ã次ã®ãããªéåžžã«ç¹æ®ãªãŠãŒã¹ã±ãŒã¹ãã«ããŒã§ããŸãã
package main
func NewJSONShrinker() embed.Codec {
return jsonShrinker{}
}
type jsonShrinker struct{}
func (_ jsonShrinker) Encode(io.Writer, io.Reader) error {
// use json.Compact + gzip.Encode...
}
func (_ jsonShrinker) Decode(io.Writer, io.Reader) error {
// use gzip.Decode + json.Indent
}
ããã䜿çšãããšã次ã®ããã«ãªããŸã
// go:embed file.name NewJSONShrinker
func main() {
embed.NewFileReader("file.name") // codec is implied by the comment above
}
ãŸãã¯ãããã
func main() {
f, err := embed.NewFileReaderCodec("file.name", NewJSONShrinker())
...
}
2çªç®ã®åœ¢åŒã§ã¯ãã³ã³ãã€ã«æã«Encode
ã¹ããããå®è¡ããå¿
èŠããããããããŒã«ãã§ãŒã³ã䜿çšããã³ãŒããã¯ãéçã«ç解ããå¿
èŠããããšããè€éãããããŸãã ãããã£ãŠãã³ã³ãã€ã«æã«ç°¡åã«æ±ºå®ã§ããªãã³ãŒããã¯å€ã¯èš±å¯ããªãå¿
èŠããããŸãã
ãããã®2ã€ã®ãªãã·ã§ã³ãèãããšãç§ã¯éæ³ã®ã³ã¡ã³ããšã³ãŒããã¯ãéžæãããšæããŸãã ããã«ãããããã§è¿°ã¹ããã¹ãŠã®ç®æšã«å¯Ÿå¿ããããã匷åãªæ©èœãå®çŸããŸãã ããã«ãããã§ã¯éæ³ã®ã³ã¡ã³ãã¯åãå
¥ããããªããšæããŸãã çŸåšããã®ç®çã®ããã«go:generate
ãä»ããŠãããããã§ã«èš±å®¹ããŠããŸãã ã©ã¡ãããšããã°ãéæ³ã®ããã±ãŒãžã ãã§ãçŸåšã®ã€ãã£ãªã ããã®éžè±ã§ãããšèãããããããŸããã çŸåšãGoãšã³ã·ã¹ãã ã«ã¯ããœãŒã¹ãã¡ã€ã«ãããŒã«ãã§ãŒã³ã«è¿œå ã®ãœãŒã¹ãã¡ã€ã«ã䜿çšããããã«æ瀺ããæ©èœãå€ããããŸãããçŸåšãéæ³ã®ã³ã¡ã³ãã§ã¯ãªãã®ã¯import
ããŒã¯ãŒãã ãã ãšæããŸãã
å§çž®ãè¡ãå Žåãã³ãŒããã¯ã¿ã€ããŸãã¯å§çž®ã¬ãã«ã®ããã¯ãŸã£ãããããŸããã ã€ãŸããããããŸã£ããæããªãããšããå§çž®ããŸã£ãããµããŒãããªãæ倧ã®è°è«ã§ãã
ããããã°ãç§ãå ¬éãããå¯äžã®éžæè¢ã¯ãã©ã³ãã ã¢ã¯ã»ã¹ãã©ããã§ãã ã©ã³ãã ã¢ã¯ã»ã¹ãå¿ èŠãªãå ŽåãããŒã«ãšã©ã³ã¿ã€ã ã¯é©åãªå§çž®ãéžæãããŠãŒã¶ãŒã«å ¬éããªãããã«ããããšãã§ããŸãã ãããŠãããã¯æéã®çµéãšãšãã«å€å/æ¹åããå¯èœæ§ããããŸãã
ããããç§ãæã£ãŠããèªèã®ããã«å§çž®ããªããšãã@rscã®åŽã«åºããããŸããïŒæãå§çž®å¯èœãªã³ã³ãã³ãïŒHTMLãJSãCSSãªã©ïŒã¯ããŸã ã©ã³ãã ã¢ã¯ã»ã¹ãå¿
èŠãªã³ã³ãã³ãã§ãïŒããšãã°ãç¯å²ãªã¯ãšã¹ãããµããŒãããhttp.FileServer
ãä»ããŠæäŸãããŸãïŒ
ãããŠãç§ãã¡ãåã蟌ãã Perkeepã®HTML / CSS / JSã®åèšãµã€ãºãèŠããšã48KBã®éå§çž®ã§ãã PerkeepãµãŒããŒã®ãã€ããªã¯49MBã§ãã ïŒåã蟌ãŸããç»åã¯ãã§ã«å§çž®ãããŠããããããµã€ãºãç¡èŠããŠããŸããïŒãããã£ãŠãããã ãã®äŸ¡å€ã¯ãªãããã§ãããåŸã§è¿œå ããããšãã§ããŸãã
@rscãšã®è©±ãåããããäžèšã®ã¢ãããŒããçµã¿åãããŠå®è¡ã§ããããã§ãã
ããã±ãŒãžã©ã³ã¿ã€ã ã§ã¯ã
package runtime
type Files struct {
// unexported field(s), at least 1 byte long so Files has a unique address
}
func (f *Files) Open(...) (...) { ...}
func (f *Files) Stat(...) (...) { ...}
func (f *Files) EnumerateSomehow(...) { ...}
次ã«ãã³ãŒãã§ïŒ
package yourcode
//go:embed static/*
//go:embed logo.jpg
var website runtime.Files
func F() {
... = website.Open("logo.jpg")
}
次ã«ãcmd / goããŒã«ã¯go:embed
ã³ã¡ã³ãã解æãããããã®ãã¿ãŒã³ãã°ãããããããã®ãã¡ã€ã«ãããã·ã¥ãã &website
ã䜿çšããŠã©ã³ã¿ã€ã ã«ç»é²ããŸãã
ã©ã³ã¿ã€ã ã«ã¯ãåãã¡ã€ã«ã¢ãã¬ã¹ã®å 容ãšããã¡ã€ã«å®è¡å¯èœãã¡ã€ã«ã®ã©ãã«ãããïŒãŸãã¯ãELF / etcã»ã¯ã·ã§ã³åãäœã§ãããïŒã®ããããå¹æçã«å«ãŸããŸãã ãããŠãå§çž®ãè¡ãããšã«ãªã£ãå Žåãã©ã³ãã ã¢ã¯ã»ã¹ããµããŒããããã©ããã«ããããããããããã
@gdamore ã
ããã§ãã1ã€ã®åé¡ããããŸããDTraceãœãŒã¹ã³ãŒãïŒåã蟌ã¿ïŒã䜿çšããå¥ã®ãããžã§ã¯ãããããŸãã ããã¯ãnãšrnã®éãã«ææã§ãã
..ã
ããŸããŸãªå€æŽã§ããŸããããªãå Žåãããã¯ãã®æ°ããæ©èœã䜿çšããããšã«å察ããè°è«ã§ãã
ãŸããå®è¡æã«å€æŽããŠãgoinstallãå®è¡ããŠããWindowsãŠãŒã¶ãŒããåã蟌ãŸãããã£ãªããžãªã¿ãŒã³ãåé€ããããšãã§ããŸãã ç§ã¯ãã®io.Readerãã£ã«ã¿ãŒãæ°åæžããã
ããããç§ãæã£ãŠããèªèã®ããã«å§çž®ããªããšããåºããããŸããïŒæãå§çž®å¯èœãªã³ã³ãã³ãïŒHTMLãJSãCSSãªã©ïŒã¯ããŸã ã©ã³ãã ã¢ã¯ã»ã¹ãå¿ èŠãªã³ã³ãã³ãã§ãïŒããšãã°ãç¯å²èŠæ±ããµããŒãããhttp.FileServerãä»ããŠæäŸãããŸãïŒ
å§çž®ãšã©ã³ãã ã¢ã¯ã»ã¹ã¯å®å šã«çžäºã«æä»çã§ã¯ãããŸããã ããšãã°ãããã§ããã€ãã®è°è«ãåç §ããŠãã ããïŒ https ïŒ
å§çž®ãšã©ã³ãã ã¢ã¯ã»ã¹ã¯å®å šã«çžäºã«æä»çã§ã¯ãããŸãã
ãããé©åãªäœçœ®ã«å°éããããã«ãªãŒããŒãããã䌎ãç²ç²åºŠã®ã·ãŒã¯ãå¿ èŠãªå Žåã ç§ã¯ãã®ã¹ããŒã¹ã§CRFSã®stargzãã©ãŒãããã䜿ã£ãŠããã€ãã®äœæ¥ã
ãªãŒããŒããããååã«å€§ããã®ã§ã人ã ã®ããã«èªåçã«ãããããããªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã
ãã£ããã ã éèŠãªåé¡ã¯ãå€æŽãå¿ èŠãªå ŽåããŸãã¯å®éšã§ãªãŒããŒãããã蚱容ã§ããããšã瀺ãããå Žåã«ãåŸã§ããã«ã€ããŠå®äŸ¡ã«èããå€ããããšãã§ããAPIã奜ããã©ããã§ãã
@bradfitzã®è¯ãç¹ã ãããŠãç§ã¯ç¢ºãã«ãããè¡ãããšãã§ããŸãã FWIWãç§ã®ãªããžããªã§ã¯ã.dãã¡ã€ã«ã衚瀺ãããšãã®æ¯æ§ãå°ãªããªãããã«gitãæ§æããŸããã ããã§ããããã¯ã¯ã©ãŒãä»ãã®åã蟌ã¿æååã®ããããã£ã¯ãäºæž¬å¯èœã§ãããgitãã·ã¹ãã ã®æ°ãŸããã®åœ±é¿ãåããªããšããç¹ã§äŸ¿å©ã ãšæããŸãã
ã³ãŒããã¯ã®ã¢ã€ãã¢ã§ç§ãåŸãã®ã¯ãå§çž®ã ããå¿ èŠãªå€æã§ã¯ãªãããŠãŒã¶ãŒãæå®ããã³ãŒããã¯ã¿ã€ãã䜿çšãããšãããŒã«ãã§ãŒã³ã§ãã©ã®ã³ãŒããã¯ã以å€ã®ãã©ã°ãç¡èŠã§ãããšããããšã§ãã å§çž®ã¬ãã«ããŸãã¯ã¢ã«ãŽãªãºã ã¯ãå§çž®ãŸãã¯ãã®ä»ã®æ¹æ³ã§ã䜿çšããã³ãŒããã¯ã«åºæã§ããå¿ èŠããããŸãã ç§ã¯ãç¹å®ã®ãã©ãŒããããšããã®ã»ãããæäŸãããšããæå³ã§ãå§çž®ããµããŒããããããšããããšã¯ã人ã ãæ±ããããšãã§ãããã¹ãŠã®ããªãšãŒã·ã§ã³ãåããéçã®ã¬ãã§ãŠã®è¿œè·¡ã«ãªãããšã«å®å šã«åæããŸãã å®éãi18nããŒã¿ã®ååŠçãã latlongã®ãããªããŒã¿ã»ããã®åŠçãªã©ãçãã䜿çšæ³ã«æãè奮ããŠããã®ã§ãããã§ããã®åšãã®ãªãã·ã§ã³ãæ€èšãã䟡å€ããããšæããŸãã
ç§ã¯ãããå¿«é©ãããããªãåãæè»æ§ãæäŸããå¥ã®æ¹æ³ãèããŸããã // go:embed
ãã£ã¬ã¯ãã£ãã¯ã // go:generate
ãšåãããã«ãã³ãã³ãåŒã³åºãã§ããå¯èœæ§ããããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ã
// go:embed "file.name" go run example.com/embedders/cat file.name
äž»ãªéãã¯ããã¡ãããã³ãã³ãåŒã³åºãã®stdoutãæå®ãããååã§åã蟌ãŸããŠããããšã§ãã ãã®äŸã§ã¯ã go run
ãå«ããµãããã±ãŒãžã䜿çšããŠãã³ãã³ãOSãç¬ç«ãããæ¹æ³ã瀺ããŠããŸããããã¯ãGoãã³ã³ãã€ã«ãããã¹ãŠã®å Žæã§cat
䜿çšã§ãããšã¯éããªãããã§ãã
ããã«ãããå€æã®ããšã³ã³ãŒããã¹ããããåŠçãããããã³ãŒããã¹ãããã®ã¿ã¹ã¯ã¯ãŠãŒã¶ãŒã«ä»»ããããšãã§ããŸãã ã©ã³ã¿ã€ã /åã蟌ã¿ããã±ãŒãžã¯ããšã³ã³ãŒãã£ã³ã°ã«é¢ä¿ãªãããŠãŒã¶ãŒãããŒã«ãã§ãŒã³ã«åã蟌ãããã«èŠæ±ãããã€ããæäŸããã ãã§ãã ãŠãŒã¶ãŒã¯ãã³ãŒãããã»ã¹ãã©ãããã¹ãããç¥ã£ãŠããã®ã§ãããã¯åé¡ãããŸããã
ããã®å€§ããªæ¬ ç¹ã®1ã€ã¯ãåã蟌ãŸãããã€ããzipãäœãã§ãã以å€ã«ããã®æ¹æ³ã§è€æ°ã®ãã¡ã€ã«ã®ã°ãããåã蟌ãè¯ãæ¹æ³ãèŠåœãããªãããšã§ãã ã°ããã¯zipã³ãã³ãã§äœ¿çšã§ããã®ã§ãå®éã«ã¯ããã§ååãããããŸãããã°ãããæ¬åœã«æ°ã«ããã®ã¯å®çŸ©åŽã§ãã ãããããã®ææ¡ãã2ã€ã®æ©èœã䜿çšããããšãã§ããŸãã1ã€ã¯åçŽãªåã蟌ã¿ãå®è¡ããæ©èœã§ããã1ã€ã¯ãžã§ãã¬ãŒã¿ãŒåã蟌ã¿ãå®è¡ããæ©èœã§ãã
ç§ã«çºçããå¯èœæ§ã®ããæ¬ ç¹ã®1ã€ã¯ãåã蟌ã¿ãgo build
ã«ãã£ãŠåŠçããã go generate
ããã«è¿œå ã®ããŒã«ãã§ãŒã³åŒã³åºããå¿
èŠãšããªãããšãåæãšããŠããã«ãã«èªç±åœ¢åŒã®ã¹ããããè¿œå ãããããšã§ãã ã§ã倧äžå€«ã ãšæããŸãã ãããããããŒã«ã¯ãã³ã¹ãã®ãããæäœã®ç¹°ãè¿ããåé¿ããããã«ç¬èªã®ãã£ãã·ã¥ã管çããããšãæåŸ
ã§ããŸãããããã¯ãããŒã«ãã§ãŒã³ãšéä¿¡ããŠGoã®ãã£ãã·ã¥ã䜿çšããããšãã§ããŸãã ããã¯è§£æ±ºã§ããåé¡ã®ããã«èããã go build
ãç§ãã¡ã®ããã«ããå€ãã®ããšããããšããå
šäœçãªããŒãïŒã¢ãžã¥ãŒã«ã®ãã§ãããªã©ïŒã«é©åããŸãã
ãã®ãããžã§ã¯ãã®ç®æšã®1ã€ã¯ãGoãã«ãã«å€éšããŒã«ãgoïŒgenerateè¡ãäžèŠã§ããããšã確èªããããšã§ããïŒ
ããã§ãªãå Žåã¯ãç©äºãã·ã³ãã«ã«ä¿ã¡ããã€ãã¹ã©ã€ã¹ãŸãã¯æååã®ã¿ããµããŒããã䟡å€ãããããã§ãããŠãŒã¶ãŒãå€æ°ã®ããã§å§çž®ãããå Žåã¯ãmakeãã¡ã€ã«ïŒãŸãã¯åæ§ã®ãã®ïŒã§å§çž®ãããããšã«ãããã«ãããåã«è¡ãçæãããããããšãã§ããŸãããããã£ãŠããã®ææ¡ã®çµæãã©ããªããã«é¢ä¿ãªããããããè¿œå ãã䟡å€ã¯ãªãããã§ãã
Makeãªã©ãå¿ èŠãšããªãããšãç®æšã§ããå Žåã¯ãå§çž®ã䜿çšããã®ãçã«ããªã£ãŠãããšæããŸãããå人çã«ã¯ãMakeãçæãªã©ã䜿çšããŠå§çž®ãè¡ããåã蟌ã¿ãåçŽã«ããŠãããã€ãã®ãã€ããåã蟌ãã ãã§ãã ã
@SamWhited ã
ãã®ãããžã§ã¯ãã®ç®æšã®1ã€ã¯ãGoãã«ãã«å€éšããŒã«ãgoïŒgenerateè¡ãäžèŠã§ããããšã確èªããããšã§ããïŒ
ã¯ãã
goïŒgenerateãMakefilesããŸãã¯ãã®ä»ã®ããŒã«ã䜿çšãããå Žåãä»æ¥ã§ã¯æ°åã®éžæè¢ããããŸãã
ããã©ã«ãã§æ©èœãããããŒã¿ãã«ã§å®å šã§æ£ãããã®ãå¿ èŠã§ãã ïŒæ確ã«ããããã«ïŒå®å šãšã¯ãgoïŒgenerateãããã©ã«ãã§å®è¡ãããªãã®ãšåãçç±ã§ããgoinstallãæã«ä»»æã®ã³ãŒããå®è¡ã§ããªãããšãæå³ããŸãïŒ
@ stephens2424
åã蟌ã¿ã€ã³ã¿ã©ã¯ã·ã§ã³ããªãã·ã§ã³ã§ãã³ãŒããã¯ããæäŸã§ããå Žåã¯ãç¹å®ã®å§çž®/å€æãã¢ã¯ãã£ãã«ãµããŒãããå¿ èŠãããããŒã«ãã§ãŒã³ã®å¿ èŠæ§ãåé¿ã§ãããšæããŸãã
go build
äžã«ä»»æã®ã³ãŒããå®è¡ãããããšã¯ãããŸããã
goãã«ãäžã«ä»»æã®ã³ãŒããå®è¡ãããããšã¯ãããŸããã
ãããç§ã¯ä»ãããèŠãŸãã ããœãŒã¹ããã¡ã€ã«ã®ã¿ããªããžããªã«ã³ããããããåŠçæžã¿ããã¡ã€ã«ãåã蟌ã¿ãããã±ãŒãžããååŸå¯èœãã«ãã go build
ã·ã³ãã«ãã€å®å
šã«ä¿ã€æ¹æ³ã¯ãªããšæããŸãã ç§ã¯ãŸã ããã§æšæºåãæšé²ããŠããŸãããç§ã¯èªåã®ã±ãŒããæã£ãŠãããé£ã¹ãããšæã£ãŠãããšæããŸãã è©ŠããŠã¿ã䟡å€ïŒ åé¡ãèŠã€ããŠãããŠããããšãïŒ
@flimzy
ããã«ããããªãã¬ã¯ã·ã§ã³ãä»ããŠä»ã®æ¹æ³ã䜿çšã§ããªããªããŸãã
ç§ãè¿°ã¹ãããšã«ã¯ã¡ãœããã¯ãªããé¢æ°ã ãã§ãã ãããã¯å®è¡æã«çºèŠã§ããããœãŒã¹ã§ååã§èšåããã«ããããåç
§ããæ¹æ³ã¯ãããŸããã ãŸããç°ãªãé¢æ°ã«ãã£ãŠè¿ãããã€ã³ã¿ãŒãã§ã€ã¹å€ã¯åãã¿ã€ãã§ããå¿
èŠã¯ãªãããšã«æ³šæããŠãã ãããå®éããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããã«å¿
èŠãªã¡ãœãããåããéãšã¯ã¹ããŒãã¿ã€ããã *strings.Reader
ã€ã³ã¹ã¿ã³ã¹ã®ããããã§ãããšäºæ³ãããŸã
ãã ããééããªãããã®ã¢ã€ãã¢ã«ã¯ãåã蟌ã¿ããã±ãŒãžã®ãšã¯ã¹ããŒããããé¢æ°ãå€ãšããŠæž¡ããšããåé¡ããããŸãã ããã§ãåé¡ã«ã¯ãªããªãå¯èœæ§ããããŸããã眲åã«ã¯ãšã¯ã¹ããŒããããŠããªãåãå«ãŸããŠããããïŒä»¥äžãåç
§ïŒãå€æ°ãåŒæ°ããŸãã¯ãããã®åã®æ»ãå€ã宣èšããããšã¯ã§ããŸããã çè«çã«ã¯ãããããreflect.ValueOf
èªäœã«æž¡ãããšãã§ããŸãã ããã§å®éã«ããããåŒã³åºãããšãã§ãããã©ããããããããŸããïŒãšã¯ã¹ããŒããããŠããªããã©ã¡ãŒã¿ã¿ã€ãã®å€ãäœæããå¿
èŠããããŸããreflectã§èš±å¯ãããŠããå Žåã¯DunnoïŒã
ãã ãã次ã®ããã«ãªããŸãã embed
æäžäœé¢æ°ãå€ãšããŠäœ¿çšããããã¹ãŠã®åã蟌ã¿ãã¡ã€ã«ã«å¶éãçããå Žåã«åããŠãåçŽã«æ²èŠ³çã«ãªãå¯èœæ§ããããŸãïŒæãåçŽã§ãïŒã ã€ãŸããembed-packageã䜿çšããŠéåžžã«å¥åŠã§åœ¹ã«ç«ããªãããšãè¡ãããšã«ããå Žåãããã€ãã®æé©åã倱ãããŸãïŒãšã«ãããå¿
ãããçŽæããããã§ã¯ãããŸããïŒã å
¬å¹³ãªããã§ãã
å®éããã®åœ±é¿ã¯ãããããåºããšæããŸãã FileReaderAtã®äœ¿çšãããŒã¿ãéå§çž®ã«ããå¿ èŠãããããšã瀺ããŠããå Žåãéå®æ°å ¥åã§FileReaderAtïŒïŒã䜿çšãããšããã¹ãŠã®ãã¡ã€ã«ãéå§çž®ã§ä¿åããå¿ èŠããããŸãã
åã蟌ã¿ãè¡ãã«ã¯ãã¡ã€ã«åãéçã«ç¥ãå¿
èŠããããããéå®æ°å
¥åãèš±å¯ããããšã¯æå³ããããŸããã ãã ãããã¡ã€ã«åãã©ã¡ãŒã¿ãŒã®ã¿ã€ããšããŠstring
ã䜿çšããã®ã¯äžæ£ç¢ºã§ããããããã¯ãå®éã«ã¯ãšã¯ã¹ããŒããããŠããªãtype filename string
ãããé¢æ°ã®åŒæ°ãšããŠã®ã¿äœ¿çšãããã¹ãã§ããã ããããã°ãåæå®ãããŠããªãæååå®æ°ä»¥å€ã®ãã®ãæž¡ãããšã¯äžå¯èœã§ãã
@Merovius
éå®æ°å ¥åãèš±å¯ããããšã¯æå³ããããŸãã
ç§ãã¡ã¯ããŸããŸãªããšã«ã€ããŠè©±ããŠãããšæããŸãã ã¢ã¯ã»ãµé¢æ°ãžã®å
¥åïŒã€ãŸãã FileReaderAt()
ïŒãæå³ããŸããããã§ã¯ãéå®æ°å
¥åãçã«ããªã£ãŠããããšã«åæãããšæããŸãã
ãããŠãç§ã®ãã€ã³ãã¯æ¬¡ã®ãšããã§ãã100åã®ãã¡ã€ã«ãåã蟌ãã ãã®ã®ã FileReaderAt(filename)
åŒã³åºããããã filename
ã¯äžå®ã§ã¯ãããŸããã ãã®æ¹æ³ã§ã©ã®åã蟌ã¿ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããïŒå®éã«ååšããå ŽåïŒãç¥ãæ¹æ³ã¯ãªãããããã¹ãŠãéå§çž®ã§ä¿åããå¿
èŠããããŸãã
@flimzyç§ãã¡ã¯åãããšã«ã€ããŠè©±ããŠããŸãããç§ã¯éconstãã¡ã€ã«åãæå³ããªããªããšçå£ã«èããŠããŸããã§ãã:)ãããèãããšãããã¯ééã£ãŠããŠèŠèœãšãã§ããã ç³ãèš³ãããŸããã ãã£ã¬ã¯ããªå šäœãã°ãããŸãã¯ã€ã³ã¯ã«ãŒãããŠããããããå埩åŠçããæ©èœã¯ãå®éã«ã¯éåžžã«éèŠã§ãã ããã§ããããã¯è§£æ±ºã§ãããšæã-ã³ã¬ã¯ã·ã§ã³ããšã®ææ決å®ãããããšã«ãããäŸãã°ïŒDIR /ã°ããïŒãšã®ã¿å®æ°åã«ãã£ãŠããããéžæããããšãã§ããŸã-ããããç§ã¯èšã£ãããã«ïŒããã¯å®éã«API Iãåå ã®GOããŒã«ã®ããã®ã¹ãŒããŒé©åã«æ€èšããã§ã¯ãããŸããããã¯ãªããŠéæ³ãªã®ã§ãããã ãããã£ãŠããã®ããã«éèã«å ¥ããšããããããæŠå¿µã«å€ãããããå€ãã®ã¹ããŒã¹ãè°è«ã«äžããããŸã:)
以åã®ã¡ãã»ãŒãžã§ã¯èŠãããããã¡ã€ã«ãGoãã€ããªã«åã蟌ãããšãæ€èšããå¥ã®ã±ãŒã¹ã¯ãéåžžã®goãã«ã/ã€ã³ã¹ããŒã«ã䜿çšããŠCå ±æã©ã€ãã©ãªã®ã©ãããŒããã±ãŒãžãé©åã«é åžã§ããªãããšã§ããïŒå ±æã©ã€ãã©ãªã¯ãœãŒã¹ïŒã
ç§ã¯çµå±ãããããŸããã§ããããããããã¯ç§ããã®å Žåã®ããã«ãããåèããããšãééããªããããŸãã Cã©ã€ãã©ãªã«ã¯ç¢ºãã«å€ãã®äŸåé¢ä¿ããããå ±æã©ã€ãã©ãªãšããŠé åžããæ¹ãç°¡åã§ãã ãã®å ±æã©ã€ãã©ãªã¯ãGoãã€ã³ãã£ã³ã°ã«ãã£ãŠåã蟌ãããšãã§ããŸãã
ããïŒïŒïŒ
@ãžã¥ãªãª-ã²ã©ãããããã£ã¹ã¯ã«æœåºããŠãããdlopenãšdlsymã䜿çšããŠCé¢æ°ãåŒã³åºãå¿
èŠããããšç¢ºä¿¡ããŠããŸãã
ç·šéïŒããªãã®æçš¿ãå°ã誀解ããŸãããããªããé åžçšã®ãã€ããªãäœæããããšã«ã€ããŠè©±ããŠããããšã«æ°ã¥ããŸãã
httpéçã¢ã»ããã®å€éšã§ãã¡ã¢ãªå ãžã®ãã€ã³ã¿ã«å¿ èŠãªåã蟌ã¿BLOBã®å Žåããã§ã«åŠçäžã®åã蟌ã¿ã¡ã¢ãªãžã®ãã€ã³ã¿ãè¿ãé¢æ°ããããšäŸ¿å©ã§ãã ããããªããšãæ°ããã¡ã¢ãªãå²ãåœãŠãŠãio.Readerããã³ããŒãäœæããå¿ èŠããããŸãã ããã¯2åã®ã¡ã¢ãªãæ¶è²»ããŸãã
@glycerine ãç¹°ãè¿ããŸãããããã¯string
ã§ãã string
ã¯ãã€ã³ã¿ãšé·ãã§ãã
ã³ã³ãã€ã«æã«å®è¡ããã³ãŒãã«ããŒã¯ãä»ããå®è¡æã«çµæãæäŸããæ¹æ³ããããšäŸ¿å©ã§ã¯ãªãã§ããããã ããããã°ãä»»æã®ãã¡ã€ã«ãèªã¿åã£ãŠãã³ã³ãã€ã«æã«å¿ èŠã«å¿ããŠå§çž®ããå®è¡æã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã ããã¯ããã¡ã€ã«ã³ã³ãã³ãã®ããªããŒãã§æ©èœãããããäžéšã®èšç®ã§ã¯æ©èœããŸãã
ã¹ã¬ããã§åã«è¿°ã¹ãããã«ã @ burkaã¯ã go build
ã¯ä»»æã®ã³ãŒããå®è¡ããŸããã
@burka ãããã¯æããã«ç¯å²å€ã§ãã ãã®æ±ºå®ïŒã³ã³ãã€ã«æã«ã³ãŒããå®è¡ãããªãïŒã¯ããªãåã«è¡ããããã®ã§ãããããã¯ãã®ããªã·ãŒãå€æŽããããã®ãã°ã§ã¯ãããŸããã
ãã®ææ¡ã®å¯äœçšã¯ãgoãããã·ãä¿åãããã¡ã€ã«ãgoãã¡ã€ã«ã®ã¿ã«æé©åã§ããªãããšã§ãã ãããã·ã¯ãGoã³ãŒãã«Go以å€ã®ãã¡ã€ã«ãåã蟌ãŸããŠãããã©ãããããããªãããããªããžããªå šäœãä¿åããå¿ èŠããããŸãã
ãããã·ããã§ã«ãããæé©åããŠãããã©ããã¯ããããŸãããããã€ãã¯å®çŸå¯èœã«ãªããããããŸããã
@leighmccullochã§ããä»æ¥ãããã¯æããªãã Goããã±ãŒãžå
ã®Go以å€ã®ãã¡ã€ã«ã¯ã go test
ã§å¿
èŠã«ãªãå¯èœæ§ããããããã¢ãžã¥ãŒã«ã¢ãŒã«ã€ãã«å«ããå¿
èŠããããŸãã å¥ã®äŸãšããŠãcgoçšã®Cãã¡ã€ã«ãããå ŽåããããŸãã
ããã¯ãšããµã€ãã£ã³ã°ãªæ¹åæ§ã§ããããŠãŒã¹ã±ãŒã¹ã«ã¯ééããªãå¿ èŠã§ãã
ãšã¯ãããèŠä»¶ãç°ãªãããŸããŸãªãŠãŒã¹ã±ãŒã¹ãããããã«æããŸããããããå®è¡ããå¿ èŠããããšèãã_æ¹æ³_ã«ã€ããŠã³ã¡ã³ãããŠããã»ãšãã©ã®äººã¯ãæé»çã«ç¬èªã®ãŠãŒã¹ã±ãŒã¹ãæ³å®ããŠããŸãããæ瀺çã«å®çŸ©ããŠããŸããã
ãã¡ã€ã«åã蟌ã¿ãœãªã¥ãŒã·ã§ã³ã®ããŸããŸãªãŠãŒã¹ã±ãŒã¹ãšãåãŠãŒã¹ã±ãŒã¹ãæ瀺ããã§ããã°ã圹ç«ã€ãããããŸããâå°ãªããšãç§ã«ãšã£ãŠã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãâã
ããšãã°ãç§ãã¡ã®äž»ãªãŠãŒã¹ã±ãŒã¹ã¯ãHTML + CSS + JS + JPG + etcãåã蟌ãã§ãgoã¢ããªã®å®è¡æã«ã http.FileServer
ã§æäŸã§ããããã«ãããã®ãã¡ã€ã«ããã£ã¬ã¯ããªã«æžã蟌ãããšãã§ããããã«ããããšã§ãã ã Goãããã¡ã€ã«ã«ã¢ã¯ã»ã¹ããå¿
èŠããªãããããªãŒããŒãšã©ã€ã¿ãŒã«ã€ããŠç§ãèªãã ã³ã¡ã³ãã®ã»ãšãã©ãç§ã«ãšã£ãŠç°è³ªãªãŠãŒã¹ã±ãŒã¹ã§ããããšãèãããšã go-bindata
ãããããã£ã¹ã¯ã«ã³ããŒãããã ãã§ã_ïŒãã ãæ€èšãã¹ãããšã«ãŸã æ°ä»ããŠããªããããåªããææ³ã掻çšããæ¹æ³ããããããããŸãããïŒ_
ãã ãã課é¡ã¯æ¬¡ã®ãšããã§ããéåžžããããã¬ãŒã§GoLandã䜿çšããç¶ç¶çãªå€æŽãè¡ãWebã¢ããªã§äœæ¥ããŸãã ãããã£ãŠãéçºäžã«ãœãŒã¹ãã£ã¬ã¯ããªããçŽæ¥ãã¡ã€ã«ãããŒãããã«ã¯http.FileServer
ãå¿
èŠã§ãã ãã ããã¢ããªã®å®è¡æã«ã http.FileServer
ã¯ãåã蟌ã¿ãœãªã¥ãŒã·ã§ã³ã«ãã£ãŠãã¡ã€ã«ãæžã蟌ãŸãããã£ã¬ã¯ããªãããããã®ãã¡ã€ã«ãèªã¿åãå¿
èŠããããŸãã ã€ãŸããã³ã³ãã€ã«ãããšãã«ãgo-bindataãå®è¡ããŠãã¡ã€ã«ãæŽæ°ããŠãããGitã«ãã§ãã¯ã€ã³ããå¿
èŠããããŸãã ãããŠãããã¯ãã¹ãŠäžè¬çã«go-bindata
ã§å®è¡å¯èœã§ããã確ãã«èããããŠããŸããã
ãã ããã³ã³ãã€ã«ãããå®è¡å¯èœãã¡ã€ã«ãå®éã«å®è¡ããå¿
èŠãããå ŽåããããŸãããã®ãããå®è¡äžã®ããã°ã©ã ã«ãããã¬ãŒãã¢ã¿ããããŠããåã蟌ã¿ãã¡ã€ã«ãgo-bindata
ã«ãã£ãŠæžã蟌ãŸãããã£ã¬ã¯ããªããã§ã¯ãªãããœãŒã¹ãã£ã¬ã¯ããªãããã¡ã€ã«ãããŒãã§ããŸãã
ããããç§ãã¡ã®ãŠãŒã¹ã±ãŒã¹ãšèª²é¡ã§ãã ãã¶ããä»ã®äººãä»ã®ãŠãŒã¹ã±ãŒã¹ãšé¢é£ããäžé£ã®èª²é¡ãæ瀺çã«å®çŸ©ã§ããã®ã§ããããã®è°è«ã¯ããŸããŸãªåé¡ç©ºéã«æ瀺çã«å¯ŸåŠã§ããããã³/ãŸãã¯ãã®åãçµã¿ãç¹å®ã®åé¡ç©ºéã®ç¹å®ã®ããŒãºã«å¯ŸåŠããªãããšãæ瀺çã«ç€ºãããšãã§ããŸããïŒ
ãããããé¡ãããŸãã
ãŠãŒã¹ã±ãŒã¹ãšããŠèšåãããŠããªãã®ã§ãtemplate.ParseFilesãä»ããŠã¢ã¯ã»ã¹ãããã³ãã¬ãŒãã®ãã£ã¬ã¯ããªã«ãããã圹ç«ã¡ãŸãã
æãã¯ãªãŒã³ãªã¢ãããŒãã¯ã go.mod
ä»ããŠãªããã€ã³ããæ¹æ³ã ãšæããŸãã ããã«ãããäžäœäºææ§ã確ä¿ããïŒæ¢åã®ãããžã§ã¯ãã§ã¯ãªããã€ã³ããŠäœ¿çšããå¿
èŠãããããïŒãããŒã«ïŒgoãããã·ãªã©ïŒã§å¿
èŠãªãã¡ã€ã«ãå€å¥ã§ããŸãã go mod init
ã³ãã³ããæŽæ°ããŠãæ°ãããããžã§ã¯ãã®ããã©ã«ãããŒãžã§ã³ãå«ããå°æ¥äœ¿ããããããããšãã§ããŸãã
ãã£ã¬ã¯ããªãæšæºåã«ããïŒãªããã€ã³ãå¿
èŠãªå Žåã¯ãããã¯ãªãŒã³ã§ã·ã³ãã«ãªååã«ããããšãã§ããŸãïŒããŸãã¯ãã£ã¬ã¯ããªã®ååãgo.mod
èªäœã§å®çŸ©ãããŠãŒã¶ãŒã次ã®ããšãè¡ããããã«ããããã®åŒæ°ã確èªã§ããŸããååãéžæããŸãïŒãã ããããã©ã«ãã¯go mod init
æäŸãããŸãïŒã
ç§ã®èãã§ã¯ããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ã䜿ãããããšãéæ³ãã®æžå°ã®ãã©ã³ã¹ãå®çŸããŸãã
@jayconrodã¯æžããïŒ
ç¹å¥ãªãã£ã¬ã¯ããªåïŒstatic /ïŒã®ä»£ããã«ã³ã¡ã³ããã©ã°ãïŒ// goïŒembedïŒãæ¯æãã1ã€ã®åŒæ°ïŒã³ã¡ã³ãã䜿çšãããšãããã±ãŒãžïŒãŸãã¯xtestã¢ãŒã«ã€ãïŒã®ãã¹ãã¢ãŒã«ã€ãã«ãã¡ã€ã«ãåã蟌ãããšãã§ããŸãããã©ã€ãã©ãªã¯åã蟌ãããšãã§ããŸãããã¹ãäžã
ããã¯æ¬åœã«çŽ æŽããã芳å¯ã§ãã æã
ã¯ç¹å¥ãªãã£ã¬ã¯ããªåãæå®ããŠè¡ããããšæã£ããªãã°ãæã
ã¯ããªãã¿ã®ã¡ã«ããºã ã䜿çšããããšãã§ããŸããïŒ static
ãã¹ãŠã®ãã«ãã®ããã«ã static_test
ãã¹ããã«ãã®ããã«ã static_amd64
AMD64çšã®ãã«ããããã³ããã ãã ããä»»æã®ãã«ãã¿ã°ãµããŒããæäŸããæ確ãªæ¹æ³ã¯ããããŸããã
éçãã£ã¬ã¯ããªã«ãããã§ã¹ããã¡ã€ã«ãååšããå¯èœæ§ããããŸãïŒç©ºã®ãããã§ã¹ããæå®ãããå Žåã®ããã©ã«ãã¯ãããã§ã¹ã以å€ã®ãã¹ãŠãå«ã¿ãŸãïŒãããã«ã¯ã°ãããå«ãŸãããã«ãã¿ã°ãåŸã§å§çž®ãªã©ãæå®ã§ããŸãã
1ã€ã®å©ç¹ã¯ãgoãªã¹ãããããã§ã¹ããå«ãdirã«ãããããå Žåããã®ããªãŒãã¹ãããã§ããããšã§ãã
æ¬ ç¹ã®1ã€ã¯ãéåžžã«htaccesãçºçããå¯èœæ§ããããæè¬ããªãããšã§ãã
ãã¡ã€ã«ãããã±ãŒãžã«ãã³ãã«ããããã®åçŽãªãŒãããã¡ã«ããºã ã¯ãããã±ãŒãžãã£ã¬ã¯ããªå
ã®ç¹å¥ãªãã£ã¬ã¯ããªgo.files
ïŒã¢ãžã¥ãŒã«å
ã®go.mod
ãšåæ§ïŒã§ããå¯èœæ§ããããŸãã ã·ã³ãã«ã®ãšã¯ã¹ããŒããéžæããªãéããã¢ã¯ã»ã¹ã¯ãã®ããã±ãŒãžã«å¶éãããŸãã
ç·šéïŒåäžæ©èœruntime/files
ææ¡ïŒ
package files
func Open(name string) (io.ReadCloser, error) {
// runtime opens embedded file based on caller package
return rc, nil
}
package foo
import "runtime/files"
func ReadPackageFile(name string) ([]byte, error) {
rc, err := files.Open(name)
if err != nil {
return nil, err
}
defer rc.Close()
return ioutil.ReadAll(rc)
}
import "C"
ã¢ãããŒãã¯ããéæ³ã®ãã€ã³ããŒããã¹ã®å
äŸããã§ã«èšå®ããŠããŸãã IMOããã¯ããªãããŸããããŸããã
ãŠãŒã¹ã±ãŒã¹ãšããŠèšåãããŠããªãã®ã§ãtemplate.ParseFilesãä»ããŠã¢ã¯ã»ã¹ãããã³ãã¬ãŒãã®ãã£ã¬ã¯ããªã«ãããã圹ç«ã¡ãŸãã
å¥ã®èª²é¡ããããŸãããã€ããªã«ã¯å¿ èŠãªãã¹ãŠã®ãã¡ã€ã«ãå«ãŸããŠããå¯èœæ§ããããŸãããéçºè ãæäŸããããã©ã«ãã¯ãããã®ãã¡ã€ã«ã§ãã ãã ããã€ã³ããªã³ãããã©ã€ãã·ãŒããªã·ãŒãªã©ã®ãã³ãã¬ãŒãã¯ããšã³ããŠãŒã¶ãŒãã«ã¹ã¿ãã€ãºã§ããå¿ èŠããããŸãã ç§ãèŠãéããããã¯ãããã©ã«ããã¡ã€ã«ããšã¯ã¹ããŒãããŠãå®è¡æã«ãã€ããªã«ã«ã¹ã¿ãã€ãºããããã¡ã€ã«ã䜿çšãããããåã蟌ã¿ããŒãžã§ã³ãã«ã¹ã¿ãã€ãºãããããŒãžã§ã³ã«çœ®ãæããæ¹æ³ãå¿ èŠã§ããããšãæå³ããŸãã
ããã¯ãåã蟌ã¿ãªãœãŒã¹ãããšã¯ã¹ããŒããããã³ã眮æãããé¢æ°ãAPIã«æäŸããããšã§å®çŸã§ãããšæããŸãã 次ã«ãéçºè ã¯ãšã³ããŠãŒã¶ãŒã«ããã€ãã®ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãæäŸã§ããŸãïŒåè¿°ã®APIåŒã³åºããå éšçã«äœ¿çšããŸãïŒã
ãã¡ãããããã¯ãã¹ãŠãå±éã確å®ã«å®¹æã«ããäœããã®åã蟌ã¿ãå®éã«ååšãããšããä»®å®ã«åºã¥ããŠããŸãã
åé¡ãéããŠããã ãããããšãããããŸãã ä»äºã§ã¯ãã»ãšãã©ãã¹ãŠã®Golangãããžã§ã¯ãã«ãã¡ã€ã«ãåã蟌ãå¿ èŠããããããåãæ©èœã®ã¢ã€ãã¢ã«ã€ããŠèããŸããã æ¢åã®ã©ã€ãã©ãªã¯æ£åžžã«æ©èœããŸãããããã¯Golangãæ±ããŠããæ©èœã ãšæããŸãã ããã¯ãåäžã®éçãã€ããªã«å€æããããã«äœæãããèšèªã§ãã éçºè ã«åªãããŠãããŒãµã«APIã䜿çšããŠãå¿ èŠãªã¢ã»ãããã¡ã€ã«ããã€ããªã«ããŒãã§ããããã«ããããšã§ããããåãå ¥ããå¿ èŠããããŸãã
奜ã¿ã®å®è£
ã®è©³çŽ°ããã°ããæäŸããããšæããŸãã è€æ°ã®äººããéæ³ã®ã³ã¡ã³ãã®ãããªå¥ã®ã·ã°ãã«ãå¿
èŠãšãã代ããã«ãåã蟌ã¿ãã¡ã€ã«ãèªã¿åãããã®APIãèªåçã«æäŸããããšã«ã€ããŠè©±ããŸããã ã¢ãããŒãã«éŠŽæã¿ã®ããããã°ã©ã çãªæ§æãæäŸããã®ã§ããããé²ãã¹ãéã ãšæããŸãã åè¿°ã®ããã«ãããããruntime/embed
ç¹å¥ãªããã±ãŒãžãéžæãããšããããæºããããå°æ¥çã«ç°¡åã«æ¡åŒµã§ããããã«ãªããŸãã 次ã®ãããªå®è£
ã¯ãç§ã«ãšã£ãŠæãçã«ããªã£ãŠããŸãã
type EmbedPackage interface {
Bytes(filename string) []bytes
BytesCompressed(filename string, config interface{}) []bytes // compressed in-binary as configured by some kind of config struct, memoizes decompression during runtime on first access
Reader(filename string) io.Reader
File(filename string) os.File // readonly and contains all metadata
Dir(filepath string) []os.File
Glob(pattern string) []os.File // like filepath.Glob()
// maybe? this could allow to load JSON, YAML, INI, TOML, etc files more easily
// but would probably be too much for the std lib implementation
Unmarshal(filename string, config interface{}, ptr interface{})
}
ã³ãŒãã®ã©ããã§ãã®ããã±ãŒãžã䜿çšãããšãã³ã³ãã€ã©ãŒãããªã¬ãŒããããã¡ã€ã«ãèªåçã«åã蟌ãŸããŠã©ã³ã¿ã€ã ã«æäŸãããŸãã
// embed a file that is compressed in-binary and automatically decompressed on first access
var LongText = embed.BytesCompressed("legal.html", embed.Config{ Compression: "gzip", CompressionLevel: "9" })
// loads a single file as reader for easy access
var FewLinesOfText = bufio.NewReader(embed.Reader("lines.txt"))
for _, line := range FewLinesOfText.ReadLines() { ... }
// embeds all files in the directory
var PdfFontFiles = embed.Dir("/fonts")
// unmarshals file into custom config
var PdfProcessingConfig MyPdfProcessingConfig
embed.Unmarshal("/pdf_conversion.json", embed.Config{ Encoding: "text/json" }, &PdfProcessingConfig)
ãŸããgo.modãã£ã¬ã¯ããªã®1ã€äžã®ãã£ã¬ã¯ããªã¬ãã«ãŸãã¯ãããã1ã€äžã®ãã£ã¬ã¯ããªã¬ãã«ã®ãã¡ã€ã«ãžã®ã€ã³ããŒããå¶éããã°ãã»ãã¥ãªãã£ã®åé¡ãšåçŸæ§ã¯åé¡ã«ãªããªãã¯ãã§ãããããã¹ã¬ããã§ãã§ã«èª¬æãããŠããŸãã 絶察åã蟌ã¿ãã¹ã¯ããã®directoyã¬ãã«ã«é¢é£ããŠè§£æ±ºãããŸãã
ã³ã³ãã€ã«ããã»ã¹äžã«ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããªããšãã³ã³ãã€ã©ãšã©ãŒãçºçããŸãã
ãã€ããªã®èåŸã«zipã¢ãŒã«ã€ããäœæããããšãå¯èœã§ãããããå¹æçã«èªå·±è§£ååãã€ããªã«ãªãããšãã§ããŸãã ãã¶ããããã¯ããã€ãã®ãŠãŒã¹ã±ãŒã¹ã§åœ¹ç«ã¡ãŸããïŒ ããã§å®éšãšããŠãããè¡ããŸããïŒ https ïŒ
Goã«ã¯ãã§ã«ãtestdataãããããŸãã ãŠããããã¹ãã§ã¯ãéåžžã®IOã䜿çšããŠãããããããšããã¹ãŠå®è¡ããŸãã ãã¹ãã¹ã³ãŒãã¯ãã³ã³ãã³ããåºè·ãããŠããªãããšãæå³ããŸãã ç¥ã£ãŠããã¹ãããšã¯ããã ãã§ããããªã«ãéæ³ãå§çž®ãããã³ã³ããããžãã¯ãèšå®å¯èœãªã€ã³ãã€ã¬ã¯ã·ã§ã³ãMETA-INFã¯ãããŸããã çŸãããã·ã³ãã«ã§ããšã¬ã¬ã³ãã ãã³ãã«ãããã©ã³ã¿ã€ã ã¹ã³ãŒãã®äŸåé¢ä¿çšã®ãããŒã¿ããã©ã«ããŒããªãã®ã¯ãªãã§ããïŒ
Github eaã®æ¢åã®Goãããžã§ã¯ããç°¡åã«ã¹ãã£ã³ããŠããã§ã«ãããŒã¿ããã©ã«ããŒã䜿çšããŠããããã調æŽãå¿ èŠãªãããžã§ã¯ããããã€ãæãã€ãããšãã§ããŸãã
ç§ã«ã¯ã¯ã£ããããªãããäžã€ã®ããšã static
ãã£ã¬ã¯ããªã®è°è«ã«ã€ããŠã¯ã static
_source_ãã£ã¬ã¯ããªã«ã€ããŠè°è«ããŠããã®ãããã¡ã€ã«ã_atã§å©çšå¯èœã«ãªãstatic
ãã£ã¬ã¯ããªã«ã€ããŠè°è«ããŠããã®ãã¯100ïŒ
æ確ã§ã¯ãããŸããã runtime_ ïŒ
ãŸãããã®åºå¥ã¯ãéçºããã»ã¹ãšéçºäžã®ã³ãŒãã®ãããã°ã«é¢é£ããŠãããããç¹ã«éèŠã§ãã
@mikeschinkelå ã®æçš¿ããããã«ãæã«åã蟌ã¿ãè¡ãããããšã¯ããªãæããã§ãã
go install
/go build
ã«åã蟌ã¿ãèªåçã«è¡ããã
å ã®æçš¿ãšäžèšã®ã³ã¡ã³ãã®äžéšã§ã¯ãå®è¡æã«ãã¡ã€ã«ãããŒãããããã®ãéçºãã¢ãŒãã«ã€ããŠã説æããŠããŸãã
@mvdanåçããããšãããããŸãã ã€ãŸããææ¡ããã/static/
ãã£ã¬ã¯ããªã¯ãã¢ããªãªããžããªãããã±ãŒãžãªããžããªããŸãã¯ãã®äž¡æ¹ã®ã«ãŒãã«çžå¯Ÿçã§ãããšèããŠããŸããïŒ
ãããŠãã©ã³ã¿ã€ã ãã¡ã€ã«ã®ãã®å Žæã¯ãéçºè ãããããé 眮ãããå Žæã«å®å šã«äŸåããŸããïŒ
ããããã¹ãŠçå®ã§ãããè«ççã§ãããšæãããå Žåã¯ããããã°æ å ±ã䜿çšããŠã³ã³ãã€ã«ãããããã°ã©ã ãããªãã·ã§ã³ã§ãœãŒã¹ã®å Žæãããã¡ã€ã«ãããŒãããŠãå€ãã®è¿œå ã®ïŒæšæºåãããŠããªãïŒããžãã¯ãã³ãŒããªãã§ãããã°ã容æã«ããããšãã§ããã°äŸ¿å©ã§ãã
äžèšã®æ°äººãã¢ãžã¥ãŒã«ãããã·ã«ã€ããŠèšåããŸããã ããã¯ããã®æ©èœãé©åã«èšèšããããã®åªãããªããã¹è©Šéšã ãšæããŸãã
ä»æ¥ã§ã¯ããŠãŒã¶ãŒã³ãŒããå®è¡ããã«ããã«ãã§äœ¿çšãããŠããªããã¡ã€ã«ãåé€ããå®è¡å¯èœãªã¢ãžã¥ãŒã«ãããã·ãå®è£ ããããšãå¯èœã§ããããã«æãããŸãã äžèšã®èšèšã®äžéšã¯ãã¢ãžã¥ãŒã«ãããã·ããŠãŒã¶ãŒã³ãŒããå®è¡ããŠãã©ã®éçãã¡ã€ã«ãå«ããå¿ èŠãããããå€æããå¿ èŠãããããšãæå³ããŸãã
人ã ã¯ãŸãããªããã€ã³ãšããŠgo.modã«ã€ããŠèšåããŸããã
ã¢ã€ãã¢ïŒgo.modãã¡ã€ã«ã®ä»æ§ïŒ ä»ã®ããŒã«ãç°¡åã«è§£æã§ããããã«ããŸãã
module github.com/foo/bar
data internal/static ./static/*.tmpl.html
ããã«ãããã³ã³ãã€ã«æã«ãã¡ã€ã«ããŒã¿ã䜿çšããŠããã±ãŒãžãäœæãããŸãã ããã§ã¯Globæ§æãé©ããŠãããããããŸããããåçŽåããŠãã£ã¬ã¯ããªãåã蟌ãã ãã§ååãããããŸããã ïŒäœè«ã§ããã **
ã°ããæ§æã®å Žåã¯+1ã§ããïŒ
import "github.com/foo/bar/internal/static"
f, err := static.Open("static/templates/foo.tmpl")
StripPrefixã®ãããªãã®ã¯ããã§ã¯ãããããããŸããããå¿ é ã§ã¯ãããŸããã å¿ èŠãªãã¡ã€ã«ãã¹ã䜿çšããã©ãããŒããã±ãŒãžãç°¡åã«äœæã§ããŸãã
ããã«ç°¡ç¥åã§ããŸãã
module github.com/foo/bar
data ./static/*.tmpl.html
import "runtime/moddata"
moddata.Open("static/foo.tmpl")
ããããmoddataãåŒã³åºãå ã®ããã±ãŒãž/ã¢ãžã¥ãŒã«ã«å¿ããŠç°ãªãåäœãããããšã¯å°ãçŽæçã§ã¯ãããŸããã ãã«ããŒïŒhttp.Filesystemã³ã³ããŒã¿ãŒãªã©ïŒãäœæããã®ãé£ãããªããŸãã
ä»æ¥ã§ã¯ããŠãŒã¶ãŒã³ãŒããå®è¡ããã«ããã«ãã§äœ¿çšãããŠããªããã¡ã€ã«ãåé€ããå®è¡å¯èœãªã¢ãžã¥ãŒã«ãããã·ãå®è£ ããããšãå¯èœã§ããããã«æãããŸãã äžèšã®èšèšã®äžéšã¯ãã¢ãžã¥ãŒã«ãããã·ããŠãŒã¶ãŒã³ãŒããå®è¡ããŠãã©ã®éçãã¡ã€ã«ãå«ããå¿ èŠãããããå€æããå¿ èŠãããããšãæå³ããŸãã
ããã§å€§ããªå€åã¯ãªããšæããŸãã ç¹ã«ãCã³ãŒãã«ã¯ãã§ã«ããªãŒå ã®ä»»æã®ãã¡ã€ã«ãå«ãŸããŠããå¯èœæ§ãããããããããå®è¡ããã¢ãžã¥ãŒã«ãããã·ã¯ãCã解æããå¿ èŠããããŸãããã®æç¹ã§ãå°å ¥ããéæ³ã®ã³ã¡ã³ããAPIã¯å°ããªã¹ãããã«ãªãããã§ãã
äžèšã®èšèšã®äžéšã¯ãã¢ãžã¥ãŒã«ãããã·ããŠãŒã¶ãŒã³ãŒããå®è¡ããŠãã©ã®éçãã¡ã€ã«ãå«ããå¿ èŠãããããå€æããå¿ èŠãããããšãæå³ããŸãã
ãgoããŒã«ã¯ãã«ãäžã«ãŠãŒã¶ãŒã³ãŒããå®è¡ããŠã¯ãªããªãããšããã®ã¯ãããã§äº€å·®ããªãç ã«æãããç·ã§ããããšã¯æããã ãšæããŸãã ãŸããgoããŒã«ããŠãŒã¶ãŒã³ãŒããå®è¡ã§ããªãå Žåã¯ããããªãã§å«ãããã¡ã€ã«ãæå®ã§ããå¿ èŠããããŸãã
ç§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã«é¢ããããŸããŸãªèããäœã説åŸåã®ãããã®ã«åçž®ããããšããŠããŸããããã®ããã @ broadyãææ¡ãããã®ã«å€§ããª+1ãdata
ã§ã¯ãªãåè©embed
ã«ããå¿
èŠããããšæããŸãã
åã蟌ãŸãããã¡ã€ã«ã¯ãç¹å¥ãªã³ã¡ã³ããéæ³ã®ããã±ãŒãžãæã£ãŠããã ãã§ã¯ãªããã€ã³ããŒãããå¿
èŠããããã®ã®ããã«æããŸãã ãŸããGoãããžã§ã¯ãã§ã¯ã go.mod
ãã¡ã€ã«ã¯ãéçºè
ãå¿
èŠãªã¢ãžã¥ãŒã«/ãã¡ã€ã«ãæå®ã§ããå Žæã§ãããããåã蟌ã¿ããµããŒãããããã«æ¡åŒµããããšã¯çã«ããªã£ãŠããŸãã
ããã«ãåã蟌ã¿ãã¡ã€ã«ã®ã³ã¬ã¯ã·ã§ã³ã¯ã1åéãã®æ§æã䜿çšããŠGoãããžã§ã¯ãã«ã¢ãããã¯ã«è¿œå ããã®ã§ã¯ãªããããã±ãŒãžãå«ããããšãã§ããã°ããã䟡å€ããããåå©çšã§ããããã«æããŸãã ããã§ã®èãæ¹ã¯ãåã蟌ã¿ãããã±ãŒãžãšããŠå®è£ ãããŠããå Žåã人ã ã¯Githubãä»ããŠããããéçºããã³å ±æã§ããä»ã®äººã¯ãããžã§ã¯ãã§ãããã䜿çšã§ãããšããããšã§ãã 以äžãå«ãGitHubäžã®ã³ãã¥ããã£ã管çããç¡æã®ããã±ãŒãžãæ³åããŠã¿ãŠãã ããã
NSã åãã¡ã€ã«ã«ãã®åœã®ãã¹ãŠã®éµäŸ¿çªå·ãå«ãŸããŠããåœã®ãã¡ã€ã«ã
NSã ãã©ãŠã¶ãèå¥ããããã®ãã¹ãŠã®æ¢ç¥ã®ãŠãŒã¶ãŒãšãŒãžã§ã³ãæååãå«ããã¡ã€ã«ã
NSã äžçååœã®æã®ç»åã
NSã Goããã°ã©ã ã§äžè¬çã«çºçãããšã©ãŒã説æãã詳现ãªãã«ãæ
å ±ã
eã çã
...
goembed://
ãªã©ã®æ°ããURLã¹ããŒã ïŒãŸãã¯æ¢åã®ã¹ããŒã ïŒã䜿çšããŠãããã±ãŒãžãããã¡ã€ã«ãéãããèªã¿åã£ããã§ãããããæ°ãããã¡ã€ã«ãäœæãã代ããã«ã_ïŒãã¹ãŠïŒïŒ_ã®æ¢åã®ãã¡ã€ã«æäœAPIã掻çšã§ããŸããçŸåšã®ããã±ãŒãžã«å«ãŸããŠããåã蟌ã¿ã«é¢é£ãã次ã®ãããªãã®ïŒ
data, err := ioutil.ReadFile("goembed://postal-codes.txt")
if (err != nil) {
fmt.Println(err)
}
äžèšã®æŠå¿µã§ã¯ã_ "éæ³" _ã®ããã«æãããã®ã¯ãããŸããã ãã¹ãŠãç®çã®ããã«æå³ãããããã«æããã¡ã«ããºã ã«ãã£ãŠãšã¬ã¬ã³ãã«åŠçãããŸãã å¿
èŠãªæ¡åŒµã¯ã»ãšãã©ãããŸããã go.mod
1ã€ã®æ°ããåè©ãšãGoã«ãã£ãŠå
éšçã«èªèããã1ã€ã®æ°ããURLã¹ããŒã ã ãã以å€ã¯ãã¹ãŠãGoãããã®ãŸãŸæäŸãããŸãã
ç§ã¯ä»ããã«code.soquee.net/pkgzip
ã䜿çšããŠããŸãïŒã°ããŒãã«ãªç¶æ
ãšã€ã³ããŒãã®å¯äœçšãåé¿ããããã«APIãå€æŽããã®ã¯statik
ãã©ãŒã¯ã§ãïŒã ç§ã®éåžžã®ã¯ãŒã¯ãããŒïŒå°ãªããšãWebã¢ããªã§ã¯ïŒã¯ãZIPãã¡ã€ã«ã«ãã³ãã«ãããã¢ã»ãããåã蟌ã¿ã golang.org/x/tools/godoc/vfs/zipfs
ãšgolang.org/x/tools/godoc/vfs/httpfs
ã䜿çšããŠããããæäŸããããšã§ãã
ç§ãgo:embed
ã¢ãããŒããæ¡çšããããšããããã劚ãã2ã€ã®ããšããããŸãïŒ
go:generate
ã䜿çšããå Žåã«ãåœãŠã¯ãŸããŸãããã®ãããéåžžããã«ãããåã«makefileã䜿çšããŠããŸããŸãªã¢ã»ããã®ã»ãããçæããããšã奜ã¿ãŸããããããã¹ãŠãmakefileã§èŠãããšãã§ããŸãïŒã¢ã»ãããïŒã¢ãžã¥ãŒã«å šäœã§ã¯ãªãïŒããã±ãŒãžã®äžéšã«ããããšã¯ããã«ãã¿ã°ãããã±ãŒãžã®ãã¹ããªã©ã®ãã¹ãŠã®è€éããæå³ãããšããäžéšã®æ©èœã§ããå¯èœæ§ããããããäžèšã«å«ããªãåé¡ããããŸãã ããããã«é©çšããå Žåããããããã®ããã±ãŒãžã«å¯ŸããŠãããªãã¯ã§ããããã©ã€ããŒãã§ããããæå®ããæ¹æ³ãªã©ãå¿ èŠã§ããããã¯ããã«ããéåžžã«è€éã«ãªãããã§ãã
ç§ãæ°ã«å ¥ã£ãŠããã®ã¯ãã¢ã»ããã®ã€ã³ããŒããç°¡åã«ããã©ã€ãã©ãªãäœæã§ããããšã§ãã äŸãã°ã ãã©ã³ããåã蟌ãã ãã®åäžã®Goãã¡ã€ã«ãå«ãã©ã€ãã©ãªããŸãã¯ããã€ãã®ã¢ã€ã³ã³ãå ¬éããŠãä»ã®Goããã±ãŒãžãšåãããã«ã€ã³ããŒãããããšãã§ããŸãã å°æ¥çã«ã¯ãã€ã³ããŒãããã ãã§ã¢ã€ã³ã³ãã©ã³ããååŸã§ããããã«ãªããŸãã
import "forkaweso.me/forkawesome/v2"
ããããã¹ãŠæ瀺çã§éåžžã®Goã³ãŒãã«ãããšããã¢ã€ãã¢ã¯å¥œãã§ããããããæšæºã©ã€ãã©ãªã®å€éšã§ã¯å®è£ ã§ããªãå¥ã®éæ³ã®ããã±ãŒãžã«ãªããšããã¢ã€ãã¢ã¯å«ãã§ãã
ãã®ãããªããã±ãŒãžã¯èšèªä»æ§ã®äžéšãšããŠå®çŸ©ãããŸããïŒ ããã§ãªããã°ãGoã³ãŒããç°ãªãå®è£ éã§å£ããŠããŸãå¥ã®å Žæã§ãããããããŸã貧匱ãªæããããŸãã ãã®ç Žæãé²ãããã«ãå€éšããŒã«ã䜿ãç¶ãããšæããŸãã
ãŸããä»ã®äººãèšåããŠããããã«ãããããã«ãæã«è¡ãããŠãããšããäºå®ã¯ããã®ããã±ãŒãžãåŒæ°ãšããŠæååãªãã©ã«ãŸãã¯å®æ°ã®ã¿ãåãããšãã§ããããšãæå³ããŸãã çŸåšãåã·ã¹ãã ã§ãããè¡šçŸããæ¹æ³ã¯ãªããæ··ä¹±ã®ãã€ã³ãã«ãªããšæããŸãã ããã¯å®æ°é¢æ°ã®ãããªãã®ãå°å ¥ããããšã§è§£æ±ºã§ããŸãããä»ã¯äž»èŠãªèšèªã®å€æŽã«ã€ããŠè©±ããŠããã®ã§ãåå¿è ã§ã¯ãããŸããã ããã§ãªããã°ããããä¿®æ£ããè¯ãæ¹æ³ãããããŸããã
ç§ã¯ãã€ããªããã¢ãããŒãã®ã¢ã€ãã¢ã奜ãã§ãã ã³ã¡ã³ããåå©çšãã代ããã«ïŒæçµçã«ã¯ãã¡ãã¡ã«æ£ãã°ããå人çãªã¡ã¢ã§ã¯ããã ã°ãã¹ã«æããŸãïŒããã¹ãŠã®ã¢ã»ããã1ã€ã®å Žæã«é
眮ããããããgo.mod
ãã¡ã€ã«ãä»ã®ã¢ã»ãããšåãããã«è¡šç€ºããããšæããŸããèšã£ãïŒ
module forkaweso.me/forkawesome/v2
go 1.15
embed (
fonts/forkawesome-webfont.ttf
fonts/forkawesome-webfont.woff2
)
ã€ãŸããã¢ã»ããã¯ãåå¥ã®ã¢ãžã¥ãŒã«ãäœæããã«ãä»»æã®ãã«ãã¿ã°ããŸãã¯ä»»æã®ããã±ãŒãžïŒ_testingããã±ãŒãžãªã©ïŒã«å«ãããé€å€ãããããããšã¯ã§ããŸããã ãã®è€éãã®è»œæžãæãŸãããšæããŸãïŒã€ã³ããŒãããããšããŠããã©ã€ãã©ãªã«ãã«ãã¿ã°ãé ãããŠããããã©ã€ãã©ãªãã€ã³ããŒããããšã¢ã»ãããåã蟌ãŸããŠããã¯ããªã®ã§ãé©åãªã¢ã»ããããªãçç±ãããããŸããïŒ ããããYMMVã ãããæãŸããå Žåã¯ãã³ãŒããçæããã代ããã«go.mod
ããŒãžã§ã³ã«ã€ããŠèª¬æããã®ãšåãã¢ãããŒãã䜿çšããããšãé€ããŠãã³ã¡ã³ãã®ãããªãã©ã°ãã䜿çšã§ããŸãã
åœåã®ææ¡ãšã¯ç°ãªããããã¯ä»»æã®ã³ãŒããçæããŸããã 代ããã«ãäŸãã°ã®æ©èœã ELFãã¡ã€ã«ã®ããŒã¿ã»ã¯ã·ã§ã³ã®èªã¿åãïŒãŸãã¯ã䜿çšããŠããOSã«ä¿åãããããšã«ãªããŸãïŒã¯ãå¿
èŠã«å¿ããŠè¿œå ãããŸãïŒããšãã°ã os
ãŸãã¯debug/elf
ãªã©ïŒã次ã«ããªãã·ã§ã³ã§ãOPã§èª¬æãããŠããããã±ãŒãžãšãŸã£ããåãããã«åäœããæ°ããããã±ãŒãžãäœæãããŸãããéæ³ã®ããã«åã蟌ãŸããã®ã§ã¯ãªããåã蟌ãŸãããã¡ã€ã«ãèªã¿åãã ãã§ãïŒã€ãŸããæšæºã©ã€ãã©ãªã®å€éšã§å®è£
ã§ããŸãïŒãå¿
èŠã«å¿ããŠïŒã
ããã¯ãåŒæ°ãšããŠæååãªãã©ã«ã®ã¿ãèš±å¯ããããã«ããžãã¯ããã±ãŒãžãå¶éããå¿ èŠããããªã©ã®åé¡ãåé¿ããŸãããåã蟌ã¿ã¢ã»ãããå®éã«ã©ããã§äœ¿çšãããŠãããã©ããããŸãã¯æçµçã«èªéã§ãããã©ããã確èªããã®ãé£ããããšãæå³ããŸãã ãŸããäœåãªãã®ãã€ã³ããŒãããå¿ èŠãããå¯äžã®ããã±ãŒãžã¯æ°ããããã±ãŒãžèªäœã§ãããããæšæºã©ã€ãã©ãªããã±ãŒãžéã®æ°ããäŸåé¢ä¿ãåé¿ããŸãã
var IconFont = embed.Dir("forkaweso.me/forkawesome/v2/fonts/")
var Logo = embed.File("images/logo.jpg")
äžã§èŠãããã«ãã¢ãžã¥ãŒã«ã«ãªãœãŒã¹ãé 眮ããããšã§ãå¿ èŠã«å¿ããŠãã®ç¹å®ã®ã¢ãžã¥ãŒã«ã«ãªãœãŒã¹ãã¹ã³ãŒãããããšãã§ããŸãã å®éã®APIãšã¢ã»ããã®éžææ¹æ³ã«ã¯ãããã€ãã®äœæ¥ãå¿ èŠã«ãªãå ŽåããããŸãã
ããã«å¥ã®ã¢ã€ãã¢ïŒ go.mod
ã«æ°ããçš®é¡ã®åè©embed
ãè¿œå ãã代ããã«ãæ°ããçš®é¡ã®ããã±ãŒãžã§ããããŒã¿ããã±ãŒãžãå°å
¥ããŠãgo.modã§ã€ã³ããŒãããŠäœ¿çšããããšãã§ããŸããéåžžã®æ¹æ³ã ãããã¹ãããŒãã³ã®ã¹ã±ããã§ãã
ããã±ãŒãžã«.go
ãã¡ã€ã«static.go
ã ãå«ãŸããŠããŠããã®ãã¡ã€ã«ã«ã³ã¡ã³ããšããã±ãŒãžå¥ã®ã¿ãå«ãŸããŠããå Žåãããã±ãŒãžã¯ããŒã¿ããã±ãŒãžã§ãã ã€ã³ããŒãããããšãcmd / goã¯ãçµæã®ãã€ããªã«åã蟌ãŸããŠãããã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãæäŸãããšã¯ã¹ããŒããããé¢æ°ãããã±ãŒãžã«å
¥åããŸãã
ãããå®éã®ããã±ãŒãžã§ããå Žåãããã¯internal
ã«ãŒã«ãé©çšãããAPIã«è¿œå ããã«ã¢ã¯ã»ã¹å¶åŸ¡ãæã€ããšãã§ããããšãæå³ããŸãã
.go
以å€ã®ãã¹ãŠã®ãã¡ã€ã«ãšãµããã©ã«ããŒïŒå®éã®ã³ãŒãã«ãŒã«ããªãå ŽåïŒããã£ã¬ã¯ããªã«èªåçã«å«ããã®ã¯ã©ãã§ããïŒ
ããã±ãŒãžã«
.go
ãã¡ã€ã«static.go
ã ãå«ãŸããŠããŠããã®ãã¡ã€ã«ã«ã³ã¡ã³ããšããã±ãŒãžå¥ã®ã¿ãå«ãŸããŠããå Žåãããã±ãŒãžã¯ããŒã¿ããã±ãŒãžã§ãã
ãã®ãã§ãã¯ã¯ããã«ãã¿ã°ãé©çšããåã«å®è¡ãããŸããïŒ ãããããªããããã¯é¿ããããããããªãããã«å¥ã®ç¹å¥ãªå Žåã®ããã§ãã ããã§ãªãå Žåãããã±ãŒãžãäžéšã®ãã«ãã¿ã°ã®æšæºã®Goããã±ãŒãžãšèŠãªãããä»ã®ãã«ãã¿ã°ã®ããŒã¿ããã±ãŒãžãšèŠãªãããå¯èœæ§ããããŸãã ããã¯å¥åŠã«æããŸãããå€åããã¯æãŸããã§ããïŒ
@flimzy
ããã«ããã1ã€ã®ã¿ã°ã§åã蟌ã¿ãã¡ã€ã«ã䜿çšããçæãããããã±ãŒãžãšåãfns / varsãå®çŸ©ããå¥ã®ã¿ã°ã§ãã¡ã€ã«ãå¥ã®æ¹æ³ïŒãããããªã¢ãŒãïŒïŒã§æäŸã§ããããã«ãªããŸãã
ã©ãããŒé¢æ°ãçæããããã®ãã«ããã©ã°ãããã°ã空çœãåããã ãã§ããã§ãããã
@josharian
ããã±ãŒãžã«
.go
ãã¡ã€ã«static.go
ã ãå«ãŸããŠããŠããã®ãã¡ã€ã«ã«ã³ã¡ã³ããšããã±ãŒãžå¥ã®ã¿ãå«ãŸããŠããå Žåãããã±ãŒãžã¯ããŒã¿ããã±ãŒãžã§ãã
ãããŒã¿ãããã±ãŒãžã¯ãéµäŸ¿çªå·æ€çŽ¢ãªã©ãç¬èªã®ãã¡ã€ã³åºæã®æ©èœãåããŠãããšæ³åã§ããŸãã å ã»ã©ææ¡ããã¢ãããŒãã§ã¯ãçããŒã¿ä»¥å€ã®ãã®ã¯èš±å¯ãããªããããããžãã¯ãããŒã¿ãšããã±ãŒãžåã§ãããšããå©ç¹ã¯ç¡å¹ã«ãªããŸãã
ãããŒã¿ãããã±ãŒãžã¯ãéµäŸ¿çªå·æ€çŽ¢ãªã©ãç¬èªã®ãã¡ã€ã³åºæã®æ©èœãåããŠãããšæ³åã§ããŸãã
my.pkg / postalcodeã§æ©èœãå ¬éããmy.pkg / postalcode / dataïŒãŸãã¯my.pkg / postalcode / internal / dataïŒã«ããŒã¿ãé 眮ã§ããŸãã
ããªããææ¡ããæ¹æ³ã§ãããè¡ãããšã®é åã¯ããããŸãããããã¯å€ãã®çåãæèµ·ããŸãïŒåŸæ¹äºææ§ã¯ã©ã®ããã«æ©èœããŸããïŒ ããŒã¿ããã±ãŒãžããã®ããã«ããŒã¯ããã«ã¯ã©ãããã°ããã§ããïŒ ããã±ãŒãžã«cmd / goãè¿œå ããæ©èœãšç«¶åããæ©èœãããå Žåã¯ã©ãããŸããïŒ ïŒç§ã¯ãããã«çãããªããšèšã£ãŠããã®ã§ã¯ãªããçããå¿ èŠããªãæ¹ãç°¡åã ãšããã ãã§ããïŒ
@josharian ãäžèšã®ã¿ã€ããã§ãã¯ã³ã¡ã³ãïŒhttps://github.com/golang/go/issues/35950#issuecomment-561443566ïŒãæ€èšããŠãã ããã
@bradfitzã¯ããããã¯èšèªã®å€æŽã§ãããgo / typesã®ãµããŒããå¿ èŠã«ãªããŸãã
å®éã«ã¯ãèšèªãå€æŽããã«ãããè¡ãæ¹æ³ããããŸããstatic.goã«ã¯ãcmd / goãå ¥åããå 容ãšå®å šã«äžèŽããããã£ã¬ã¹é¢æ°ãå«ãŸããŠããå¿ èŠããããŸãã
static.goã«ãcmd / goãå ¥åããå 容ãšå®å šã«äžèŽããããã£ã¬ã¹é¢æ°ãå«ããå¿ èŠããããŸãã
ãã¹ãŠã®embed.File()
ãã£ããããã®ã§ã¯ãªãããã¡ã€ã«ããšã®é¢æ°ãçæããå Žåã¯ãã¢ã»ããããšã®ãšã¯ã¹ããŒãå¶åŸ¡ãç°¡åã«ãªããŸãã
ãããã£ãŠãçæããããã®ã¯æ¬¡ã®ããã«ãªããŸãã
EmbededFoo() embed.Asset {...}
embededBar() embed.Asset {...}
4ãæåã«éçãã¡ã€ã«ã«ã€ããŠæžããããã°æçš¿ã çµè«ã®æåŸã®æãåç §ããŠãã ãã:-)
@josharian
my.pkg / postalcodeã§æ©èœãå ¬éããmy.pkg / postalcode / dataïŒãŸãã¯my.pkg / postalcode / internal / dataïŒã«ããŒã¿ãé 眮ã§ããŸãã
ããã¯âãšã¬ã¬ã³ãã§ã¯ãããŸãããâç§ã®æžå¿µã«å¯ŸåŠããããšãã§ããŸãã
äžäœäºææ§ã¯ã©ã®ããã«æ©èœããŸããïŒ
ããã§ã¯ãBCã®æžå¿µãã©ã®ããã«åœãŠã¯ãŸãã®ãããããŸããã 詳现ãæããŠããã ããŸããïŒ
ããŒã¿ããã±ãŒãžããã®ããã«ããŒã¯ããã«ã¯ã©ãããã°ããã§ããïŒ
embed
ã§å£°ægo.mod
ïŒ
å€åç§ã¯ããªããæ±ããŠããããšã«åŸããªãã§ãããã
ããããç§ã¯ããã奜転ãããŸãã ããŒã¿ã®ã¿ã§ããã±ãŒãžãããŒã¯ããã«ã¯ã©ãããã°ããã§ããïŒ
ããã±ãŒãžã«cmd / goãè¿œå ããæ©èœãšç«¶åããæ©èœãããå Žåã¯ã©ãããŸããïŒ
ææ¡ãããã¢ãããŒãã䜿çšãããšããããã®æ©èœãè¿œå ããããã«cmd / goãå¿ èŠã«ãªããšã¯æããŸããã
cmd / goã§é¢æ°ãè¿œå ããå¿ èŠãããå Žåã§ãã_existing_ããã±ãŒãžã§ã®ç«¶åã®åäœã¯_undefined_ã«ãªããšæããŸãã
ãã®ææ¡ã¯ãéçºè ãåäžè²¬ä»»ã®ååã«åŸãããšãåæãšããŠãããããããŒã¿ãå«ãããã±ãŒãžãããŒã¿äžå¿ã®ããã±ãŒãžãšããŠã®ã¿æ§ç¯ããæ¢åã®ããžãã¯äžå¿ã®ããã±ãŒãžã«ããŒã¿ãè¿œå ããªãããã«ããå¿ èŠããããŸãã
ãã¡ãããéçºè ã¯æ¢åã®ããã±ãŒãžã«è¿œå ããããšãã§ããŸãããã®å Žåãåäœã¯æªå®çŸ©ã«ãªããŸãã IOWãéçºè ãã€ãã£ãªã ãç¡èŠããå Žåã圌ãã¯æªç¥ã®é åã«ããã§ãããã
ç§ã¯ãããã«çãããªããšèšã£ãŠããã®ã§ã¯ãªããçããå¿ èŠããªãæ¹ãç°¡åã ãšããã ãã§ãã
çãã¯ç°¡åã ãšæãããšãé€ããŠã å°ãªããšãããªãããããŸã§ã«æèµ·ãããã®ã«ã€ããŠã¯ã
ã·ã³ãã«ãŸãã¯ã·ã³ãã«ã®å€ãè¿œå ãããœãªã¥ãŒã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã¹ã³ãŒãã§ã¯ãªãããã±ãŒãžã¹ã³ãŒãã§ãªããã°ãªããªããšæããŸãã Goã®ã³ã³ãã€ã«åäœã¯ããã±ãŒãžã§ãããã¢ãžã¥ãŒã«ã§ã¯ãªãããã§ãã
ãããã£ãŠãããã«ãããã€ã³ããŒããããã¡ã€ã«ã®ãªã¹ããæå®ããããã®go.mod
䜿çšãé€å€ãããŸãã
@dolmenæçµçµæãç¬èªã®ããã±ãŒãžã«å«ãŸããå Žåãã¹ã³ãŒãèªäœã¯ã¢ãžã¥ãŒã«ã«ãªããŸãã
@urandomããããã¹ã³ãŒãã¯ãçæãããããã±ãŒãžãã€ã³ããŒãããããã±ãŒãžã§ãã ããããšã«ãããå®å šã«çæãããããã±ãŒãžããã®ææ¡ã®ç¯å²ã«å«ãŸãããšã¯æããŸããã
@urandomããããã¹ã³ãŒãã¯ãçæãããããã±ãŒãžãã€ã³ããŒãããããã±ãŒãžã§ãã ããããšã«ãããå®å šã«çæãããããã±ãŒãžããã®ææ¡ã®ç¯å²ã«å«ãŸãããšã¯æããŸããã
ãã®ææ¡ãã©ã®ããã«å®è£ ããããã«é¢ä¿ãªããããŸããŸãªã¢ãžã¥ãŒã«ããã±ãŒãžãæçµçµæã䜿çšããããšãèãããšãåã蟌ãŸãããã®ã®å®çŸ©ãã¢ãžã¥ãŒã«ã¬ãã«ã§æå®ãããããšã¯çã«ããªã£ãŠããŸãã ããã®åäŸã¯ãåã蟌ã¿ãã¡ã€ã«ãã¢ãžã¥ãŒã«ã¹ã³ãŒãã§ããžãã¯ãã£ã¬ã¯ããªããè¿œå ãããJavaãšã³ã·ã¹ãã ã«ããã§ã«ååšããŸãã
ããã«ãgo.modã¯ãæ¢åã®ããã°ã©ã ãå£ãããšãªãããã®ãããªæ©èœïŒéæ³ã®ã³ã¡ã³ããéæ³ã®ãã£ã¬ã¯ããªãªãïŒãè¿œå ããããã®æãã¯ãªãŒã³ãªæ¹æ³ãæäŸããŸãã
ãŸã èšåãããŠããªãããšããããŸããGoãœãŒã¹åŠçããŒã«ïŒã³ã³ãã€ã©ãŒãéçã¢ãã©ã€ã¶ãŒïŒã®APIã¯ãã©ã³ã¿ã€ã APIãšåããããéèŠã§ãã ãã®çš®ã®APIã¯ããšã³ã·ã¹ãã ã®æé·ã«åœ¹ç«ã€Goã®ã³ã¢ããªã¥ãŒã§ãïŒ go/ast
/ go/format
ãgo mod edit
ïŒã
ãã®APIã¯ãããªããã»ããµããŒã«ïŒç¹ã«go:generate
ã¹ãããïŒã§äœ¿çšããŠãåã蟌ãŸãããã¡ã€ã«ã®ãªã¹ããååŸããããåç
§ãçæãããããããšãã§ããŸãã
ç¹å¥ãªããã±ãŒãžã®å Žåã go.mod
解æïŒ go mod
ããŒã«ïŒãŸãã¯go/ast
ããŒãµãŒã§å€æŽãããã®ã¯äœããããŸããã
@ãã«ã¡ã³
_ "ã·ã³ãã«ãŸãã¯ã·ã³ãã«ã®å€ãè¿œå ãããœãªã¥ãŒã·ã§ã³ã¯ãã¢ãžã¥ãŒã«ã¹ã³ãŒãã§ã¯ãªãããã±ãŒãžã¹ã³ãŒãã§ããå¿ èŠããããšæããŸããGoã®ã³ã³ãã€ã«ãŠãããã¯ã¢ãžã¥ãŒã«ã§ã¯ãªãããã±ãŒãžã§ãããããgo.modã䜿çšããŠã®ãªã¹ããæå®ããå¿ èŠã¯ãããŸãããã€ã³ããŒããããã¡ã€ã«ã "_
ã¢ãžã¥ãŒã«ãšã¯äœã§ããïŒ ã¢ãžã¥ãŒã«ã¯_ "åäžã®ãŠããããšããŠäžç·ã«ããŒãžã§ã³ç®¡çãããé¢é£ããGoããã±ãŒãžã®ã³ã¬ã¯ã·ã§ã³ã§ãã" _ãããã£ãŠãã¢ãžã¥ãŒã«ã¯åäžã®ããã±ãŒãžã§æ§æã§ããåäžã®ããã±ãŒãžã¯ã¢ãžã¥ãŒã«å šäœã§ããå¯èœæ§ããããŸãã
ãã®ãããGoããŒã ãç¹å¥ãªã³ã¡ã³ããéæ³ã®ããã±ãŒãžãããgo.mod
ãæ¡çšããŠãããšä»®å®ãããšã go.mod
ã¯ã€ã³ããŒããããã¡ã€ã«ã®ãªã¹ããæå®ããæ£ããå Žæã§ãã ããã¯ãGoããŒã ãgo.pkg
ãã¡ã€ã«ãè¿œå ããããšã決å®ããªãéãã§ãã
ããã«ãGoããŒã ãåã蟌ã¿ãã¡ã€ã«ãæå®ããå ŽæãšããŠgo.mod
ãåãå
¥ããå Žåããã¡ã€ã«ãåã蟌ã¿ãã人ã¯ã embed
説æãšããã±ãŒãžãgo.mod
æäŸããå¿
èŠããããŸãã go.mod
ãã¡ã€ã«ãååšãããã£ã¬ã¯ããªã§è¡šããããã®ã¯ãåã蟌ã¿ãã¡ã€ã«ãå«ãããã±ãŒãžã«ãªããŸãã
ãããããããéçºè
ã®æã¿ã§ã¯ãªãå Žåã¯ãå¥ã®go.mod
ãã¡ã€ã«ãäœæããåã蟌ã¿ãã¡ã€ã«ãå«ããããã±ãŒãžã®ãã£ã¬ã¯ããªã«é
眮ããå¿
èŠããããŸãã
ãããã®å¶çŽãæ©èœããªããšæ³å®ããæ£åœãªã·ããªãªã¯ãããŸããïŒ
@mikeschinkel ãã¢ãžã¥ãŒã«ã¯_related_ããã±ãŒãžã®ã³ã¬ã¯ã·ã§ã³ã§ãã ãã ããã¢ãžã¥ãŒã«å ã®ä»ã®ããã±ãŒãžã®æšç§»çãªäŸåé¢ä¿ïŒããã³ããŒã¿ïŒïŒãååŸããã«ãã¢ãžã¥ãŒã«ãã1ã€ã®ããã±ãŒãžã䜿çšããããšã¯å¯èœã§ãïŒãããŠåççã§ãïŒïŒã
ããŒã¿ãã¡ã€ã«ã¯éåžžãã¢ãžã¥ãŒã«ããšã§ã¯ãªãããã±ãŒãžããšã®äŸåé¢ä¿ã§ããããããããã®äŸåé¢ä¿ãèŠã€ããæ¹æ³ã«é¢ããæ å ±ã¯ãåå¥ã®ã¢ãžã¥ãŒã«ã¬ãã«ã®ã¡ã¿ããŒã¿ãšããŠä¿åããã®ã§ã¯ãªããããã±ãŒãžãšåãå Žæã«é 眮ããå¿ èŠããããŸãã
@bcmills
ã¡ãã»ãŒãžå
ã®ãããŒã¿ãã¡ã€ã«ãããã¢ãžã¥ãŒã«ãã«çœ®ãæããããšãã§ããããã§ãããããã§ãåœãŠã¯ãŸããŸãã
ç¬èªã®ç¹å®ã®ããã±ãŒãžã®äŸåé¢ä¿ãšããŠç¹å®ã®ã¢ãžã¥ãŒã«ãæã€ããšã¯éåžžã«äžè¬çã§ãã
ããã§ããããããã¹ãŠãgo.modå
ã«é
眮ããŸãã
@urandom ã go.mod
ãã¡ã€ã«ã«ç€ºãããŠããã¢ãžã¥ãŒã«å
ã®ãã¹ãŠã®ããã±ãŒãžãæçµçãªãã€ããªã«ãªã³ã¯ãããŠããããã§ã¯ãããŸããã ïŒ go.mod
ãã¡ã€ã«ã«äŸåé¢ä¿ã眮ãããšã¯ããã®äŸåé¢ä¿ãããã°ã©ã ã«ãªã³ã¯ããããšãšã¯_çãããããŸãã_ãïŒ
ã¡ã¿ãã€ã³ã
ãããå€ãã®äººã ãæ°ã«ãããŠããããšã§ããããšã¯æããã§ãããäžéšã®ãã©ããã®å ã®ã³ã¡ã³ãã¯ãæåã®ã¹ã±ãã/éå§ç¹/è¡åã®åŒã³ãããããå®æããææ¡ã§ã¯ãããŸããã§ããã ãã®æç¹ã§ããã®ç¹å®ã®è°è«ãçµãããããã©ãããšããããä»ã®æ°äººã詳现ãªèšèšããã¥ã¡ã³ãã§å ±åäœæ¥ãè¡ãããã®ç¹å®ã®ïŒãŸã æžãããŠããªãïŒããã¥ã¡ã³ãã®è°è«ã®ããã«æ°ããåé¡ãéå§ããããšã¯çã«ããªã£ãŠãããšæããŸãã ããã¯ãå°ãåºå€§ãªäŒè©±ã«ãªã£ãŠããããšã«éäžããã®ã«åœ¹ç«ã€ããã§ãã
èãïŒ
ãããéããããšã«åæãããã©ããã¯ããããŸããããææ¡ã¯å¯èœã§ã-èšèšããã¥ã¡ã³ããäœæããããŸã§ä¿çããã³ã¡ã³ããå°ãããã¯ããŸãã ïŒã³ã¡ã³ããåé·ã§ãããã©ããã確èªããã«ã¯ã³ã¡ã³ããå€ãããããããã®æç¹ã§ã¯ã»ãšãã©ãã¹ãŠã®ã³ã¡ã³ããåé·ã§ã...ïŒ
ãã¶ãããã¶ã€ã³ããã¥ã¡ã³ãããããšãã¯ããããéããããšãã§ããŸãã
ãŸãã¯ããããéããŠïŒ3035ãå床éãïŒã³ã¡ã³ããåçµããŠïŒãå°ãªããšã1ã€ã®æªè§£æ±ºã®åé¡ãããã远跡ããããã«ããŸãã
ã¯ããŒãžã³ã°ã«ã€ããŠè©±ãåã£ãçŽåŸã«ãããè¡ã£ãŠç³ãèš³ãããŸãããã @ bcmillsã®ã³ã¡ã³ãã®çŽåŸã§ãæ確ã«ããåã«ãã¯ããŒãºã®è°è«ã
"_ãã ããã¢ãžã¥ãŒã«å ã®ä»ã®ããã±ãŒãžã®æšç§»çãªäŸåé¢ä¿ïŒããã³ããŒã¿ïŒïŒãååŸããã«ãã¢ãžã¥ãŒã«ãã1ã€ã®ããã±ãŒãžã䜿çšããããšã¯å¯èœã§ãïŒãããŠåççã§ãïŒïŒã" _
ã¯ããæããã«ããã¯_å¯èœã§ãã_ããããä»ã®ãã¹ããã©ã¯ãã£ã¹ãšåæ§ã«ãããŒã¿ããã±ãŒãžã®ãã¹ããã©ã¯ãã£ã¹ã¯ãã¢ãžã¥ãŒã«çšã®åäžã®ããã±ãŒãžãäœæããããšã§ãããããã«ããæžå¿µã解決ãããŸãã ãããã«ãŒãã«go.mod
ãæå³ããããŒã¿ããã±ãŒãžãå«ããµããã£ã¬ã¯ããªã«å¥ã®go.mod
ãæå³ããå Žåã¯ãããã§ãã
ç§ã¯ããªããããã§åã®æµã«ãªãããšãå®ç§ã«ããªãããšã䞻匵ããŠãããšæããŸããããã§åã¯go.mod
ãšããŠèå¥ãããåã蟌ã¿ãã¡ã€ã«ãæå®ããã®ã«æé©ãªå Žæã§ããã¢ãžã¥ãŒã«ã®ã³ã³ããŒãã³ãã
ç³ãèš³ãããŸããããããã±ãŒãžã¯Goã®åºæ¬çãªæŠå¿µã§ãããã¢ãžã¥ãŒã«ã§ã¯ãããŸããã
ã¢ãžã¥ãŒã«ã¯ã1ã€ã®ãŠããããšããŠããŒãžã§ã³ç®¡çãããããã±ãŒãžã®åãªãã°ã«ãŒãã§ãã
ã¢ãžã¥ãŒã«ã¯ãåã
ã®ããã±ãŒãžã®ã»ãã³ãã£ã¯ã¹ä»¥å€ã«è¿œå ã®ã»ãã³ãã£ã¯ã¹ãæäŸããŸããã
ããã¯åœŒãã®åçŽãã®äžéšã§ãã
ããã§è¡ãããšã¯ãã¹ãŠãã¢ãžã¥ãŒã«ã§ã¯ãªãããã±ãŒãžã«é¢é£ä»ããå¿
èŠããããŸãã
ãããã©ãã«è¡ã£ãŠãããããã©ã®ããã«è¡ããããšããŠããïŒäœ¿çšãããŠãããã¿ãŒã³ã ãã§ãªãïŒgolistã䜿çšããŠåã蟌ãŸãããã¹ãŠã®ã¢ã»ããã®ãªã¹ããååŸããæ¹æ³ãããã¯ãã§ãã
ãã©ãããšä»ã®äººãæ£åŒãªèšèšããã¥ã¡ã³ããäœæãããŸã§ä¿çã«ããŸãã
ç¹ã«
static
ãŸãã¯embed
ãã£ã¬ã¯ããªã䜿çšããŠããå Žåã¯ãç¹å®ã®ãã¡ã€ã«ããããã¯ããã®ã¯ããã»ã©é£ãããããŸããã ã·ã³ããªãã¯ãªã³ã¯ã¯ãããå°ãè€éã«ãããããããŸããããçŸåšã®ã¢ãžã¥ãŒã«ã®å€éšããŸãã¯GOPATHã䜿çšããŠããå Žåã¯ããã£ã¬ã¯ããªãå«ãããã±ãŒãžã®å€éšã«äœããåã蟌ãŸããªãããã«ããããšãã§ããŸããç§ã¯ã³ãŒãã«ã³ã³ãã€ã«ãããã³ã¡ã³ãã®ãã¡ã³ã§ã¯ãããŸããããã³ã³ãã€ã«ã«åœ±é¿ãäžããç䌌ããã±ãŒãžãå°ãå¥åŠã ãšæããŸãã ãã£ã¬ã¯ããªã¢ãããŒãã䜿çšããªãå Žåã¯ãããçš®ã®
embed
ãããã¬ãã«å®£èšãå®éã«èšèªã«çµã¿èŸŒãæ¹ãå°ãçã«ããªã£ãŠãããããããŸãããimport
ãšåæ§ã«æ©èœããŸãããããŒã«ã«ãã¹ã®ã¿ããµããŒãããå²ãåœãŠãããã®ååãå¿ èŠã«ãªããŸãã äŸãã°ãembed ui "./ui/build" func main() { file, err := ui.Open("version.txt") if err != nil { panic(err) } version, err = ioutil.ReadAll(file) if err != nil { panic(err) } file.Close() log.Printf("UI Version: %s\n", bytes.TrimSpace(version)) http.ListenAndServe(":8080", http.EmbeddedDir(ui)) }
ç·šéïŒããªãã¯ããã«ç§ãæã¡è² ãããŸããã@ jayconrodã
ããã¯ã¯ãªãŒã³ã§èªã¿ãããã§ãããgoããŒã ãæ°ããããŒã¯ãŒããå°å ¥ããããã©ããã¯ããããŸãã
ç§ãèŠããŠããã¢ã€ãã¢ã¯ãéçããŒã¿ãå«ããstaticãã®ãããªç¹å¥ãªãã£ã¬ã¯ããªåãèšå®ãã泚éãå¿ èŠãšããã«APIãä»ããŠèªåçã«å©çšã§ããããã«ããããšã§ããã
ç¹å¥ãªãã£ã¬ã¯ããªåãšããŠstatic
ã䜿çšããã®ã¯å°ãæ··ä¹±ããã®ã§ã assets
ã䜿çšããããšæããŸãã
ã¹ã¬ããã§èŠãªãã£ããã1ã€ã®ã¢ã€ãã¢ã¯ã assets
ãããã±ãŒãžãšããŠã€ã³ããŒãã§ããããã«ããããšã§ãïŒäŸïŒ import "example.com/internal/assets"
ã å
¬éãããAPIã«ã¯ãŸã ãã¶ã€ã³ãå¿
èŠã§ãããå°ãªããšãç¹å¥ãªã³ã¡ã³ããæ°ããruntime/files
ã¹ã¿ã€ã«ã®ããã±ãŒãžããããããã«èŠããŸãã
ã¹ã¬ããã§èŠãªãã£ããã1ã€ã®ã¢ã€ãã¢ã¯ãã¢ã»ãããããã±ãŒãžãšããŠã€ã³ããŒãã§ããããã«ããããšã§ãã
ããã¯ããã§ææ¡ãããŸããïŒ https ïŒ
è€éãªç¹ã®1ã€ã¯ãã¿ã€ããã§ãã¯ãæå¹ã«ããã«ã¯ããããèšèªã®å€æŽã«ããããcmd / goã§å ¥åããæ¬æã®ãªãé¢æ°ãæäŸããå¿ èŠããã
ãããåæ§ã®ã¢ã€ãã¢ã§ããã static.go
èšèšã§ã¯ãä»»æã®ã€ã³ããŒããã¹ãããŒã¿ããã±ãŒãžã«å€æã§ããŸããã assets
ãã£ã¬ã¯ããªã¯testdata
ã internal
ãŸãã¯vendor
ãç¹å¥ãã§ãããšããç¹ã§assets
ãæã€å¯èœæ§ã®ããèŠä»¶ã®1ã€ã¯ãGoããã±ãŒãžãå«ãŸãªãïŒãŸãã¯ããã¥ã¡ã³ãã®ã¿ãèš±å¯ããïŒããšã§ããã€ãŸããæé»çãªäžäœäºææ§ã®ããã§ãã
ããã¯ããã¡ã€ã«ãååŸããããã®runtime/files
-thingyAPIãšçµã¿åãããããšãã§ããŸãã ã€ãŸããçã®import
ã䜿çšããŠãã£ã¬ã¯ããªããªãŒã«ãã¡ã€ã«ãåã蟌ã¿ãã©ã³ã¿ã€ã ããã±ãŒãžã䜿çšããŠãããã«ã¢ã¯ã»ã¹ããŸãã os.Open
ã§ããããåŸãŸããããããåãå
¥ããããå¯èœæ§ã¯äœãã§ãã
shurcooL/vfsgen
åãããŠshurcooL/httpgzip
ã¯ã解åããã«ã³ã³ãã³ããæäŸã§ããåªããæ©èœããããŸãã
äŸãã°
rsp.Header().Set("Content-Type", "image/png")
httpgzip.ServeContent(rsp, req, "", time.Time{}, file)
åæ§ã®æ©èœãC ++çšã«ææ¡ãããŠããŸãïŒ std::embed
ïŒ
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1040r0.html
https://mobile.twitter.com/Cor3ntin/status/1208389050698215427
ãã¶ã€ã³ã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ãšããŠããŸãèãããããŠãŒã¹ã±ãŒã¹ãåéããã®ã«åœ¹ç«ã€å ŽåããããŸãã
ç§ã¯ããŒãã£ãŒã«å°ãé ããŠããŸãããç§ã¯èããæã£ãŠããŸããã ç¹å¥ãªã³ã¡ã³ãã®ä»£ããã«ãåºå®ãããç¹å¥ãªãã£ã¬ã¯ããªïŒéçïŒããŸãã¯go.modãæ¡åŒµããããã®æããã«ããŒããŒã®ã¢ãããŒãïŒããã±ãŒãžããšã®æ°ãããããã§ã¹ããã¡ã€ã«ã¯ã©ãã§ããïŒgo.res
package mypackagename
è¡ã®package
ããããŒè¡ã®æ¹ã奜ãã§ããfunc Read(name string) (io.Reader, bool)
é¢æ°ãå°ãªããšã1ã€ãããŸããfunc readresource(name string) (io.Reader, bool)
ïŒ.go
ãã¡ã€ã«ãè¿œå ããŠããµããã£ã¬ã¯ããªãããã±ãŒãžã«ããŸãã goãã¡ã€ã«ã¯ããµããã£ã¬ã¯ããªããã±ãŒãžå
ã®ãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããã®ç¬èªã®ãããªãã¯APIããšã¯ã¹ããŒãããŸãã ä»ã®ããã±ãŒãžã®ãªãœãŒã¹ã¯ïŒèšèšäžïŒèªåçã«ãšã¯ã¹ããŒããããªããããgoãã¡ã€ã«ãšãšã¯ã¹ããŒããããAPIãå¿
èŠã§ãã ãã®æ¹æ³ã§ãšã¯ã¹ããŒãããæ¹æ³ãã«ã¹ã¿ãã€ãºããããšãã§ããŸããéåžžã«ã·ã³ãã«ã§ãã 1ã€ã®æ°ããæ©èœã 1ã€ã®æ°ãããã¡ã€ã«ã ãã¹ã¯ãããŸããã å§çž®ãªãã æ°ããæ§æã¯ãããŸããã éæ³ã¯ãããŸããã æ¡åŒµå¯èœã ãªãŒããŒãä»ããèªã¿åãå°çšã¢ã¯ã»ã¹ïŒãã ããå°æ¥çã«ã¯å¥ã®ã¢ã¯ã»ã¹ãã¿ãŒã³ãå©çšã§ããããã«ãªããŸãïŒã æ¢åã®ããã±ãŒãžãå£ãå¯èœæ§ã¯ã»ãŒãŒãã§ãã ããã±ãŒãžãgoã®ã³ã¢ã³ã³ã¹ãã©ã¯ãã§ããããšãç¶æããŸãã
__Edit__ githubã§language:go filename:go.res extension:res
æ€çŽ¢ããåŸã go.res
ã䜿çšããã®ã¯ããªãå®å
šãªãã¡ã€ã«åã®ããã§ãã goãªããžããªã«ã¯äžèŽãããã®ã¯ãªããégoãªããžããªã«ã¯ãããããäžèŽããŸããã
@ chris.ackermanmã®ã¢ã€ãã¢ã奜ãã§ãã ããããç§ã¯çµã¿åããã奜ãã§ãããïŒ
ãã£ã¬ã¯ããªå ã®åå空éãæå®ããgo.resãã¡ã€ã«ã
ããã«ããã
åŸè ã¯ãæŽæ°ãããŸããŸãªãªãã·ã§ã³ãªã©ã«ãã£ãŠã¬ã€ã¢ãŠããå€æŽãããå¯èœæ§ã®ããwebpackãªã©ã®åºåã«åãçµãå¿ èŠããããŸãã
å§çž®ã«é¢ããŠïŒãã€ããªãµã€ãºãççºããªããšããç¹ã§ãããå€ãã®æ©èœã§ããã䜿çšããã³ãŒãã«å¯ŸããŠééçã§ããå¿ èŠããããšæããŸãã
åŸã§ã次ã®ãããªæžãæããèš±å¯ã§ããŸãã
filename => stored-as.png
ã¡ããã©ç§ã®2¢
@ sascha-andreséåžžã«ã·ã³ãã«ã§ãéæ³ããŒãã®ããã§ãããã®ã¹ã¬ããã®ããŒã³ã§ãã ç§ãã³ã¡ã³ãã«å¯ŸããŠè¡ã£ãç·šéãåç §ããŠãã ããã
ãããã³ã°ã奜ãã§ã¯ãããŸããã å¿ èŠãªãã ãšã«ããå¥ã®ããã±ãŒãžããç¬èªã®èªã¿åãé¢æ°ãå ¬éããããšã§ãããå¯èœã«ãªããæ°ãããã¡ã€ã«æ§æããŸãã¯1è¡ãããã®ãã¡ã€ã«ãããè€éãªãã®ãå¿ èŠã«ãªããŸãã
ãã
ãã®ææ¡ã¯çŽ æŽãããã§ãïŒ
ãããŠãç§ã¯ãemebedè³ç£ãžã®ç§ã®ã¢ãããŒããæã£ãŠããŸãã GNUbintools以å€ã®ããŒã«ãå°å ¥ããå¿ èŠã¯ãããŸããã ã¡ãã£ãšæ±ãã§ãããä»ã®ãšããããŸããããŸãã ç§ã¯ãããå ±æããŠãããã圹ç«ã€ãã©ããã確èªããããšæããŸãã
ç§ã®ã¢ãããŒãã¯ãã¢ã»ããïŒtarïŒgzã§å§çž®ïŒãobjcopyã䜿çšããŠelf / pe32ã»ã¯ã·ã§ã³ã«åã蟌ã¿ãå¿ èŠã«å¿ããŠzipãšãšãã«ããã±ãŒãždebug / elfããã³debug / pe32ãä»ããŠèªã¿åãããšã§ãã ç§ãèŠããŠããå¿ èŠãããã®ã¯ãæ¢åã®ã»ã¯ã·ã§ã³ã«è§Šããªãããšã ãã§ãã ãã¹ãŠã®ã¢ã»ããã¯äžå€ã§ãããã³ãŒãã¯ã³ã³ãã³ããèªã¿åããã¡ã¢ãªå ã§åŠçããŸãã
ç§ã¯èšèªèšèšãã³ã³ãã€ã©èšèšã«ããªãäžæ
£ãã§ãã ãããã£ãŠãäžèšã®ã¢ãããŒãã䜿çšããã»ã¯ã·ã§ã³åãšããŠ.goassets
ãªã©ã䜿çšããŸãã å§çž®ããªãã·ã§ã³ã«ããŸãã
ç§ã®ã¢ãããŒãã¯ãã¢ã»ããïŒtarïŒgzã§å§çž®ïŒãobjcopyã䜿çšããŠelf / pe32ã»ã¯ã·ã§ã³ã«åã蟌ã¿ãå¿ èŠã«å¿ããŠzipãšãšãã«ããã±ãŒãždebug / elfããã³debug / pe32ãä»ããŠèªã¿åãããšã§ãã ç§ãèŠããŠããå¿ èŠãããã®ã¯ãæ¢åã®ã»ã¯ã·ã§ã³ã«è§Šããªãããšã ãã§ãã ãã¹ãŠã®ã¢ã»ããã¯äžå€ã§ãããã³ãŒãã¯ã³ã³ãã³ããèªã¿åããã¡ã¢ãªå ã§åŠçããŸãã
elf
/ pe32
ã§åäœããããã«èãããŸããã mach-o
/ plan9
ã©ãã§ããïŒ
ãã1ã€ã®åé¡ã¯ãå®è¡å¯èœãã¡ã€ã«ã®ãã¡ã€ã«ãã³ãã«ãéãããšã«äŸåããŠããããšã§ããå®è¡å¯èœãã¡ã€ã«ãäžæžã/æŽæ°/åé€ãããå Žåãããã¯ç°ãªãããŒã¿ãè¿ããŸããããããæ£åœãªåé¡ãªã®ãäºæããªãæ©èœãªã®ãã¯ããããŸããã
ç§ã¯ïŒ debug / machoã䜿çšããŠïŒå°ãmach-o-x86-64
ãç ŽæããŠããããã§ãã mach-o
æ§é ãç解ããŠããªãã ãã§ã objcopy
èŠãã®ã§é·ãããå¯èœæ§ããããŸãïŒã
ãã1ã€ã®åé¡ã¯ãå®è¡å¯èœãã¡ã€ã«ã®ãã¡ã€ã«ãã³ãã«ãéãããšã«äŸåããŠããããšã§ãã
ããã°ã©ã ããŒããŒããªãœãŒã¹ã»ã¯ã·ã§ã³ãã¡ã¢ãªã«ããŒãããïŒãŸãã¯ããŒãã§ããïŒãšç¢ºä¿¡ããŠããã®ã§ããããã°ããã±ãŒãžã䜿çšããå¿ èŠã¯ãããŸããã ãã ããããŒã¿ã«ã¢ã¯ã»ã¹ããã«ã¯ããªããžã§ã¯ããã¡ã€ã«ãããããåãå¿ èŠããããŸãã
äœãæ©èœããããããšãã°Javaãã©ã®ããã«æ©èœãããã«åŸã£ãŠã¿ãŸãããã ç§ã¯ç©äºã倧ãããªãã®ã«ããå¿ èŠããããŸããã次ã®ãããªãã®ããããŸãã
go.res
ãã¡ã€ã«ãäœæãããã go.mod
ãå€æŽããŠããªãœãŒã¹ããããã£ã¬ã¯ããªãæãããã«ããŸããå§çž®ãªã©ã¯ããã®ãªãœãŒã¹ãã³ãã«ã®ç¯å²å€ã§ããå¿
èŠããããå¿
èŠã«å¿ããŠ// go:generate
ã¹ã¯ãªãããŸã§å¯èœã§ãã
誰ããmarkbates / pkgerãèŠãããšããããŸããïŒ ããã¯ãçŸåšã®äœæ¥ãã£ã¬ã¯ããªãšããŠgo.mod
ã䜿çšããéåžžã«åçŽãªãœãªã¥ãŒã·ã§ã³ã§ãã index.html
ãåã蟌ãŸãããšä»®å®ãããšããããéããšpkger.Open("/index.html")
ãŸãã ããã¯ããããžã§ã¯ãã§static/
ãã£ã¬ã¯ããªãããŒãã³ãŒãã£ã³ã°ãããããè¯ãèãã ãšæããŸãã
ãŸããç§ãèŠãéããGoã«ã¯ãããžã§ã¯ãã«éèŠãªæ§é èŠä»¶ããªãããšã«ãèšåãã䟡å€ããããŸãã go.mod
ã¯åãªããã¡ã€ã«ã§ããã vendor/
䜿çšãã人ã¯ããã»ã©å€ããããŸããã å人çã«ã¯ã static/
ãã£ã¬ã¯ããªãè¯ããšã¯æããŸããã
æ¢åã®ldflags
ãªã³ã¯ãã©ã°-X importpath.name=value
ãä»ããŠïŒå¶éã¯ãããŸããïŒããŒã¿ããã«ãã«æ¿å
¥ããæ¹æ³ããã§ã«ããã®ã§ããã®ã³ãŒããã¹ã調æŽããŠ-X importpath.name=@filename
ãåãå
¥ããŠæ¿å
¥ã§ããŸããïŒå€éšã®ä»»æã®ããŒã¿ïŒ
ããã¯å
ã®åé¡ã®èšèŒãããç®æšã®ãã¹ãŠãã«ããŒããŠããããã§ã¯ãªãããšãç解ããŠããŸãããæ¢åã®-X
æ©èœã®æ¡åŒµãšããŠãããã¯åççãªåé²ã®ããã«èŠããŸããïŒ
ïŒãããããŸãããã°ã ldflags
-X
å€ãæå®ããããã®ããé©åãªæ¹æ³ãšããŠgo.mod
æ§æãæ¡åŒµããããšã次ã®åççãªã¹ãããã§ããïŒïŒ
ããã¯éåžžã«èå³æ·±ãã¢ã€ãã¢ã§ãããã»ãã¥ãªãã£ãžã®åœ±é¿ãå¿é ã§ãã
-X 'pkg.BuildVersion=$(git rev-parse HEAD)'
ãå®è¡ããããšã¯ããªãäžè¬çã§ãããgo.modã«ä»»æã®ã³ãã³ããå®è¡ãããããããŸãããïŒ ïŒgo generateã¯ããã ãšæããŸãããããŠã³ããŒãããOSSããã±ãŒãžã«å¯ŸããŠéåžžå®è¡ãããã®ã§ã¯ãããŸãããïŒgo.modããããåŠçã§ããªãå Žåãäž»èŠãªãŠãŒã¹ã±ãŒã¹ãæ¬ èœããããšã«ãªããldflagsã¯äŸç¶ãšããŠéåžžã«äžè¬çã§ãã
次ã«ã @filename
ã/ etc / passwdãªã©ãžã®ã·ã³ããªãã¯ãªã³ã¯ã§ã¯ãªãããšã確èªãããšããå¥ã®åé¡ããããŸãã
ãªã³ã«ãŒã䜿çšãããšãWASMãããªã³ã«ãŒã䜿çšããªãä»ã®ã¿ãŒã²ããã®ãµããŒããã§ããªããªããŸãã
ããã§ã®è°è«ã«åºã¥ããŠã @ bradfitzãšç§ã¯ãäžèšã®2ã€ã®ã¢ãããŒãã®äžéã«äœçœ®ããèšèšãäœæããããããã®æè¯ãšæããããã®ãæ¡çšããŸããã ãã©ãããã¶ã€ã³ã®ããã¥ã¡ã³ãããããªãããã³ã³ãŒããæçš¿ããŸããïŒä»¥äžã®ãªã³ã¯ïŒã ãã®åé¡ã«é¢ããã³ã¡ã³ãã®ä»£ããã«ããã®ç¹å®ã®ãã©ããèšèšã«é¢ããã³ã¡ã³ãã«ã€ããŠã¯ãReddit QïŒAã䜿çšããŠãã ãã-Redditã¯ãGitHubãããåªãããã£ã¹ã«ãã·ã§ã³ãã¹ã¬ããåããã³ã¹ã±ãŒãªã³ã°ããŸãã ããããšãïŒ
ãããªïŒ https ïŒ
ãã¶ã€ã³ïŒ https ïŒ
QïŒAïŒ https ïŒ
ã³ãŒãïŒ https ïŒ
@rscç§ã®æèŠã§ã¯ãgoïŒembedã®ææ¡ã¯ãã³ã³ãã€ã«æã«_universal_ãµã³ãããã¯ã¹åãããGoã³ãŒãã®å®è¡ãæäŸãããããå£ããŸããããã«ã¯ããã¡ã€ã«ã®èªã¿åããšãå®è¡æã®æ¶è²»ã«æé©ãª_æé©ãªåœ¢åŒ_ãžã®èªã¿åãããŒã¿ã®å€æãå«ãŸããŸãã
@atomsymbolããã¯ãã®åé¡ã®ç¯å²å€ã®äœãã®ããã«èãããŸãã
@atomsymbolããã¯ãã®åé¡ã®ç¯å²å€ã®äœãã®ããã«èãããŸãã
ç§ã¯ãããç¥ã£ãŠããŸãã
ææ¡ãèªã¿ãã³ãŒããã¹ãã£ã³ããŸããããããã«å¯ŸããçããèŠã€ãããŸããã§ããããã®åã蟌ã¿ã¹ããŒã ã«ã¯ããã£ã¹ã¯äžã®ãã¡ã€ã«ïŒãos.StatïŒã«é¢ããæ å ±ãå«ãŸããŠããŸããïŒ ãŸãã¯ããããã®ã¿ã€ã ã¹ã¿ã³ãã¯ãã«ãæéã«ãªã»ãããããŸããïŒ ãããã«ããããããã¯ããŸããŸãªå Žæã§äœ¿çšãããæçšãªããŒã¹æ å ±ã§ããããšãã°ãããã«åºã¥ããŠå€æŽãããŠããªãã¢ã»ããã«å¯ŸããŠ304ãéä¿¡ã§ããŸãã
ããããšãïŒ
ç·šéïŒredditã¹ã¬ããã§ãããèŠã€ããŸããã
ããªãããªã¹ãããåçŸæ§ã®æžå¿µã®ããã«ããã¹ãŠã®åã蟌ã¿ãã¡ã€ã«ã®å€æŽæéã¯ãŒãæéã§ãã ïŒåãçç±ã§ãã¢ãžã¥ãŒã«ã¯å€æŽæéãèšé²ããŸãããïŒ
https://old.reddit.com/r/golang/comments/hv96ny/qa_goembed_draft_design/fytj7my/
ãããã«ããããããã¯ããŸããŸãªå Žæã§äœ¿çšãããæçšãªããŒã¹æ å ±ã§ããããšãã°ãããã«åºã¥ããŠå€æŽãããŠããªãã¢ã»ããã«å¯ŸããŠ304ãéä¿¡ã§ããŸãã
ãã¡ã€ã«ããŒã¿ããã·ã¥ã«åºã¥ãETagããããŒã¯ãæ¥ä»ã«ã€ããŠäœãç¥ããªããŠããã®åé¡ã解決ããŸãã ãããããããæ©èœãããªãœãŒã¹ãç¡é§ã«ããªãããã«ã¯ãhttp.HandlerFSãŸãã¯äœãã«ãã£ãŠèªèãããŠããå¿ èŠãããããã¡ã€ã«ããšã«1åã ãå®è¡ããå¿ èŠããããŸãã
ãããããããæ©èœãããªãœãŒã¹ãç¡é§ã«ããªãããã«ã¯ãhttp.HandlerFSãŸãã¯äœãã«ãã£ãŠèªèãããŠããå¿ èŠãããããã¡ã€ã«ããšã«1åã ãå®è¡ããå¿ èŠããããŸãã
http.HandlerFSã¯ãfs.FSãäžå€ã§ããããšãã©ã®ããã«ããŠç¥ãã®ã§ããããã IsImmutable() bool
ãªãã·ã§ã³ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠã§ããïŒ
http.HandlerFSã¯ãfs.FSãäžå€ã§ããããšãã©ã®ããã«ããŠç¥ãã®ã§ããããã
IsImmutable() bool
ãªãã·ã§ã³ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã§ããïŒ
ç§ã¯ãããã®ãã®ã®èšèšè ã§ã¯ãªãã®ã§ãå®è£ ã®è©³çŽ°ã«ã¯è§ŠããããããŸããããhttp.HandlerFSã¯ãããembed.FSã¿ã€ãã§ãããã©ããããã§ãã¯ããç¹å¥ãªå ŽåãšããŠããã«åºã¥ããŠè¡åããããšãã§ããŸããä»ããFSAPIãå±éããŠãã ããã ç¹ã«ããã¡ã€ã«ã·ã¹ãã ãäžå€ãšããŠæ±ãããã«HandlerFSã«æ瀺ãããªãã·ã§ã³åŒæ°ãååšããå¯èœæ§ããããŸãã ãŸãããããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«è¡ããããã¹ãŠã®ctime / mtimeã®å€ããŒãã®å ŽåãhandlerFSã¯ãã®æ å ±ã䜿çšããŠããã¡ã€ã«ãå€æŽãããŠããªãããšããç¥ããããšãã§ããŸãããmtimeããªãããç¡å¹ã«ãªã£ãŠããå¯èœæ§ã®ãããã¡ã€ã«ã·ã¹ãã ããããŸããããã«ãåé¡ããããããããŸããã
ç§ã¯ãã®åé¡ã«é¢ããã³ã¡ã³ããèŠãŠããŸããã§ããã
@atomsymbolãããããªããïŒ ããã§ãŸãã³ã¡ã³ãããŠãã ããã®ãèŠãã®ã¯çŽ æŽãããããšã§ãã
ç§ã¯ååãšããŠããµã³ãããã¯ã¹åãããã°å€ãã®ããšãç°¡åã«ãªãããšã«åæããŸãã
äžæ¹ã§ãå€ãã®ããšãé£ãããããããŸãã-ãã«ãã¯æ±ºããŠçµãããªããããããŸããã
ãããã«ãããä»æ¥ã¯ãã®ãããªãµã³ãããã¯ã¹ã¯çµ¶å¯Ÿã«ãããŸããã :-)
@kokes詳现ã¯
ãã ããåã蟌ã¿ãæäŸããããšã確èªããŸããHTTPãä»ãããã¡ã€ã«ã¯ããã©ã«ãã§ETagãæ£ããååŸããŸãã
7æã«æçš¿ããããã¶ã€ã³ãã©ãããåãå
¥ããããã«ïŒ41191ãæåºããŸããã
ãã®åé¡ã«åã£ãŠä»£ãã£ãŠããã®åé¡ãã¯ããŒãºããŸãã
ããã§çŽ æŽãããäºåçãªè°è«ãããããšãã
æãåèã«ãªãã³ã¡ã³ã
@robpikeãšç§ã¯ããã®æ°å¹ŽåïŒææ¡ããã»ã¹ãè¡ãããåïŒã«è¡ãããã®ææ¡ã«ã€ããŠè©±ãåããŸããããäœãããããšã«æ»ãããšã¯ãããŸããã§ããã ç§ãã¡ããããããçµããªãã£ãããšã¯äœå¹Žãã®éç§ãæ©ãŸããŠããŸããã ç§ãèŠããŠããã¢ã€ãã¢ã¯ãéçããŒã¿ãå«ããstaticãã®ãããªç¹å¥ãªãã£ã¬ã¯ããªåãèšå®ãã泚éãå¿ èŠãšããã«APIãä»ããŠèªåçã«å©çšã§ããããã«ããããšã§ããã
ãå§çž®vsãªããããã®è€éãã«ã€ããŠã¯ç¢ºä¿¡ãæãŠãŸããã ããããã°ã人ã ã¯ç§ãã¡ã«ã©ã®å§çž®ãå§çž®ã¬ãã«ãªã©ã®å¶åŸ¡ãè¿œå ããããšãæãã§ããã§ãããã è¿œå ããå¿ èŠãããã®ã¯ããã¬ãŒã³ãã€ãã®ãã¡ã€ã«ãåã蟌ãæ©èœã ãã§ãã ãŠãŒã¶ãŒãå§çž®ããŒã¿ããã®ãã¡ã€ã«ã«ä¿åãããå Žåã¯ã詳现ã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãããGoåŽã«APIã¯ãŸã£ããå¿ èŠãããŸããã