2014幎ãGopherConã«ã³ãã¡ã¬ã³ã¹ã®ãªãŒããã³ã°ã§ãGoïŒ
Production Environmentsã®ãã¹ããã©ã¯ãã£ã¹ ããšé¡ãããã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸããã
SoundCloudã§ãç§ãã¡ã¯Goã®æåã®ãŠãŒã¶ãŒã®1人ã§ãããããããŸã§ã«2幎éã§æ¢ã«æžãããŠãããäœããã®åœ¢ã§
GoãæŠéã§ãµããŒãããŠããŸããã ãã®éãç§ãã¡ã¯äœããåŠã³ããã®çµéšã®äžéšãå
±æããããšããŸããã
ãã以æ¥ãéçšãšã€ã³ãã©ã¹ãã©ã¯ãã£ãæ
åœããSoundCloudããŒã ã§1æ¥äžGoã§ããã°ã©ãã³ã°ãç¶ããçŸåšã¯
Weaveworksã§
Weave Scopeãš
Weave Meshã䜿çšããŠããŸãã ãŸãããªãŒãã³ãœãŒã¹ã®ãã€ã¯ããµãŒãã¹ããŒã«
ãããã§ãã
Goãããã«ãç±å¿ã«åãçµã¿ãŸããã ãããŠãã®éãã£ãšãç§ã¯Goããã°ã©ããŒã³ãã¥ããã£ã®çºå±ã«ç©æ¥µçã«åå ãããšãŒããããã¢ã¡ãªã«ã§ã®äŒè°ãäŒè°ã§å€ãã®éçºè
ãšåºäŒããæåãšå€±æã®ã¹ããŒãªãŒãåéããŸããã
2015幎11æãGoãªãªãŒã¹ã®
6åšå¹Žã« ãæåã®ããã©ãŒãã³ã¹ãæãåºããŸããã æã®è©Šç·Žã«åæ Œãããã¹ããã©ã¯ãã£ã¹ã¯ã©ãã§ããïŒ ãããã®ã©ããæ代é
ãã§ããããå¹æããããŸãããïŒ æ°ãããã¯ããã¯ã¯ãããŸããïŒ 3æã«ã
QCon Londonã«ã³ãã¡ã¬ã³ã¹ã§
è¬æŒããæ©äŒããããŸãããããã§ã¯ã2014幎ã®ãã¹ããã©ã¯ãã£ã¹ãš2016幎ãŸã§ã®Goã®ãããªãéçºã«ã€ããŠè©±ããŸããã ãã®æçš¿ã¯ç§ã®ãã¬ãŒã³ããŒã·ã§ã³ããã®æç²ã§ãã
ç§ã¯ãããã¹ãã®éèŠãªãã€ã³ãããããããã³ã-æé«ã®ãã³ããã®åœ¢åŒã§åŒ·èª¿ããŸããã
ãããŠãããã«ã³ã³ãã³ãããããŸãïŒ
- éçºç°å¢
- ãªããžããªæ§é
- æžåŒèšå®ãšã¹ã¿ã€ã«
- æ§æ
- ããã°ã©ã éçº
- ãã®ã³ã°ãšã¡ããªãã¯
- ãã¹ãäž
- äŸåé¢ä¿ç®¡ç
- çµã¿ç«ãŠãšå±é
- ãããã«
éçºç°å¢
Goéçºç°å¢ã®èŠåã¯ãGOPATHã®äœ¿çšã«åºã¥ããŠããŸãã 2014幎ã«ãåäžã®ã°ããŒãã«å€æ°GOPATHãååšããå¿
èŠããããšããèŠè§£ãæè·ããŸããã ãã以æ¥ãç§ã®ç«å Žã¯å¹Ÿååããã§ããŸãã ç§ã¯ãŸã ãä»ã®æ¡ä»¶ãåãã§ããã°ããããæè¯ã®éžæè¢ã§ãããšèããŠããŸããããããžã§ã¯ããããŒã ããã®ä»ã®æ©èœã«ã倧ããäŸåããŸãã
ããªããŸãã¯ããªãã®äŒç€Ÿãäž»ã«ãã€ããªãäœæããå Žåããããžã§ã¯ãããšã«å¥ã
ã®GOPATHã䜿çšãããšç¹å®ã®å©ç¹ãåŸãããŸãã ãã®ãããªå ŽåãDave Cheneyãšå¯çš¿è
ã®æ°ãã
gbãŠãŒãã£ãªãã£ã䜿çšããŠããã®ç®çã®ããã«æšæºã®
go
ããŒã«ã眮ãæããããšãã§ããŸãã ãã®ãŠãŒãã£ãªãã£ã¯ãã§ã«å€ãã®è¯å®çãªã¬ãã¥ãŒãåããŠããŸãã
äžéšã®éçºè
ã¯ã2ã€ã®ãã£ã¬ã¯ããªïŒ2ãšã³ããªïŒã§GOPATHã䜿çšããŠããŸããããšãã°ã
$HOME/go/external:$HOME/go/internal
ã§ãã go-teamã¯åžžã«ãã®ãããªã±ãŒã¹ã®åŠçæ¹æ³ãç¥ã£ãŠããŸããïŒ
go get
ã¯äŸåé¢ä¿ãæåã®ãã¹ã®ãã£ã¬ã¯ããªã«ããŠã³ããŒãããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãå
éšã³ãŒãããµãŒãããŒãã£ããå³å¯ã«åé¢ããå¿
èŠãããå Žåã«åœ¹ç«ã¡ãŸãã
äžéšã®éçºè
ã
GOPATH/bin
ã
PATH
ã«å
¥ããã®ãå¿ããŠããããšã«æ°ä»ããŸããã ãã ããããã«ããã
go get
ã§ååŸããå®è¡å¯èœãã¡ã€ã«ã®å®è¡ãç°¡åã«ãªããïŒæšå¥šïŒ
go install
ã³ãŒãã¢ã»ã³ããªã¡ã«ããºã ã®æäœãç°¡åã«ãªããŸãã ããªãçç±ã¯ãããŸããã
⪠äžã®ãã³ã - $PATH
ã«$GOPATH/bin
ãšãã€ã³ã¹ããŒã«ãããããã°ã©ã ãžã®ã¢ã¯ã»ã¹ã容æã«ãªããŸãã
ããããçš®é¡ã®ãšãã£ã¿ãŒãšIDEã®ãããã§ãéçºç°å¢ã¯ç¶ç¶çã«æ¹åãããŠããŸãã ããªããvimãã¡ã³ãªãããã¹ãŠãå®ç§ã«æ©èœããŸããïŒFatih Arslanã®ç²ãç¥ããã§ä¿¡ããããªãã»ã©å¹æçãªä»äºã®ãããã§ã
vim-goãã©ã°ã€ã³ã¯ã¯ã©ã¹ã®æé«ã®ããŒã«ã§ããæ¬åœã®èžè¡äœåã«å€ãããŸããã ç§ã¯
Emacsã«ã¯ããŸã銎æã¿ããããŸããããgoinmodel
Dominik Honnefããã®åéã§äŸç¶ãšããŠæ¯é
ããŠããŸãã
åŒãç¶ããå€ãã®äººã
Sublime Text +
GoSublimeãã³ãã«ãåŒãç¶ã䜿çšããŠããŸãã 圌女ãšã¹ããŒãã§ç«¶ãã®ã¯é£ããã§ãã ããããæããã«ãæè¿ã
Electronã«åºã¥ããç·šéè
ã«ããå€ãã®æ³šæãæãããŸããã
Atom +
go-plusã«ã¯å€ãã®ãã¡ã³ãããŸããç¹ã«ãããèšèªããJavaScriptã«é »ç¹ã«åãæ¿ããå¿
èŠã®ããéçºè
ã®éã§ç¹ã«ããã§ãã
Visual Studio Code +
vscode-goãã³ãã¯ããŒã¯ããŒã¹ã§ããïŒSublime Textãããé
ãå®è¡ãããŸãããAtomãããèããé«éã§ãããåæã«ã¯ãªãã¯ããŠå®çŸ©ããïŒã¯ãªãã¯ããŠãªããžã§ã¯ãã®å Žæã«ç§»åããïŒãªã©ãç§ã«ãšã£ãŠéèŠãªéèŠãªæ©èœãå®å
šã«ãµããŒãããŸãïŒ
Thomas Adamãã玹ä»ãããŠä»¥æ¥ãç§ã¯ãã®ãã³ãã«ã6ãæéæ¯æ¥äœ¿çšããŠããŸãã çŽ æŽãããããšã
æ¬æ ŒçãªIDEã«ã€ããŠã¯ãç¹å¥ã«äœæããã
LiteIDEãæããããšãã§ã
ãŸã ãããã¯å®æçã«æŽæ°ãããç¬èªã®ãã¡ã³ãããŸãã Go
Intellijã®èå³æ·±ããã©ã°ã€ã³ããããåžžã«æ¹åãããŠããŸãã
ãªããžããªæ§é
ãããžã§ã¯ããããæçããã®ã«ååãªæéãããããã®çµæãå€ãã®æ確ãªã¢ãããŒããéçºãããŸããã ãããžã§ã¯ãã
äœã§ãããã¯ããªããžããªã®æ§é ã«ãã£ãŠç°ãªããŸãã éãããããžã§ã¯ããŸãã¯äŒç€Ÿã®å
éšãããžã§ã¯ãã«ã€ããŠè©±ããŠããå Žåã¯ãå
ã«é²ãããšãã§ããŸãïŒç¬èªã®GOPATHãæãããã«ã¹ã¿ã ãã«ãããŒã«ã䜿çšããåã³ããããããçç£æ§ãåäžãããå Žåã¯äœã§ãããŸãã
ãã ãããããªãã¯ãããžã§ã¯ãïŒããšãã°ããªãŒãã³ãœãŒã¹ïŒã®å Žåãã«ãŒã«ã¯ããå³æ Œã«ãªããŸãã ã³ãŒãã¯
go get
ãšäºææ§ãããå¿
èŠããããŸããããã¯ãã»ãšãã©ã®Goéçºè
ãããªãã®äœæ¥ã掻çšãããæ¹æ³ã ããã§ãã
çæ³çãªãªããžããªæ§é ã¯ããšã³ãã£ãã£ã®ã¿ã€ãã«ãã£ãŠç°ãªããŸãã ããããæä»çã«å®è¡å¯èœãªãã€ããªãã¡ã€ã«ãŸãã¯ã©ã€ãã©ãªã§ããå Žåãã³ã³ã·ã¥ãŒããããŒã¹ãã¹ã«æ²¿ã£ãŠ
go get
ãŸãã¯importã䜿çšã§ããããšã確èªããå¿
èŠããããŸãã ãããã£ãŠãããã±ãŒãžã®ã¡ã€ã³ã³ãŒããŸãã¯ã¡ã€ã³ã³ãŒãã
github.com/name/repo
ã«ã€ã³ããŒããããµãããã±ãŒãžã«ã¯ãµããã©ã«ããŒã䜿çšããŸãã
ãªããžããªããã€ããªãã¡ã€ã«ãšã©ã€ãã©ãªã®çµã¿åããã§ããå Žåã
ã¡ã€ã³ãšã³ãã£ãã£ãå®çŸ©ããŠããªããžããªã®ã«ãŒãã«é
眮ããå¿
èŠããããŸãã ããšãã°ããªããžããªã®å€§éšåãå®è¡å¯èœãã¡ã€ã«ã§æ§æãããŠããããã©ã€ãã©ãªãšããŠã䜿çšã§ããå Žåããããã次ã®ããã«æ§é åããããšããå§ãããŸãã
github.com/peterbourgon/foo/ main.go
æçšãªã¢ããã€ã¹ïŒ
lib/
ãµããã©ã«ããŒã§ã¯ããã©ã«ããŒèªäœã§ã¯ãªããã©ã€ãã©ãªãŒã®ååã«åŸã£ãŠããã±ãŒãžã«ååãä»ããæ¹ãè¯ãã§ãã ã€ãŸãããã®äŸã§ã¯ã
package lib
ã§ã¯ãªã
package foo
ã§ãã ããã¯ããªãå³å¯ãªGoã€ãã£ãªã ã®äŸå€ã§ãããå®éã«ã¯ãŠãŒã¶ãŒã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãã HTTPãµãŒãã¹ã®ã¹ãã¬ã¹ãã¹ãçšããŒã«ã§ããçŽ æŽããã
tsenart / vegetaãªããžããªãåæ§ã«é
眮ãããŠããŸãã
⪠ããããã³ã -fooãªããžããªãäž»ã«å®è¡å¯èœãªãã€ããªãã¡ã€ã«ã§æ§æãããŠããå Žåã¯ãã©ã€ãã©ãªã³ãŒããlib/
ãµããã©ã«ããŒã«å
¥ãã package foo
ååãä»ãpackage foo
ã
ãªããžããªãåºæ¬çã«ã©ã€ãã©ãªã§ãããã1ã€ãŸãã¯2ã€ã®å®è¡å¯èœããã°ã©ã ãå«ãŸããŠããå Žåãæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
github.com/peterbourgon/foo foo.go
ã©ã€ãã©ãªã³ãŒããã«ãŒãã«é
眮ãããå®è¡å¯èœããã°ã©ã ã®ã³ãŒãããµããã£ã¬ã¯ããª
cmd/foo/
æ ŒçŽããããšãéæ§é ã«ãªããŸãã äžéã®
cmd/
ã¬ãã«ã¯ã次ã®2ã€ã®çç±ã§äŸ¿å©ã§ãã
- GoããŒã«ãããã¯ãããã±ãŒãžmainã眮ãããŠãããã©ã«ããŒã®ååã§ãã€ããªãã¡ã€ã«ã«èªåçã«ååãä»ããããããªããžããªå
ã®ä»ã®ããã±ãŒãžãšç«¶åããå¯èœæ§ããªããæé©ãªãã¡ã€ã«åãååŸã§ããŸãã
- ãŠãŒã¶ãŒã
/cmd/
ãå«ããã¹ã«go get
ãšããŠãŒã¶ãŒã¯ããã«äœãååŸããããç解ããŸãã gbã¢ã»ã³ããªãŠãŒãã£ãªãã£ã®ãªããžããªãåæ§ã«é
眮ãããŸãã
⪠ããããã³ã -ãªããžããªã®äž»ãªç®çãã©ã€ãã©ãªã®å Žåãå®è¡å¯èœããã°ã©ã ã®ã³ãŒããcmd/
å
ã®ãµããã©ã«ããŒã«é
眮ããŸãã
ããã§ã®äž»ãªã¢ã€ãã¢ïŒãŠãŒã¶ãŒã®äžè©±-ãããžã§ã¯ãã®åºæ¬æ©èœã®äœ¿çšãç°¡çŽ åããŸãã ãŠãŒã¶ãŒã®ããŒãºã«çŠç¹ãåœãŠããã®æœè±¡çãªã¢ã€ãã¢ã¯ãGoã®ç²Ÿç¥ãã®ãã®ã«åã£ãŠããããã«æããŸãã
æžåŒèšå®ãšã¹ã¿ã€ã«
ããã§å€§ããªå€åã¯ãããŸããã ããã¯Goãæ£ããéãæ©ãã å Žæã®1ã€ã§ãããã³ãã¥ããã£ã®åæãšããã«ããèšèªã®å®å®æ§ã«æ¬åœã«æè¬ããŠããŸãã
ã³ãŒãã¬ãã¥ãŒã³ã¡ã³ãã¯åªããŠãããã³ãŒãæ¹èšäžã«åºæºãæºããããã«å¿
èŠãªæäœéã®åºæºã»ããã§ããå¿
èŠããããŸãã ãŸããã¿ã€ãã«ã«ç°è°ãå±ããç¶æ³ãççŸãããå Žåã¯ãAndrew Gerrandã®åªãã
æ
£çšçãªåœåèŠåã䜿çšã§ããŸãã
⪠ãã³ã -Andrew Gerrandã®åœåèŠåã掻çšããŠãã ããã
ããŒã«ã«é¢ããŠã¯ããã¹ãŠãè¯ããªããŸããã ãšãã£ã¿ãŒãæ§æããŠãä¿åæã«gofmtãããªã¬ãŒãããããã«ããããgoimportãæ¹åã
ãŸã ïŒããã«ãªããžã§ã¯ãã1ã€ããªãããšãé¡ã£ãŠããŸãïŒã go vetãŠãŒãã£ãªãã£ã䜿çšããŠã誀æ€ç¥ã¯
ã»ãšãã©çºçããªããããäºåã³ãããããã¯ã®äžéšãšããŠäœ¿çšã§ããŸãã ãŸãã
gometalinterã®åªããã³ãŒãå質管çãŠãŒãã£ãªãã£ã«æ³šæããŠ
ãã ãã ã 誀æ€ç¥ãçºçãã
å¯èœæ§ããããããäœããã®åœ¢ã§
ç¬èªã®å¥çŽãæå®ããããšã¯çã«ããªã£ãŠããŸãã
æ§æ
æ§æã¯ãã©ã³ã¿ã€ã ç°å¢ãšããã»ã¹ã®éã«ãããŸãã æ瀺çã§ååã«ææžåãããŠããå¿
èŠããããŸãã ç§ã¯ä»ã§ãflagããã±ãŒãžã䜿çšãã䜿çšããããšããå§ãããŸãããããã§ãèšå®ããã銎æã¿ã®ããããšã奜ã¿ãŸãã åŒæ°ã®è©³çŽ°ã§ç°¡æœãªåœ¢åŒãããããã«ãåŒæ°ã®æšæºæ§æãgetoptsã¹ã¿ã€ã«ã§ååŸããããšæããŸãã ãŸãã䜿çšæ³ã®ããã¹ãããã£ãšã³ã³ãã¯ãã«ãããã§ãã
Twelve-Factor Appã®èŠåã«åŸãã¢ããªã±ãŒã·ã§ã³ã¯ãç°å¢å€æ°ãæ§æã«äœ¿çšããããã«åæ©ä»ããŸãã
åå€æ°ãflagãšããŠå®çŸ©ãããŠããã° ãããã¯æ£åžžã ãšæããŸãã ããã§ã¯èªææ§ãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ã®å®è¡æã®åäœã®å€æŽã¯ãç°¡åã«æ€åºããã³ææžåãããæ¹æ³ã§è¡ãããå¿
èŠããããŸãã
ãã§ã«2014幎ã«èšã£ãããç¹°ãè¿ãå¿
èŠããããšèããŠ
ãããfunc mainïŒïŒå
ã§ãã©ã°ãå®çŸ©ããŠè§£æãã ã
func main()
ã®ã¿ãããŠãŒã¶ãŒã䜿çšã§ãããã©ã°ã決å®ããæš©å©ãæã£ãŠããŸãã ã©ã€ãã©ãªã§åäœãæ§æã§ããå Žåãæ§æãã©ã¡ãŒã¿ãŒã¯åã³ã³ã¹ãã©ã¯ã¿ãŒã®äžéšã§ããå¿
èŠããããŸãã æ§æãããã±ãŒãžã®ã°ããŒãã«ã¹ã³ãŒãã«ç§»åãããšãå©ç¹ã®é¯èŠãçããŸãããç¯çŽã¯èª€ãã§ããã³ãŒãã®ã¢ãžã¥ãŒã«æ§ãå£ããããä»ã®éçºè
ãäŸåé¢ä¿ã®é¢ä¿ãç解ããã®ãé£ãããªããç¬ç«ãã䞊ååããããã¹ããæžãããšãã¯ããã«é£ãããªããŸãã
Tipãã³ã -func func main()
ã®ã¿ãããŠãŒã¶ãŒã䜿çšã§ãããã©ã°ã決å®ããæš©éãæã¡ãŸãã
ã³ãã¥ããã£ã¯ããããã®ãã¹ãŠã®ããããã£ãçµã¿åãããããã©ã°ã®å
æ¬çãªããã±ãŒãžãéåžžã«ããŸãäœæã§ãããšæããŸãã æ¢ã«ååšããå¯èœæ§ããããŸãã ãããããªãã
ç§ã«ç¥ãããŠãã ãã ã ç§ã¯ééããªãããã䜿çšããŸãã
ããã°ã©ã éçº
äŒè©±ã§ã¯ãããã°ã©ã éçºã®ä»ã®å€ãã®åŽé¢ãè°è«ããããã®åºçºç¹ãšããŠæ§æã䜿çšããŸããïŒ2014幎ã«ãã®ãããã¯ãåãäžããŸããã§ããïŒã ãŸããã³ã³ã¹ãã©ã¯ã¿ãŒãèŠãŠã¿ãŸãããã ãã¹ãŠã®äŸåé¢ä¿ãæ£ãããã©ã¡ãŒã¿ãŒåãããšãã³ã³ã¹ãã©ã¯ã¿ãŒãéåžžã«å€§ãããªãå¯èœæ§ããããŸãã
foo, err := newFoo( *fooKey, bar, 100 * time.Millisecond, nil, ) if err != nil { log.Fatal(err) } defer foo.close()
æ§æãªããžã§ã¯ãã䜿çšããŠããã®ãããªæ§æãè¡šçŸããæ¹ãããå ŽåããããŸããæ§æãªããžã§ã¯ãã¯ãæ§æããããªããžã§ã¯ãã®åäœã決å®ãã
ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãåãæ§é
ã§ã ã
fooKey
ãã©ã¡ãŒã¿ãŒ
fooKey
å¿
é ã§ãããä»ã®ãã¹ãŠã劥åœãªããã©ã«ãå€ãæã£ãŠãããã
fooKey
ãšä»®å®ããŸãã
ç§ã¯ãã°ãã°ãæ§æãªããžã§ã¯ããããããæçåãããæ¹æ³ã§æ§ç¯ããããããžã§ã¯ãã«åºããããŸãïŒ
ãã ããããããæ§é åæåæ§æã䜿çšããŠãåäžã®åŒã䜿çšããŠäžåºŠã«ãªããžã§ã¯ããæ§ç¯ããæ¹ãã¯ããã«åªããŠããŸãã
ãªããžã§ã¯ããäžéã®èª€ã£ãç¶æ
ã«ããå Žåãããã«ã¯åŒã¯ãããŸããã åæã«ã
fooConfig
ã®å®çŸ©ãåæ ããŠããã¹ãŠã®ãã£ãŒã«ããçŸããåºåãããã€ã³ãã³ããããŸãã
cfg
ãªããžã§ã¯ããäœæããããã«äœ¿çšããããšã«æ³šæããŠãã ããã ãã®å Žåã
newFoo
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æ§é äœå®£èšãçŽæ¥åã蟌ãããšã§ãäžéç¶æ
ã®ãã1ã€ã®ã¹ããããåé¿ããå¥ã®ã³ãŒãè¡ãä¿åã§ããŸãã
çŽ æŽãããã
⪠äžã®ãã³ã -誀ã£ãäžéç¶æ
ãåé¿ããã«ã¯ãæ§é ãªãã©ã«ã®åæåã䜿çšããŸãã å¯èœãªéããæ§é 宣èšãåã蟌ã¿ãŸãã
次ã«ã劥åœãªããã©ã«ãã®ãããã¯ã«ç§»ããŸãããã
Output
ãã©ã¡ãŒã¿ãŒã¯
nil
ã§ããããšã«æ³šæããŠãã ããã
ããã
io.Writer
ãŸãã äœãç¹å¥ãªããšãè¡ããªãå Žåã
foo
ãªããžã§ã¯ãã§ããã䜿çšãããå Žåã¯ããŸãnilããã§ãã¯ããå¿
èŠããããŸãã
func (f *foo) process() { if f.Output != nil { fmt.Fprintf(f.Output, "start\n") }
ããã¯çŽ æŽãããããšã§ã¯ãããŸããã åºåå€ã®ååšã確èªããã«äœ¿çšã§ããæ¹ãã¯ããã«å®å
šã§ãã
func (f *foo) process() { fmt.Fprintf(f.Output, "start\n")
ãã®ãããããã§ã¯ããã©ã«ãã§æçšãªãã®ãæäŸããå¿
èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã®çš®é¡ã®ãããã§ãã€ã³ã¿ãŒãã§ã€ã¹ã®ããŒãªãã¬ãŒã·ã§ã³å®è£
ïŒã€ãŸããæäœãå®è¡ããªãå®è£
ãã¹ã¿ãã翻蚳è
ã®ã¡ã¢ïŒãæäŸãããã®ãæž¡ãããšãã§ããŸãã ãã®ãããstdlib ioutilããã±ãŒãžã«ã¯
io.Writer
ãšãã
ioutil.Discard
ãªãã¬ãŒã·ã§ã³
io.Writer
ãä»å±ããŠããŸãã
⪠ããããã³ã -ããã©ã«ãã®ããŒãªãã¬ãŒã·ã§ã³å®è£
ã§ã¯ãnilãã§ãã¯ãé¿ããŸãã
ããã
fooConfig
ãªããžã§ã¯ãã«æž¡ãããšãã§ããŸãããããã¯ããªãè匱ãªãœãªã¥ãŒã·ã§ã³ã§ãã åŒã³åºãå
ã®ã³ãŒããåŒã³åºãã®å Žæã§ãããè¡ãã®ãå¿ããå Žåãåã³
nil
ãã©ã¡ãŒã¿ãŒãååŸããŸãã 代ããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒå
ã§ä¿è·ã§ããŸãã
func newFoo(..., cfg fooConfig) *foo { if cfg.Output == nil { cfg.Output = ioutil.Discard }
ããã¯ãGo Make Zeroå€ã®ã€ãã£ãªã ã®åãªãã¢ããªã±ãŒã·ã§ã³ã§ãã ã€ãŸããnullå€ïŒ
nil
ïŒã䜿çšããŠãé©åãªããã©ã«ãã®åäœïŒno-opïŒãæäŸã§ããŸãã
⪠å
端ã®ãã³ã -ç¹ã«æ§æãªããžã§ã¯ãã§ã¯ãnullå€ãæçšã«ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒã«æ»ããŸãããã ãã©ã¡ãŒã¿ãŒ
fooKey
ã
bar
ã
period
ããã³
output
ã¯
äŸåé¢ä¿ã§ãã
foo
ãªããžã§ã¯ãã®èµ·åãšæäœã®æåã¯ããããã®ããããã«
äŸåããŸãã Goã§ã®6幎éã®æ¯æ¥ã®ããã°ã©ãã³ã°ãšå€§èŠæš¡ãããžã§ã¯ãã®èŠ³å¯ã§æ£ç¢ºã«åŠãã ããšã¯ã
äŸåé¢ä¿ãæ瀺çã«ããå¿
èŠããããšããããšã§ãã
⪠å
端ã®ãã³ã -äŸåé¢ä¿ãæ瀺çã«ïŒ
ãããŸããªäŸåé¢ä¿ãŸãã¯æé»çãªäŸåé¢ä¿ããæè¡ãµããŒããæ··ä¹±ããã°ãæªæãã®æè¡çè² åµã®ããã®äººä»¶è²»ã®ä¿¡ããããªãã»ã©ã®éã®çç±ã ãšæããŸãã
foo
åã®processïŒïŒã¡ãœãããèããŠã¿ãŸãããïŒ
func (f *foo) process() { fmt.Fprintf(f.Output, "start\n") result := f.Bar.compute() log.Printf("bar: %v", result)
fmt.Printf
èªåŸçã§ãã°ããŒãã«ç¶æ
ã«åœ±é¿ãäžãããäŸåããŸããã æ©èœé¢ã§ã¯ãäžçš®ã®
åç
§ééæ§ããããŸãã ãããã£ãŠãããã¯äžæ¯ã§ã¯ãããŸããã æããã«ãããã¯
f.Bar
ã§ãã
log.Printf
ãã°ããŒãã«ïŒããã±ãŒãžå
ïŒãã¬ãŒãªããžã§ã¯ãã«åœ±é¿ãäžããã®ã¯äžæè°ã§ããããã¯ã
Printf
é¢æ°ãç¡æã§ãããããåçŽã«æããã§ã¯ãããŸããã ãããã£ãŠããããäžæ¯ã§ãã
ããããã¹ãŠã®äŸåé¢ä¿ã§äœãããŸããïŒ
ããããæ瀺çã«ããŸããã ã processïŒïŒã¡ãœããã¯æäœäžã«ãã°ã«æžã蟌ããããã¡ãœãããŸãã¯
foo
ãªããžã§ã¯ãèªäœã¯ããã®ã³ã°ãªããžã§ã¯ããäŸåé¢ä¿ãšããŠåãå
¥ããå¿
èŠããããŸãã ããšãã°ã
log.Printf
ã¯
f.Logger.Printf
ãªã
f.Logger.Printf
ã
func (f *foo) process() { fmt.Fprintf(f.Output, "start\n") result := f.Bar.compute() f.Logger.Printf("bar: %v", result)
以åã¯ãç¹å®ã®çš®é¡ã®äœæ¥ãæ
ä¿ãšããŠã®ãã®ã³ã°ãšèŠãªããŠããŸããã ãããã£ãŠãã°ããŒãã«ãã¬ãŒãªã©ã®ãµããŒãã©ã€ãã©ãªã䜿çšããŠãè² æ
ã軜æžã§ããããšãå¬ããæããŸãã ãã ããã¡ããªãã¯ã¹ãšåæ§ã«ããã®ã³ã°ã¯ãµãŒãã¹ã®æ©èœã«ãããŠæ±ºå®çãªåœ¹å²ãæããããšããããããŸãã ãããŠãå¯èŠæ§ã®ã°ããŒãã«ç©ºéã§äŸåé¢ä¿ãé衚瀺ã«ããããšã§ããã®ã³ã°ãªã©ã®äžèŠç¡å®³ãªåœ¢ã§ããŸãã¯ãã©ã¡ãŒã¿ãŒåãæ°ã«ããªãä»ã®ããéèŠãªäž»é¡ã³ã³ããŒãã³ãã®åœ¢ã§ãç§ãã¡ã«ææãäžããããšãã§ããŸãã ã å³æ Œãªã«ãŒã«ã§å°æ¥ã®çã¿ãã身ãå®ããŸãããïŒãã¹ãŠã®äžæ¯ã
æ瀺çã«ããŸãããã
⪠ããããã³ã -ãã¬ãŒã¯äŸåé¢ä¿ã§ãããä»ã®ã³ã³ããŒãã³ããããŒã¿ããŒã¹ã¯ã©ã€ã¢ã³ããã³ãã³ãã©ã€ã³åŒæ°ãªã©ãžã®ãªã³ã¯ãåæ§ã§ãã
ãã¡ããããã¬ãŒã®åŠ¥åœãªããã©ã«ããååŸããå¿
èŠããããŸãã
func newFoo(..., cfg fooConfig) *foo {
ãã®ã³ã°ãšã¡ããªãã¯
å
šäœãšããŠã®åé¡ã«ã€ããŠè©±ããšããã°ãèšé²ããããšã§ãæŠéã§ã®çµéšãã¯ããã«å€ããªããåé¡ã«å¯Ÿããæ¬æã匷ããªããŸããã ãã®ã³ã°ã¯ãäºæ³ãããã¯ããã«é«äŸ¡ã§ãããã·ã¹ãã ã®ããã«ããã¯ã«ããã«å€ããå¯èœæ§ããããŸãã ãã®ãããã¯ã«ã€ããŠ
ã¯ãå¥ã®æçš¿ã§è©³ãã説æã
ãŸããããç°¡åã«èšãã°ïŒ
- 人ãŸãã¯ãã·ã³ãèªã¿åã£ãã¢ã¯ã·ã§ã³ã®åºç€ãæäŸããæ
å ±ã®ã¿ãèšé²ããŸã ã
- ããŸãã«ã詳现ãªãã®ã³ã°ã¯é¿ããŠãã ãããããããããããã°ã®ããã®ååãªäžè¬æ
å ±ãšããŒã¿ãåŸãããã§ãããã
- æ§é åããããã°ã䜿çšããŸãã ç§ã¯åèŠããããŸããã go-kit / logããå§ãããŸã ã
- ãã¬ãŒã¯äŸåé¢ä¿ã§ãïŒ
ãã®ã³ã°ãé«äŸ¡ãªå Žåãã¡ããªãã¯ã¯å®äŸ¡ã§ãã ã³ãŒãããŒã¹ã®éèŠãªã³ã³ããŒãã³ãããã¡ããªãã¯ãåé€ããŸãã ãã¥ãŒãªã©ã®ãªãœãŒã¹ã®å Žåã¯ã
Brendan Greggã®USEã¡ãœããã䜿çšããŠæž¬å®ããŸãïŒUtilizationãSaturationãError countïŒrateïŒã ãããäœããã®ãšã³ããã€ã³ãã§ããå Žå
ããã ãŠã£ã«ããŒã®REDã¡ãœããã«åŸã£ãŠæž¬å®ããŸãïŒèŠæ±ã«ãŠã³ãïŒçïŒããšã©ãŒã«ãŠã³ãïŒçïŒãæéã
ãã®åé¡ã§éžæããæ©äŒãããã°ã
ããã¡ããŠã¹ã枬å®ã·ã¹ãã ãšããŠäœ¿çšããããšããå§ãããŸãã ãããŠãã¡ãããã¡ããªãã¯ãäŸåé¢ä¿ã§ãïŒ
ãã¬ãŒãšã¡ããªãã¯ããè±ç·ããŠãã°ããŒãã«ç¶æ
ãçŽæ¥èŠãŠã¿ãŸãããã Goã«é¢ããããã€ãã®äºå®ã次ã«ç€ºããŸãã
log.Print
ã¯ãåºå®ã°ããŒãã«log.Print
䜿çšããŸããhttp.Get
ã¯åºå®ã°ããŒãã«http.Client
䜿çšãhttp.Client
ãhttp.Server
ã¯log.Logger
åºå®ã°ããŒãã«http.Server
䜿çšlog.Logger
ãdatabase/sql
ã¯ããã©ã€ããŒã®åºå®ã°ããŒãã«ã¬ãžã¹ããªã䜿çšããŸããfunc init
ã¯ãããã±ãŒãžã®ã°ããŒãã«ç¶æ
ã«å¯äœçšãããããããã«ã®ã¿ååšããŸãã
ãããã®äºå®ã¯åå¥ã«èš±å®¹ãããŸãããäžè¬çã«ã¯å°é£ã§ãã ã€ãŸããåºå®ã°ããŒãã«ãã¬ãŒã䜿çšããŠãã³ã³ããŒãã³ãã«ãã£ãŠãã°ã«éä¿¡ãããåºåãã©ã®ããã«ãã¹ãã§ããŸããïŒ ãã®ããŒã¿ããªãã€ã¬ã¯ãããå¿
èŠããããŸããã䞊è¡ããŠãã¹ãããæ¹æ³ã¯ïŒ ãŸããïŒ çãã¯äžååã§ãã ãŸãã¯ãããšãã°ãç°ãªãèŠä»¶ãæã€HTTPãªã¯ãšã¹ããçæãã2ã€ã®ç¬ç«ããã³ã³ããŒãã³ãããããŸããããããã©ã®ããã«ç®¡çããŸããïŒ æšæºã®ã°ããŒãã«
http.Client
ã䜿çšããã®ã¯éåžžã«å°é£ã§ãã äŸãåç
§ããŠãã ããã
func foo() { resp, err := http.Get("http://zombo.com")
http.Getã¯ãhttpãã±ããã§ã°ããŒãã«ãåŒã³åºããŸãã æé»çãªã°ããŒãã«äŸåé¢ä¿ããããŸãããããã¯ç°¡åã«åé€ã§ããŸãã
func foo(client *http.Client) { resp, err := client.Get("http://zombo.com")
http.Client
ããã©ã¡ãŒã¿ãŒãšããŠæž¡ã
http.Client
ã ããããããã¯å
·äœçãªã¿ã€ãã§ããããããã®é¢æ°ããã¹ãããå Žåã¯ãç¹å®ã®http.ClientãæäŸããå¿
èŠããããŸããããã«ãããHTTPãä»ããå®éã®æ¥ç¶ã®ç¢ºç«ã匷å¶ãããŸãã ããã¯è¯ããããŸããã ããè¯ãæ¹æ³ïŒHTTPèŠæ±ãå®è¡ïŒå®è¡ïŒã§ããã€ã³ã¿ãŒãã§ãŒã¹ãæž¡ããŸãã
type Doer interface { Do(*http.Request) (*http.Response, error) } func foo(d Doer) { req, _ := http.NewRequest("GET", "http://zombo.com", nil) resp, err := d.Do(req)
http.Client
Doer
,
Doer
. :
foo
foo
, ,
http.Client
, .
âŠ
ãã¹ãäž
2014 , - . (stdlib) . . Go ,
. , . testing .
TDD/BDD , DSL , , . , . , , ,
, .
When in Go, do as Gophers do ( Go, , ) : â Go, , , .
, . GOPATH, , , DSL . , , . , .
. (Mitchell Hashimoto) (
SpeakerDeck ,
YouTube ), .
: , Go , . , , , .
⪠Top Tip â .
http.Client
, , - , . - -, HTTP-, , , . - - .
⪠Top Tip â , .
. 2014 , (vendor). - : . , Go 1.6 GO15VENDOREXPERIMENT vendor/ . . , , . :
⪠Top Tip â .
. Go . , . , 1.5 , . , :
1 ,
2 . , :
.
⪠Top Tip â .
, () API. , .
open source , , . , , . GO15VENDOREXPERIMENT , .
, . Etcd ,
, , Go Windows. , , , . , ,
, - .
, ( )
go install
go build
.
install
$GOPATH/pkg
, .
$GOPATH/bin
, .
⪠Top Tip â go install
go build
.
, ,
gb . . , Go 1.5 - « ». GOOS GOARCH, go-. .
, , , , Ruby, Python, JVM. : ,
â FROM scratch. Go , .
: , , â -. . , AMI EC2, . .
ãããã«
Top Tips:
$GOPATH/bin
$PATH
, .- foo , lib/
package foo
. - â , cmd/.
- .
func main()
, .- , . , , .
- nil no-op- .
- , .
- !
- , , , . .
- .
- , .
- .
- .
go install
go build
.
Go , , - . â â . (
Go Proverbs ), , « » (up the stack) , , Go.
Go.