2022 幎 10 æã«ããã³ã°ããåºçããã100 ã® Go ã®ééããšãã®åé¿æ¹æ³ã®ãœãŒã¹ ã³ãŒããšã³ãã¥ãã㣠ã¹ããŒã¹(æ¬ã«ã€ããŠ)ã
ã·ã£ããŠå€æ°ãé¿ããããšã§ãééã£ã倿°ãåç §ããããèªè ãæ··ä¹±ãããããããªã©ã®ãã¹ãé²ãããšãã§ããŸãã
ãã¹ããããã¬ãã«ãé¿ããããã㌠ãã¹ãå·ŠåŽã«é 眮ããããšã§ãã¡ã³ã¿ã« ã³ãŒã ã¢ãã«ã®æ§ç¯ã容æã«ãªããŸãã
倿°ãåæåãããšãã¯ãinit 颿°ã§ã¯ãšã©ãŒåŠçãå¶éãããŠãããç¶æ ã®åŠçãšãã¹ããããè€éã«ãªãããšã«æ³šæããŠãã ãããã»ãšãã©ã®å Žåãåæåã¯ç¹å®ã®é¢æ°ãšããŠåŠçããå¿ èŠããããŸãã
ã²ãã¿ãŒãšã»ãã¿ãŒã®äœ¿çšã匷å¶ããããšã¯ãGo ã§ã¯æ £çšçã§ã¯ãããŸãããå®çšçã§ãããå¹çæ§ãšç²ç®çã«ç¹å®ã®ã€ãã£ãªã ã«åŸãããšãšã®éã®é©åãªãã©ã³ã¹ãèŠã€ããããšããé²ãã¹ãéã§ãã
æœè±¡åã¯ãäœæããã®ã§ã¯ãªããçºèŠããå¿ èŠããããŸããäžå¿ èŠãªè€éããé¿ããããã«ãã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã«ãªããšäºæ³ããããšãã§ã¯ãªããå¿ èŠãªãšãã«ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããããå°ãªããšãæœè±¡åãæå¹ã§ããããšã蚌æã§ããå Žåã«ã€ã³ã¿ãŒãã§ã€ã¹ãäœæããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãã¯ã©ã€ã¢ã³ãåŽã«ä¿æããããšã§ãäžèŠãªæœè±¡åãåé¿ã§ããŸãã
æè»æ§ãå¶éãããã®ãé²ãããã«ãã»ãšãã©ã®å Žåã颿°ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã§ã¯ãªãå ·äœçââãªå®è£ ãè¿ãå¿ èŠããããŸããéã«ã颿°ã¯å¯èœãªéãã€ã³ã¿ãŒãã§ã€ã¹ãåãå ¥ããå¿ èŠããããŸãã
anyäœãèšããªã (#8)
anyãªã©ã®å¯èœãªã¿ã€ããåãå ¥ãããè¿ãå¿ èŠãããå Žåã«ã®ã¿äœ¿çšããŠãã ãã
json.Marshalããã
anyããªããšãæå³ã®ããæ å ±ãæäŸããããåŒã³åºãå ãä»»æã®ããŒã¿åã§ã¡ãœãããåŒã³åºãããšãã§ãããããã³ã³ãã€ã«æã®åé¡ãçºçããå¯èœæ§ããããŸãã
ãžã§ããªãã¯ãšåãã©ã¡ãŒã¿ãŒã«äŸåãããšãå®åã³ãŒããèšè¿°ããŠèŠçŽ ãåäœãé€å€ããããšãã§ããªããªãå¯èœæ§ããããŸãããã ããåãã©ã¡ãŒã¿ãŒãææå°æ©ã«äœ¿çšããªãã§ãã ãããå ·äœçãªå¿ èŠæ§ãããå Žåã«ã®ã¿äœ¿çšããŠãã ãããããããªããšãäžå¿ èŠãªæœè±¡åãšè€éããçããŸãã
åã®åã蟌ã¿ã䜿çšãããšããã€ã©ãŒãã¬ãŒã ã³ãŒããåé¿ããããšãã§ããŸãããã ããããããããšã§ãäžéšã®ãã£ãŒã«ããé衚瀺ã®ãŸãŸã§ããå¿ èŠãããå¯èŠæ§ã®åé¡ãçºçããªãããã«ããŠãã ããã
ãªãã·ã§ã³ã䟿å©ã〠API ãã¬ã³ããªãŒãªæ¹æ³ã§åŠçããã«ã¯ãæ©èœãªãã·ã§ã³ ãã¿ãŒã³ã䜿çšããŸãã
project-layout ãªã©ã®ã¬ã€ã¢ãŠãã«åŸãããšã¯ãç¹ã«æ°ãããããžã§ã¯ããæšæºåããããã®æ¢åã®èŠåãæ¢ããŠããå Žåã«ãGo ãããžã§ã¯ãã®æ§é åãéå§ããããã®è¯ãæ¹æ³ã§ãã
ããŒãã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³èšèšã®éèŠãªéšåã§ãã
commonã
utilãããã³ãªã©ã®ããã±ãŒãžãäœæ
sharedããŠããèªè ã«ã¯ããŸã䟡å€ããããŸããããã®ãããªããã±ãŒãžãæå³ã®ããå ·äœçãªããã±ãŒãžåã«ãªãã¡ã¯ã¿ãªã³ã°ããŸãã
倿°ãšããã±ãŒãžã®éã§ååãç«¶åããæ··ä¹±ããã°ã®åå ãšãªãã®ãé¿ããããã«ãããããã«äžæã®ååã䜿çšããŠãã ããããããäžå¯èœãªå Žåã¯ãã€ã³ããŒã ãšã€ãªã¢ã¹ã䜿çšããŠä¿®é£Ÿåã倿Žããããã±ãŒãžåãšå€æ°åãåºå¥ããããããé©åãªååãèããŠãã ããã
ã¯ã©ã€ã¢ã³ããšã¡ã³ãããŒãã³ãŒãã®ç®çãçè§£ã§ããããã«ããšã¯ã¹ããŒããããèŠçŽ ãææžåããŸãã
ã³ãŒãã®å質ãšäžè²«æ§ãåäžãããã«ã¯ããªã³ã¿ãŒãšãã©ãŒããã¿ãŒã䜿çšããŸãã
æ¢åã®ã³ãŒããèªããšãã¯ã0 ã§å§ãŸãæŽæ°ãªãã©ã«ã¯ 8 鲿°ã§ããããšã«æ³šæããŠãã ããããŸããèªã¿ããããåäžãããããã«ã8 鲿޿°ã®åã« ãä»ããŠæç€ºçã«ã
0oãŸãã
æŽæ°ã®ãªãŒããŒãããŒãšã¢ã³ããŒãããŒã¯ Go ã§ãµã€ã¬ã³ãã«åŠçããããããç¬èªã®é¢æ°ãå®è£ ããŠãããããã£ããã§ããŸãã
ç¹å®ã®ãã«ã¿å ã§æµ®åå°æ°ç¹æ¯èŒãè¡ããšãã³ãŒãã®ç§»æ€æ§ãä¿èšŒãããŸãã
å ç®ãŸãã¯æžç®ãå®è¡ãããšãã¯ã粟床ãåªå ããããã«åããããªå€§ããã®é åºã§æŒç®ãã°ã«ãŒãåããŸãããŸããè¶³ãç®ã»åŒãç®ã®åã«æãç®ã»å²ãç®ãè¡ããŸãã
ã¹ã©ã€ã¹ã®é·ããšå®¹éã®éããçè§£ããããšã¯ãGo éçºè ã®ã³ââã¢ç¥èã®äžéšã§ããå¿ èŠããããŸããã¹ã©ã€ã¹ã®é·ãã¯ã¹ã©ã€ã¹ã§äœ¿çšå¯èœãªèŠçŽ ã®æ°ã§ãããã¹ã©ã€ã¹ã®å®¹éã¯è£å©é åã®èŠçŽ ã®æ°ã§ãã
ã¹ã©ã€ã¹ãäœæãããšãããã®é·ãããã§ã«ããã£ãŠããå Žåã¯ãæå®ãããé·ããŸãã¯å®¹éã§åæåããŸããããã«ãããå²ãåœãŠã®æ°ãæžããããã©ãŒãã³ã¹ãåäžããŸããåãããžãã¯ããããã«ãåœãŠã¯ãŸãããµã€ãºãåæåããå¿ èŠããããŸãã
encoding/jsonãŸãã¯ããã±ãŒãžã䜿çšããå Žåãªã©ã®äžè¬çãªæ··ä¹±ãé¿ããããã«
reflectãnil ã¹ã©ã€ã¹ãšç©ºã®ã¹ã©ã€ã¹ã®éããçè§£ããå¿ èŠããããŸããã©ã¡ããé·ããŒãã容éãŒãã®ã¹ã©ã€ã¹ã§ãããnil ã¹ã©ã€ã¹ã ãã¯å²ãåœãŠãå¿ èŠãšããŸããã
ã¹ã©ã€ã¹ã«èŠçŽ ãå«ãŸããŠããªããã©ããã確èªããã«ã¯ããã®é·ãã確èªããŸãããã®ãã§ãã¯ã¯ãã¹ã©ã€ã¹ã
nil空ãã©ããã«é¢ä¿ãªãæ©èœããŸããåãããšãå°å³ã«ãèšããŸãã
æç¢ºãª API ãèšèšããã«ã¯ãnil ã¹ã©ã€ã¹ãšç©ºã®ã¹ã©ã€ã¹ãåºå¥ããªãã§ãã ããã
copyçµã¿èŸŒã¿é¢æ°ã䜿çšã㊠1 ã€ã®ã¹ã©ã€ã¹ãå¥ã®ã¹ã©ã€ã¹ã«ã³ããŒããã«ã¯ãã³ããŒãããèŠçŽ ã®æ°ã 2 ã€ã®ã¹ã©ã€ã¹ã®é·ãã®æå°å€ã«å¯Ÿå¿ããããšã«æ³šæããŠãã ããã
ã³ããŒãŸãã¯å®å šãªã¹ã©ã€ã¹åŒã
append䜿çšãããšã2 ã€ã®ç°ãªã颿°ãåãé åã«åºã¥ãã¹ã©ã€ã¹ã䜿çšããå Žåã«ç«¶åãçºçããã®ãé²ãããšãã§ããŸãããã ãã倧ããªã¹ã©ã€ã¹ãçž®å°ããå Žåã¯ãã¹ã©ã€ã¹ã®ã³ããŒã®ã¿ãã¡ã¢ãª ãªãŒã¯ãé²ããŸãã
ãã€ã³ã¿ãŒ ãã£ãŒã«ããæã€æ§é äœãŸãã¯ãã€ã³ã¿ãŒã®ã¹ã©ã€ã¹ãæäœããå Žåãã¹ã©ã€ã¹æäœã«ãã£ãŠé€å€ãããèŠçŽ ã nil ãšããŠããŒã¯ããããšã§ãã¡ã¢ãª ãªãŒã¯ãåé¿ã§ããŸãã
#21ãåç §ããŠãã ããã
ãããã¯åžžã«ã¡ã¢ãªå ã§æ¡å€§ã§ããŸãããçž®å°ããããšã¯ãããŸããããããã£ãŠãã¡ã¢ãªã®åé¡ãçºçããå Žåã¯ãGo ã«åŒ·å¶çã«ããããåäœæããããããã€ã³ã¿ãŒã䜿çšãããªã©ãããŸããŸãªãªãã·ã§ã³ã詊ãããšãã§ããŸãã
Go ã§åãæ¯èŒãââãã«ã¯ã2 ã€ã®åãæ¯èŒå¯èœã§ããã° == æŒç®åãš != æŒç®åã䜿çšã§ããŸã: ããŒã«å€ãæ°å€ãæååããã€ã³ã¿ãŒããã£ãã«ãããã³æ§é äœãå®å šã«æ¯èŒå¯èœãªåã§æ§æãããŠããŸãããã以å€ã®å Žåã¯ã
reflect.DeepEqualãªãã¬ã¯ã·ã§ã³ã®ä»£åãæã£ãŠäœ¿çšããããã«ã¹ã¿ã ã®å®è£ ãšã©ã€ãã©ãªã䜿çšã§ããŸãã
rangeã«ãŒãã§ã³ããŒãããããšãç¡èŠãã (#30)
ã«ãŒãå ã®å€èŠçŽ ã¯
rangeã³ããŒã§ãããããã£ãŠãããšãã°ãæ§é äœã倿Žããã«ã¯ããã®ã€ã³ããã¯ã¹ãŸãã¯åŸæ¥ã®
forã«ãŒããä»ããŠã¢ã¯ã»ã¹ããŸã (倿ŽããèŠçŽ ãŸãã¯ãã£ãŒã«ãããã€ã³ã¿ãŒã§ãªãå Žå)ã
rangeã«ãŒã (ãã£ãã«ãšé å) ã§è©äŸ¡ãããæ¹æ³ãç¡èŠãã (#31)
ãªãã¬ãŒã¿ãŒã«æž¡ãããåŒã
rangeã«ãŒãã®éå§åã« 1 åã ãè©äŸ¡ãããããšãçè§£ãããšããã£ãã«ãŸãã¯ã¹ã©ã€ã¹ã®å埩ã«ãããéå¹ççãªå²ãåœãŠãªã©ã®ããããééããåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
rangeãã (#32)
ããŒã«ã«å€æ°ã䜿çšããããã€ã³ããã¯ã¹ã䜿çšããŠèŠçŽ ã«ã¢ã¯ã»ã¹ãããããããšã§ãã«ãŒãå ã§ãã€ã³ã¿ãŒãã³ããŒããéã®ãã¹ãé²ãããšãã§ããŸãã
ãããã䜿çšãããšãã«äºæž¬å¯èœãªåºåã確ä¿ããã«ã¯ããããã®ããŒã¿æ§é ãæ¬¡ã®ããšãèŠããŠãããŠãã ããã
breakã¹ããŒãã¡ã³ãã®ä»çµã¿ãç¡èŠãã(#34)
breakorãã©ãã«ãšãšãã«äœ¿çšãã
continueãšãç¹å®ã®ã¹ããŒãã¡ã³ãã匷å¶çã«ç Žæ£ãããŸããããã¯ãã«ãŒãå ã®
switchorã¹ããŒãã¡ã³ãã§åœ¹ç«ã¡ãŸãã
select
defer(#35)
颿°å ã§ã«ãŒã ããžãã¯ãæœåºãã
deferãšãåååŸ©ã®æåŸã«ã¹ããŒãã¡ã³ããå®è¡ãããŸãã
ã«ãŒã³ã Unicode ã³ãŒã ãã€ã³ãã®æŠå¿µã«å¯Ÿå¿ããè€æ°ã®ãã€ãã§æ§æã§ããããšãçè§£ããããšã¯ãæååãæ£ç¢ºã«æäœããããã® Go éçºè ã®ã³ââã¢ç¥èã®äžéšã§ããå¿ èŠããããŸãã
æŒç®åã䜿çšããŠæååã
rangeå埩ãããšãã«ãŒã³ã®ãã€ã ã·ãŒã±ã³ã¹ã®éå§ã€ã³ããã¯ã¹ã«å¯Ÿå¿ããã€ã³ããã¯ã¹ã䜿çšããŠã«ãŒã³ãå埩åŠçããŸããç¹å®ã®ã«ãŒã³ ã€ã³ããã¯ã¹ (3 çªç®ã®ã«ãŒã³ãªã©) ã«ã¢ã¯ã»ã¹ããã«ã¯ãæååã
[]rune.
strings.TrimRight/
strings.TrimLeftã¯ãæå®ãããã»ããã«å«ãŸããæ«å°Ÿ/å é ã®ã«ãŒã³æåããã¹ãŠåé€ããŸããã / ã¯æå®ããããµãã£ãã¯ã¹
strings.TrimSuffix/
strings.TrimPrefixãã¬ãã£ãã¯ã¹ã®ãªãæååãè¿ããŸãã
strings.Builderåå埩äžã«æ°ããæååãå²ãåœãŠãããªãããã«ãæååã®ãªã¹ããé£çµããå¿ èŠããããŸãã
bytesããã±ãŒãžãããã±ãŒãžãšåãæäœãæäŸããããšãèŠããŠãããšã
stringsäœåãªãã€ã/æååã®å€æãé¿ããããšãã§ããŸãã
éšåæååã®ä»£ããã«ã³ããŒã䜿çšãããšãéšåæååæäœã«ãã£ãŠè¿ãããæååãåããã€ãé åã«ãã£ãŠãµããŒãããããããã¡ã¢ãª ãªãŒã¯ãé²ãããšãã§ããŸãã
å€ãŸãã¯ãã€ã³ã¿ãŒ ã¬ã·ãŒããŒã䜿çšãããã©ããã¯ãåã倿Žããå¿ èŠããããã©ãããã³ããŒã§ããªããã£ãŒã«ããå«ãŸããŠãããã©ããããªããžã§ã¯ãã®å€§ãããªã©ã®èŠå ã«åºã¥ããŠæ±ºå®ããå¿ èŠããããŸããçãããå Žåã¯ããã€ã³ã¿ ã¬ã·ãŒãã䜿çšããŠãã ããã
ååä»ãã®çµæãã©ã¡ãŒã¿ãŒã䜿çšãããšãç¹ã«è€æ°ã®çµæãã©ã¡ãŒã¿ãŒãåãåã§ããå Žåã«ã颿°/ã¡ãœããã®å¯èªæ§ãåäžãããå¹ççãªæ¹æ³ã«ãªããŸããå Žåã«ãã£ãŠã¯ãååä»ãçµæãã©ã¡ãŒã¿ãŒããŒãå€ã«åæåãããããããã®æ¹æ³ã䟿å©ãªå ŽåããããŸãããã ããæœåšçãªå¯äœçšã«ã¯æ³šæããŠãã ããã
#43ãåç §ããŠãã ããã
ã€ã³ã¿ãŒãã§ã€ã¹ãè¿ããšãã¯ãnil ãã€ã³ã¿ã§ã¯ãªãæç€ºç㪠nil å€ãè¿ãããšã«æ³šæããŠãã ãããããããªããšãåŒã³åºãå ã nil 以å€ã®å€ãåãåããããæå³ããªãçµæãçããå¯èœæ§ããããŸãã
ãã¡ã€ã«åã®ä»£ããã«åãåãåãããã«é¢æ°ãèšèšãã
io.Readerãšã颿°ã®åå©çšæ§ãåäžãããã¹ãã容æã«ãªããŸãã
defer(åŒæ°è©äŸ¡ããã€ã³ã¿ãŒãããã³å€ã¬ã·ãŒããŒ) (#47)
颿°ãžã®ãã€ã³ã¿ãŒãæž¡ãããš
deferãšãåŒã³åºããã¯ããŒãžã£ãŒå ã«ã©ããããããšã¯ãåŒæ°ãšã¬ã·ãŒããŒã®å³æè©äŸ¡ãå æããããã® 2 ã€ã®å¯èœãªè§£æ±ºçã§ãã
Using
panicã¯ãGo ã§ãšã©ãŒãåŠçããããã®ãªãã·ã§ã³ã§ãããã ããå埩äžèœãªç¶æ³ã§ã®ã¿æ§ããã«äœ¿çšããå¿ èŠããããŸããããšãã°ãããã°ã©ããŒã®ãšã©ãŒãéç¥ããå Žåããå¿ é ã®äŸåé¢ä¿ã®èªã¿èŸŒã¿ã«å€±æããå Žåãªã©ã§ãã
ãšã©ãŒãã©ãããããšããšã©ãŒãããŒã¯ãããã远å ã®ã³ã³ããã¹ããæäŸãããã§ããŸãããã ãããšã©ãŒ ã©ããã³ã°ã¯ãåŒã³åºãå ããœãŒã¹ ãšã©ãŒãå©çšã§ããããã«ãããããçµåã®å¯èœæ§ãçã¿åºããŸãããããé²ãããå Žåã¯ããšã©ãŒã©ããã³ã°ã䜿çšããªãã§ãã ããã
Go 1.13 ãšã©ãŒ ã©ããã³ã°ã
%wãã£ã¬ã¯ãã£ã and
fmt.Errorfã§äœ¿çšããå ŽåãåãŸãã¯å€ã«å¯Ÿãããšã©ãŒã®æ¯èŒã¯ããããã
errors.AsãŸãã¯ã䜿çšããŠè¡ãå¿ èŠ
errors.IsããããŸãããã以å€ã®å Žåããã§ãã¯ãããè¿ããããšã©ãŒãã©ãããããŠãããšããã§ãã¯ã«å€±æããŸãã
#50ãåç §ããŠãã ããã
äºæ³ããããšã©ãŒãäŒããã«ã¯ããšã©ãŒ ã»ã³ãã£ãã« (ãšã©ãŒå€) ã䜿çšããŸããäºæããªããšã©ãŒã¯ãç¹å®ã®ãšã©ãŒ ã¿ã€ãã§ããå¿ èŠããããŸãã
ã»ãšãã©ã®å Žåããšã©ãŒã¯ 1 åã ãåŠçããå¿ èŠããããŸãããšã©ãŒããã°ã«èšé²ããããšã¯ããšã©ãŒãåŠçããããšã§ãããããã£ãŠããã°ã«èšé²ãããããšã©ãŒãè¿ãããéžæããå¿ èŠããããŸããå€ãã®å Žåããšã©ãŒ ã©ããã³ã°ã¯ããšã©ãŒã«è¿œå ã®ã³ã³ããã¹ããæäŸãããœãŒã¹ ãšã©ãŒãè¿ãããšãã§ããããããœãªã¥ãŒã·ã§ã³ã§ãã
颿°åŒã³åºãäžã颿°å ãã«é¢ä¿ãªãããšã©ãŒãç¡èŠããã«ã¯
deferã空çœã®èå¥åã䜿çšããŠæç€ºçã«è¡ãå¿ èŠããããŸããããããªããšãå°æ¥ã®èªè ã¯ããããæå³çãªãã®ãªã®ããã¹ãªã®ãã«ã€ããŠæ··ä¹±ããå¯èœæ§ããããŸã.
deferãªã (#54)
å€ãã®å Žåã
defer颿°ã«ãã£ãŠè¿ããããšã©ãŒãç¡èŠãã¹ãã§ã¯ãããŸãããã³ã³ããã¹ãã«å¿ããŠãçŽæ¥åŠçããããåŒã³åºãå ã«äŒéããŸããç¡èŠããå Žåã¯ã空çœã®èå¥åã䜿çšããŠãã ããã
䞊è¡åŠçãšäžŠååŠçã®åºæ¬çãªéããçè§£ããããšã¯ãGo éçºè ã®ç¥èã®åºç€ã§ããäžŠè¡æ§ã¯æ§é ã«é¢ãããã®ã§ãããäžŠåæ§ã¯å®è¡ã«é¢ãããã®ã§ãã
çç·Žããéçºè ã«ãªãã«ã¯ãåæå®è¡ãåžžã«é«éã§ãããšã¯éããªãããšãèªèããå¿ èŠããããŸããæå°éã®ã¯ãŒã¯ããŒãã®äžŠååãå«ããœãªã¥ãŒã·ã§ã³ã¯ãé æ¬¡å®è£ ãããå¿ ãããé«éã§ãããšã¯éããŸãããã·ãŒã±ã³ã·ã£ã« ãœãªã¥ãŒã·ã§ã³ãšã³ã³ã«ã¬ã³ã ãœãªã¥ãŒã·ã§ã³ã®ãã³ãããŒã¯ãè¡ãããšã§ãä»®å®ãæ€èšŒããããšãã§ããŸãã
ãŽã«ãŒãã³ã®çžäºäœçšãèªèããããšã¯ããã£ãã«ãšãã¥ãŒããã¯ã¹ã®ã©ã¡ãã䜿çšããããæ±ºå®ããéã«ã圹ç«ã¡ãŸããäžè¬ã«ã䞊åãŽã«ãŒãã³ã«ã¯åæãå¿ èŠã§ããããããã£ãŠãã¥ãŒããã¯ã¹ãå¿ èŠã§ããéã«ã䞊è¡ãŽã«ãŒãã³ã¯éåžžã調æŽãšãªãŒã±ã¹ãã¬ãŒã·ã§ã³ããããã£ãŠãã£ãã«ãå¿ èŠãšããŸãã
åæå®è¡ã«ç¿çãããšããããšã¯ãããŒã¿ç«¶åãšç«¶åç¶æ ãç°ãªãæŠå¿µã§ããããšãçè§£ããããšãæå³ããŸããããŒã¿ç«¶åã¯ãè€æ°ã®ãŽã«ãŒãã³ãåæã«åãã¡ã¢ãªäœçœ®ã«ã¢ã¯ã»ã¹ãããã®ãã¡ã®å°ãªããšã 1 ã€ãæžã蟌ã¿ãè¡ã£ãŠããå Žåã«çºçããŸããäžæ¹ãããŒã¿ç«¶åããªããšããããšã¯ãå¿ ãããæ±ºå®è«çãªå®è¡ãæå³ããããã§ã¯ãããŸãããåäœããå¶åŸ¡ã§ããªãã€ãã³ãã®ã·ãŒã±ã³ã¹ãŸãã¯ã¿ã€ãã³ã°ã«äŸåããŠããå Žåãããã¯ç«¶åç¶æ ã§ãã
Go ã¡ã¢ãª ã¢ãã«ãšãé åºä»ããšåæã«é¢ããåºæ¬çãªä¿èšŒãçè§£ããããšã¯ãããŒã¿ç«¶åãç«¶åç¶æ ãé²ãããã«äžå¯æ¬ ã§ãã
ç¹å®ã®æ°ã®ãŽã«ãŒãã³ãäœæãããšãã¯ãã¯ãŒã¯ããŒãã®ã¿ã€ããèæ ®ããŠãã ãããCPU ããŠã³ãã®ãŽã«ãŒãã³ãäœæãããšããããšã¯ããã®æ°ã
GOMAXPROCS倿°ã®è¿ãã«å¶éããããšãæå³ããŸã (ããã©ã«ãã§ã¯ããã¹ãã® CPU ã³ã¢ã®æ°ã«åºã¥ããŸã)ãI/O ããŠã³ãã®ãŽã«ãŒãã³ã®äœæã¯ãå€éšã·ã¹ãã ãªã©ã®ä»ã®èŠå ã«äŸåããŸãã
Go ã³ã³ããã¹ãã¯ãGo ã®åæå®è¡ã®åºç€ã® 1 ã€ã§ããããŸããã³ã³ããã¹ãã䜿çšãããšãæéããã£ã³ã»ã« ã·ã°ãã«ãããã³/ãŸãã¯ããŒãšå€ã®ãªã¹ããéã¶ããšãã§ããŸãã
ã³ã³ããã¹ãããã£ã³ã»ã«ã§ããæ¡ä»¶ãçè§£ããããšã¯ãã³ã³ããã¹ããäŒæãããšãã«éèŠã§ããããšãã°ãå¿çãéä¿¡ããããšãã« HTTP ãã³ãã©ãŒãã³ã³ããã¹ãããã£ã³ã»ã«ããå Žåãªã©ã§ãã
ãªãŒã¯ãåé¿ãããšããããšã¯ããŽã«ãŒãã³ãéå§ããããã³ã«ãæçµçã«ããã忢ããèšç»ãç«ãŠãå¿ èŠãããããšã«æ³šæããããšãæå³ããŸãã
ãŽã«ãŒãã³ãšã«ãŒã倿°ã®ãã°ãåé¿ããã«ã¯ãããŒã«ã«å€æ°ãäœæããããã¯ããŒãžã£ã®ä»£ããã«é¢æ°ãåŒã³åºããŸãã
selectè€æ°ã®ãã£ãã«ããããè€æ°ã®ãªãã·ã§ã³ãå¯èœãªå Žåã«ã±ãŒã¹ãã©ã³ãã ã«éžæããããšãçè§£ãããšã埮åŠãªäžŠè¡æ§ã®ãã°ã«ã€ãªããå¯èœæ§ã®ãã誀ã£ãä»®å®ãé²ãããšãã§ããŸãã
chan struct{}ã¿ã€ãã䜿çšããŠéç¥ãéä¿¡ããŸãã
ããšãã°ãnil ãã£ãã«ã䜿çšãããšãã¹ããŒãã¡ã³ãããã±ãŒã¹ãåé€ã§ãããããåæå®è¡ããŒã«ã»ããã®äžéšã«ããå¿ èŠããããŸãã
select
åé¡ãçºçããå Žåã¯ã䜿çšããé©åãªãã£ãã« ã¿ã€ããæ éã«æ±ºå®ããŠãã ããããããã¡ãªã³ã°ãããŠããªããã£ãã«ã®ã¿ãã匷åãªåæä¿èšŒãæäŸããŸãã
ãããã¡ãªã³ã°ããããã£ãã«ä»¥å€ã®ãã£ãã« ãµã€ãºãæå®ããååãªçç±ãããã¯ãã§ãã
æååã®æžåŒèšå®ãæ¢åã®é¢æ°ã®åŒã³åºãã«ã€ãªããå¯èœæ§ãããããšã«æ³šæããããšã¯ããããããã¯ããã®ä»ã®ããŒã¿ç«¶åã®å¯èœæ§ã«æ³šæããããšãæå³ããŸãã
åŒã³åºã
appendã«åžžã«ããŒã¿ç«¶åããªãããã§ã¯ãããŸããããããã£ãŠãå ±æã¹ã©ã€ã¹ã§åæã«äœ¿çšããªãã§ãã ããã
ã¹ã©ã€ã¹ãšãããã¯ãã€ã³ã¿ãŒã§ããããšãèŠããŠãããšãäžè¬çãªããŒã¿ç«¶åãé²ãããšãã§ããŸãã
sync.WaitGroup(#71)
To accurately use
sync.WaitGroup, call the
Addmethod before spinning up goroutines.
sync.Cond(#72)
You can send repeated notifications to multiple goroutines with
sync.Cond.
errgroup(#73)
You can synchronize a group of goroutines and handle errors and contexts with the
errgrouppackage.
synctype (#74)
synctypes shouldnât be copied.
Remain cautious with functions accepting a
time.Duration. Even though passing an integer is allowed, strive to use the time API to prevent any possible confusion.
time.Afterand memory leaks (#76)
Avoiding calls to
time.Afterin repeated functions (such as loops or HTTP handlers) can avoid peak memory consumption. The resources created by
time.Afterare released only when the timer expires.
Unexpected behavior because of type embedding
Be careful about using embedded fields in Go structs. Doing so may lead to sneaky bugs like an embedded time.Time field implementing the
json.Marshalerinterface, hence overriding the default marshaling behavior.
JSON and the monotonic clock
When comparing two
time.Timestructs, recall that
time.Timecontains both a wall clock and a monotonic clock, and the comparison using the == operator is done on both clocks.
Map of
any
To avoid wrong assumptions when you provide a map while unmarshaling JSON data, remember that numerics are converted to
float64by default.
Forgetting that
sql.Opendoesn't necessarily establish connections to a database
Call the
Pingor
PingContextmethod if you need to test your configuration and make sure a database is reachable.
Forgetting about connections pooling
Configure the database connection parameters for production-grade applications.
Not using prepared statements
Using SQL prepared statements makes queries more efficient and more secure.
Mishandling null values
Deal with nullable columns in tables using pointers or
sql.NullXXXtypes.
Not handling rows iteration errors
次ã®è¡ã®æºåäžã«ãšã©ãŒãèŠéããªãããã«ãè¡ã®å埩åŸã«
Errã¡ãœãããåŒã³åºããŸãã
sql.Rows
sql.RowsäžæçãªãªãœãŒã¹ (HTTP æ¬æã ãããã³)ãéããªã
os.File(#79)
æçµçã«ã¯ãå®è£ ããŠãããã¹ãŠã®æ§é äœãéããŠã
io.CloserãªãŒã¯ã®å¯èœæ§ãåé¿ããŸãã
returnHTTP ãã³ãã©ãŒã®å®è£ ã§äºæããªãåäœãåé¿ããã«ã¯ã ã®åŸã«ãã³ãã©ãŒã忢ããå Žåã¯ã¹ããŒãã¡ã³ããèŠéããªãããã«ããŠãã ãã
http.Errorã
éçšã¬ãã«ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã©ã«ãã® HTTP ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®å®è£ ã䜿çšããªãã§ãã ããããããã®å®è£ ã«ã¯ãæ¬çªç°å¢ã§å¿ é ãšãªãã¿ã€ã ã¢ãŠããšåäœããããŸããã
ãã«ã ãã©ã°ãç°å¢å€æ°ããŸãã¯ã·ã§ãŒã ã¢ãŒãã䜿çšããŠãã¹ããåé¡ãããšããã¹ã ããã»ã¹ãããå¹ççã«ãªããŸãããã«ã ãã©ã°ãŸãã¯ç°å¢å€æ° (ãŠããã ãã¹ããšçµ±åãã¹ããªã©) ã䜿çšããŠãã¹ã ã«ããŽãªãäœæããçæéå®è¡ãã¹ããšé·æéå®è¡ãã¹ããåºå¥ããŠãå®è¡ãããã¹ãã®çš®é¡ã決å®ã§ããŸãã
-race䞊è¡ã¢ããªã±ãŒã·ã§ã³ãäœæããå Žåã¯ããã©ã°ãæå¹ã«ããããšã匷ããå§ãããŸããããããããšã§ããœãããŠã§ã¢ã®ãã°ã«ã€ãªããå¯èœæ§ã®ããæœåšçãªããŒã¿ç«¶åããã£ããã§ããŸãã
ãã©ã°ã䜿çšãã
-parallelãšããã¹ããç¹ã«å®è¡æéã®é·ããã¹ããé«éåããå¹ççãªæ¹æ³ã«ãªããŸãã
ãã©ã°ã䜿çšã
-shuffleãŠããã¹ã ã¹ã€ãŒãããã°ãé ãå¯èœæ§ã®ãã誀ã£ãä»®å®ã«äŸåããªãããã«ããŸãã
ããŒãã«é§åãã¹ãã¯ãã³ãŒãã®éè€ãé²ããå°æ¥ã®æŽæ°ãåŠçããããããããã«ãäžé£ã®é¡äŒŒãããã¹ããã°ã«ãŒãåããå¹ççãªæ¹æ³ã§ãã
åæã䜿çšããŠã¹ãªãŒããåé¿ãããã¹ãã®äžå®å®ãã軜æžããããå ç¢ã«ããŸããåæãäžå¯èœãªå Žåã¯ãå詊è¡ã®æ¹æ³ãæ€èšããŠãã ããã
time API ã䜿çšããŠé¢æ°ãåŠçããæ¹æ³ãçè§£ããããšã¯ããã¹ãã®äžå®å®ãã軜æžãããã 1 ã€ã®æ¹æ³ã§ããé衚瀺ã®äŸåé¢ä¿ã®äžéšãšããŠæéãåŠçããããã¯ã©ã€ã¢ã³ãã«æéãæäŸããããã«äŸé Œããããããªã©ãæšæºçãªææ³ã䜿çšã§ããŸãã
httptestããã³
iotest) ã䜿çšããªã (#88)
ãã®
httptestããã±ãŒãžã¯ãHTTP ã¢ããªã±ãŒã·ã§ã³ãæ±ãã®ã«åœ¹ç«ã¡ãŸããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ããã¹ãããããã®äžé£ã®ãŠãŒãã£ãªãã£ãæäŸããŸãã
ãã®
iotestããã±ãŒãžã¯ãio.Reader ãèšè¿°ããã¢ããªã±ãŒã·ã§ã³ããšã©ãŒã«èãããããã©ããããã¹ãããã®ã«åœ¹ç«ã¡ãŸãã
ã¿ã€ããŒããªã»ãããŸãã¯äžæåæ¢ããªã
æéã¡ãœããã䜿çšããŠããã³ãããŒã¯ã®ç²ŸåºŠãç¶æããŸãã
ãã€ã¯ããã³ãããŒã¯ã«ã€ããŠééã£ãä»®å®ããã
ã®ãããªããŒã«ãå¢ãã
benchtimeãã䜿çšããããã
benchstatãšããã€ã¯ããã³ãããŒã¯ãæ±ããšãã«åœ¹ç«ã¡ãŸãã
æçµçã«ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã·ã¹ãã ããã€ã¯ããã³ãããŒã¯ãå®è¡ããã·ã¹ãã ãšç°ãªãå Žåã¯ããã€ã¯ããã³ãããŒã¯ã®çµæã«æ³šæããŠãã ããã
ã³ã³ãã€ã©ã®æé©åã«æ³šæãæããªã
Make sure the function under test leads to a side effect, to prevent compiler optimizations from fooling you about the benchmark results.
Being fooled by the observer effect
To prevent the observer effect, force a benchmark to re-create the data used by a CPU-bound function.
Code coverage
Use code coverage with the
-coverprofileflag to quickly see which part of the code needs more attention.
Testing from a different package
Place unit tests in a different package to enforce writing tests that focus on an exposed behavior, not internals.
Utility functions
Handling errors using the
*testing.Tvariable instead of the classic
if err != nilmakes code shorter and easier to read.
Setup and teardown
You can use setup and teardown functions to configure a complex environment, such as in the case of integration tests.
CPU architecture
Understanding how to use CPU caches is important for optimizing CPU-bound applications because the L1 cache is about 50 to 100 times faster than the main memory.
Cache line
Being conscious of the cache line concept is critical to understanding how to organize data in data-intensive applications. A CPU doesnât fetch memory word by word; instead, it usually copies a memory block to a 64-byte cache line. To get the most out of each individual cache line, enforce spatial locality.
Slice of structs vs. struct of slices
Predictability
CPU ã«å¯ŸããŠã³ãŒããäºæž¬å¯èœã«ããããšã¯ãç¹å®ã®æ©èœãæé©åããå¹ççãªæ¹æ³ã«ããªããŸããããšãã°ãåäœã¹ãã©ã€ããŸãã¯å®æ°ã¹ãã©ã€ã㯠CPU ã§äºæž¬ã§ããŸãããéåäœã¹ãã©ã€ã (ãªã³ã¯ ãªã¹ããªã©) ã¯äºæž¬ã§ããŸããã
ãã£ãã·ã¥é 眮ããªã·ãŒ
é倧ãªã¹ãã©ã€ããåé¿ããŠããã£ãã·ã¥ã®ããäžéšã®ã¿ã䜿çšããã«ã¯ããã£ãã·ã¥ãåå²ãããŠããããšã«æ³šæããŠãã ããã
äžäœã¬ãã«ã® CPU ãã£ãã·ã¥ããã¹ãŠã®ã³ã¢ã§å ±æãããŠããªãããšãç¥ã£ãŠãããšãåæå®è¡ã³ãŒãã®èšè¿°äžã«èª€ã£ãå ±æãªã©ã®ããã©ãŒãã³ã¹äœäžãã¿ãŒã³ãåé¿ããã®ã«åœ¹ç«ã¡ãŸããèšæ¶ã®å ±æã¯å¹»æ³ã§ãã
åœä»€ã¬ãã«ã®äžŠååŠç (ILP) ã䜿çšããŠã³ãŒãã®ç¹å®ã®éšåãæé©åããCPU ãã§ããã ãå€ãã®äžŠååœä»€ãå®è¡ã§ããããã«ããŸããããŒã¿ãã¶ãŒããç¹å®ããããšã¯ãäž»èŠãªã¹ãããã® 1 ã€ã§ãã
Go ã§ã¯ãåºæ¬åãç¬èªã®ãµã€ãºã«åãããŠé 眮ãããŠããããšãèŠããŠããããšã§ãããããééããé¿ããããšãã§ããŸããããšãã°ãæ§é äœã®ãã£ãŒã«ãããµã€ãºå¥ã«éé ã«åç·šæãããšãæ§é äœãããã³ã³ãã¯ãã«ãªãå¯èœæ§ãããããšã«æ³šæããŠãã ãã (ã¡ã¢ãªå²ãåœãŠãå°ãªããªãã空éç屿æ§ãåäžããå¯èœæ§ããããŸã)ã
ããŒããšã¹ã¿ãã¯ã®åºæ¬çãªéããçè§£ããããšããGo ã¢ããªã±ãŒã·ã§ã³ãæé©åããéã®éèŠãªç¥èã®äžéšã§ããå¿ èŠããããŸããã¹ã¿ãã¯å²ãåœãŠã¯ã»ãšãã©ç¡æã§ãããããŒãå²ãåœãŠã¯é ããGC ã«äŸåããŠã¡ã¢ãªãã¯ãªãŒã³ã¢ããããŸãã
sync.Pool) (#96)
å²ãåœãŠãæžããããšããGo ã¢ããªã±ãŒã·ã§ã³ãæé©åããäžã§äžå¯æ¬ ãªåŽé¢ã§ããããã¯ãå ±æãé¿ããããã« API ãæ éã«èšèšãããäžè¬ç㪠Go ã³ã³ãã€ã©ã®æé©åãçè§£ããã
sync.Pool.
é«éãã¹ã®ã€ã³ã©ã€ã³åææ³ã䜿çšããŠã颿°ãåŒã³åºãããã®ååŽæéãå¹ççã«åæžããŸãã
ãããã¡ã€ãªã³ã°ãšå®è¡ãã¬ãŒãµãŒãå©çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšæé©åããéšåãçè§£ããŠãã ããã
GC ã®èª¿æŽæ¹æ³ãçè§£ãããšãæ¥æ¿ãªè² è·ã®å¢å ãããå¹ççã«åŠçã§ãããªã©ãè€æ°ã®å©ç¹ãåŸãããŸãã
Docker ããã³ Kubernetes ã«ãããã€ããããšãã« CPU ã¹ããããªã³ã°ãåé¿ããããã«ãGo 㯠CFS ã«å¯Ÿå¿ããŠããªãããšã«æ³šæããŠãã ããã