Goã®ããã©ãŒãã³ã¹æé©å
Go ã¢ããªã±ãŒã·ã§ã³ãæé©åããããã®ãã¹ã ãã©ã¯ãã£ã¹ãšãã¯ããã¯ã玹ä»ããŸãã䞊è¡åŠçããããã¡ã€ãªã³ã°ãå®å šãªãã€ã³ã¿ã®äœ¿çšæ³ããã³ãããŒã¯ã«ãã£ãп倧ã®ããã©ãŒãã³ã¹ãéæããæ¹æ³ãåŠã³ãŸãã

Goã«ãããããã©ãŒãã³ã¹æé©åå ¥é
GoããŸãã¯Golangã¯ãRobert GriesemerãRob PikeãKen Thompsonã«ãã£ãŠGoogleã§éçºãããææ°ã®ãªãŒãã³ãœãŒã¹ããã°ã©ãã³ã°èšèªã§ããGoã¯ããã®ã·ã³ãã«ãã匷åãªåä»ããçµã¿èŸŒã¿ã® äžŠè¡æ§ ãµããŒããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãããã§ãåªããããã©ãŒãã³ã¹ç¹æ§ãèªã£ãŠããŸããéçºè ã¯ããµãŒããŒãµã€ã ã¢ããªã±ãŒã·ã§ã³ãããŒã¿ ãã€ãã©ã€ã³ããã®ä»ã®é«æ§èœã·ã¹ãã ãæ§ç¯ããéã«ããã®éåºŠãæ¡åŒµæ§ãã¡ã³ããã³ã¹ã®å®¹æããçç±ã« Go ãéžæããŸãã
Go ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæå€§éã«åŒãåºãã«ã¯ãã³ãŒããæé©åããå¿ èŠããããŸãããã®ããã«ã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãçè§£ããã¡ã¢ãªå²ãåœãŠãå¹ççã«ç®¡çãã䞊è¡åŠçãæŽ»çšããå¿ èŠããããŸããããã©ãŒãã³ã¹ãéèŠããã¢ããªã±ãŒã·ã§ã³ã§ Go ã䜿çšããŠããæ³šç®ãã¹ãäºäŸã®ã²ãšã€ã«ãããã¯ãšã³ãããŠã§ããã¢ãã€ã«ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®åŒ·å㪠ããŒã³ãŒãã» ãã©ãããã©ãŒã ã§ãã AppMaster ããããŸããAppMaster 㯠Go ã䜿çšããŠããã¯ãšã³ãã»ã¢ããªã±ãŒã·ã§ã³ãçæããé«è² è·ã§ãšã³ã¿ãŒãã©ã€ãºãªãŠãŒã¹ã±ãŒã¹ã«å¿ èŠãªã¹ã±ãŒã©ããªãã£ãšé«ãããã©ãŒãã³ã¹ãä¿èšŒããŠããŸãããã®èšäºã§ã¯ãGoã®äžŠè¡æ§ãµããŒããæŽ»çšããããšããå§ããŠãããã€ãã®éèŠãªæé©åãã¯ããã¯ãåãäžããŸãã
æ§èœåäžã®ããã®äžŠè¡åŠçã®æŽ»çš
åæå®è¡ã¯ãè€æ°ã®ã¿ã¹ã¯ãåæã«å®è¡ããå©çšå¯èœãªã·ã¹ãã ãªãœãŒã¹ãæé©ã«æŽ»çšããŠããã©ãŒãã³ã¹ãåäžãããŸããGoã¯äžŠè¡åŠçã念é ã«çœ®ããŠèšèšãããŠããã䞊è¡åŠçãç°¡çŽ åããçµã¿èŸŒã¿ã®èšèªæ§æãšã㊠ãŽã«ãŒãã³ã ãã£ãã«ãçšæãããŠããŸãã
ãŽã«ãŒãã³
ãŽã«ãŒãã³ã¯Goã®ã©ã³ã¿ã€ã ã«ãã£ãŠç®¡çããã軜éã®ã¹ã¬ããã§ããGoroutine ã®äœæã¯ç°¡åã§ã颿°ãåŒã³åºãåã« `go` ããŒã¯ãŒãã䜿ãã ãã§ã: ``go go funcName() ``` Goroutine ãå®è¡ãéå§ãããšãä»ã® Goroutine ãšåãã¢ãã¬ã¹ç©ºéãå ±æããŸããããã«ãããŽã«ãŒãã³éã®éä¿¡ãç°¡åã«ãªããŸãããã ããããŒã¿ç«¶åãé²ãããã«å ±æã¡ã¢ãªã¢ã¯ã»ã¹ã«ã¯æ³šæããå¿ èŠããããŸãã
ãã£ãã«
ãã£ãã«ã¯Goã«ãããGoroutineéã®äž»èŠãªéä¿¡ææ®µã§ãããã£ãã«ã¯ãGoroutineéã§å€ãéåä¿¡ããããã®åä»ãã³ã³ãžããã§ãããã£ã³ãã«ãäœæããã«ã¯ã ``chan` ããŒã¯ãŒãã䜿çšããŸã: ```go channelName := make(chan dataType) ``` ãã£ã³ãã«ãéããŠå€ãéåä¿¡ããã«ã¯ãç¢å°æŒç®å (`<-`) ã䜿çšããŸãã以äžã¯ãã®äŸã§ã: ```go // ãã£ãã«ã«å€ãéä¿¡ãã channelName <- valueToSend // ãã£ãã«ããå€ãåä¿¡ãã receivedValue := <-channelName ``` ãã£ãã«ãæ£ãã䜿çšããããšã§ããŽã«ãŒãã³éã®å®å šãªéä¿¡ãä¿èšŒããæœåšçãªç«¶åç¶æ ãæé€ããŸãã

åæå®è¡ãã¿ãŒã³ã®å®è£
䞊ååŠçããã€ãã©ã€ã³ãfan-in/fan-out ãªã©ã®äžŠè¡åŠçãã¿ãŒã³ãé©çšããããšã§ãGo éçºè 㯠ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ ã§ããŸãããããã®ãã¿ãŒã³ã«ã€ããŠç°¡åã«èª¬æããŸãïŒ
- 䞊ååŠçïŒ èšç®ãå°ããªã¿ã¹ã¯ã«åå²ãããããã®ã¿ã¹ã¯ãåæã«å®è¡ããããšã§ãè€æ°ã®ããã»ããµã³ã¢ãå©çšããèšç®ãé«éåããŸãã
- ãã€ãã©ã€ã³ïŒ äžé£ã®é¢æ°ãã¹ããŒãžã«åããåã¹ããŒãžã§ããŒã¿ãåŠçãããã£ãã«ãä»ããŠæ¬¡ã®ã¹ããŒãžã«æž¡ããããã«ãããç°ãªãã¹ããŒãžãåæã«åäœããŠããŒã¿ãå¹ççã«åŠçããåŠçãã€ãã©ã€ã³ã圢æãããã
- ãã¡ã³ã€ã³/ãã¡ã³ã¢ãŠãïŒ è€æ°ã®ãŽã«ãŒãã³ïŒãã¡ã³ã¢ãŠãïŒã«ã¿ã¹ã¯ã忣ãããåæã«ããŒã¿ãåŠçãããæ¬¡ã«ããããã®ãŽã«ãŒãã³ããã®çµæã1ã€ã®ãã£ãã«ã«éçŽãïŒãã¡ã³ã€ã³ïŒããããªãåŠçãéçŽãè¡ãããããã®ãã¿ãŒã³ãæ£ããå®è£ ãããšãGoã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãå€§å¹ ã«åäžãããããšãã§ããŸãã
æé©åã®ããã®Goã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°
ãããã¡ã€ãªã³ã°ãšã¯ãã³ãŒããåæããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ããªãœãŒã¹æ¶è²»ã®éå¹çæ§ãç¹å®ããããã»ã¹ã§ããGo ã«ã¯ `pprof` ããã±ãŒãžã®ãããªçµã¿èŸŒã¿ããŒã«ããããéçºè ã¯ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠããã©ãŒãã³ã¹ç¹æ§ãææ¡ããããšãã§ããŸããGo ã³ãŒãããããã¡ã€ãªã³ã°ããããšã§ãæé©åã®æ©äŒãç¹å®ãããªãœãŒã¹ã®å¹ççãªå©çšãä¿èšŒããããšãã§ããŸãã
CPU ãããã¡ã€ãªã³ã°
CPU ãããã¡ã€ãªã³ã°ã§ã¯ãGo ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã CPU 䜿çšçãšãã芳ç¹ããæž¬å®ããŸããpprof`ããã±ãŒãžã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãå®è¡æéã®å€§åãè²»ãããŠããå Žæã瀺ãCPUãããã¡ã€ã«ãçæã§ããŸããCPUãããã¡ã€ãªã³ã°ãæå¹ã«ããã«ã¯ã以äžã®ã³ãŒãã¹ããããã䜿çšããŸãïŒgo import "runtime/pprof" // ... func main() { // CPUãããã¡ã€ã«ãä¿åãããã¡ã€ã«ãäœæ f, err := os.Create("cpu_profile.prof") if err != nil { log.Fatal(err) } defer f.Close() // CPUãããã¡ã€ã«ãéå§ãã if err := pprof.StartCPUProfile(f); err != nil { log.Fatal(err) } defer pprof.StopCPUProfile() // ããã§ã¢ããªã±ãŒã·ã§ã³ã³ãŒããå®è¡ãã } } ``` ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããåŸãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããå®è¡ããŸãã``` ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšã`cpu_profile.prof` ãã¡ã€ã«ãäœæãããŸãããã®ãã¡ã€ã«ã¯ `pprof` ããŒã«ã䜿çšããŠåæããããäºææ§ã®ãããããã¡ã€ã©ã®å©ããåããŠèŠèŠåããããšãã§ããŸãã
ã¡ã¢ãªã®ãããã¡ã€ãªã³ã°
ã¡ã¢ãªãããã¡ã€ãªã³ã°ã¯ Go ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªå²ãåœãŠãšäœ¿çšéã«çŠç¹ãåœãŠãæœåšçãªã¡ã¢ãªãªãŒã¯ãéå°ãªå²ãåœãŠãã¡ã¢ãªãæé©åã§ããé åãç¹å®ããã®ã«åœ¹ç«ã¡ãŸããã¡ã¢ãªã»ãããã¡ã€ãªã³ã°ãæå¹ã«ããã«ã¯ã次ã®ã³ãŒãã»ã¹ããããã䜿çšããŸãïŒgo import "runtime/pprof" // ... func main() { // ããã§ã¢ããªã±ãŒã·ã§ã³ã³ãŒããå®è¡ãã // ã¡ã¢ãªãããã¡ã€ã«ãä¿åãããã¡ã€ã«ãäœæãã f, err := os.Create("mem_profile.prof") if err != nil { log.Fatal(err) } defer f.Close() // ã¡ã¢ãªã»ãããã¡ã€ã«ãæžã蟌ã runtime.GC() // æ£ç¢ºãªã¡ã¢ãªçµ±èšãååŸããããã«ã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ãå®è¡ãã if err := pprof.WriteHeapProfile(f); err != nil { log.Fatal(err) } // ã¡ã¢ãªã»ãããã¡ã€ã«ãä¿åãããã¡ã€ã«ãäœæããã}CPU ãããã¡ã€ã«ãšåæ§ã«ã`pprof` ããŒã«ã䜿çšã㊠`mem_profile.prof` ãã¡ã€ã«ãåæããããäºææ§ã®ãããããã¡ã€ã©ã§å¯èŠåããããšãã§ããŸãã
Go ã®ãããã¡ã€ãªã³ã°æ©èœã掻çšããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãææ¡ããæé©åãã¹ãé åãç¹å®ããããšãã§ããŸããããã«ãããå¹ççã«ã¹ã±ãŒã«ãããªãœãŒã¹ãæé©ã«ç®¡çãããå¹ççã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
Go ã«ãããã¡ã¢ãªå²ãåœãŠãšãã€ã³ã¿
Go ã§ã¡ã¢ãªå²ãåœãŠãæé©åãããšãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸããå¹ççãªã¡ã¢ãªç®¡çã¯ããªãœãŒã¹ã®äœ¿çšéãæžãããå®è¡æéãççž®ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãªãŒããŒããããæå°éã«æããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãã¡ã¢ãªäœ¿çšéãæå€§åãããã€ã³ã¿ãå®å šã«æ±ãããã®æŠç¥ã«ã€ããŠèª¬æããŸãã
å¯èœãªéãã¡ã¢ãªãåå©çšãã
Goã§ã¡ã¢ãªå²ãåœãŠãæé©åããäž»ãªæ¹æ³ã®ã²ãšã€ã¯ããªããžã§ã¯ããç Žæ£ããŠæ°ãã«å²ãåœãŠãã®ã§ã¯ãªããå¯èœãªéãåå©çšããããšã§ããGoã¯ã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ã䜿ã£ãŠã¡ã¢ãªã管çããã®ã§ããªããžã§ã¯ããäœæããŠç Žæ£ãããã³ã«ãã¬ããŒãžã»ã³ã¬ã¯ã¿ã¯ã¢ããªã±ãŒã·ã§ã³ã®åŸå§æ«ãããªããã°ãªããŸãããããã¯ãç¹ã«é«ã¹ã«ãŒãããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããã©ãŒãã³ã¹ã®ãªãŒããŒããããããããå¯èœæ§ããããŸãã
ã¡ã¢ãªãå¹ççã«åå©çšããããã«ãsync.Poolãç¬èªã®å®è£ ãªã©ã®ãªããžã§ã¯ãããŒã«ã®äœ¿çšãæ€èšããŠãã ããããªããžã§ã¯ãã»ããŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã§åå©çšã§ãããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãä¿åã»ç®¡çããŸãããªããžã§ã¯ãããŒã«ã䜿ã£ãŠã¡ã¢ãªãåå©çšããããšã§ãã¡ã¢ãªã®å²ãåœãŠãšå²ãåœãŠè§£é€ã®ç·éãæžããããšãã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«äžãã圱é¿ãæå°éã«æããããšãã§ããŸãã
äžèŠãªå²ãåœãŠãé¿ãã
äžå¿ èŠãªå²ãåœãŠãé¿ããããšã¯ãã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ã®å§åãæžããã®ã«åœ¹ç«ã¡ãŸããäžæçãªãªããžã§ã¯ããäœæãã代ããã«ãæ¢åã®ããŒã¿æ§é ãã¹ã©ã€ã¹ã䜿çšããŸããããã¯ä»¥äžã®æ¹æ³ã§å®çŸã§ããŸãïŒ
make([]T,size,capacity)ã䜿ã£ãŠæ¢ç¥ã®ãµã€ãºã®ã¹ã©ã€ã¹ãäºåã«ç¢ºä¿ãããappend颿°ãè³¢ã䜿ããé£çµæã«äžéã¹ã©ã€ã¹ãçæãããªãããã«ããã- 倧ããªæ§é äœãå€ã§æž¡ãã®ãé¿ããã代ããã«ããã€ã³ã¿ã䜿çšããŠããŒã¿ãžã®åç §ãæž¡ãã
äžå¿ èŠãªã¡ã¢ãªå²ãåœãŠã®ãã1ã€ã®äžè¬çãªåå ã¯ãã¯ããŒãžã£ã®äœ¿çšã§ããã¯ããŒãžã£ã¯äŸ¿å©ã§ããã远å ã®å²ãåœãŠãçºçãããå¯èœæ§ããããŸããå¯èœãªéãã颿°ã®ãã©ã¡ãŒã¿ã¯ã¯ããŒãžã£ã§åã蟌ãã®ã§ã¯ãªããæç€ºçã«æž¡ãããã«ããŸãããã
ãã€ã³ã¿ãå®å šã«äœ¿ã
ãã€ã³ã¿ãŒã¯Goã®åŒ·åãªã³ã³ã¹ãã©ã¯ãã§ãã³ãŒãããã¡ã¢ãªã¢ãã¬ã¹ãçŽæ¥åç §ã§ããŸãããããããã®åŒ·åãã«ã¯ãã¡ã¢ãªé¢é£ã®ãã°ãããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããå¯èœæ§ã䌎ããŸãããã€ã³ã¿ãå®å šã«æ±ãã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- ãã€ã³ã¿ã®äœ¿çšã¯æ§ããã«ãå¿ èŠãªãšãã ãã«ããŸãããããã€ã³ã¿ã®äœ¿ãããã¯ãå®è¡é床ã®äœäžãã¡ã¢ãªæ¶è²»éã®å¢å€§ãæããŸãã
- ãã€ã³ã¿ãŒã®äœ¿çšç¯å²ãæå°éã«æãããã¹ã³ãŒãã倧ãããªããšãåç §ã远跡ããŠã¡ã¢ãªãŒã»ãªãŒã¯ãé¿ããã®ãé£ãããªãã
unsafe.Pointerã¯Goã®åå®å šæ§ããã€ãã¹ãããããã°ãã«ããåé¡ãåŒãèµ·ããå¯èœæ§ãããããã絶察ã«å¿ èŠãªå Žå以å€ã¯é¿ããŠãã ããã- å
±æã¡ã¢ãªã«å¯Ÿããã¢ãããã¯æäœã«ã¯
sync/atomicããã±ãŒãžã䜿çšããŠãã ãããéåžžã®ãã€ã³ã¿æäœã¯ã¢ãããã¯ã§ã¯ãªãã®ã§ãããã¯ããã®ä»ã®åæã¡ã«ããºã ã䜿çšããŠåæãããªããšãããŒã¿ç«¶åã«ã€ãªããå¯èœæ§ããããŸãã
Goã¢ããªã±ãŒã·ã§ã³ã®ãã³ãããŒã¯
ãã³ãããŒã¯ãšã¯ãããŸããŸãªæ¡ä»¶äžã§Goã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããè©äŸ¡ããããã»ã¹ã§ããããŸããŸãªäœæ¥è² è·äžã§ã®ã¢ããªã±ãŒã·ã§ã³ã®åäœãçè§£ããããšã§ãããã«ããã¯ãç¹å®ããããã©ãŒãã³ã¹ãæé©åããæŽæ°ã«ãã£ãŠããã©ãŒãã³ã¹ãäœäžããªãããšã確èªã§ããŸãã
Goã«ã¯ã testing ããã±ãŒãžãéããŠæäŸããããã³ãããŒã¯çšã®ãã«ãã€ã³ãµããŒãããããŸããããã«ãããã³ãŒãã®å®è¡æããã©ãŒãã³ã¹ã枬å®ãããã³ãããŒã¯ãã¹ããæžãããšãã§ããŸããçµã¿èŸŒã¿ã® go test ã³ãã³ãã䜿çšããŠãã³ãããŒã¯ãå®è¡ããæšæºåããã圢åŒã§çµæãåºåããŸãã
ãã³ãããŒã¯ãã¹ãã®èšè¿°
ãã³ãããŒã¯é¢æ°ã¯ãã¹ã颿°ãšåæ§ã«å®çŸ©ãããŸãããã·ã°ããã£ãç°ãªããŸãïŒ
func BenchmarkMyFunction(b *testing.B) { // ãã³ãããŒã¯ã³ãŒãã¯ããã«... }.
颿°ã«æž¡ããã *testing.B ãªããžã§ã¯ãã¯ããã³ãããŒã¯ã«äŸ¿å©ãªããããã£ãšã¡ãœãããããã€ãæã£ãŠããŸãïŒ
b.N: ãã³ãããŒã¯é¢æ°ãå®è¡ããååŸ©åæ°ã- b
.ReportAllocs()ïŒãã³ãããŒã¯äžã®ã¡ã¢ãªå²ãåœãŠåæ°ãèšé²ããŸãã b.SetBytes(int64)ïŒã¹ã«ãŒãããã®èšç®ã«äœ¿çšãããã1åã®åŠçã§åŠçããããã€ãæ°ãèšå®ããŸãã
å žåçãªãã³ãããŒã¯ãã¹ãã«ã¯ã以äžã®ã¹ããããå«ãŸããŸãïŒ
- ãã³ãããŒã¯å¯Ÿè±¡ã®é¢æ°ã«å¿ èŠãªç°å¢ãšå ¥åããŒã¿ãã»ããã¢ããããã
- ã¿ã€ããŒããªã»ããã
ïŒb.ResetTimer()ïŒããã³ãããŒã¯æž¬å®ããã»ããã¢ããæéãåãé€ããŸãã - äžããããååŸ©åæ°ã§ãã³ãããŒã¯ãã«ãŒãããŸãïŒ
for i := 0; i < b.N; i++. - é©åãªå ¥åããŒã¿ã§ãã³ãããŒã¯å¯Ÿè±¡ã®é¢æ°ãå®è¡ããŸãã
ãã³ãããŒã¯ãã¹ãã®å®è¡
go test ã³ãã³ãã§ã -bench ãã©ã°ã«ç¶ããŠå®è¡ããããã³ãããŒã¯é¢æ°ã«ãããããæ£èŠè¡šçŸãæå®ããŠãã³ãããŒã¯ãã¹ããå®è¡ããŸããäŸãã°
go test -bench=.
ãã®ã³ãã³ãã¯ããã±ãŒãžå ã®ãã¹ãŠã®ãã³ãããŒã¯é¢æ°ãå®è¡ããŸããç¹å®ã®ãã³ãããŒã¯ãå®è¡ããã«ã¯ããã®ååã«ãããããæ£èŠè¡šçŸãæå®ããŸãããã³ãããŒã¯çµæã¯è¡šåœ¢åŒã§è¡šç€ºããã颿°åãååŸ©åæ°ã1åã®åŠçæéãèšé²ãããŠããå Žåã¯ã¡ã¢ãªå²ãåœãŠã衚瀺ãããŸãã
ãã³ãããŒã¯çµæã®åæ
ãã³ãããŒã¯ãã¹ãã®çµæãåæããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ç¹æ§ãçè§£ããæ¹åç¹ãç¹å®ããŸããç°ãªãå®è£ ãã¢ã«ãŽãªãºã ã®ããã©ãŒãã³ã¹ãæ¯èŒããæé©åã®åœ±é¿ã枬å®ããã³ãŒããæŽæ°ããéã«ããã©ãŒãã³ã¹ã®åŸéãæ€åºããŸãã
Go ããã©ãŒãã³ã¹æé©åã®ãã®ä»ã®ãã³ã
ã¡ã¢ãªå²ãåœãŠã®æé©åãšã¢ããªã±ãŒã·ã§ã³ã®ãã³ãããŒã¯ã«å ããŠãGo ããã°ã©ã ã®ããã©ãŒãã³ã¹ãåäžãããããã®ãã³ããããã€ã玹ä»ããŸãïŒ
- Goã®ããŒãžã§ã³ãæŽæ° ããïŒGo ããŒãžã§ã³ãæŽæ°ãã: Go ã®ææ°ããŒãžã§ã³ãåžžã«äœ¿çšããŠãã ããã
- 該åœããå Žåã¯é¢æ°ãã€ã³ã©ã€ã³ åããŸãïŒé¢æ°ãã€ã³ã©ã€ã³åããããšã§ã颿°åŒã³åºãã®ãªãŒããŒããããæžãããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããã€ã³ã©ã€ã³åã®ç©æ¥µæ§ãå¶åŸ¡ããã«ã¯ã
go build -gcflags '-l=4'ã䜿çšããŸãïŒå€ã倧ããã»ã©ã€ã³ã©ã€ã³åãé²ã¿ãŸãïŒã - ãããã¡ãŒãã»ãã£ã³ãã«ãäœ¿çš ããïŒäžŠè¡åŠçãéä¿¡ã«ãã£ãã«ã䜿çšããå Žåã¯ãããããã³ã°ãé²ãã¹ã«ãŒããããåäžãããããã«ãããã¡ä»ããã£ãã«ã䜿çšããŸãã
- é©åãªããŒã¿æ§é ãéžæ ããïŒã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«æãé©ããããŒã¿æ§é ãéžæãããããã«ã¯ãå¯èœã§ããã°é åã®ä»£ããã«ã¹ã©ã€ã¹ã䜿ã£ãããå¹ççãªæ€çŽ¢ãæäœã®ããã«çµã¿èŸŒã¿ã®ããããã»ããã䜿ã£ããããããšãå«ãŸããŸãã
- ã³ãŒããå°ããã€æé©å ããïŒãã¹ãŠãåæã«åãçµãããšããã®ã§ã¯ãªããäžåºŠã«1ã€ã®é åã®æé©åã«éäžãããã¢ã«ãŽãªãºã ã®éå¹çæ§ããçæããæ¬¡ã«ã¡ã¢ãªç®¡çããã®ä»ã®æé©åãè¡ãã
Goã¢ããªã±ãŒã·ã§ã³ã«ãããã®ããã©ãŒãã³ã¹æé©åãã¯ããã¯ãå®è£ ãããšãã¹ã±ãŒã©ããªãã£ããªãœãŒã¹äœ¿çšéãå šäœçãªããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããããšãã§ããŸããGoã®ãã«ãã€ã³ããŒã«ã®ãã¯ãŒãšãã®èšäºã§å ±æãããæ·±ãç¥èãæŽ»çšããããšã§ã倿§ãªã¯ãŒã¯ããŒãã«å¯Ÿå¿ã§ããããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ååãªæºåãæŽããŸãã
Goã§ã¹ã±ãŒã©ãã«ã§å¹ççãªããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ãéçºãããã§ããïŒAppMaster ããæ€èšãã ãããGo (Golang) ã䜿çšããŠããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ãçæãã匷å㪠ããŒã³ãŒããã©ãããã©ãŒã ã§ãé«ãããã©ãŒãã³ã¹ãšé©ç°çãªã¹ã±ãŒã©ããªãã£ãå®çŸããé«è² è·ããšã³ã¿ãŒãã©ã€ãºãŠãŒã¹ã±ãŒã¹ã«çæ³çãªéžæè¢ãšãªããŸãã AppMaster 㮠詳现ãšã AppMaster ãéçºããã»ã¹ã«ã©ã®ãããªé©åœãããããããã芧ãã ããã
ãããã質å
GoããŸãã¯Golangã¯ããããŒãã»ã°ãªãŒã¹ããŒãããã»ãã€ã¯ãã±ã³ã»ãã³ããœã³ã«ãã£ãŠGoogleã§äœããããªãŒãã³ãœãŒã¹ã®ããã°ã©ãã³ã°èšèªã§ãããã·ã¹ãã ã»ããã°ã©ãã³ã°çšã«èšèšãããŠãããå¹çæ§ã匷ãåä»ããã¬ããŒãžã»ã³ã¬ã¯ã·ã§ã³ã§ç¥ãããŠããã
Goã®ããã©ãŒãã³ã¹æé©åã«ãããã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹ç®¡çãæ¹åãããåŸ ã¡æéãççž®ãããã¹ã±ãŒã©ããªãã£ãåäžããŸãããã倧ããªã¯ãŒã¯ããŒãã«å¯Ÿå¿ã§ãããå¹ççã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
Goã«ãããéèŠãªæé©åãã¯ããã¯ã«ã¯ã䞊è¡åŠçã®æŽ»çšãã¢ããªã±ãŒã·ã§ã³ã®ãããã¡ã€ãªã³ã°ãã¡ã¢ãªå²ãåœãŠãšãã€ã³ã¿ã®ç®¡çããã³ãããŒã¯ãæšå¥šããããã¹ããã©ã¯ãã£ã¹ã«åŸãããšãªã©ããããŸãã
䞊è¡åŠçã«ãããè€æ°ã®ã¿ã¹ã¯ãåæã«å®è¡ã§ãããããã·ã¹ãã ãªãœãŒã¹ãæå¹æŽ»çšã§ããããã©ãŒãã³ã¹ãåäžããŸããGoã«ã¯GoroutinesãšChannelsã«ãã䞊è¡åŠçã®ãµããŒããçµã¿èŸŒãŸããŠããã䞊è¡åŠçãç°¡åã«å®è£ ã§ããŸãã
ãããã¡ã€ãªã³ã°ãšã¯ãã³ãŒããåæããŠããã©ãŒãã³ã¹ã®ããã«ããã¯ãã¡ã¢ãªãªãŒã¯ããªãœãŒã¹äœ¿çšã®éå¹çæ§ãç¹å®ããããã»ã¹ã§ããGo ã«ã¯ pprof ãªã©ã®ããŒã«ãçµã¿èŸŒãŸããŠãããéçºè ãã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããŠããã©ãŒãã³ã¹ç¹æ§ãçè§£ããæ å ±ã«åºã¥ããæé©åãè¡ããããã«ããŸãã
Goã§ã¡ã¢ãªå²ãåœãŠãæé©åããã«ã¯ãéåžžãã¡ã¢ãªãç Žæ£ããŠåå²ãåœãŠãã代ããã«åå©çšãããäžèŠãªå²ãåœãŠãé¿ããããã€ã³ã¿ãå¹ççã«äœ¿çšãããªã©ã®æ¹æ³ããããŸããGoã®ã¡ã¢ãªç®¡çã®ä»çµã¿ãçè§£ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯ããã©ãŒãã³ã¹ãåäžãããã¡ã¢ãªã®ãªãŒããŒããããæžããããšãã§ããŸãã
ãã³ãããŒã¯ãšã¯ãããŸããŸãªæ¡ä»¶äžã§ Go ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã枬å®ããã³åæãããã®éçãçè§£ããŠæ¹åããããã»ã¹ã§ããGo ã«ã¯ããã¹ã ããã±ãŒãžã«çµã¿èŸŒã¿ã®ãã³ãããŒã¯ ãµããŒãããããã¢ããªã±ãŒã·ã§ã³ã®ã«ã¹ã¿ã ãã³ãããŒã¯ãç°¡åã«äœæããŠåæã§ããŸãã
AppMaster ããã¯ãšã³ãã¢ããªã±ãŒã·ã§ã³ã®çæã«GoïŒGolangïŒã䜿çšããŠãããããé«è² è·ããšã³ã¿ãŒãã©ã€ãºãŠãŒã¹ã±ãŒã¹ã«äžå¯æ¬ ãªé©ç°çãªã¹ã±ãŒã©ããªãã£ãšé«ãããã©ãŒãã³ã¹ãä¿èšŒãããã


