ãGoèšèªãããããšã¯äœãïŒãSimplicityã®å²åŠãçè§£ããGo Wayã«æ²¿ã£ãéçºãé²ããããšã®è¯ã
ããã°ã©ãã³ã°èšèªã«ã¯äœè ã®èšèšææ³ã匷ãçŸããŸãããGoèšèªããŸãåŸçºã§ããããšãçããããã£ãããšããææ³ã«åºã¥ããŠéçºãããŠããŸããå ¬åŒã®ããã¥ã¡ã³ãçã§èªãããŠããSimplicityã®å²åŠãçè§£ããGoèšèªããããGo Wayã«åŸã£ãŠéçºããè¯ãã«ã€ããŠãã¯ãŠãªããŒããšã³ãžãã¢ã®æŸæšé 幞ïŒSongmuïŒããã解説ããŸãã
çè ãå€ããŠããæ ªåŒäŒç€Ÿã¯ãŠãªã§ã¯ã2013幎ããGoèšèªãéçºã«çšããããã«ãªããŸãããå°å ¥åœåã¯Mackerelã§çšããããç£èŠãšãŒãžã§ã³ãã§ããmackerel-agentããå§ãŸããçŸåšã§ã¯URLå€åœ¢ç£èŠã®ããã®ãµãã·ã¹ãã ããæç³»åããŒã¿ããŒã¹ã®ããã«ãŠã§ã¢ãæè¿ã§ã¯æ°èŠãããžã§ã¯ãã§ã®æ¡çšãªã©å©çšã·ãŒã³ãå€å²ã«ããã£ãŠããŸãã
çè ã¯Javaã®çµéšã¯å°ããããŸããããPerlãªã©ã®åçåä»ãã®ã¹ã¯ãªããèšèªã§ã®éçºãé·ããæåã¯Goã«æ £ããªãç¹ããããŸãããããããä»ã§ã¯å€§å¥œããªèšèªã®ã²ãšã€ã«ãªããçè ã®GitHubã§ã¯ãGoã®ããŒã«ãã©ã€ãã©ãªãæ°å€ãå ¬éããŠããŸãã
ä»åããGoèšèªãããããããŒãã«èšäºãå·çããŠã»ãããšããé£çµ¡ãæ¥ããšãã¯ããããã¯å€§å€ãªäŸé Œãæ¥ãŠããŸã£ããªããšæããŸããããã®ããŒãã§èšäºãæžãã«ã¯ãããµããããæ¹ãããããã«ãæããŸããããGoã¯åŸçºã®ããã°ã©ãã³ã°èšèªã§ãããåãèšèšææ³ããã£ããããŠããããããã®å€ãã¯æ¢ã«äœè ãéçºè ããŒã ã«ãã£ãŠèªãããŠããããã§ãã
ããã°ã©ãã³ã°èšèªã¯ãã®äœè ããã°ãã°ãåªããçµèº«ã®ç¬è£è ããªã©ãšç§°ãããããšãããããã«ãç¹ã«äœè ã®èšèšææ³ã匷ãçŸãããœãããŠã§ã¢ã§ããGoã®å Žåã§ããåæéçºè ã®Robert GriesemerãRob PikeãKen Thompsonã®3åããã³ã¢éçºè ã®Russ Coxã«ãããGo Blogã圌ãã®ãã¬ãŒã³è³æãããã°ãªã©ã§ãã®èæ¯ãèšèšææ³ãç¶ŽãããŠããŸãã
Go Blogã§2018幎4æ26æ¥ã«çºè¡šããããGo's New Brandãã«ãGoèšèªã®èšèšææ³ãåæ ãããŠãã
æ¬çš¿ã§ã¯ãGoèšèªã®äœãããèæ¯ã»èšèšææ³ã«æ¹ããŠãµãããšãšãã«ãçè ãèãããGoèšèªããããããGoãããã³ãŒããæžãããã«å¿æããŠããããšããäŒãããŸãã
- Goèšèªããããšã¯
- Goãããã³ãŒããæžãããšãå¿æãã
- Goãããã³ãŒããæžãäžã§å¿æããŠããããã«ããã€ãã®ããš
- ãŸãšã
Goèšèªããããšã¯
Goèšèªãæ¥çã«æ¥éã«åãå ¥ããããŠãã倧ããªçç±ã«ããããããã®ææ³ã®çã®è¯ãããšãçŸä»£ã®ããŒãºã«ãããããèšèªæ©èœãããããšçè ã¯èããŸãã
ã€ãŸããéå»ã«æ£ããåŠã³ãçŸä»£ã®éçºã«å¿ èŠãªæ©èœãçã蟌ã¿ãå ããŠããããã®æªæ¥ã«æ±ãããããã£ãŒãã£ãŒãææ¡ãå®çŸããããšããŠãããšãããéå»ã»çŸåšã»æªæ¥ããã©ã³ã¹ããèæ ®ãããåªããèšèšã«ãªã£ãŠããã®ã§ãã
èšèªèšèšã®çµç·¯ããçŸåšã®æœ®æµã®äžã§èšèªã«æ±ããããŠããæ©èœãææ¡ãããšãäžèŠç¹æ®ã«ãæããGoã®èšèªæ©èœããªããã®ããã«ãªã£ãŠããã®ããã©ããã£ãèšèªç¹æ§ãäžã®äžã«åãå ¥ããããŠããã®ããçè§£ããããšãã§ãããããGoããããã³ãŒããæžããããã«ãªãã§ãããã
Goãäœãããèæ¯
Goãäœãããèæ¯ãšããŠã¯ãRob Pikeã«ããããã¥ã¡ã³ããGo at GoogleããèªããšãGoogle瀟å ã«ãããå€§èŠæš¡ãœãããŠã§ã¢éçºã®çç£æ§ãã¹ã±ãŒã©ããªãã£ã®ããã ãšããããšãåãããŸãã
The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable. The language was designed by and for people who writeâand read and debug and maintainâlarge software systems.
Go's purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers. Go is more about software engineering than programming language research. Or to rephrase, it is about language design in the service of software engineering.
åŒçšïŒGo at Google: Language Design in the Service of Software Engineering 3. Go at Google
çè ãç¹ã«Goã«å¯ŸããŠå¥œãŸããæã£ãŠããç¹ã¯ãããã«æžãããŠããããã«ãGoãããã°ã©ãã³ã°èšèªç ç©¶ã®ããã®èšèªã§ã¯ãªããå®éã®åé¡è§£æ±ºã®ããã®èšèªã ãšããããšã§ãããã®ç¹ã¯ãããã°ã©ãã³ã°èšèªãã®ãã®ã奜ããªäººã«ãšã£ãŠç©è¶³ããªãæããããéšåã§ã¯ããã®ã§ãããã
ãŸããäžèšã®ãGo at Googleãã®ã»ãã«ããå ¬åŒã®FAQã«ã¯éçºã®ã³ã³ã»ãããææ³ãäºçްãã«æžãããŠããŸããããããã®èšäºã§ã¯ãGoãäœãããèæ¯ã«ã¯ä»¥äžã®ãããªèª²é¡ãããããšãè¿°ã¹ãããŠããŸãã
- ããã°ã©ãã³ã°èšèªãã®ãã®ãéçºãããŠããç°å¢ãšãå®éã«äœ¿ãããŠããç°å¢ãç°ãªã
- ãœãããŠã§ã¢ãéçºããé床ã«ãã¹ã±ãŒã©ããªãã£ãæ±ããããŠãã
- æ¢åã®éçèšèªã®å€ãã¯ããã±ãŒãžã®äŸå管çã倧å€ã§ãã
- GCãšäžŠåèšç®ã®äž¡æ¹ããäžè¬çãªèšèªã§ã¯ããŸããµããŒããããŠããªã
- ãã«ãã³ã¢ãã€ãã£ããªèšèªãæ±ããããŠãã
ãŸããããããèžãŸããFAQã®äžã®ãäœæ æ°ããèšèªãäœã£ãŠããã®ãããšããé ç®ã§ã¯ä»¥äžã®ããã«è¿°ã¹ãããŠããŸãã
Go is an attempt to combine the ease of programming of an interpreted, dynamically typed language with the efficiency and safety of a statically typed, compiled language. It also aims to be modern, with support for networked and multicore computing.
åŒçšïŒFrequently Asked Questions (FAQ) - The Go Programming Language
Goã¯ãåçåä»ãã®ã¹ã¯ãªããèšèªã«ãããéçºã®å¹çæ§ãšå®¹æããšãéçåä»ãã®èšèªã®å®å šæ§ãèåããã詊ã¿ã§ããããããã¯ãŒã¯ããã«ãã³ã¢ãã€ãã£ããªã¢ãã³ãªèšèªã§ããããšãç®æšã«ããŠããããšãåãããŸãã
å®éã«çè ã¯ãPerlã®ãããªã¹ã¯ãªããèšèªã§ã®éçºçµéšãé·ãã®ã§ãããGoã«ã¯ãã銎æïŒãªãïŒãããšãã§ããŸãããã¹ã¯ãªããèšèªã®æèŠã§éçºã§ããéçåä»ãèšèªã§ããããã«æããŠããŸãã
äŸãã°ãã¹ã¯ãªããèšèªã§ã®éçºã®å Žåãå°ããã€éçºã³ãŒããšãã¹ãã³ãŒãã亀äºã«æžããŠåäœã现ãã確èªããªããã€ã³ã¯ãªã¡ã³ã¿ã«ã«éçºãè¡ããŸãããGoã§ããã®ãªãºã ã倧ããå€ããããšãªãéçºãå¯èœã§ããGoã®ã³ã³ãã€ã«ãéããã¹ããæžããããç¹ã倧ããå¯äžããŠãããšæããŸãã
Goãäœã£ã人ãã¡
Goã¯ãRobert GriesemerãRob PikeãKen Thompsonã®3åã«ãã£ãŠéçºãå§ããããŸããã
Rob PikeãšKen Thompsonã®2人ã¯ãèšç®æ©ã®äžçã§ã¯ç¥æ§ãšèšã£ãŠããååšã§ããKen Thompsonã¯ãCèšèªãUNIXãUTF-8ã®ãªãªãžãã«éçºè ã®äžäººã§ããRob PikeãUNIXéçºã«æºãããUTF-8ã®åæèšèšãè¡ã£ãããšã§ç¥ãããŠããŸãã
ãããªåœŒããèšèšããèšèªã§ããããéå»ã®èšèªèšèšã§å€±æããåçããGoã«ã¯æŽ»ããããŠããããã«ãæããŸããäŸãã°ã以äžã®ãããªç¹ãæããããã§ãããã
- 倿°ã®å宣èšãåŸçœ®ã§ãã
- switchæã§ãããã©ã«ãæåã§breakãã
- å€éšããã±ãŒãžã®èªã¿èŸŒã¿ãããã¯ãã§ã¯ãªãæ§æãšããŠçšæãããŠãã
- æé»ã®æ°å€å€æãæäŸããŠããªã
- 颿°ã®è¿ãå€ãè€æ°æã€ããšãã§ãã
ScaleãšSimplicity
Goã®ãŽãŒã«ã¯ã2çš®é¡ã®Scale âã·ã¹ãã ã®ã¹ã±ãŒã©ããªãã£ãšéçºã®ã¹ã±ãŒã©ããªãã£â ã§ãããšãRuss Coxã¯ãToward Go 2ããšããèšäºã§è¿°ã¹ãŠããŸãã
ãã®2ã€ãå®çŸããäžã§å€§äºãªããŒã¯ãŒãããSimplicityã§ããGoã®èšèªãšããŠã®åªäœæ§ã¯ãã·ã³ãã«ãªãã®ãçµã¿åããããã©ã³ã¹ã®è¯ãã«ãããŸãã
å€ãã®èšèªãåããããªæ©èœè¿œå ç«¶äºãè¡ããšããšãããã°ããããã䌌éã£ãèšèªã«ãªããããŸãããäžæ¹ãGoã¯æ©èœãåãããšã§åè² ããŠããŸããã³ã¢éçºè ã®å šå¡ãå¿ èŠã ãšæã£ãæ©èœããèšèªã«åã蟌ãŸãªããšããæ¹éããèšèªã®ä»æ§ããããã ã«ä¿ã€äžã§éåžžã«ã¯ãŒã¯ããŠãããšèšããŸãã
ããŒã¯ãŒãã25åãããªããããã«ãªææ³ããéå°ãªè¡šçŸåãæããããçŽ æŽããæ¯ãšããæåããããããææ³ãåæ ãããŠããã®ã§ã¯ãªãã§ããããã
ãŸããæžãæã«ãšã£ãŠã®åçŽãã®ããã«ãGoèšèªãå éšã§è€éããé èœããŠãããŠããæ©èœããããŸããããããGCã§ãããgoroutineãšchannelãšãã£ã䞊è¡ã»äžŠååŠçã®ããã®æ©èœããããŠã€ã³ã¿ãŒãã§ãŒã¹æ©èœã§ãã
åçŽã§ã¯ãããã®ã®åŒ·åã§å¥¥æ·±ããããã®æ©èœãçµã¿åãããããšããGoããã°ã©ãã³ã°ã®ééå³ïŒã ããã¿ïŒãšãããã§ãããã
Rob Pikeã®ãSimplicity is Complicatedããšããè³æãåèã«ããŠãã ããã
Goãããã³ãŒããæžãããšãå¿æãã
ãããŸã§ãèšèªãéçºããèæ¯ããèšèªãç®æããŽãŒã«ãããGoãããããæŠèŠ³ããŠããŸãããããããã¯ãå®éã«Goãæžãäžã§ãçè èªèº«ãå¿æããŠããããšãè¿°ã¹ãŠãããããšæããŸãã
Goã«å ¥ã£ãŠã¯Go Wayã«åŸã
Goãæžãäžã§å€§äºãªããšã¯ããŸãã¯Goã®äœæ³ã«çŽ çŽã«åŸãããšã§ããã»ãã®èšèªããæ¥ããšãGoã®ãäœæ³ã¯äžèŠå¥åŠã«æããããšããããŸããããã®éåæããã£ãšé£²ã¿èŸŒãã§ãçŽ çŽã«Goã®ããæ¹ã«æ²¿ã£ãŠãã°ããã³ãŒããæžããŠã¿ãŸãããã
èªåãæ £ããŠããèšèªã®ããæ¹ãäžéå端ã«åã蟌ãŸãã«ãå šé¢çã«åŸã£ãŠã¿ãŸããããããããããšã§ãæåã¯å¥åŠã«èŠããäœæ³ãåŸã ã«è ïŒãµïŒã«èœã¡ãããã«ãªããGoãããã³ãŒãã身ã«ä»ããŠããŸãã
äŸãã°ãç°¡æœãªããã±ãŒãžåãšçã倿°åã¯ãããã§ãåé¡ãªãããã«ã¹ã³ãŒããããã±ãŒãžã®åœ¹å²ãå°ããä¿ã€ããã®ãã©ã¯ãã£ã¹ã§ãããäŸå€ã®ãªããšã©ãŒãã³ããªã³ã°ã«é¢ããŠã¯å€§åãžã£ã³ããæå³ãã¬ã¯ã©ãã·ã¥ãæããããšã§ç¹ã«ã䞊åã䞊è¡åŠçæã®èŠéããè¯ãããããã«æçšã§ããããšãçè§£ã§ããŸãã
Goãããã³ãŒããæžãããã®ããŒã«çŸ€
Goãããã³ãŒããæžãããã«ã¯ã©ãããã°ããã®ã§ããããããŸãã¯ãå ¬åŒã§æäŸãããŠããã¬ã€ãã©ã€ã³ãEffective Goãã«ç®ãéããšè¯ãã®ã§ããããããªãéèªããã®ã¯å°ã倧å€ã§ãã
å®ã¯ããããã®äžéšã®äœæ³ã匷å¶ãå®ãããããã®ããŒã«ãããã°ç¯æ£ã®ãã¹ã®ãããªããŒã«çŸ€ããæšæºãå
¬åŒã§æäŸãããŠããŸããå
·äœçã«ã¯ãgofmtãgoimportsãšãã£ãã³ãŒããã©ãŒããã¿ãŒããããŠgo vetãgolintãšãã£ãlinterã§ãã
ãããã£ãããŒã«ãé©åã«äœ¿ã£ãŠããã°ãåºæ¬çãªGoãããã³ãŒãã¹ã¿ã€ã«ãèªç¶ãšèº«ã«ä»ããŠããŸãã
Goã®äœæ³ãéµå®ããŠããã°ãGoãçšããããŒã éçºã§åºæ¬çãªã³ãŒãã£ã³ã°èŠçŽããã¡ãã¡çå®ããå¿ èŠããããŸããããã¹ã¿ã€ã«ã®å¥œãå«ãã«èµ·å ãããèªè»¢è»çœ®ãå Žã®è°è«ããé¿ããããšãã§ããŸããããã¯éçºãã¹ã±ãŒã«ãããäžã§ãå°å³ã«éèŠãªãã€ã³ãã§ãã
ã³ãŒããã©ãŒããã¿ãŒ ââ gofmtãšgoimports
gofmtã¯ãGoèšèªã®ãããªãã¯ãªãªãŒã¹åœåããä»å±ããŠãããçŸåšãæšæºãã³ãã«ãããŠããã³ãŒããã©ãŒããã¿ãŒã§ãã
gofmtã«ã¯ãã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã«ãã£ãŠãã©ãŒããã¿ãŒãã«ã¹ã¿ãã€ãºãããããªæ©èœãããããŠãããŸãããäŸãã°ãgofmtã®ã€ã³ãã³ãã¯ããŒãã¿ãïŒã¿ãæåïŒãçšããŸãããããããœããã¿ãã«ã«ã¹ã¿ãã€ãºããæ©èœã¯ãããŸããã
ããããã«ã¹ã¿ãã€ãºã®å¶éã¯ãé©åãªæ±ºãæã¡ã®åäžãªãã©ãŒãããã«ãŒã«ãããããããããžã§ã¯ãã§çµ±äžçã«é©çšãããããšãžã®èšèªéçºè åŽã®æ³ããæããããŸããçè ãã€ã³ãã³ããããŒãã¿ãã§ããããšã«æåã¯æžæããŸãããããã®ãã¡æ £ããŸããã
goimportsã¯ãå
¬åŒã§æäŸããŠããgofmtã®äžäœäºæããŒã«ã§ããã³ãŒãã®ãã©ãŒãããã«å ããŠãimportã®èªå解決ïŒããã±ãŒãžåã®ã¢ã«ãã¡ãããé ã«ãœãŒããäžèŠãªããã±ãŒãžã®åé€ãªã©ïŒã®æ©èœãåããŠããŸãã
go getã§ã以äžã®ããã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
% go get golang.org/x/tools/cmd/goimports
goimportsã§ã¯ãimportã®è§£æ±ºã®é¢ä¿ã§å®è¡ã«ããæéããããããšããgofmtã«ãã-sã-rãªãã·ã§ã³ããªãã£ãããšãäž¡è
ã«ã¯çްããéãããããŸãããŠãŒã¹ã±ãŒã¹ã«ãã£ãŠäœ¿ãåããå¿
èŠã§ãããçè
ã¯ã»ãŒgoimportsã®ã¿ãå©çšããŠããŸãã
ã³ãŒããã©ãŒããã¿ãŒã¯ããªããžããªã«ã³ãŒããã³ãããããåã«å®è¡ããã®ãäžè¬çã§ãããIDEããšãã£ã¿ã®èšå®ã§ãã³ãŒããä¿åãããšãã«èªåå®è¡ãããããã«ããŠãã人ãå€ãããã§ãã
linter ââ go vetãšgolint
æšæºã§linterãæäŸãããŠããããšããGoã®çŽ æŽãããç¹ã§ãã
linterã¯ãã³ãŒãã®éçè§£æãè¡ããã³ãŒãäžã®æªããç®æãæ©æ¢°çã«ææããŠããããã®ã§ãããGoãæäŸããŠããåçš®ã®linterã¯ãã¹ã¿ã€ã«ãæã£ãŠããªãç®æããGoããããªãæžãæ¹ã«å ããã³ãŒãäžã§ãã°ãçºçããããªç®æãææããŠãããåªããã®ã§ãã
æšæºã§ãã³ãã«ãããŠããgo vetã®ã»ããå
¬åŒããŒã«ã®golintããããŸããgo vetã¯ãã°ã®åå ã«ãªããããªã³ãŒããæ€åºããããŒã«ã§ãgolintã¯ããã«å ããŠãGoããããªãã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãæ€åºããŠèŠåããŠãããŸãã
golintã¯ãgo getã§ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
% go get github.com/golang/lint/golint
ããæå ã«Goã§æžããã³ãŒããããããããŸã§ãããã®linterãé©çšããããšããªããã°ã以äžã®ã³ãã³ããå®è¡ããŠã¿ãŠãã ããã
% go vet ./...
% go list ./... | xargs golint -set_exit_status
ããããããšããããããããããªéã®èŠåãåºåããããããããŸããã倿°ã®åœåèŠåã宣èšäœçœ®ãã³ã¡ã³ãã®ãã©ãŒããããåå²ã®æžãæ¹ãªã©ãå°ããããæããããå 容ã®èŠåãå€ãã§ãããã
ãããã现ããèŠåã«ãã¡ããšå¯Ÿå¿ããããšã§ãèŠéãã®è¯ããGoãããã³ãŒãã«è¿ã¥ããŸããããææãã¡ãããšçŽããŠããããšãåŸã ã®ããã«ãªããŸããæ £ããŠããã°ãã»ãšãã©èŠåãåºãªãããã«ã³ãŒããæžãããšãã§ããããã«ãªãã§ãããã
ãããããç¶ããªãããã«ãããããžã§ã¯ãåœåãããããã®ã³ãã³ãã宿çã«å®è¡ããå¿ããªãããã«ãCIã®äžã«çµã¿èŸŒããšè¯ãã§ãããã
ãŸããgolintã«ã¯-min_confidenceãšãããã§ãã¯ã®å³ãããæå®ãããªãã·ã§ã³ããããŸããããã©ã«ãã0.8ã§ãæ°å€ãå°ãããªãã»ã©å³ãããªããŸããããã©ã«ãã®èšå®ã«æ
£ããŠãããããã£ãšå°ããªå€ã«èšå®ããŠãè¯ãã§ãããã
ãããã®ãã©ãŒããã¿ãŒãlinterãæŽ»çšããªããGoèšèªã§éçºãè¡ããæ £ããŠããããEffective Goãã«ç«ã¡æ»ã£ãŠèªã¿è¿ãããšã§ãæ¹ããŠGoããããçè§£ã§ããããã«ãªãã§ãããã
ããŒã«ããšã³ã·ã¹ãã ãŸã§ãå«ãGoã®å²åŠ
å°ãè±ç·ããŸãããGoã¯å
¬åŒã§ã»ãã«ãå€ãã®ããŒã«ãæäŸããŠããŸããããã¥ã¡ã³ãé²èЧããŒã«ã®godocã倿°ã颿°ããªããŒã ããgorenameããœãŒã¹ã³ãŒãã®éçè§£æããŒã«guruããããã¡ã€ã©ããŒã«pprofãªã©ã§ãã
ãããã®ããŒã«ã¯ãGoã§éçºããã«åœãã£ãŠéåžžã«æçšã§ããç¹ã«ãšãã£ã¿ãšé£æºããŠãè£å®ããªãã¡ã¯ã¿ãªã³ã°æ©èœãªã©ã®çµ±åéçºç°å¢ãæäŸããäžã§åãçºæ®ããŸããGoã¯å€§ããªIDEãæäŸããã®ã§ã¯ãªãããšãã£ã¿å ã§ããŒã«ãçµã¿åãããããšã§ãåçš®ãšãã£ã¿ã§IDEã®ãããªæäœæ§ãå®çŸã§ããããã«ãªã£ãŠããŸãã
ããã¯éåžžã«Goãããçºæ³ã ãšæããŸããå°ãããŠã·ã³ãã«ãªãã®ãçµã¿åãããŠé«æ©èœãªä»çµã¿ãå®çŸããããšã¯ãUNIXã®èãæ¹ã«ãéããGoã®å²åŠã§ãã
ãã®ããã«ãGoã¯èšèªãã®ãã®ã ãã§ã¯ãªããããŒã«ããšã³ã·ã¹ãã å«ããèšèªç°å¢èŸŒã¿ã§èšèšãããŠãããšããã匷ã¿ãšèšããŸãã
Goããããã¹ãã®æžãæ¹
çŸä»£ã®ãœãããŠã§ã¢éçºã«ãããŠãã¹ãã®éèŠæ§ã¯å¢ããŠããããã¯ããã¹ãã³ãŒããæžãããšã¯åœããåãšãªããŸãããGoã§ãã¢ãã³èšèªããããæšæºã§testingãšãããã¹ãããã±ãŒãžãæäŸãããŠããŸãã
Goã®ãã¹ãã®ããæ¹ã¯æåã¯å°ãç¬ç¹ã§ãããèŠããããšãå°ãªããŠå®ã¯ç°¡åã§ããæäœéã以äžã®ããšã ããèŠããŠããã°ããã§ãããã
-
go testã§å®è¡ãã -
*_test.goã®ããã«åœåããããã¡ã€ã«ããã¹ããã¡ã€ã«ãšãªã -
TestXXX(t *testing.T)ã®ããã«Testã§å§ãŸããt *testing.Tãåãåã颿°ããã¹ãã±ãŒã¹ã«ãªã -
t.Error()ãt.Errorf()ãªã©ãåŒã³åºããããšãã¹ã倱æãšãªã
æç€ºçã«å€±æãããããšã¯ã§ããŠãæç€ºçã«æåãããããšãã§ããªãç¹ãå°ãåããã¥ããç¹ãããããŸããããããã¯æ £ãã®åé¡ã§ãã
ãã¹ãã³ãŒãã®äŸãšTable Driven Test
å žåçãªãã¹ãã³ãŒãã¯ä»¥äžã®ããã«ãªããŸãã
import testing func TestHello(t *testing.T) { expect := "Hello" got := Hello() if got != expect { t.Errorf("got: %s, expect: %s", got, expect) } }
ãã®ã³ãŒãã§ã¯ãHello()ãšãã颿°ã®åºåãæ£ãã "Hello" ãšãªã£ãŠãããããã¹ãããŠããŸãã
éåžžã«åçŽæå¿«ãªãã¹ãã³ãŒãã§ãããassertãmockã®ä»çµã¿ãæšæºã§æäŸãããŠããªãããšã«å¯ŸããŠäžæºãæããããšããããããããŸããã
æ £ããªããã¡ã¯ãå¿ èŠã«å¿ããŠtestifyãªã©ã®ãµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã䜿ã£ãŠãè¯ããããããŸããããã ããçè ããããã®å¿ èŠæ§ãæããããšã¯æžã£ãŠããŸããã
äŸãã°ãTable Driven Testã®ææ³ã䜿ãã°ãassertãæžããŸããå¿ èŠããªããªããåçŽãªãšã©ãŒã¡ãã»ãŒãžã§ååã«ãªããŸãã
Table Driven Testã¯ãæšæºããã±ãŒãžã§ããããæã§äœ¿ãããŠãããã¯ããã¯ã§ããå ·äœçã«ã¯ããã¹ã察象ã®é¢æ°ã«å¯Ÿããå ¥åãšæåŸ ãããåºåã®ãã¢ããå¿ èŠãªãã¹ãã±ãŒã¹åã ãããŒãã«ã«èšè¿°ããããã«å¯ŸããŠç¶²çŸ çã«ãã¹ããå®è¡ããææ³ã§ããäžåºŠããŒãã«ãçµãã§ããŸãã°ããã¹ãã±ãŒã¹ã®è¿œå ãç°¡åã«ãªããŸãã
ãŸããTable Driven Testã§ãã¹ããæžãããšããããšã¯ãå¯Ÿè±¡é¢æ°ã®å ¥åãšåºåãæç¢ºã§ãèšèšã綺éºãªèšŒæ ã§ããããŸããã»ãšãã©ã®ãã¹ãã¯ãå¯èœãªéãTable Driven Testã«èœãšã蟌ããšè¯ãã§ãããã
mockã«é¢ããŠããã€ã³ã¿ãŒãã§ãŒã¹æ©èœãããŸã䜿ãã°å®çŸããããšãã§ããŸãããããŸãã€ã³ã¿ãŒãã§ãŒã¹ã«èœãšã蟌ãããšã¯ãã³ãŒãèšèšäžãæçšã ãšèšããŸãã
æšæºããã±ãŒãžãããGoãããææ³ããåŠãŒã
Goã§ã¯ããã¹ãã«éãããæšæºããã±ãŒãžã§å€ãã®ããšããŸããªããããããµãŒãããŒãã£è£œã®ã©ã€ãã©ãªã«é Œãå¿ èŠããããŸããããŸããã
ãã ããã®ããæ¹ãããããŸã§ã®ä»èšèªã§ã®ãã€ã³ãã»ãããšç°ãªããããè§£æ³ãèŠã€ãããããæ £ããããæ¹ã®ã©ã€ãã©ãªãæ¢ããŠããŸããã¡ã§ãã
å®éã«ã¯ãGoãããææ³ããçšæãããŠããããšãå€ãããããèŠããã°è§£æ±ºã§ããããšãå€ãã®ã§ãããããã£ãææ³ã¯ãæšæºããã±ãŒãžã®ãœãŒã¹ã³ãŒãã®ãããæã«æ£ãã°ããããŠããŸããåèã«ãªãã®ã§èªãã§ã¿ããšè¯ãã§ãããã
ãªãã説æã¯å²æããŸãããtestingããã±ãŒãžã«ã¯ããã³ãããŒã¯ã®ä»çµã¿ãå«ãŸããŠããŸããããã¯ããã©ãŒãã³ã¹æž¬å®äžæçšã§ããããèšèªæšæºã§ç°¡åã«è¡ããç¹ãå¬ãããã€ã³ãã§ãã
Goãããã³ãŒããæžãäžã§å¿æããŠããããã«ããã€ãã®ããš
ããã«ãå®çšçãªGoãããã³ãŒããæžãäžã§çè ãå¿æããŠããããšãèããŠããããšããããã€ãåãäžããŠè§£èª¬ããŸãã
panicã䜿ããªã
Goèšèªéçºè ã«ãšã£ãŠã¯ãã¯ãåœããåã§ãããGoã«äŸå€ã¯ãªããšèããã»ããè¯ãã§ãããã
panicãšããçµã¿èŸŒã¿ã®é¢æ°ã¯ãããŸãããããã¯äŸå€ãšããããããæ¬åœã«èŽåœçãªåé¡ã§çµäºãããšãã«äœ¿ããããã®ã§ãåºæ¬çã«ã¯äœ¿ããŸããã
ãã®ä»£ããã颿°ããå€ãè¿ãéã«ããã®æ«å°Ÿã«çµã¿èŸŒã¿ã®erroråãè¿ãããããnilãšæ¯èŒããŠãšã©ãŒåŠçãè¡ãããšãåºæ¬ã®åœ¢ãšãªã£ãŠããŸãã
result, err := doSomething() if err != nil { // ãšã©ãŒåŠç }
if err != nil {ã®é »åºã¯ãä»èšèªéçºè
ãGoã®ã¢ã¬ã«ã®ãŒãèµ·ãããŠããŸãããããã€ã³ãã§ããããŸãã
ãã ãããããŸãæ £ãã®åé¡ã ãšæãããã«ãªããŸããããã®ã³ãŒãã®æµãã®æ¹ãããšã©ãŒãã§ãã¯ãè¡ã£ãŠããããšãæããã§ãäŸå€ã®ãã£ããæŒããªã©ãæ°ã«ããå¿ èŠããªããšããå©ç¹ãããããã«æããŠããŸãã
æ£èŠè¡šçŸãé¿ããŠstringsããã±ãŒãžã掻çšãã
匷åãªæ£èŠè¡šçŸæ©èœãåããã¹ã¯ãªããèšèªã§éçºããçµéšããããšãæååæäœã¯ãªãã§ãæ£èŠè¡šçŸã§ãããããªã£ãŠããŸããŸãã
Goã®æšæºã®æ£èŠè¡šçŸããã±ãŒãžã§ããregexpã¯ååã«é«æ©èœã§ã¯ãããçŸå®çãªé床ã§åãã¯ãããã®ã®ãããã»ã©ããã©ãŒãã³ã¹ã¯é«ããããŸãããå®éãã¹ã¯ãªããèšèªã®æ£èŠè¡šçŸã©ã€ãã©ãªãšåççšåºŠã®é床ããåºãããšãã§ããŸãããããã¯ã³ã³ãã€ã«èšèªã«ãšã£ãŠã¯ããªã倧ããªããã©ãŒãã³ã¹ã€ã·ã¥ãŒãšèšããã§ãããã
幞ããGoã®æååæäœããã±ãŒãžã§ããstringsããã±ãŒãžãéåžžã«å
å®ããŠãããããæ£èŠè¡šçŸã®ä»£ããã«ãã®äžã®é¢æ°ã®ããããã䜿ããªãã調ã¹ãŠã¿ããšè¯ãã§ãããã
ã©ãããŠãæ£èŠè¡šçŸã䜿ãããå Žå
ãã¡ããæ£èŠè¡šçŸã䜿ãããå ŽåããããŸãããã®å Žåãæ£èŠè¡šçŸãªããžã§ã¯ãã®çæã«ã¯ã³ã¹ããããããããå®è¡æã«åçã«çæããã®ã¯å¯èœãªéãé¿ããåæåæã«çæããŸãããã
å
·äœçã«ã¯ãããã±ãŒãžã®ãããã¬ãã«ããinit()ã®äžã§ãªããžã§ã¯ãã®çæãæžãŸããŠããŸããŸãã
var digitsReg = regexp.MustCompile(`\d+`)
ããã§ã¯æååãããã¯ã¯ãªãŒãã§å²ãã raw string literalãçšããŠããŸããäœèšãªãšã¹ã±ãŒããé¿ãããããæ£èŠè¡šçŸã®æå®æã«ã¯åžžæå©çšãããšè¯ãã§ãããã
ã¡ãªã¿ã«ãMustXXXãšããåœåã®é¢æ°ã¯ãåŒæ°ãå¿
ãæ£ããããšãæåŸ
ãããŠããã誀ã£ãåŒæ°ãæå®ããå Žåã«panicãèµ·ããããšã瀺ãåœåèŠåã§ããã€ãŸããMustCompileã«èª€ã£ãæ£èŠè¡šçŸæååãæž¡ããšpanicããŸããããã¯ãå®è¡äžã®é¢æ°ã®äžã§å©çšããŠã¯ãããŸããã
å®è¡äžã«æ£èŠè¡šçŸãåçã«çµã¿ç«ãŠããå Žåã«ã¯ã代ããã«regexp.Compileã以äžã®ããã«äœ¿ããŸãã
reg, err := regexp.Compile(`...` + hoge) if err != nil { // ãšã©ãŒåŠç }
ãã®å Žåãäžæ£ãªæ£èŠè¡šçŸæååãæž¡ãããå Žåã«ã¯ãšã©ãŒãè¿åŽãããã®ã§ãããã°ã©ã ãã¯ã©ãã·ã¥ããããé©åã«ãšã©ãŒåŠçãè¡ãããšãã§ããŸãã
ãã ããã®ç¯ã®åé ã§è¿°ã¹ãããã«ãåçã«æ£èŠè¡šçŸæååãçµã¿ç«ãŠãŠå®è¡äžã«æ£èŠè¡šçŸãªããžã§ã¯ããçæããã®ã¯ãããã©ãŒãã³ã¹äžã®ãªãŒããŒãããã倧ãããããããŸããããªãæ¹ãè¯ãã§ãããã
ã€ã³ã¿ãŒãã§ãŒã¹æ©èœã掻çšãã ââ io.Reader ã®å Žå
Goã®ã€ã³ã¿ãŒãã§ãŒã¹æ©èœã®äžã§ããã®åŒ·åããæåã«åããããã宿ã§ããã®ã¯io.Readerã§ã¯ãªãã§ããããã
äœããã®å€§ããã®å
¥åãåãåã颿°ãå®çŸ©ãããšãããµã€ãºã®å€§ããªæååãstringã§æž¡ãããšããããéãããã¡ã€ã«ã*os.Fileã®ãŸãŸæž¡ããããªã·ã°ããã£ãå®çŸ©ããŠããŸããããªããŸãããããã¯ãããããŸããã
Goã®æšæºioããã±ãŒãžã«ã¯ãå
¥åã¹ããªãŒã ãæœè±¡åããŠãããio.Readerãšããã€ã³ã¿ãŒãã§ãŒã¹ãããããã¡ããæŽ»çšããã®ã綺éºã§ããäŸãã°ã以äžã®ãããªåœ¢ã§ãã
func main() { f, err := os.Open("/path/to/file") if err != nil { log.Println(err) os.Exit(1) } defer f.Close() doSomething(f) } func doSomething(r io.Reader) error { // å ¥åã«å¯ŸããåŠç }
ããã§os.Openãè¿ããŠãã倿°fã®åã¯*os.Fileã§ãããdoSomethingã®ã·ã°ããã£ã§ã¯ãio.Readerãåãåãããã«å®çŸ©ããŠãããšãããããœã§ãã
ãã®ããã«ããããšã§ãæ±çšçã§å¹çããããäŸåãåãé¢ãããŠããã¹ããããããã³ãŒããæžãããšãå¯èœã«ãªããŸãã
ç¶æ¿ããã³ã³ããžã·ã§ã³
ãç¶æ¿ããã³ã³ããžã·ã§ã³ããšã¯ããªããžã§ã¯ãæåã«é¢ããèŠå¥ãšããŠè¿å¹Žããèãããã«ãªã£ãèšèã§ãã
Goã§ã¯ãstructãå®çŸ©ããŠãããã«å¯ŸããŠã¡ãœãããå®çŸ©ãããªããžã§ã¯ãæåã®ãããªããšãè¡ããŸãããäžè¬çãªãªããžã§ã¯ãæåèšèªã«ãããç¶æ¿ãçšããéå±€æ§é ã¯ãµããŒãããŠããŸããããã®ä»£ãããåã蟌ã¿ã«ãã£ãŠå§è²ã®ãããªããšãå®çŸããããšãã§ããŸãã
Goã«ãããŠã¯ã1ã€ã®structã«å€ãã®ãã£ãŒã«ããã¡ãœãããèšããŠå€§ããªã¯ã©ã¹ãäœãããšããã®ã§ã¯ãªããç¹å®ã®åãåã蟌ãã§å§è²ããããå°ããæ±çšçãªã€ã³ã¿ãŒãã§ãŒã¹ãæºããã¡ãœãããå®è£ ãããããããšã§ãã³ã³ããžã·ã§ã³ãå®çŸããããã«ã¯ã©ã¹èšèšã®æèãåãæ¿ããããšãèèŠã§ãã
ããã«æ £ããŠãããšãGoãããèªç¶ãªã¯ã©ã¹èšèšãã§ããããã«ãªãã§ãããã
äŸãã°ãæšæºã®ioããã±ãŒãžã«ã¯ãio.ReadWriterãšããã€ã³ã¿ãŒãã§ãŒã¹ããããŸããããã®äžèº«ã¯ã以äžã®ããã«io.Readerãšio.Writerãã³ã³ããžã·ã§ã³ãããå®çŸ©ãšãªã£ãŠããŸãã
type ReadWriter interface{ Reader Writer }
ç¶æ¿ãæ¢ããŠãµããŒãããªãå²ãåãããGoããããŠå¥œãŸãããšçè ã¯æããŸãã
SOLIDãªãã¶ã€ã³
ãªããžã§ã¯ãæåã«ããããSOLIDããšããååããããŸãããªããžã§ã¯ãæåã®ååã®äžã§ããç¹ã«éèŠãª5ååãããã®é æåãåãããŠããŸãã
- S : The Single Responsibility PrincipleïŒåäžè²¬ä»»ã®ååïŒ
- O : The Open Closed PrincipleïŒãªãŒãã³ã»ã¯ããŒãºãã®ååïŒ
- L : The Liskov Substitution PrincipleïŒãªã¹ã³ãã®çœ®æååïŒ
- I : The Interface Segregation PrincipleïŒã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®ååïŒ
- D : The Dependency Inversion PrincipleïŒäŸåæ§é転ã®ååïŒ
ããã¯ãç¶ç¶çã«éçºããããœãããŠã§ã¢ãã¹ãã²ããã£ã³ãŒãã«ãªããªãããã«ããéèŠãªååã§ãããããã®ååãé©çšããéã«ãGoã®Simplicityã®å²åŠããäžã€äžã€ã®æ©èœãç¹ã«ã€ã³ã¿ãŒãã§ãŒã¹æ©èœã¯ãé©ãã»ã©ã®å¹æãçºæ®ããŸãã
ç¶æ¿ãªã©ã®æ©èœããªããæ ã«ãGoã¯ãªããžã§ã¯ãæåèšèªã§ã¯ãªãããšèšãããããšããããŸããããããããã¯äžå¿ èŠãªæ©èœãåãããŠããã ãã®è©±ã§ãGoã«ã¯çŸä»£ã®ãœãããŠã§ã¢èšèšã«ãããŠå¿ èŠãªæ©èœã¯ãã£ã¡ããšè©°ã蟌ãŸããŠããããªããžã§ã¯ãæåçãªèšèšãååã«ã§ããã®ã§ãã
GoãšSOLIDååã«é¢ããŠã¯ãDave Cheneyã®ãSolid Go Designããšããèšäºã«è©³ããæžãããŠãã®ã§ã䜵ããŠãèªã¿ã ããã
䞊è¡ã»äžŠååŠç
æ¬çš¿ã§ã¯ããŸãåãäžããããŸããã§ãããããã¯ããgoroutineãšchannelãçšãã䞊è¡ã»äžŠååŠçãããGoã®ç骚é ã§ãããGoãããã®ç¥é«ãšèšããŸãã
çè ãGoãæžããŠäžçªè¡æã ã£ãã®ã¯ãåæåŠçãšéåæåŠçãæ··åšãããŠæžããããšã§ããPerlã®AnyEventãNode.jsã®ãããªéåæåæã®ãã¬ãŒã ã¯ãŒã¯ãèšèªãçšãããšãå€ãã®åŠçãéåæã§æ±ãå¿ èŠããããããã³ãŒããè€éã«ãªã£ãŠããŸãããšããããŸãã
ããããGoèšèªã§ã¯ã倧çã§ã¯åæçã«åŠçãèšè¿°ããŠå±æçã«éåæåŠçã«ããããšããgoroutineã䜿ãã°é©ãã»ã©ç°¡åã«å®çŸã§ããã®ã§ãã
䞊è¡ã»äžŠååŠçã«ã¯ãçšéã«å¿ããããŸããŸãªå®è£ ãã¿ãŒã³ããããŸãããGoèšèªã§ã¯ãgoroutineãšchannelãšãããã£ã2ã€ã®ã·ã³ãã«ãã€åŒ·åãªæ©èœã§å®çŸã§ããŸããããããGoããããã€ã³ãã§ãã
ããã§èªãå°œããããšã¯ã§ããŸããããæ¯éãgoroutineãšchannelã䜿ãããªããŠã奥深ãGoã®äžŠè¡ã»äžŠååŠçãå ªèœããŠãã ããã
ããŸãã«ãç°¡åã«äžŠè¡ã»äžŠååŠçãæžããŠããŸããããgoroutineãäžå¿ èŠã«äœ¿ããããªã£ãŠããŸãããšããããŸãããéã«éå¹çã«ãªã£ãããã³ãŒãã®èŠéããæªããªã£ãŠããŸã£ãããããããå¿ èŠãªãšããã§äœ¿ãã«ãšã©ãã䜿ãéãã«ã¯æ³šæããŸãããã
ãŸãšã
GoãããããGoãããã³ãŒããæžãæ¹æ³ã«ã€ããŠãçè ãªãã«æžãããŠããããŸãããGoã®é åãèªãå°œããããšã¯ã§ããŸããããçè ãGoãæžããŠããŠæ°æã¡ãè¯ãæããæåŸã«ãŸãšããŠæžãåºããŠãããŸãã
- çŸå®çã«éããããããã©ãŒãã³ã¹ãããã»ã©æ°ã«ããªããŠè¯ã
- ãã¹ããšå®è£ ã®ãªãºã ããã¹ã¯ãªããèšèªã®ããã«è»œå¿«ã«æžãã
- æç€ºçã«èšè¿°ãããèšèªä»æ§ãååããéã«è¿·ããæããŠããã
- åšèŸºããŒã«ãã§ã€ã³ãæŽã£ãŠãã
- åæåŠçãšéåæåŠçãæ··åšãããŠæžãã
- ã³ãŒãã®å ¬éã®ãããã
- åŸæ¹äºæã«é æ ®ãããŠããå®å¿æ
Goã¯äœããå®çšèšèªã§ãããçç£æ§ãé«ãç¹ãé åã§ãããã®Simplicityã®å²åŠãçè§£ããGoã®äœæ³ã«çŽ çŽã«åŸã£ãŠéçºãé²ããŠã¿ããšãGoã®è¯ãããã®çç£æ§ã®é«ããšå¹çã®è¯ããããåãã£ãŠããã§ããããæ¯éãGoã䜿ã£ãŠã¿ãŠãã ããã
å·çè ãããã£ãŒã«
æŸæš é
幞ïŒãŸã€ãã»ãŸãããïŒ
The Go gopher was designed by Renee French. gopher.ai was created by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.
ç·šéïŒèäºåæ¥ïŒZINEïŒ




