Go2ææ¡ïŒ32437ã¯ãèšèªã«æ°ããæ§æãè¿œå ããŠã if err != nil { return ... }
ãã€ã©ãŒãã¬ãŒãã®ç
©ãããã軜æžããŸãã
ããŸããŸãªä»£æ¿æ¡ããããŸããå ã®ææ¡ã¯æ®éçã«æãããŠããªããããïŒ32804ãšïŒ32811ã§ãã
ããã¯ã¹ã«å¥ã®éžæè¢ãæããã«ã¯ïŒãã®ãŸãŸã«ããŠã¿ãŸãããïŒ
if err != nil
æ§é ã®æ瀺çãªæ§è³ªã奜ãã«ãªã£ãã®ã§ããã®ããã«æ°ããæ§æãå¿
èŠãªçç±ãããããŸããã æ¬åœã«ãããªã«æªãã®ïŒ
ç§ã¯ããã2çªç®ã«ããŸãã ãã¹ãŠã®ãšã©ãŒãè¿ãåã«è£ 食ããããšã§ã人éãèªãã圢åŒã®ããã¥ã¡ã³ãããœãŒã¹ã«è¿œå ããæ¹æ³ïŒéåžžããšã©ãŒãã[ãããã®ã³ãŒãè¡ã§è¡ã£ãŠããããš]ïŒ[åã®ãšã©ãŒ]ããšããŠãã©ãŒãããã§ããŸããã§ããïŒãšãŠãŒã¶ãŒã«éåžžã«æ°ã«å ¥ã£ãŠããŸããèªã¿åããšã©ãŒã
ãã®æ¹æ³ã§çæããããšã©ãŒã¯éåžžã«æçã§ãããã¹ã¿ãã¯ãã¬ãŒã¹ãããã¯ããã«èªã¿ããããªã£ãŠããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãå°å·ããããšã©ãŒã¯ãéåžžããœãŒã¹ã«ã¢ã¯ã»ã¹ããæºåãã§ããŠããïŒç®¡çè ã¯ãã®ãããªã¢ã¯ã»ã¹æš©ãæã£ãŠããªãå¯èœæ§ããããŸãïŒãå®éã«ã³ãŒãå ã®æ¹æ³ãç¥ã£ãŠããããšãåæãšããŠããŸãã
ã³ã³ããã¹ãããã¬ãŒã¹ã®åœ¢åŒããªããšã©ãŒïŒè£žã®æååãEOFãïŒã¯ãŸã£ãã圹ã«ç«ã¡ãŸããã 裞ã®ãšã©ãŒãç°¡åã«è¿ãããšãã§ããã·ã§ãŒãã«ããããããšãGoããã°ã©ã ã¯å€ãã®åœ¹ã«ç«ããªããšã©ãŒãåºåããããã«ãªããšæããŸãã
ã©ã¡ãããšããã°ãããããæ°ããç£å»ãšãªã³ãã®ã«ãŒã«ã䜿çšããŠãã³ã³ããã¹ãã§ãšã©ãŒãè£ é£Ÿããããšãããã·ã¥ããŠãµããŒãããå¿ èŠããããŸãã
æ瀺çãªãšã©ãŒãã§ãã¯ãæ°ã«å
¥ã£ãŠããŸãã try
ã¯çŽãããããæé»ã®æ»ãã¯å¥åŠã§ãã
ãšã©ãŒãåèãã代ããã«ããããã®ãã§ãã¯ãçãããããã®å¥ã®ã¢ãããŒããè©Šãããšãã§ãããšæããŸãã
ããã¯ç§ãå¿ ãããåæããªãäŸã§ãïŒ
value, err := foo()
return err if err != nil
ããã«ãããããçããæ瀺çãªã¢ãããŒããå¯èœã«ãªããŸãã ãããŠãããã¯ã³ã³ããã¹ããè¿œå ããããšãå¯èœã«ããã§ãããïŒ
ãšã¯èšããã®ã®ãã€ã³ã©ã€ã³ifã¯Rubyã®ãã®ã§ãããããŸããŽã€ãã·ã¥ãªæãã¯ããŸããããããã¯åãªããã¬ã€ã³ã¹ããŒãã³ã°ã§ãã å€åç§ãã¡ã¯äœãä»ã®ãã®ãèŠã€ããŸãã
ç·šéïŒç§ã¯ããã«ããã«é¢ããææ¡ãè¿œå ããŸããïŒ https ïŒ
ç©äºãè¡ãæ¹æ³ã¯1ã€ã ãã§ãªããã°ãªããŸãã
[...]ãã®ãŸãŸã«ããŠã¿ãŸãããïŒ
ç§ãã¡ã¯çãããã«å¯Ÿããçããç¥ã£ãŠãããšèšã£ãŠãéèšã§ã¯ãªããšæããŸãã å¿ããããããªãå Žåã¯ãããŸããŸãªææ¡ã®1ã€ãèªãã§çããèŠã€ããã ãã§ãã
IMOãããã§ã¯è©³çŽ°ãå°ãªãããŠçŠç¹ãçµã£ãè°è«ãããããšãã§ããïŒã€ãŸããææ¡ãšããŠé©æ Œã§ã¯ãªããšæããŸãïŒãããã«ãµãŒã¯ã«ãžã£ãŒã¯ãšã³ãŒããèªã¿ã«ããããã¢ã€ãã¢ã§ãã£ã±ãã®å¥ã®èªè»¢è»å°å±ã«å€ãããŸãã
ããã ãã
ééããªãããã®æ瀺çãªãšã©ãŒåŠçã®ããã«Goã«åå ããŸããã ããã¯ãå€ãã®èšèªã䜿çšããæé»ã®try-catchãšããŠãŒã¶ãŒã«è¿ããæ瀺çã«åŠçãããããšã奜ãOptionãMaybeãªã©ã®é¢æ°ã¿ã€ãã®éã®ã©ããã«ãããŸãã
æ°ããæ§æãæ¬åœã«ããã解決ãããã©ããã¯ããããŸããã if err := nil
ããã®ãããªãã«ããŒé¢æ°ã§ã©ãããããšãå°ã圹ç«ã€ãããããŸããïŒç§ã®ãã³ãGoãèš±ããŠãã ããïŒïŒ
func handleErr(err error, cb func(error)) {
if err := nil {
cb(err)
}
}
ãããããã®ãã«ããŒé¢æ°ã®äžè¬çãªæçšæ§ãäœäžãããåé¡ã¯ãå¥ã®ãããã¯ã§ããåã·ã¹ãã ã§ãã
ç§ã¯ããã2çªç®ã«ããŸãã if err != nil { return err }
ã¯ãã³ãŒãããŒã¹ã®ã³ãŒãã®äžéšã§ã¯ãããŸããã ãããã£ãŠãããã¯ãããè©ŠããŠã¿ãŠããŸã£ããæå³ããããŸããã ã³ã³ããã¹ãã説æããã¡ãã»ãŒãžãšãšãã«ãã©ããããããšã©ãŒã®ã¿ãè¿ããŸãã
ç°ãªãçš®é¡ã®ãšã©ãŒãåºå¥ããããã«ç°ãªããšã©ãŒã¡ãã»ãŒãžãè¿ãããã®ã§ãdeferãä»ããŠã³ã³ããã¹ããè¿œå ããããšãæå³ããããŸããã ãã ãã try(fn(), "my error message: %w")
ã圹ç«ã€å ŽåããããŸãã ãã ããããã§ããè¡ã®é·ããçãããã if err != nil
æ§é ã®æ¹ãæãŸããå ŽåããããŸãã
ççŽã«èšã£ãŠã try
æäŸããæé»ã®ãªã¿ãŒã³ã¯å¿
èŠãããŸããã ãžã§ããªãã¯ã¹ãããå Žåã¯ã代ããã«ã¢ãã颚ã®åäœã䜿çšãããœãªã¥ãŒã·ã§ã³ããå§ãããŸãã
type Result<T> interface {
Expect(err error) T
OrElse(defaultValue T) T
}
func From<T>(value T, err error) Result<T> { ... }
ç§ã«ãšã£ãŠãããã¯çŸåšææ¡ãããŠãããã«ãã€ã³ãããã¯ããã«ã¯ãªãŒã³ã§ãããè¿ãããã¡ãœããïŒå€ããšã©ãŒïŒãšçµæãæ¥å¢ãããããäžèšã«ããã«å€æŽãå ããå¿
èŠããããŸã
ãšã©ãŒãæ瀺çã«è£
食ããæ¹æ³ããªãçŸåšã®try
ææ¡ã¯ãç§ã®ããŒãºãæºãããŠããŸããã ç§ã¯ããã䜿ãããšãæ³åããããšã¯ã§ããŸããã ççŽã«èšã£ãŠãããã¯code_smell
ãšåŒã°ããããšããããŸãã
ééã£ãåé¡ã解決ããããšããŠãããããå€æŽããŠãæå³ããªãå ŽåããããŸãã
ç§ãã¡ã粟éããŠããã³ãŒãã¯ãšã©ãŒåŠçã§ã¯ãããŸããã
if err != nil {
return err
}
ããã¯ãšã©ãŒnil
åŠçã§ãã ãã®ãã¿ãŒã³ã®ã©ã®æç¹ã§ãããšã©ãŒã®å€ã¯åŠçãããŸããã
ãããå¥ã®èšèªãRubyã§ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ããå Žåã
begin
some_method_that_raises_an_error
rescue => e # catch any exception
retry e # throw it up again
end
ããã¯ãgolangã³ãŒããšåãåäœãäžç¶ããŸãã äŸå€ãçºçããããšãæ€åºãããããåçºçããããšãã ã¹ã¿ãã¯ã«æããã ãã§ãã
golangã§ã¯ã return
ã§ãã
å®éã®_ãšã©ãŒåŠç_ã¯ã©ãã§çºçããŠããŸããïŒ
ç§ãã¡ã¯çããã®ãã¿ãŒã³ã®å€±æã«ã€ããŠåæ§ã®çµéšãããŸããã ããšãã°ã file not found
ãšã©ãŒãåä¿¡ãããã®ãšã©ãŒã®å
ã®_thrower_ããã¬ãŒã¹ããã®ã«é·ãæéãè²»ãããŸãã
ãããã try
ææ¡ïŒããã³ãã®ä»ïŒã«èª€ãããããšç§ãä¿¡ããçç±ã§ãã å®éã«ãšã©ãŒãåŠçããããã®é©åãªãã¿ãŒã³ã¯ãããŸããã
å®éã«ãšã©ãŒãæ€æ»ããããã®err.Error()
æååãã§ãã¯ãåã¢ãµãŒã·ã§ã³ãªã©ã確èªããŸããã
ãã®äžäžèŽã®ãã¿ãŒã³ãå¿
èŠã§ãã xerrs
ãããã解決ããŠããããã«æããŸããããŸã å®å
šã§ã¯ãããŸããã
errïŒ= nilãã§ãã¯ããã®ãŸãŸç¶æããããšããµããŒãããŸãã
ããªã倧ããªGoã³ãŒãããŒã¹ãæãäžãããã³ã«ããã€ã©ãŒãã¬ãŒãã®äžéšãæžããæ¹æ³ãèªåããŸãã ç§ã¯ãã€ãæ»ã£ãŠããŸãïŒ
課é¡ãã©ãã«ãŒã¯å€ãã®ããšã«åœ¹ç«ã¡ãŸããã圹ã«ç«ããªãããšã®1ã€ã¯ãè€éãªãããã¯ã®è©³çŽ°ãªèª¬æã§ãã 課é¡ãã©ãã«ãŒã¯ã¹ã¬ããåãæäŸãããç¹å®ã®ã¡ãã»ãŒãžãžã®è¿ä¿¡ã¯åä»ã§ãã ããã«ã¯å®éã®ææ¡ã¯ãªããä»ã®ææ¡ãžã®åçã«éããªãã®ã§ããã®è°è«ãgolang-nutsã¡ãŒãªã³ã°ãªã¹ãã«æã¡èŸŒãããšã匷ããå§ãããŸãã
å¯èœã§ããã°ããããçãã ãšæããŸãã ãã®æ°ãããšã©ãŒææ¡ã¯ãèšèªã®ç®æšãšçŽæ¥ççŸããŠããŸãã
ç§ãgolangãæããçç±ã¯ããã®åçŽããšå¶åŸ¡ãããŒã®æ確ãªäœ¿çšã®ããã§ãã ç§ãJavaã«ã€ããŠæã軜èããŠããããšã®1ã€ã¯ãtrythrowã³ã³ã¹ãã©ã¯ãã§ãã ããã¯ãšãŠãå«ã§ãã ããã¯ã²ã©ããšã©ãŒåŠçãå©é·ããŸãã ã³ãŒã«ã¹ã¿ãã¯ã«äŸå€ãéä¿¡ããããšã¯ãå¶åŸ¡ãããŒãåŠçããããã®æããããŠå«ãªæ¹æ³ã§ãã ããã«ãèªå·±ææžåããŠåãšã©ãŒç¶æ³ãæ瀺çã«åŠçããã®ã§ã¯ãªãããã¹ãŠã巚倧ãªãã§ãã¯ã§ã©ããããŠ1æ¥ãšåŒã¶ããšããå§ãããŸãã
errïŒ= nilãé©åãªãšã©ãŒåŠçãä¿é²ããèªå·±ææžåã§ãããç¹å®ã®ã±ãŒã¹ã«é¢ããé©åãªææžåãä¿é²ããå Žåãæ£çŽãªãšãããããã¯ç§ãgoã§æãæ°ã«å ¥ã£ãŠããããšã®1ã€ã§ãã ãã®æ°ããå¶åŸ¡ãããŒã®å²ã蟌ã¿ããä¹±éã§ãããããŸããªæ»ãå€ãšãã©ã¡ãŒã¿ãŒã䜿çšããŠäœæããã»ãã³ãã£ã¯ã¹ãæ··ä¹±ãããããšã¯ãç§ãæããããã«ãªã£ãèšèªã®ç²Ÿç¥ã§ã¯ãããŸããã
åé·æ§ã¯æªãããšã§ã¯ãããŸããã äžå¿ èŠãªåé·æ§ã¯ãããŸãããgoã®ãšã©ãŒåŠçã¯äžèŠã§ã¯ãªããšç§ã¯äž»åŒµããŸãã ããã¯èšèªã®é åã®äžéšã§ãã
ãã以äžåæã§ããŸããã§ããã æ瀺çãªãšã©ãŒåŠçã¯ãIMOèšèªã®æãåªããæ©èœã®1ã€ã§ãã æ°ã«ãªã人ã¯ãŸã æ £ããŠããªãæ°ãããŸãã
åé¡ãåãããŠããã®ã¯è¯ããããŸããããä»åã¯2ã€ã®æèŠã1ã€ã®æèŠã«ãŸãšããããŠãããšæããŸãã
GitHubã®æ祚ã¢ã€ã³ã³ã¯2çªç®ã解éã§ããŸããã
goã§ã®æ瀺çãªãšã©ãŒåŠçã¯ãç§ãgolangãæããçç±ã®1ã€ã§ãã ãªãgoéçºè ãä»ã®æ¹æ³ã§ãããæãã§ããã®ãç解ã§ããŸããã æ°ããæ§æãè¿œå ãããšããææ¡ã¯ãã»ãšãã©ã®å Žåãä»ã®èšèªã§äœ¿çšãããŠããæ§æãå¿«é©ã«äœ¿çšã§ãã人ã ããã®ãã®ã ãšæããŸãã æ £ãããŸã§å°ãæéãããããããããŸããããæ £ããã°å®ç§ã«åäœããŸãã
ç§ã¯ïŒ32811ãæžãããã®ææ¡ããã£ãšæ¯æããŸã...ãšã©ãŒåŠçã¯ãã®ãŸãŸã«ããŠããããã§ãã ãã®ææ¡ã«å¯Ÿããçµµæåã®åå¿ã¯å€ããèªã£ãŠãããšæããŸãã
ç§ã¯å人çã«ããšã©ãŒåŠçããã®ãŸãŸã«ããŠããããšã«åæããŸãã Goã«ã€ããŠç§ãæ°ã«å ¥ã£ãŠããããšã®1ã€ã¯ãèšèªãæå°éã§ãããäžè¬çã«èšãã°ãç©äºãè¡ã1ã€ã®æ¹æ³ãããããšã§ãã ãšã©ãŒåŠççšã®æ°ããæ§æãè¿œå ããããšã§ãã³ãŒãã®xïŒ ãçŸåšã®ã¡ãœããã䜿çšããyïŒ ãæ°ããã¡ãœããã䜿çšããäžçãäœæããŸãã ããã¯ããã§ã«èª¬æããä»ã®åé¡ã®äžã§ããäžè²«æ§ã®ãªãã³ãŒãããŒã¹ãäœæããŸãã å人çã«ã¯ãæ¢åã®æ§æãåå/ååã§ãããšèããŠãããããæ°ãããšã©ãŒåŠçæ§æã®äŸ¡å€ã¯ãã¬ãŒããªãã®äŸ¡å€ããããšã¯æããŸããã
GolangãåããŠäœ¿çšãã人ãšããŠããã®èšèªã«ã€ããŠç§ãæ°é®®ã«æããããšã®1ã€ã¯ãæ瀺çãªãšã©ãŒåŠçã§ãã ç§ã¯JavaãRubyãPythonãNodeã§ããªãéãåããŠããŸãããããšã©ãŒã®åŠçã¯Goãããã¯ããã«é¢åã§ãã ãšã©ãŒãããææ§ã«ããèšèªæ§é ã«ãã£ãŠæ瀺ããããããããšã©ãŒã®æ確ãªããã¹ããèŠãããšæããŸãã
Ëreturn ... if ... Ë @ andreyneringããã®ææ¡ã¯å®éã«ã¯ããªãè³¢ãç§èŠã§ãã ãã€ã©ãŒãã¬ãŒãïŒã¯ã³ã©ã€ããŒïŒãåæžããŠããéãã³ãŒããæ瀺çã«ä¿ã¡ãŸãïŒé ããå¶åŸ¡ãããŒã®äžæã¯ãããŸããïŒã ã
åæããŸãã if err != nil
ã¯ãã®ãŸãŸã«ããŠãããŸãã
ç§ã¯çŸåšã®ãã©ãŒãããã奜ã¿ãŸãã æ確ã§æãããããã¿ãŒã³ã§ãã æ°ãããšã³ãžãã¢ãã¹ããŒãã¢ãããããã®ã¯ç°¡åã§ãã圌ãã¯1ã€ã®åçŽãªãã¿ãŒã³ãåŠã³ããããç¹°ãè¿ãããšãã§ããããã§ãã ãŸããå°ãªããšãçŸåšã®ã³ã³ããã¹ãã§ãšã©ãŒãèæ ®ããããã«ãŠãŒã¶ãŒã«æ±ããå°ãªããšããšã³ãžãã¢ãããã§ãšã©ãŒãçºçããå¯èœæ§ãããããšãèªèããŠããããšã確èªããŸããç§ã¯äœããã¹ãããèããå¿ èŠããããŸãã
ç§ã¯ïŒ32804ãæžããŸããããç©äºãå€ãããªãããšãæãã§ããŸãã ã³ãŒããé·ãå Žåãããã¯å€ãã®ããšãè¡ãããã§ãã ãšã©ãŒåŠçã³ãŒããããããããå Žåãããã¯ãã¹ãŠã®ã±ãŒã¹ãããŸãåŠçããŠããããã§ãã
ç©ãè¿œå ããããã ãã«ç©ãè¿œå ããªãã§ãã ããã
ãšã©ãŒåŠçã®ã·ã³ãã«ãããã®ãŸãŸæ¥œããã§ããŸãã
Expectã¯ããé€ããŠåãªãã¢ãã°ã©ã ã§ãããç§ã¯ããã䜿çšããããããŸããã ãããå§ããŠãããŠããããšãã
ç§ã®èæ¯ãå€ããªãã§ãã ããã
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
@icholyãã¡ããã§ãããçŸåšã®ææ¡ã«ã¯
1ã€ã®äžæºã¯ãããå ¥åããªããã°ãªããªãããšã§ããããäºå®äžãã¹ãŠã®ãšãã£ã¿ãŒã«ã¯ã³ãŒãã¹ãããããæ¿å ¥ããããã®ã·ã§ãŒãã«ãããããã®ã§ãããã¯å®éã«ã¯å€§ããããšã§ã¯ãããŸããã ããããã1.0ããåããGoã䜿çšããã®ã¯ç§èªèº«ã®çµéšã§ãããç§ã¯ããŸããŸã·ã³ãã«ãã奜ãã§ãåé·æ§ãæ°ã«ããŸããã
@kevineaton try
ã¯è€éã ãšæããŸããïŒ
ç§ã¯ããã«å®å
šã«åæããŸãã ç§ã¯ç§ãã¡ãäœããããå¿
èŠããããšå人çã«ãã確信ããŠããŸãã-ç§ã¯if err != nil
ãã§ãã¯ãäžèŠããã¡ãªãèŠããããšã«åæããŸãããå®éã«åé¡ã解決ããææ¡ããããã®ãèŠãããšããããŸãããã«äººæ°ããããŸãã
@icholy Goã®åã«JavaãšPythonã10幎éæžããåŸããããªãå¯èœæ§ããããšæããŸãã ãã±ã¢ã³ã®äŸå€ãã£ããããŸãã¯è€æ°ã®äŸå€ã®ãã£ãããã§ãŒã³ã«ééãããšæããŸããããã§ãªããã°ãããã«å€ãã®ãªãŒããŒããããšå®åæãå°å ¥ãããŸãã ãšã©ãŒåŠçãåé¿ã§ããã°ããã®ã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã«æ»ãããšã¯ãããŸãããã»ãšãã©ã®å Žåãç¹ã«æãããšãã«é çãæ··ä¹±ãæãããã§ãã ç§ã¯ãŸãããœãããŠã§ã¢ã¢ãŒããã¯ããšããŠã®æ¥ã ã®ä»äºã«å ããŠãã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãæããŠããã®ã§ãæ°ããéçºè ãæããããæå°ãããããããšã«åã£ãŠããŸãã ç§ã¯GoãéžæããŸããããã¯ãããè€éã§åŸ®åŠãªãšã©ãŒåŠçããããåçŽãªãšã©ãŒåŠçã§ãã
課é¡ãã©ãã«ãŒã¯å€ãã®ããšã«åœ¹ç«ã¡ãŸããã圹ã«ç«ããªãããšã®1ã€ã¯ãè€éãªãããã¯ã®è©³çŽ°ãªèª¬æã§ãã
ããã¯çå®ã§ã¯ãããŸããã ããããããã«ãããŸãã
if err != nil
try
ãè¿œå ãããŠãã if err != nil
ã¯æ¶ããŸããã try
ã¯ããšã©ãŒè»¢éãéããã1ã€ã®é
延ãšã©ãŒãã³ãã©ãŒã§å€ãã®ç°ãªããšã©ãŒãç°¡åã«ãŸãšããããšãã§ããã³ãŒããã¹ã«ããçšåºŠã®æ確ããè¿œå ãããšæããŸãã ã try
ã空ã®if-err-return-err
æãããã¯ããã«å€ãã®ãšã©ãŒãåŠçããªãããã«ä¿ãæ¹æ³ãããããããŸããã try
ãååšãããã©ããã«é¢ä¿ãªããå®éã«ãšã©ãŒãåŠçããããšãç¡èŠããã®ã¯ç°¡åã§ãã try
ã¯ãããã䜿çšããŠããã³ãŒããèªã¿ãããããã«èŠããã®ã§ããšã©ãŒåŠçã®æè¯ã®ææ¡ã®1ã€ã ãšæããŸãã
ç§ã®äžæ¹çãª2ã»ã³ããããã¯ããŸããè¡ããããã«æããŸããã ããã¯ããŸãã«ãéæ³ã§ãããæ瀺çãªãã®ãããæé»çãªæ§æãæ¡çšããŸãã
GoFAQãã
Goã«ïŒïŒæŒç®åããªãã®ã¯ãªãã§ããïŒ
_Goã«ã¯3é ãã¹ãæäœã¯ãããŸããã åãçµæãåŸãã«ã¯ã以äžã䜿çšã§ããŸãã_if expr { n = trueVal } else { n = falseVal }
ïŒïŒãGoã«ãªãçç±ã¯ãèšèªã®èšèšè ããæäœãé »ç¹ã«äœ¿çšãããŠãäžå¯è§£ã«è€éãªåŒãäœæããã®ãèŠãŠããããã§ãã if-else圢åŒã¯ãé·ããªããŸãããééããªãæ確ã§ãã èšèªã«å¿ èŠãªæ¡ä»¶å¶åŸ¡ãããŒæ§é ã¯1ã€ã ãã§ãã
@ianlancetaylor
課é¡ãã©ãã«ãŒã¯å€ãã®ããšã«åœ¹ç«ã¡ãŸããã圹ã«ç«ããªãããšã®1ã€ã¯ãè€éãªãããã¯ã®è©³çŽ°ãªèª¬æã§ãã 課é¡ãã©ãã«ãŒã¯ã¹ã¬ããåãæäŸãããç¹å®ã®ã¡ãã»ãŒãžãžã®è¿ä¿¡ã¯åä»ã§ãã ããã«ã¯å®éã®ææ¡ã¯ãªããä»ã®ææ¡ãžã®åçã«éããªãã®ã§ããã®è°è«ãgolang-nutsã¡ãŒãªã³ã°ãªã¹ãã«æã¡èŸŒãããšã匷ããå§ãããŸãã
ç¹å®ã®ã¡ãã»ãŒãžã«è¿ä¿¡ã§ããŸãã ç§ã¯ããªãã«è¿ä¿¡ããŸããã :)
ããã«ã¯å®éã®ææ¡ã¯ãªãã®ã§ãä»ã®ææ¡ãžã®è¿çã ãã§ãã
ç§ãžã®ææ¡ã¯ãå€åã®åŒã³ãããæå³ããŸãã ãã®ç¹å®ã®åé¡ã¯åå€åã§ãã ãšã©ãŒåŠçãå€æŽããªããšããææ¡ãäœæããããšãææ¡ããŸããïŒ ææ¡äœå¶ã¯çŽ æŽããããšæããŸãããçŸç¶ã¯éå°è©äŸ¡ãããŠããŸãã
JavaãšPythonã®äœæã«10幎ãè²»ãããåŸããœãããŠã§ã¢ã¢ãŒããã¯ããšããŠã®æ¥ã ã®ä»äºã«å ããŠãã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãæããŠããŸãã
@kevineatonããªãã¯ããªãèªèº«ã®ãã£ãã¯ãåžãããšã
ãã®åé¡ã¯ãåºæ¬çã«èª°ã§ãç°¡åã«ææ¡ã«è³æãŸãã¯å察祚ãæããããšãã§ããåå ¬åŒã®å Žæã§ã®é·æã«ãããäžè«èª¿æ»ãšããŠæ©èœããŸãã
if err != nil
ãåé€ããããã«èšèªãå€æŽããªãããšã¯ãåºæ¬çã«è¿œå ã®è©³çŽ°ãå¿
èŠãšããªãå®å
šã«å€§ãããªææ¡ã§ãã äœãåé¡ãªã®ãããããŸããã ããããããã¯ã²ã©ãé·ããŠãããããã®ãé£ããç¥ã§ã¯ãããŸããã ããã¯ãããééã£ãããæªãããããäžååã«ããããããã®ã§ã¯ãããŸããã
+1ããã以äžè¯ãããšã¯ãªãã«ããŠããæ¬åœã«è¯ãã¹ã¿ãã¯ãã¬ãŒã¹æ
å ±ïŒãã¬ãŒã ãã³ã¹ã®ãã®ãªãïŒã«ãªãã§ãããã x/errors
ãã§ã«ãããéæããŠãããšæããŸãããè¿ãå°æ¥ãããŒãã³ã°ã®ãããªè¿
éãªãã®ã倧奜ãã§ãfunc
ã¯ã error
+ try
ããŒã¯ãŒããè¿ãthrows
ããŒã¯ãŒãã䜿çšããŠããšã©ãŒå€æ°ã®ã·ã£ããŠã€ã³ã°ïŒç§ã¯å人çã«å«ãã§ãïŒãé²ããŸãã
func a() (int) throws {
throw &someError{}
}
anInt, err := try a()
@icholyããã¯ä¿¡ããããªãã»ã©æ±ããããŠã
çŸåšã®ãšã©ãŒåŠçã¯ã人çºçãšã©ãŒãçºçãããããã®ã§ãã çŸæç¹ã§err
ããã§ãã¯ããã®ãå¿ããã®ã¯ç°¡åã§ãã ã¹ã³ãŒãå
ã«ãã§ã«ãã§ãã¯ãããå ŽåïŒãããŠã»ãšãã©ã®å ŽåïŒãã³ã³ãã€ã©ãŒã¯unused variable
çµäºããŸããã ãšã©ãŒåŠçã¯å³å¯ã§ããå¿
èŠããããŸã-ãšã©ãŒã_
ãããããã§ãã¯ããŸã-ã¬ãã°ã·ã¥ãŒãã¯äžå¯èœã§ãã
@kevineaton
try
ã¯è€éã ãšæããŸããïŒ
try
ã¯ã³ãŒãã®èãã§ãã ããã«ããã1ã€ã®å Žæã ãã§ãªããã³ãŒãã®ãããã¯å
šäœã«ã€ã³ãã³ãã匷å¶ãããŸãã ããã«ãäŸå€åŠçã®ãããã«ã¢ãããã®æ§è³ªã«ãããã³ãŒãããã³è€æ°ã®åºå£ç¹ã§äºå®äžã®é決å®è«çãªåäœãçºçããŸãã
try
代ããã«è€æ°ã®æ»ãå€ã䜿çšããããšã®å©ç¹ã¯ãé¢æ°ãå®äºãããšãã«ãã§ãã¯ããå€ã1ã€ãšãé¢æ°ããã®çµäºç¹ã1ã€ããããšã§ãïŒãã¡ãããã¬ãŒãã¹ããŒãã¡ã³ãããã®ä»ã®æ瀺çãªæ»ãå€ã䜿çšããå Žåãé€ãïŒã
try
ãããã¯ã¯ãè€æ°ã®ãªã¿ãŒã³ãšããã¯ãœã®ç®çå
šäœãæã¡è² ãããŸãã
@fillestã³ãŒããå°ãèªã¿ã«ãããªããŸãããããã¯å®å šæ§/æ瀺çãªãšã©ãŒåŠçã®èŠ³ç¹ããä»å 䟡å€ã«ãªããšæããŸãã Goã§ãšã©ãŒãåŠçããæ¹æ³ã®åœåã®ç®æšãæ¯ãè¿ããšãæ瀺çãªåã®ç²Ÿç¥ãè¿œæ±ããªãããåŒçšãããã°ã®ã¯ã©ã¹ãåé¿ããããã®è¯ãå埩ã«ãªããšæããŸãã
çŸåšã®ãšã©ãŒåŠçã¯ã人çºçãšã©ãŒãçºçãããããã®ã§ãã çŸæç¹ã§ãšã©ãŒããã§ãã¯ããã®ãå¿ããã®ã¯ç°¡åã§ãã ã¹ã³ãŒãå ã«ãã§ã«ãã§ãã¯ãããå ŽåïŒãããŠã»ãšãã©ã®å ŽåïŒãã³ã³ãã€ã©ãŒã¯æªäœ¿çšã®å€æ°ã§çµäºããŸããã ãšã©ãŒåŠçã¯å³å¯ã§ããå¿ èŠããããŸã-ãšã©ãŒã_ãšã©ãŒãŸãã¯ãã§ãã¯ããŸã-ã¬ãã°ã·ã¥ãŒãã¯äžå¯èœã§ããå¿ èŠããããŸãã
@fillestææ¡ããããšã©ãŒåŠçã®å€æŽã«ããããã¬ãã°ã·ã¥ãŒãã£ã³ã°ãã容æã«ãªãããšã©ãŒã¯é 延åŠçã§ãããããããé¡èã«ãªããŸãã
ãžã§ããªãã¯ã¹ã®æ¬ åŠããã€ã©ãŒãã¬ãŒãã®åŸåãGCããªãœãŒã¹å¶é/ã¢ã«ãŠã³ãã£ã³ã°ã®æ¬ åŠãããã³ã³ã³ãã€ã©ãŒã®æ©èœãç解ããŠããªãPHPåå¿è ããçæãããã¯ãŒã¯ããŒãã®ããã«Goã®äœ¿çšããããŸããã HaskellãCïŒãªã©ã¯ãšã©ãŒåŠçãããªãããŸã解決ããŸãã... Go 2ã®ææ¡ã¯ã以åã®ããã«æ瀺çãªã±ãŒã¹åŠçãããã°åé¡ãªãããã«èŠããŸãïŒäžæïŒã
ãšã©ãŒåŠçã¯ããã°ã©ãã³ã°ã®äžå¿ã§ãã ããžãã¹ããžãã¯ã®ã¢ããªã³ã°ïŒè€éã§ããïŒã¯ããã®ããžãã¯ãçæããç¡å¹ãªæ¡ä»¶ã«å¯Ÿå¿ãããããåžžã«ç°¡åã§ãã ãšã©ãŒã転éããã ãã§ã¯ãã³ãŒãã®èããããŸãã Goããã®åäœã奚å±ããªããããšã©ãŒç®¡çãã¿ãŒã³ãä¿é²ããããšãæã¿ãŸãã åå¿è ã¯ãäžå€®ã®ãšã©ãŒç®¡çãããã«éèŠã§ããããç解ããŠããªãããããã®ãã¹ãŠã®ãšã©ãŒåŠçã³ãŒããšæ··åãããããšããããããŸãã
try
ãã«ãã€ã³ã¯ãšã©ãŒãã©ããããŠå°ãã§ãæ
å ±ãè¿œå ããã®ã«åœ¹ç«ããªãã®ã§ãå®å
šã«åæããŸãã
try
æžãæããåã«ïŒ
_, err := doSomething()
if err != nil {
return nil, errors.Wrap(err, "failed to do something")
}
_, err = doOtherThing()
if err != nil {
return nil, errors.Wrap("failed to do the other thing")
}
try
æžãçŽããåŸã®æ§åãæ³åããŠã¿ãŠãã ããã
try
ãåŒæ°ãæ¬åŒ§ã§å²ãããšã«ããããã§ã«1åŒæ°é¢æ°ã®ããã«æ©èœããããããšã©ãŒã©ããã³ã°ã³ãŒãã§ãã2çªç®ã®åŒæ°ãåãå
¥ããããšãã§ããŸãã
try(extract_value(try(get_data(1), errors.Wrap(err, "failed to get data")), errors.Wrap(err, "failed to get data")))
err
å€ãæé»çã«å°å
¥ããå¿
èŠãããå ŽåïŒè¡ççãªæ¹æ³ã§ïŒã 次ã«ã try
ã1åŒæ°é¢æ°ãšããŠäœ¿çšãããå Žåããšã©ãŒã¯å€æŽãããã«è¿ãããŸãã
ç§ã¯åæããŸãããšã©ãŒåŠçãå°ãç°¡åã«ãããããããªãå¯äžã®ãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãã¯ãé¢æ°ããè€æ°ã®ãªã¿ãŒã³ããããšãã«æ¬¡ã®ãããªããšããããŠãããŸã...ã¢ã³ããŒã¹ã³ã¢ã¯ãªã¿ãŒã³ã¿ã€ããäœã§ããããã©ã«ãå€ã«ãªããŸã
if err != nil {
return _, _, err
}
@sorenvonsarvortããã¯
var errContext string
defer func() {
// err is a named return
if err != nil {
err = fmt.Errorf("%v: %w", errContext, err)
}
}()
errContext = "failed to do something"
_ := try(doSomething())
errContext = "failed to do other thing"
_ := try(doOtherThing())
ç§ã®ç解ã§ã¯ãã³ãŒãã®ç¹å®ã®ã»ã¯ã·ã§ã³ãæ確ã§ããã°ã if err != nil { ... }
䜿çšããããšãã§ããŸãã
try
ã¯ä»ã®å Žåã«èŒããŸãã 次ã®ãããªãã®ãæ³åããŠã¿ãŠãã ããã
func trySomeComplexOp() (r result, err error) {
a := try(step1())
b := try(step2(a))
c, d := try(step3(b))
return try(lastStep(c, d)), nil
}
äžèšã®ã³ãŒãã®ãããªã³ãŒãã¯ã if err != nil
ãããã¯ãæ¯ããããå¿
èŠãããå Žåãããã¯ããã«ã¯ãªãŒã³ã«ãªãå¯èœæ§ããããŸãã Goã¯ãç·åœ¢ã®èªã¿ããããããã¹ãŠãªã®ã§ã try
ã¯ãã®ç®çã«åãã£ãŠããŸããããšæããŸãã
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
ããã¯ããŒã«ã«ã®ãã€ããªãã£ã§ããããããã®ããªãã®éšåãGoã䜿çšããŠããªãã«éããããŸããã
@sirkonãã®å£°æã®æ ¹æ ã¯äœã§ããïŒ
@sorenvonsarvortããã¯
äžèšã®ã³ãŒãã®ãããªã³ãŒãã¯ã
if err != nil
ãããã¯ãæ¯ããããå¿ èŠãããå Žåãããã¯ããã«ã¯ãªãŒã³ã«ãªãå¯èœæ§ããããŸãã Goã¯ãç·åœ¢ã®èªã¿ããããããã¹ãŠãªã®ã§ãtry
ã¯ãã®ç®çã«åãã£ãŠããŸããããšæããŸãã
ãã·ã¢ã§ã¯ãããããÑкПМПЌОÑМаÑпОÑÐºÐ°Ñ ããšåŒãã§ããŸãã æå³ãç解ããããã«ã°ãŒã°ã«ç¿»èš³ã䜿çšããŠãã ããã
ãŸã èªãã§ããªããã®ã¹ã¬ããã®äººã«ã¯ãå
ã®try
ããããŒã¶ã«ã®åé¡ã«é¢ãããã®ã³ã¡ã³ããèªãããšããå§ãããŸãã äžè¬çãªãšã©ãŒã³ã³ããã¹ãã®ãã¹ããã©ã¯ãã£ã¹ãšããããtry
ã©ã®ããã«è¡šçŸããããã«ã€ããŠèª¬æããŸãã
ãããããGoã³ãã¥ããã£ã§ã¯ãšã©ãŒã³ã³ããã¹ããå°ãç¬æçã«ãªã£ãŠãããšæããŸãã ç§ã¯å人çã«ããã«é¥ãããšã©ãŒãé床ã«æèåããŠãéåžžã«é·ããå埩çã§ãèªã¿ã«ããã¡ãã»ãŒãžããããããããšãç¥ã£ãŠããŸãã ãšã©ãŒãã³ã³ããã¹ãåããã¿ã€ãã³ã°ãšããªãã¿ã€ãã³ã°ã«é¢ããŠã¯ãå€ãã®ãã¥ã¢ã³ã¹ããããŸãã
try
ã¯åºæ¬çã«ã·ã§ãŒãã«ããã§ããããã€ã©ãŒãã¬ãŒãã³ãŒããæžããããšã奜ãã§ãã ãã ãããšã©ãŒãè¿œå æ
å ±ã§ã©ããããæ©èœã¯å€±ãããŸãã ãã ãã次ã®å€æŽã§ä¿®æ£ãããå¯èœæ§ããããŸãã
f := try(os.Open(filename))
ã«ãªããŸã
f := try(os.Open(filename), "open data file")
ãã¡ããããã以äžã®ããšãããå¿
èŠãããå Žåã§ãã err != nil
ãã§ãã¯ãè¡ããå®å
šãªãæ¹æ³ã¯åŒãç¶ãå©çšã§ããŸãã
ç§ã¯ããã«åæããŸãããæçµçãªæèŠãè¿°ã¹ãåã«ãå€æŽã«ã€ããŠããå€ãã®çµéšãç©ããšãããŽãŒããŒã ããã®èŠæ±ãå°éããŸãã
ããããå€æŽã«é¢ããç§ã®äºåçãªçµéšã¯ããããæ¬åœã«äžå¿
èŠã§ããããšãæ¯æããŠããããã§ãã ç§ã¯ããããçŽ1äžè¡ã®2ã€ã®ãçŸå®äžçãã®ããã°ã©ã ãæã£ãŠãããäž¡æ¹ã§ããããŸãã ããã¯ãã©ã¡ããåžžã«ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ãããšããäºå®ã«ãã£ãŠç°¡åã«èª¬æãããŸãã Goã«ã¯ä»ã«ãå°ããªãããã¡ããããã°ã©ã ãããã tryhard
ã¯ããã®ãã¡ã®1ã€ã§try
ã䜿çšã§ããã±ãŒã¹ã1ã€èŠã€ããŸããããããã ãã§ãã
ä»ã®äººãç§ãšã¯ç°ãªãæ¹æ³ã§ãšã©ãŒãåŠçããå¯èœæ§ãããããšãèªãã try
ãç©æ¥µçã«äœ¿çšã§ããå¯èœæ§ãèªããŸãã tryhard
ãœãŒã¹ã³ãŒãèªäœã«ã¯ã return err
é£ç¶ããã±ãŒã¹ãããã€ããããŸããããã¯ã try
ã䜿çšããå Žåãèªã¿ããããããã»ã©æãªãããããšã¯ãªããšæããŸãã ãããã誀çšã¯èªã¿ãããã«åœ±é¿ãäžããã®ã§ãç§ã¯èª€çšãæããŠããŸãã è¯ãäŸãããã«ãããŸãã ãããŠãäœãè¯ã䜿ãæ¹ããå€æããããšã¯ããŸã£ããå¥ã®è©±ã«ãªããŸãã
ãŸããèªåã§ããã°ã©ã ãå®è¡ããªããŠããéåžžã¯goã³ãŒããèªã¿åãããšãã§ããæ¹æ³ã奜ãã§ãã ããã«ãããç¹ã«ä»ã®èšèªã§èŠãä»ã®try
ãšã¯ç°ãªãããšãè¡ãããã try
ãè¡ãéæ³ãåŠã¶å¿
èŠããããŸãã ããã¯ããã®èšèªãåããŠäœ¿çšãã人ã«ãåœãŠã¯ãŸããŸããããã¯ããå¿
èŠãªæ©èœã ãããåããŠããããšã§ã·ã³ãã«ã§ããããšã«èªããæã£ãŠããèšèªã§åŠã°ãªããã°ãªããªããã1ã€ã®æ©èœã§ãã
åŸ ã£ãŠèŠãŠã¿ãŸãããã ç§ã¯ãã®å€æŽããã£ãšå®éšããã€ããã§ããããããç§ã®ç«å Žãå€ãããšã¯ç¢ºä¿¡ããŠããŸããã
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
@icholyç§ãèšã£ãããã«ãç§ã¯ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããã®ã奜ãã§ãã ãã®ç¹ã§ãç§ã«ãšã£ãŠãããåçåããããšã©ãŒåŠçããšã¯ããã®ã³ã³ããã¹ããæäŸããããããæ
å ±ãååŸããããã®ããè¯ãæ¹æ³ãæå³ããŸãã ããšãã°ããšã©ãŒã«è¿œå ãããã¹ãŠã®ã³ã³ããã¹ãã§ããšã©ãŒã®åå ãã¿ã€ã ã¢ãŠãã§ãããã©ããããã³ã³ããã¹ããã«å°ããã®ã¯ç°¡åãªã¯ãã§ãã ããããããã§ã¯ãããŸããã éåžžã pkg/error
ã䜿çšããããç¬èªã®ããšã©ãŒæ§é ããäœæããããå®è£
ã«ãã£ãŠã¯æååæ€çŽ¢ãå®è¡ã§ããã¡ãœãããäœæããå¿
èŠããããŸãã ããããããŸã«1ã€ã®if
ãç¯çŽãããã®ããããæ§é äœãã¡ãœããå
šäœãäœæããããšããç§ãæãäœããèŠãããšæããŸãã ãããŠã以åã«èšãããããã«ããã®å€æŽãåºæ¬çã«ãšã©ãŒãå®éã«åŠçããªãããã®ãã䟿å©ãªæ¹æ³ãæäŸããŠãããšãããããæ¬åœã«ããšã©ãŒåŠçããšåŒã¶ããšãã§ããŸããïŒ
try
ã¯è€éã ãšæããŸããïŒ
åç¬ã§try
ã¯è€éã§ã¯ãããŸããããèšèªã®å€æŽã¯åç¬ã§ã¯èæ
®ãããŸããã æ€èšïŒ
if err != nil {return ... errors.Wrap() }
ã代ããã«äœ¿çšããå¿
èŠãããå Žåã«ã try
ã䜿çšãããšèªã¿ããããäœäžãããããèªã¿ããããäœäžããŸãããšã©ãŒããã§ãã¯ããç°¡åãªæ¹æ³ããããåçŽãïŒãšã©ãŒããã§ãã¯ããåäžã®æ¹æ³ãæã€ïŒã®æ¹ãéèŠã§ãããšããææ ãäžã«ç¹°ãè¿ããŸãã
ãšã©ãŒãåŠçããæ¹æ³ã¯ããã®ã°ããŒãã«ã¹ããŒãã¡ã³ãã䜿çšããããšã§ã¯ãããŸãããããããç¡èŠããããã®ã§ããå Žåããããã¯ç¶æ³ã¯ã©ã®ããã«åŠçãããŸããïŒ ä»ã®ããã°ã©ãã³ã°ãã©ãã€ã ãä»æ¥ãšã©ãŒãåŠçããã®ã§ãããè¯ããšã©ãŒåŠçããµããŒãããŸãããç¡èŠããªãã§ãã ãã
try
ææ¡ã«åé¡ã¯ãããŸãããïŒ
å€ãåäœã䜿çšãããå ŽåããŸãã¯ä»ã®æ¹æ³ã§ãšã©ãŒãåŠçããå¿
èŠãããå Žåã¯ãå€ãæ¹æ³ãåå©çšããŠã¿ãŸãããïŒ try
æ§æã䜿çšããŠããéŠãæŒã人ã¯èª°ãããŸãããïŒ
try
æ§æã¯åçŽã§ãå®åã³ãŒããæžããããã®çŸããæ¹æ³ã§ããããªãgopherããµãã£ãºã ãæããŠããã®ãããããŸããã
ãããã¯ã1è¡ã«ãšã©ãŸãå Žåã1ã€ã®ã¹ããŒãã¡ã³ãã衚瀺ãããããã«gofmtãå€æŽãããå Žåã¯ã©ããªããŸããïŒ
ããããã°ãã©ããããããšã©ãŒãåŠçããã®ã«ãã»ãšãã©ã®å Žå3è¡ã§ã¯ãªã1è¡ããããããªãå¯èœæ§ããããŸãã ããã«ããããšã©ãŒåŠçã«ãã£ãŠå ããããåçŽæ¹åã®ã¹ããŒã¹ãåæžããããšã©ãŒåŠçãå¹³åçãªé¢æ°ã®åçŽæ¹åã®ã¹ããŒã¹ã®åå以äžãå ããŠããªãããã«èŠããŸãã
ãããã©ã®ããã«èŠãããã§ãïŒ
// we already have an err in scope
err = frub.Confozzle(foo, bar, baz)
if err != nil { return errors.Wrap(err, "confozzling didn't work") }
ãããããGoã³ãã¥ããã£ã§ã¯ãšã©ãŒã³ã³ããã¹ããå°ãç¬æçã«ãªã£ãŠãããšæããŸãã ç§ã¯å人çã«ããã«é¥ãããšã©ãŒãé床ã«æèåããŠãéåžžã«é·ããå埩çã§ãèªã¿ã«ããã¡ãã»ãŒãžããããããããšãç¥ã£ãŠããŸãã ãšã©ãŒãã³ã³ããã¹ãåããã¿ã€ãã³ã°ãšããªãã¿ã€ãã³ã°ã«é¢ããŠã¯ãå€ãã®ãã¥ã¢ã³ã¹ããããŸãã
ãšã©ãŒã©ããã³ã°ãšã¹ã¿ãã¯ãã¬ãŒã /ãšã©ãŒå°å·ã®ãã®ã¯ãã¯ããã«ç°¡åã«ãªããŸãã ãã®ãã¡ã«è¯ã解決çããããšæããŸãããä»ã¯ããã§ã¯ãããŸãããå人çã«ã¯ããã©ã¡ããªãã¯å€åã解決ãããŸã§ããã匷åãªgo2æ©èœã®å°å ¥ãåŸ ã¡ãããšæããŸããããã¯ãæ®ãã®æ©èœãèšèšãããšãã«åœ¹ç«ã€å¯èœæ§ãããããã§ãã
ãã®ãŸãŸã«ããŠããããšã«å®å šã«åæããŸãã å°ãåé·ãããŸãããåŸãã®ã¯ããªãç°¡åã§ãã
æžããããšãã§ããã°
if err := foo.x(a, b); err != nil {
return err
}
if err := foo.y(); err != nil {
return err
}
if err := foo.z(c); err != nil {
return err
}
ã®ãããªãã®ã«
if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil {
return err
}
ã€ãã£ãªã ãããŸãå€ããªããŠããããããããŸããã
@henvicããã«é¢ããåé¡ã¯ã3ã€ã®ãšã©ãŒãåãæ¹æ³ã§åŠçããããšæ³å®ããŠããããšã ãšæããŸãã Goã䜿çšãããšãåãšã©ãŒãåå¥ã«åŠçããæ¹æ³ãèããå¿ èŠããããŸãã åå¥ã®ãšã©ãŒãã§ãã¯ããããšããããæ確ã«ãªããŸãã ãããã1ã€ã«éçŽãããšãéçºè ã¯èªç¥çã«æ»ã£ãŠç¢ºèªããå¿ èŠããããŸãããããã®ãšã©ãŒã¯_æ¬åœã«_åãããã«åŠçããå¿ èŠããããŸããïŒ ãã®ææ¡ã§ã¯ãæ確ãã倱ãããããŒã¹ãããŒã¯ãæ°åå°ãªããªããšãšã©ãŒã«ã€ããŠèããå¿ èŠãçãããšæããŸãã
@sanbornm ãããªãã¯æ£ããã§ãã åæããŸãã
ãã®check
ã¯ã1ã€ã®æ»ãåŒæ°ã®ã¿ãåããæåã®ãŒã以å€ã®å€ïŒnullãªã©ïŒã§è¿ãcheckNonZero
æŒç®åã§ããå¯èœæ§ããããŸãã ããããææ§ãããŠãèšèªã«ããã«åœ±é¿ãäžããããšã«å ããŠã ããšãã°ãio.EOFãæåŸ
ããŠããå Žåã¯ã䜿çšãã¹ãã§ã¯ãªããšãããã³ããå°ãã§ãäžããããŸãã å¥ã®å¯èœæ§ã¯ããããããå°ãªããšãæãäžè¬çãªã±ãŒã¹ïŒãã€ãããèªã¿åããšãã®io.EOFãªã©ïŒãç¥ãããããã«go vet
ãé Œãã«ããããšã§ã...ãããããã®ã¢ã€ãã¢ã¯åŸæã§ã¯ãããŸãããã¹ãŠç§ã«ã
try
ææ¡ã«åé¡ã¯ãããŸãããïŒ
å€ãåäœã䜿çšãããå ŽåããŸãã¯ä»ã®æ¹æ³ã§ãšã©ãŒãåŠçããå¿ èŠãããå Žåã¯ãå€ãæ¹æ³ãåå©çšããŠã¿ãŸãããïŒtry
æ§æã䜿çšããŠããéŠãæŒã人ã¯èª°ãããŸãããïŒ
try
æ§æã¯åçŽã§ãå®åã³ãŒããæžããããã®çŸããæ¹æ³ã§ããããªãgopherããµãã£ãºã ãæããŠããã®ãããããŸããã
ç§ãã¡ã¯çãã³ãã¥ããã£ã«äœãã§ããŸãã ç§ã¯æ¯æ¥ãä»ã®äººãæžããããããã®ã³ãŒããæ±ã£ãŠããŸãã ã§ããããèšèªãå€ããŠãã䜿ããªããŠã圱é¿ãåããŸãã
倧èŠæš¡ãªãããžã§ã¯ãã§ã¯ãææªã®ãã°ã¯ã誰ããæžããããšãå¿ããé¢æ°ã«ãã£ãŠçæãããŸãããã®é¢æ°ã¯ãããã±ã¢ã³ãäŸå€ãã³ãã©ãŒãå®è¡ãããŸã§äœããã£ãããããªãã£ãæ±çšnew Exception()
ãã¹ããŒããã©ã€ãã©ãªãåŒã³åºãã©ã€ãã©ãªãåŒã³åºãã©ã€ãã©ãªãåŒã³åºããŸããäžè¬çãªãšã©ãŒããã°ã«èšé²ããŸããã 2çªç®ã«æªããã®ã¯åãã§ãããäžå¯è§£ãªæ°çŸè¡ã®ã¹ã¿ãã¯ãã¬ãŒã¹ããããæçµçã«åå ãçªãæ¢ããããšãã§ãããšæããŸãïŒå¹žãã github.com/<us>/<ourproject>
ãæ€çŽ¢ããã ãã§ãé¢é£æ
å ±ã®ã»ãšãã©ãèŠã€ãããŸãããæã
ãããããããŸãïŒã ãã®ååã«ããããããããäŸå€ãã¯å€§ããªJavaãããžã§ã¯ãã§ã¯æ²æšãªã»ã©äŸå€çã§ã¯ãããŸããã
äžæ¹ãåé·ãªã³ã³ããã¹ããããããããå Žåã§ããéèŠãªã³ã³ããã¹ããã©ããã«åã蟌ãããšã«ç±å¿ã«åãçµãã§ããéãã "narf: Error unpoiting the zort: foo: Unexpected bar in baz: {\"ork\": \"morpork\"}"
ãããªåçŽãªGoãšã©ãŒæååã¯ïŒç§ã®çµéšã§ã¯ïŒéåžžã¯éåžžã«ç°¡åã«è§£éã§ããŸããå®éã®ãšã©ãŒå€ã éèŠãªã³ã³ããã¹ããæ¬ èœããŠããããšãå€æããå Žåãããã¯éåžžããªãæçœã§ãã ãã®ãããªå Žåã®ãä¿®æ£ãã¯ãã³ã³ããã¹ããè¿œå ããŠå¥ã®ãšã©ãŒãåŸ
æ©ããããšã§ãããããå®å
šã§ã¯ãããŸãããããã©ã³ã¹ããšããšãã¹ã¿ãã¯ãã¬ãŒã¹ãã¹ã¯ããŒã«ããããäŸåé¢ä¿ã®äŸåé¢ä¿ã«äŸåããŠãã¹ããŒããããããããããåªå
ããŸãã ããŸãã¯ãçºçãããæ£åžžãªãšã©ãŒã¡ãã»ãŒãžã panic()
ãšããååããã»ãšãã©ã®Goéçºè
ãæ¬è³ªçã«åãèšèªæ©èœãèªç±ã«å±éããããšã劚ããŠããããã«èŠããããšãæ¬åœã«æè¬ããŠããŸãã çµå±ã error
ãšpanic
åããã®ã«ããªãããã«ããŸãããã
é¢æ°ã«12ã»ã©ã®é害ã¢ãŒããããããããã®å€§éšåãåããšã©ãŒã¡ãã»ãŒãžã«å€ããç¶æ³ã«ééããããšããããŸãã ç¹°ãè¿ãã¯å®éã«ã¯æ°ã«ãªããŸããããéåžžãç§ã®ããŒã ã«ã¯ä»ã®èª°ããæ°ã«ãªããŸãããã®ããããããã®äžè¬çãªãšã©ãŒãåŠçããããã«ãé¢æ°ã®éå§æã«ã¯ããŒãžã£ã宣èšããããšã§åŠ¥åããŸãã
func foo(a, b, c SomeArgType) (x, y, z SomeReturnType, err error) {
handleError := func(handleErr error) (x, y, z SomeReturnType, err error) {
log.WithFields(logrus.Fields{
"package": "foo",
"func": "foo",
"arguments": map[string]SomeArgType{"a": a, "b": b, "c": c},
"error": handleErr,
}).Error("Error fooing the bar")
return reasonable, default, values, handleErr
}
err := doABunchOfThings()
if err != nil {
return handleError(err)
}
}
確ãã«ãããã¯ããã€ãã®ç¹ã§ãŸã äžå®å
šãªè§£æ±ºçã§ãã ãããããããè¡ãããšã§ãå°æ¥ã®éçºè
ããå¶åŸ¡ãããŒãããŸãé£ã³åãããšãªãã foo
ããã€äœãè¿ãããéåžžã«ç°¡åã«ç解ã§ããããã«ãªã£ãããšãæ°ã«å
¥ã£ãŠããŸãã
ã©ããããããããã®ç¹°ãè¿ãã®ãåé¡ãããïŒç§ãéåžžèŠãŠããããã«ïŒéå äžå¯èœãªè€éãªããã±ãŒãžå ã®å°æ°ã®éå äžå¯èœãªè€éãªé¢æ°ã«éå®ãããã®ã§ã¯ãªããå€æ°ã®ããã±ãŒãžå šäœã§éåžžã«äžè¬çã§ããå Žåããããžã§ã¯ãå šäœã®ããã¡ã³ã¯ã¿ãŒãã䜿çšããŠåæ§ã®ç®çã§ãããïŒããæ¯ïŒãã©ã¡ããªãã¯åã®æŠå¿µãèšèªã«è¿œå ãããå Žåãtry / catchã«äŸåããããšãªãããšã©ãŒåŠçãã¡ã¯ããªãã¡ã¯ããªã®èåŸã«ããã«è©³çŽ°ãé ãããšãã§ããŸãã
@thomasf
ãšã©ãŒã©ããã³ã°ãšã¹ã¿ãã¯ãã¬ãŒã /ãšã©ãŒå°å·ã®ãã®ã¯ã¯ããã«ç°¡åã«ãªããŸã
åæããŸãã
å人çã«ã¯ããã©ã¡ããªãã¯å€åã解決ãããŸã§ããã匷åãªgo2æ©èœã®å°å ¥ãåŸ ã¡ãããšæããŸããããã¯ãæ®ãã®æ©èœãèšèšãããšãã«åœ¹ç«ã€å¯èœæ§ãããããã§ãã
å
ã®try
ææ¡ã®äœäººãã®äººã
ã¯ããžã§ããªãã¯ãåŸ
ã€ããšã«ã€ããŠãè°è«ããŸãããããã©ã¡ããªãã¯å€åãtry
ææ¡ãã©ã®ããã«å€ãããã¯ç§ã«ã¯ããããŸããã ãã§ã«çµã¿èŸŒãŸããŠããã®ã§ãèšèªã§è¡šçŸã§ãããã®ã®å¶éã«éå®ãããŸããã
@icholy
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
ããã«å¯Ÿå¿ããããã ãã«ã è±åœã®EUé¢è±ãæ¯æããéåæ°ããããŸããã 確ãã«ãEUã¯äžè¬å€§è¡ã察å¿ããããã€ãã®äžå©ãªç¹ããããããŸãã ãããããã¹ãŠã®éžæè¢ãæ瀺ãããåŸã¯ãEUã«ãšã©ãŸãã®ã¯çµå±ããã»ã©æªãã¯ãªãããã«æãããŸããã
ããŠããããæ¿æ²»åããããšã¯ç§ã®æå³ã§ã¯ãŸã£ãããªããããªãã¯äžèšã«åæããªããããããŸããã ããããç§ã瀺ãããã®ã¯ã倧å€æ°ãæåã«äœããè¿·æã ãšèãããšããŠãããã¹ãŠã®éžæè¢ãæ€èšããåŸã§ãããããæåã®è§£æ±ºçã«ãªãå¯èœæ§ããããšããããšã§ãã
ç§ã¯ãšã©ãŒåŠçã«ã€ããŠåŒ·ãæèŠãæã£ãŠããŸããããããã¯ç©äºããã®ãŸãŸã«ããŠããããã®è°è«ã«ãªãå¯èœæ§ããããŸãã
ãããã§ãã·ã§ãã«ãªã³ãŒãã£ã³ã°ç°å¢ã§ã¯ãçŸåšã®ãšã©ãŒåŠçææ³ãå©çšããŠããã¬ãŒã¹ã·ã¹ãã ã«æ³šéãä»ãããã°ãè£ é£ŸããŸãã äœè«ã§ãããæé»çãªæ»ãã¯ããšã¯ã¹ããŒããããã©ã€ãã©ãªé¢æ°ã§ãããã¯ã䜿çšããã®ãšäŒŒãŠããããããŒå¶åŸ¡ã®å³æã®å¯èªæ§ãèŠãé ããŸãã
@icholy
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
ããã«å¯Ÿå¿ããããã ãã«ã è±åœã®EUé¢è±ãæ¯æããéåæ°ããããŸããã 確ãã«ãEUã¯äžè¬å€§è¡ã察å¿ããããã€ãã®äžå©ãªç¹ããããããŸãã ãããããã¹ãŠã®éžæè¢ãæ瀺ãããåŸã¯ãEUã«ãšã©ãŸãã®ã¯çµå±ããã»ã©æªãã¯ãªãããã«æãããŸããã
ãã®äººã®äž»åŒµãçå£ã«èããå¿
èŠã¯ãããŸãããçµµæåã®æ°ã¯ã人ã
ãäžè¬çã«try
ææ¡ãå«ããäžè¬çã«ãã®ããã®ãŸãŸãã®ææ¡ã奜ãããšã瀺ããŠããŸãã
ç§ã®å®è·µã§ã¯ãPSã¯ã¡ã€ã³ãã¡ã€ã³ïŒãããã¯ãŒã¯ãµãŒãã¹ãCLIãŠãŒãã£ãªãã£ïŒã§Goãå«ã倧å€æ°ã®äººã ãããã䜿çšããããšãããããŸããã ã ããç§ã¯åœŒãã®æèŠãç¡èŠããããšæããŸãã
try
ææ¡ãããåªãããç©è°ãéžãããšãå°ãªããªãã·ã§ã³ãå¿
èŠã§ãã
æ¥ãã§è§£æ±ºããç·æ¥æ§ã¯èŠåœãããªãã
@velovixãã©ã€/ãã£ãããšã©ãŒã®ãåŠçãããããã©ã¡ããªãã¯ããªã¢ãŒãã£ãºã ãå«ãã ãšæããŸããããããèšèªæ©èœã«ãªã£ãå Žåãå¥ã®çµã¿èŸŒã¿èšèªæ©èœã®å¿ èŠæ§ãåé¿ããããã€ãã®æ¹æ³ãèŠãããšãã§ããŸããã
äžã€ã«ã¯ã人ã ãç¹°ãè¿ããããªãã³ãŒãã¯ã次ã®ãããªå®åæã§ãã
foo, err := Foo()
if err != nil {
log(err)
}
bar, err := Bar(foo)
if err != nil {
log(err)
}
// ...
次ã«ããã©ã¡ããªãã¯é¢æ°ãåæšè«ãããã³_maybe_ãŸãã¯_optional_ã¹ã¿ã€ã«ã®ãªããžã§ã¯ããã¶ã€ã³ãã¿ãŒã³ã®ããã€ãã®çµã¿åããã¯ãå¥åŠãªéç·åœ¢å¶åŸ¡ãããŒæŠç¥ã«é Œãããšãªãããã€ã©ãŒãã¬ãŒããç°¡åã«ïŒhehïŒåæžããŸãã
func<T> DoWithErrorLogging(f func(any...) (T, error), args... any) T {
t, err := f(args...)
if err != nil {
log(err)
}
return t
}
// ...
foo := DoWithErrorLogging(Foo)
bar := DoWithErrorLogging(Bar, foo)
IMOããã¯ãã¹ãŠãGo1ãããã¯ããã«æªãã§ãããã ãããããã®_plus_ try / catchããŒã¯ãŒãããã®èšèªã§äœ¿çšããããã¯ãŸãã§ãã
æ£çŽãªãšãã...ä»ã®ãšãããGo2ã®ç§ã®ãæ°ã«å
¥ãã®ãç Žå£çãªãå€æŽã¯ãGo1ã®å°ããªäžäŸ¿ããã¹ãŠä¿®æ£ããã ãã ãšæããŸããããšãã°ã net/http
ããã©ã«ãã¯ãå¯å€å
±æã°ããŒãã«å
ã«ãã¹ããããå¯å€å
±æã°ããŒãã«ã§ãïŒ Hashicorpã®cleanhttp
æšæºïŒåºæ¬çã«ïŒããŸãã¯(*time.Timer).Reset()
ã«ãç¥ã£ãŠããå¿
èŠã®syscallããã±ãŒãžå
šäœãäœæããŸãã Go3ã¯ããã®çŽåŸã«ã人ã
ãæé·ããããè
«çãäœã§ããããªãªãŒã¹ããããšãã§ããŸãã 倧å°ã®é倧ãªå€æŽããã¹ãŠ1ã€ã®ãªãªãŒã¹ã§è¡ãå¿
èŠãããçç±ãããããŸããã
æ§ããã«äœ¿çšãããšã try
ã«è³æã§ãã 人æ°ã®ãããããžã§ã¯ãã§ã¯ãtryã䜿çšããŠãåé¡ããªããã©ããã«é¢ããã¬ã€ãã©ã€ã³ãè¿œå ãããå°èŠæš¡/æ°èŠ/ç¬èº«ã®ãããžã§ã¯ãã§ã¯ã try
ãåå ã§ããšã©ãŒãå°ãªããªãã䜿çšã§ããªããªãããšããããšæããŸãã
èšèªã«try
ãè¿œå ããŠããããã»ã©ã²ã©ãããšã¯ãªããšæããŸãã 人ã
ã®ææªã®å Žåã®æããæ ¹åºã«ããããšã蚌æãããå Žåããã®äœ¿çšã¯çãã²ãããã§ãããã çµéšã®æµ
ã人ã¯ç¡å·®å¥ã«äœ¿çšããŸãããä»ã®äººã¯äœ¿çšããŸããã ããã¯äžçã®çµããã§ã¯ãããŸããã
try
ãè¿œå ãããå Žåãç§ã¯ããããããã䜿çšããã§ãããã ãã®ãããªå Žåã¯ããšã©ãŒãè¿ãããŸãããå®éã«ãšã©ãŒãçºçããå¯èœæ§ã¯éåžžã«äœããšæããŸããã³ã³ããã¹ããè¿œå ããŠãæå³ãããããªãã®ã§ããã®ãŸãŸãšã©ãŒãè¿ããŸãã ããšãã°ã1 TBã§ããããšãããã£ãŠãããã£ã¹ã¯ãåãããã¡ã€ã«ã·ã¹ãã ãäœæããã°ããã®å Žåã1kbã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªãäœæããããã®ã¹ããŒã¹ãããããšã確信ã§ããŸãã ããã倱æããå Žåãç§ã¯ãšã©ãŒãç¡èŠããããããŸãã-ããã¯ä»ã®å Žæã®ãã°ãããŒããŠã§ã¢é害ãªã©ã瀺ããŠããå¯èœæ§ããããŸãããããããã¹ãŠã®ãã¡ããã¡ã-ããããããªããšã©ãŒã«æ³šéãä»ããããšã«åªåãã䟡å€ã¯ãããŸããã
tryïŒ..ïŒããå ¥åæã«èããããã«ãã³ãŒããŒã®ãã€ã³ãã¹ã¿ãã¯ã«ãã1çµã®æ¬åŒ§/ãã©ã±ãããé 眮ããæ¹æ³ã奜ãã§ã¯ãããŸããã ãããŠãç§ãæ³åã§ããæãé·ãéïŒ
ãããã£ãŠãããã¯ããè¯ãã§ãïŒ
å€ããšã©ãŒïŒ= fooïŒïŒ
errïŒ= nilã®å Žåã¯errãè¿ããŸã
ããããããã§ãããã¯éåžžã«äžè¬çã§ãã ã ããç§ã¯ãã®ãããªsmtãã©ããããããå¯èœã§ãããã©ãããæã¿ãŸãïŒ
å€ããšã©ãŒã確èªããŠãã ããïŒ= fooïŒïŒ
Goãèªã¿ãããèšèªã«ãªãããå Žåã¯ãèªã¿ã«ããããŸãã¯ç解ãã«ãããšèããèœåãæå°éã«æããå¿ èŠããããŸãã
Goãé©åãªãšã©ãŒåŠçãè¡ãããå Žåã¯ããšã©ãŒãã³ãŒã«ã¹ã¿ãã¯ãäžããšãã«ããšã©ãŒã«è¿œå ã®ã³ã³ããã¹ããæãããããã«ä¿ãå¿ èŠããããŸãã ãšã©ãŒãåŠçããããã«deferã䜿çšãããšããèŠä»¶ã¯ãçŽããããããã§ãã ãšã©ãŒãã³ãã©ã«ãšã©ãŒãããå Žåã¯ã©ããªããŸããïŒ å»¶æã¯ã¹ã¿ãã¯é ã«å®è¡ãããŸããããã³ãã©ãŒãéã«å®£èšããå¿ èŠããããŸããïŒ
ã¹ããŒãã¡ã³ããåçŽã§ãããã«ãããŸããã®äœå°ãã»ãšãã©ãªãå Žåã try
ã¯ãå®éã®ãšã³ãžãã¢ãªã³ã°ã®åé¡ã§ã¯ãªããåé¡ã解決ããŠããããã«æããŸãã ç§ã¯ãã®ææ¡ã奜ãã§ãããªããªãããããã®è€éãªææ¡ã®ããããåŽé¢ãå®å
šã«ç解ããããšãªãããµã€ã¬ã³ãããžã§ãªãã£ãæçµçã«çºèšã§ããããã§ãã
@icholy瀌åæ£ããããŠãã ããã Gopherã®è¡åèŠç¯ã«æ³šæããŠãã ããïŒ https ïŒ
çããïŒäžèšã®ç§ã®ã³ã¡ã³ãïŒhttps://github.com/golang/go/issues/32825#issuecomment-506740412ïŒã«å ããŠãhttpsïŒ//golang.org/wiki/NoPlusOneã«æ³šæããŠãã ããã ãåæããããŸãã¯ãåæããªãããšèšã£ãŠãæå³ããããŸããã 代ããã«çµµæåãã¿ã³ã䜿çšããŠãã ããã ããããšãã
@sanbornm
ïŒç§ã¯ã¡ãã»ãŒãžã«è¿ä¿¡ããããšãå¯èœã§ããããšã«åæããŸããããã¯åä»ã§äžå¯èœã§ã¯ãªããšèšããŸããããããŠããã®ããã¹ã¬ãããä»ã®ã³ã¡ã³ãã®çå¹éªã§å€±ããããšããç¹ã§ãã¹ã¬ããã«ã€ããŠã®ç§ã®ãã€ã³ãã¯ãŸã æ®ã£ãŠããŸããïŒ
ç§ãžã®ææ¡ã¯ãå€åã®åŒã³ãããæå³ããŸãã ãã®ç¹å®ã®åé¡ã¯åå€åã§ãã ãšã©ãŒåŠçãå€æŽããªãææ¡ãäœæããããšãææ¡ããŸããïŒ ææ¡äœå¶ã¯çŽ æŽããããšæããŸãããçŸç¶ã¯éå°è©äŸ¡ãããŠããŸãã
ææ¡Bãæ¡çšãã¹ãã§ã¯ãªããšèšã£ãŠææ¡Aãäœæããå¿ èŠã¯ãããŸããã 代ããã«ææ¡Bã«å察祚ãæããŠãã ããã ææ¡Bã®è©³çŽ°ã«ã€ããŠã¯ããã®ææ¡ãŸãã¯ã¡ãŒãªã³ã°ãªã¹ãã䜿çšããŠãã ããã
ïŒãã®å Žåã®ææ¡Bã¯ããã¯ãããŠããããšãç解ããŠããŸãããã®ææ¡ã«ã¯ã1æ¥ä»¥å ã«77ã®ã³ã¡ã³ãããããšããäºå®ãçç±ã瀺ããŠããŸãããã®ã¬ãã«ã®ãã£ã¹ã«ãã·ã§ã³ã¯ã課é¡è¿œè·¡ã·ã¹ãã ãããã¡ãŒãªã³ã°ãªã¹ãã§ããŸãæ©èœããŸããïŒ
@ianlancetaylor
ïŒç§ã¯ã¡ãã»ãŒãžã«è¿ä¿¡ããããšãå¯èœã§ããããšã«åæããŸããããã¯åä»ã§äžå¯èœã§ã¯ãªããšèšããŸããããããŠããã®ããã¹ã¬ãããä»ã®ã³ã¡ã³ãã®çå¹éªã§å€±ããããšããç¹ã§ãã¹ã¬ããã«ã€ããŠã®ç§ã®ãã€ã³ãã¯ãŸã æ®ã£ãŠããŸããïŒ
ååã«å ¬å¹³ã§ããããã¯çã«ããªã£ãŠããŸãã ã¡ãŒãªã³ã°ãªã¹ãã¯çŽ æŽãããã§ããããã®å Žåãå人çã«ã¯GitHubãä»ããŠæçš¿ããæ¹ãç°¡åã ãšæããŸãã çŸåšã®ãšã©ãŒåŠçãçŽ æŽãããããšä»¥å€ã¯èšãããšã¯ããŸããããŸãããããããå€ãããªãããšãé¡ã£ãŠããŸãã çµµæå/æ祚ã¯ããã«æé©ã§ãã 100人ã®ãæ祚ãã§ååãªã¡ãŒãªã³ã°ãªã¹ãã«ããšã©ãŒåŠçããã®ãŸãŸã«ããŠãããŠãã ããããš100人ãæžãããšã¯ããããæãŸãããããŸããã
ãã®åé¡ã¯ããã¯ãããŠãããããçµµæåã§ãæ祚ãããããšã¯ã§ããªããªããŸããã ãã®ããããã®åé¡ã¯ããããäœæããããšæããŸãã
å¯æ¬¡çãªç¹ã§ãããé¢é£ããäŸåé¢ä¿ã®ç®¡çã¯ããŸãåŠçãããŸããã§ããã Depã¯ããŸãæ©èœããã©ããããšããªãgo modãéžæãããŸããïŒèŠãç®ããïŒ[1]ã ãããææ¡å¶åºŠãã§ããçç±ã ãšæããŸãã ãã®å Žåã®ææ¡ã·ã¹ãã ã¯ãåé¡ãããã¯ãããŠããŠãã¡ãŒãªã³ã°ãªã¹ãã«è¡ãããã«èšãããå Žåãã³ãã¥ããã£ãéå°è©äŸ¡ããå¯èœæ§ããããšæããŠããŸãã
[1] https://twitter.com/_rsc/status/1022588240501661696
ç·šéïŒGoããŒã ãšã³ãã¥ããã£ã¯ãã»ãšãã©ã®å Žåãã³ãã¥ããã£ã®ãã£ãŒãããã¯ãèããŠçŽ æŽãããä»äºãããŠããŸãã ç§ã¯ããã«å ¥ããã¹ãŠã®ä»äºã«æè¬ããŸãã Go調æ»ã¯è¯ãäŸã§ãã
@sanbornm
Depã¯ããŸããããŸãã
ããã§å察ããå¿ èŠããããŸãã Goã¢ãžã¥ãŒã«ã¯ã httpsïŒ //proxy.golang.orgã«ããæ°žç¶çãªãã£ãã·ã¥ã«é¢ãããããç¥ãããŠããªããgobindataãã®åé¡ãæçµçã«è§£æ±ºããŸãã
ãã®æ åœè ã¯åé¡ã«æ°ã¥ããã代ããã«VCSãä»ããŠæŽŸæãªãä¿èšŒããããã£ãŠããŸããã
@sirkonããã¯å°ãå€ãããããã¯ã§ãããDepãè¡ã£ãŠããããã«ãã³ããŒã®depãè¡ã£ãŠããå Žåã¯ããã®ããããå¿ èŠãããŸããã
çŸç¶ã§ã¯ã1è¡ã«1ã€ã®tryã¹ããŒãã¡ã³ãã®ããã«ãå¶çŽãè¿œå ãããªãéãããã®ãŸãŸã«ããŠããã»ãããããšæããŸãã ãã®çç±ããããã®äŸãèããŠããã®ææ¡-ããã¯ååã«ç¡å®³ãšæãããinfo := try(try(os.Open(file)).Stat())
ããããã¯éåžžã©ã®ãããªå¶åŸ¡ãããŒã®ç¯å²ãè¶
ããŠãã¡ã€ã«ãã³ãã«ããªãŒã¯ããŸãã io.Closer
å®è£
ããããã³ã³ãã¯ããªã³ãŒããè¿œæ±ããããã«äººã
ãåé¿ããå¯èœæ§ã®ãããã®ä»ã®ã¯ãªãŒã³ã¢ããé¢æ°ã䜿çšãããšããã¡ã€ã«ãªãœãŒã¹ãªãŒã¯ãå¢å ãããšæããŸãã
fãã©ã€ãã§ã¯ãªããªããããã«GCã®å¯Ÿè±¡ã«ãªããããæç¹ã§ãã¡ã€ãã©ã€ã¶ãŒãfã確å®ã«éãããããéèŠã§ã¯ãªããšèãã人ããããããããŸããã ããã«ãããé¢æ°ãããã¯ã«ãã€ã³ããããŠãããä»æ¥ã®deferã䜿çšãããšãã以åã®æ確ãªïŒãªã³ã¿ãŒã§ãµããŒããããŠããïŒèŠåãå€æŽããããšæããŸãã æ©èœãããã¯ãçµäºãããšããªãœãŒã¹ã解æŸãããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«äŸåããŠãããªãœãŒã¹ã䜿ãæãããªããšããä¿èšŒã¯ãããŸããïŒéåžžãéããŠãããã¡ã€ã«ãã³ãã«ã®å¶éã®ããã©ã«ãã¯1kãã4kã®éã§ãïŒãããã¯ãåçŽãªãã¡ã€ã«ãã¹ã§ç°¡åã«è¶ ããããŸãã
èŠçŽãããšãå®è£ ããããã®æ§æã¯ãctor / dtorããªãããªãœãŒã¹ãªãŒã¯ãé²ãããã«ã³ãŒããããã¯ããé ãé¢ããäœã¬ãã«ã®GCæ©æ§ã«äŸåããŠãããããGoã®ãªãœãŒã¹ç®¡çã«åŸ®åŠãªãªã¹ã¯ããããããšæããŸãã ç¡å®³ãšæããããã®ãæœåšçãªãšã©ãŒç¶æ ïŒéããŠãããã¡ã€ã«ãå€ãããïŒã«å€ããã
var n int
for _, name in try(os.Readdir(...)) {
n += try(getSize(name))
}
func getSize(name string) (int, error) {
return try(try(os.Open(name)).Stat()).Size
}
ç·šéïŒ
å¶çŽã«ã€ããŠã¯ã a, b := try(get("a")), try(get("b"))
ã§ååã§ãããããå²ãåœãŠã®å³åŽã§ã®ã¿æå¹ã§ããå Žåã¯ã1è¡ã«1ã€ãšèšããããé©åã ãšæããŸãã ãã ããããã§ãtry(os.Open(name)).Stat()
ãå®è¡ããæ©èœã¯æ®ããŸããããã¯ãtryïŒïŒãç¡å¹ã«ããå Žåã«éããŸãããå²ãåœãŠã®RHSã«ãªãå Žåã«ã®ã¿ã次ã®ããã«æ©èœããªããã®ãæ®ããŸããå
šãŠã
@cstocktonãããçŽ æŽãããçºèŠïŒ
Rustã«ã¯å®éã«ã¯åæ§ã®ãã¯ãïŒç§ãæ£ããèŠããŠããã°?
ïŒãããããã®try
æå³ãããšããã«åäœããŸãããé©åãªraiiãããããããã®èšèªã§ã¯åé¡ã¯ãªãã巚倧ã§ãç§ãã¡ã®å Žåã®ç©Ž
@sanbornmãããããªãã®ãªããžããªã«ã€ã³ã¿ãŒãããã®ååãä¿æããããšã¯ç¢ºãã«çŽ æŽãããã¢ã€ãã¢ã®ããã«èŠããŸãã
try
æéãšåŽåãç¯çŽã§ããå Žæã®æ°ãæ°ãããŠãŒãã£ãªãã£ã«ã€ããŠèª°ããèšåã
| ãããžã§ã¯ã| LOC * | åè£è
ãè©Šã|
| ---------- | ------ | ---------------- |
| cal1 | 2047 | 3 |
| pump1 | 1030 | 0 |
| docs1 | 4576 | 8 |
| hugoutil | 604 | 1 |
| ä»ã®ãã¹ãŠ| 8452 | 23 |
cloc
ãŠãŒãã£ãªãã£ã«åŸã£ãŠãã³ã¡ã³ããé€ããŠã³ãŒãã®ã¿ãå®è¡ããŸããããã®ä»ãã¹ãŠãã®å 容ã«ã¯ãGoãåŠãã§ãããšãã«æžããç°¡åãªããã¯ãšã³ãŒããå«ãŸããŠããããšã«æ³šæããŠãã ããã
ç§ã®å
šäœçãªçµè«ã¯ãå°ãªããšãç§ã«ãšã£ãŠã¯ã try
ææ¡ã¯ãç§ã®ãšã©ãŒåŠçã䟡å€ã®ããçšåºŠãŸã§åçåããã®ã«åœ¹ç«ããªããšããããšã§ãã
ç§ãè¡ãã®ã倧奜ããªæ倧ã®çç±ã¯ããã®ä»æ§ãã³ãŒããŒãä»ã®èšèªã§å©çšå¯èœãªæ§æã®å°ããªãµãã»ããã«å¶éããŠããããšã§ãã ããã¯éåžžã«å°ããªæ©èœã»ããã§ãããããæ©èœã»ããå
šäœãç°¡åã«åŠã¶ããšãã§ããŸãã å°æ¥ã®éçºè
ã¯ããããç§ã®ã³ãŒããèŠãŠãç§ãäœãããããç¥ãããšãã§ããŸãã èšèªã«æ°ãããã®ãè¿œå ããããã³ã«ãå°æ¥ã®éçºè
ããã®ããšãç¥ãå¯èœæ§ãäœããªããŸãã æ»ããããåã®æ¥µç«¯ãªéšåã¯ãC ++ãscalaã®ããã«ãè€éãã®ããã«ç解ãã«ããèšèªã§ãã
go1ã«æ§æãè¿œå ãããªãããã«ãããã®ã§ããã代ããã«go2ã«å
¥ããŠãã ããã
@miekgãã®ãªã³ã¯https://github.com/golang/go/issues/32825#issuecomment-506882164ãææ¡ã«è¿œå ããŠãã ããã ãã®äŸã§ã¯ããã®æè¿ã®try
ããŒã¯ãŒãã®ã¢ã€ãã¢å
šäœãå®å
šã«å€±æ Œã«ãªã£ãŠããŸãã
ãã®ãŸãŸã«ããŠããããšã«å®å šã«åæããŸãã å°ãåé·ãããŸãããåŸãã®ã¯ããªãç°¡åã§ãã
æžããããšãã§ããã°
if err := foo.x(a, b); err != nil { return err } if err := foo.y(); err != nil { return err } if err := foo.z(c); err != nil { return err }
ã®ãããªãã®ã«
if err := check foo.x(a, b), foo.y(), foo.z(c); err != nil { return err }
ã€ãã£ãªã ãããŸãå€ããªããŠããããããããŸããã
ããã¶ããã¿ã€ãã«ã€ããŠè©±ããŠããå Žåãæåã«ããªã¢ã³ãã¿ã€ããå¿ èŠã§ãã
if err != nil
ãæ©èœããããã«ããŸããããããã¯æããã§ãããã»ã©åé·ã§ã¯ãªããã³ãŒãã®æµãã®äžã§çã«ããªã£ãŠããŸãã ãã®ã³ã³ã¹ãã©ã¯ãã䜿çšããŠã³ãŒããèªããšããããäœãããã®ããããããŸãã
ãããç¶æããŸãããã try
è¿œå ããªãã§ãã ãã
ã³ãŒããèªããšãã¯ããšã©ãŒåŠçã®æç¡ã«ãããããããžã§ããå®è¡ããŠããè¡ãæ確ã«èªã¿åããããã«ããŸãã
åãã¬ãã«ã®3æåã®ãerrãã¯ç§ã«ã¯åãå ¥ããããŸãã éèŠãªã³ãŒãã¯ç¬¬2ã¬ãã«ã«ããããïŒlispãèŠããŠããŸããïŒïŒãéèŠãªã³ãŒããã©ãããããcheckãé¢æ°ã¯å¿ èŠãããŸããããŸããéèŠãªã³ãŒããã€ã³ãã³ãããããããåã«ãtryãè¡ã䜿çšããããããŸããããããŠ2è¡ç®ã«ã
resãerrïŒ= begin_jobïŒïŒ
if errïŒ= nil {
handle_errorïŒïŒ
}
err = continue_jobïŒresïŒ
if errïŒ= nil {
handle_errorïŒïŒ
}
ãã®ã³ãŒãã䜿çšãããšããããã¯ã®æåã®è¡ãèªã¿åãããšã§ããšã©ãŒä»¥å€ã®ã±ãŒã¹ã®ãããŒãèªã¿åãããšãã§ããŸãïŒãã°ããèªãå¿ èŠããããšãã«ããã¥ã¡ã³ãã®ã¿ã€ãã«ãèªãããïŒ
try
æéãšåŽåãç¯çŽã§ããå Žæã®æ°ãæ°ãããŠãŒãã£ãªãã£ã«ã€ããŠèª°ããèšåããããžã§ã¯ãLOC *åè£è ãè©Šã
cal1 2047 3
pump1 1030 0
docs1 4576 8
hugoutil 604 1
ä»ã®ãã¹ãŠ845223
cloc
ãŠãŒãã£ãªãã£ã«åŸã£ãŠãã³ã¡ã³ããé€ããŠã³ãŒãã®ã¿ãå®è¡ããŸãã
倧èŠæš¡ãªããã°ã©ã ã§ã¯try
ããã£ãšå¿
èŠã ãšæããŸãã ã¡ã¢ãªããæç»ããã ãã§ãLOCãµã€ãºãçŽ15ã20k以äžã®ããã°ã©ã ã§ã¯ãããå€ãã®ããã°ã©ã ãå¿
èŠã«ãªããšæããŸããããã¯ãã¯ããŒãºãã·ã¹ãã ã§é©åã«æå®ããã³åŠçãããããããšã©ãŒãæž¡ãå¿
èŠãããã¬ã€ã€ãŒãååŸãå§ããå¯èœæ§ãããããã§ããéä¿¡åŽãšåä¿¡åŽã®äž¡æ¹ã ããã¯ãããã©ã®çš®é¡ã®ããã°ã©ã ã§ãããã«å€§ããäŸåããŸãã ç§ã¯ããããå°ããªããã°ã©ã ã§ãããŸãè©ŠããŠã¿ãªãã§ããã
倧èŠæš¡ãªããã°ã©ã ã§ã¯ãè©ŠããŠã¿ãå¿ èŠããããšæããŸãã
ããèŠç¹ãã heptio / contourã28.7kè¡ã®ãœãŒã¹ããã¹ãã§tryhardãè©ŠããŸããããtryhardã¯12åã®çœ®æãèŠã€ããŸããã
倧èŠæš¡ãªããã°ã©ã ã§ã¯ãè©ŠããŠã¿ãå¿ èŠããããšæããŸãã
ããèŠç¹ãã heptio / contourã28.7kè¡ã®ãœãŒã¹ããã¹ãã§tryhardãè©ŠããŸããããtryhardã¯12åã®çœ®æãèŠã€ããŸããã
ããïŒ 12察28.7Kè¡ãããã«ã¯æ¬åœã«å°çšã®ããŒã¯ãŒããå¿ èŠã§ãïŒ
ãŸããç§ã¯ããã«é¢ããããªãã®POVã«ãã£ãšèå³ããããŸãïŒ
stat := try(try(os.Open(fileName)).Stat())
ããã°ã©ã ãããå°ãã¢ããªã·ãã¯ã§ãå€ãã®ãµãŒãã¹éã®ãµãŒãã¹çµ±åã®äžéšã§ã¯ãªãå Žåã¯ãããäžè¬çã ãšæããŸãã ãã®ãªããžããªïŒ heptio/contour
ïŒã®githubã§fmt.errorf
ãŸãã¯errors
ãæ€çŽ¢ãããšãçµæãéââåžžã«å°ãªããããç°¡åãªæŠèŠãååŸããã®ã¯å°é£ã§ãã倧èŠæš¡ãªããã°ã©ã ã§ãã£ãŠããããã°ã©ã ããšã«å€§ããç°ãªãå¯èœæ§ããããšè¿°ã¹ãŸããã
å€ãã®å€éšã©ã€ãã©ãªã䜿çšããªãåäžã®ããã°ã©ã ããããšããŸãã 次ã«ãç¹å®ã®AuthorizationErrorãèšå®ã§ããŸãïŒè¿ããããã¹ãŠã®ãšã©ãŒã¯ããã§ã«åŠçããã³ã©ãããããŠããioãšã©ãŒã§ååã«å ·äœçã§ããããšãããããŸãïŒãããã«ã¯ããŠãŒã¶ãŒã¡ã¿ããŒã¿ãæ¢ã«å«ãŸããŠãããå®éã«å¿ èŠãªãã®ã«å€§ããªå€æŽãå ããããšãªããããã€ãã®ã¬ã€ã€ãŒãå€æŽããã«äŒæã§ããŸãããªã¯ãšã¹ãã¬ã€ã€ãŒãŸã§ããããåŠçããŸãã
ããã°ã©ã ãããå°ãã¢ããªã·ãã¯ã§ãå€ãã®ãµãŒãã¹éã®ãµãŒãã¹çµ±åã®äžéšã§ã¯ãªãå Žåã¯ãããäžè¬çã ãšæããŸãã ãã®ãªããžããªã®githubã§
fmt.errorf
ãŸãã¯errors
ãæ€çŽ¢ãããšãçµæãéââåžžã«å°ãªããããç°¡åãªæŠèŠãååŸããã®ã¯å°é£ã§ããããããç§ãèšã£ãããã«ãããã°ã©ã ã«ãã£ãŠå€§ããç°ãªãå¯èœæ§ããããŸãã倧èŠæš¡ãªããã°ã©ã ã§ãã£ãŠããããã°ã©ã ãããå€ãã®å€éšã©ã€ãã©ãªã䜿çšããªãåäžã®ããã°ã©ã ããããšããŸãã 次ã«ããŠãŒã¶ãŒã¡ã¿ããŒã¿ããã§ã«å«ãŸããŠããç¹å®ã®AuthorizationErrorãäœæãããªã¯ãšã¹ãã¬ã€ã€ãŒãŸã§å®éã«åŠçããå¿ èŠã®ãããã®ã«å€§ããªå€æŽãå ããããšãªããããã€ãã®ã¬ã€ã€ãŒãå€æŽããã«äŒæã§ããŸãã
ããããªãã 泚éã¯ããšã©ãŒãçºçããæ¹æ³ãç°¡åã«èŠã€ããããã®ãã®ã§ãã åæ§ã«os.NotExist
ããããã¯ãšã©ãŒãã¹ã«é¢ããè¯ããã³ãã«ã¯ãªããŸããã
@thomasfã¯ã
529628ãœãŒã¹è¡ãtryhardã¯1763ïŒ0.3ïŒ ïŒã®çœ®æãæ€åºããŸããã
ããã確ãã«ã ããªãã¯äž¡æ¹ã«é¢ãã£ãŠããã®ã§ãããã°ã©ã ãæžãããã®ããŸããŸãªæ¹æ³ã®è¯ãäŸã§ã¯ãªããããããŸããã tryhardããã°ã©ã atmãè©ŠãæéãããªããããŸããŸãªãœãŒã¹ã§é©åã«å®è¡ããæéããããŸããïŒgithubçµç±ã§åéãããå Žåãã¯ããŒãºããœãŒã¹ã³ãŒããçç¥ãããããããšã«ããåéã§ããªãå¯èœæ§ããããŸãïŒ
529628ãœãŒã¹è¡ãtryhardã¯1763ïŒ0.3ïŒ ïŒã®çœ®æãæ€åºããŸããã
誰ãïŒèŠåºå
žïŒãè³¢æã«èšã£ãããã«ã try
ã¯ãšã©ãŒã®åŠçã容æã«ããŸããã ããã¯ããããæ±ããªãããšãããç°¡åã«ããŸãã
ã³ãŒããåæããŠtry
眮æãããããèŠã€ããå Žåãã³ãŒãã¯ãšã©ãŒãè¿ã以å€ã¯äœãããªããšããããšã ããããããŸãã ããã¯ããããçŽ æŽãããã³ãŒãã§ã¯ãããŸããã 人ã
ãæ æ°ã«ãªãããšã©ãŒãå¿é
ããªãããã«ããå¿
èŠããããŸããïŒ ãããæ£ç¢ºã«åé¿ããããã«ãGoã«äŸå€ããªãçç±ã®1ã€ã§ã¯ãããŸãããïŒ
ç§ã¯ãã®ç«å Žãåãã€ããã¯ãããŸããã ããããç§ãèŠã€ããŠããã®ã¯ãããã瀺åãã圌ãã®å°ããªè£ä»ããšãªã蚌æ ã§ã
NSã try
ãæ¢åã®goã³ãŒãããŒã¹ã«é©çšã§ããå Žæã¯ãããããããŸã
NSã äžè¬ã«ããšã©ãŒåŠçã¯SLOCã®éèŠãªéšåãæ§æããŸããããã¯ãç§èªèº«ã®æž¬å®å€ãšGoããŒã ã«ãã£ãŠæ±ºå®ãããæ°å€ã«åºã¥ããŠããŸããåç
§
ã³ãŒããåæããŠ
try
眮æãããããèŠã€ãã£ãå Žåãã³ãŒãã¯ãšã©ãŒãè¿ã以å€ã¯äœãããªããšããããšã ãã瀺ããŠããŸãã ããã¯ããããçŽ æŽãããã³ãŒãã§ã¯ãããŸããã 人ã ãæ æ°ã«ãªãããšã©ãŒãå¿é ããªãããã«ããå¿ èŠããããŸããïŒ ãããæ£ç¢ºã«åé¿ããããã«ãGoã«äŸå€ããªãçç±ã®1ã€ã§ã¯ãããŸãããïŒ
try
ãçŸåšããã誀çšããããããã©ããã¯ããããŸãããgoã«ã¯ãšã©ãŒåŠçã匷å¶ããæ©èœããªãããã§ã«ã¹ãããããã®ã¯éåžžã«ç°¡åã§ãã ç§ã«ãšã£ãŠã¯try
ããããšã©ãŒãåŠçããå¿
èŠããªãå Žåã¯èªã¿ãããã³ãŒããäœãã«ã€ããŠã§ããtry
ã¯å€ãã®å Žæã§å¿
èŠãšãããªããããå¿
èŠãªããããããŸããããåã«äžæ©å«ã«ãªãã®ã§ã¯ãªããã¢ã€ãã¢ã楜ããŸããŠãŠãŒã¹ã±ãŒã¹ãèããŠã¿ãŸããã...
èªåã§ã©ããã£ãŠäœ¿ãã®ããèªåã§ã¯ããŸãèããããŸãããããŸã ååšããŠããªãã®ã§ããããã£ããéããã¶ã€ã³ã«ãããã©ããã¯ããããŸããã doã¯ãtryã䜿çšããŠãã®ãããªç¡åé¢æ°ã«ããã€ãã®ã¢ã¯ã·ã§ã³ãã°ã«ãŒãåããåŒã³åºãå ã«è¿ãåã«ãšã©ãŒãåŠçããŸãã ããã«ãããäžéšã®ã³ãŒããã¯ããã«èªã¿ããããªãå¯èœæ§ããããŸãã
var v1, v3 string
if err := func() error {
try(onething())
v = try(twothing())
try(otherthing())
v3 = try(somethingg())
}(); err != nil {
... handle error...
}
ãã®æç¹ã§ãããŸããŸãªããã±ãŒãžã®tryhard
ããŒã¿ãä¿æããããããèŠèŠåããWebãµã€ããäœæããããšããå§ãããŸãã ãã¶ããgolang / gddoïŒgodoc.orgïŒãå°ãå€æŽããã ãã§ããŸãããã§ãããã
ç§ã¯if err != nil
æŸã£ãŠããã»ãã奜ãã§ãã ãã ãããšã©ãŒåŠçã®ããã«äœããè¿œå ããå¿
èŠãããå Žåã¯ã throws
ããŒã¯ãŒããè¿œå ããæ°ããææ¡ããããŸãã
ããã§ãã§ã«èª¬æããè°è«ã®ããã€ããç¹°ãè¿ããã«ãç§ã¯if err != nil
ããã®ãŸãŸã«ããŠãããšããææ
ããšã³ãŒãââãŸãã
ç§ãæäŸã§ããèŠç¹ã¯æ¬¡ã®ãšããã§ããäœçŸäººãã®æ°åè
ïŒããã°ã©ãã³ã°ãšä»ã®èšèªããã®Goã®äž¡æ¹ïŒã«Goãæãã人ãšããŠã if err != nil
ã¯åœŒãã«ãšã£ãŠæ±ºããŠåé¡ã§ã¯ãããŸããã§ããã ç§ã®ã¯ãŒã¯ã·ã§ããã®çµéšè±å¯ãªããã°ã©ããŒã¯ãæåã¯çããããšã«æ°ã¥ããŸãããããã«Goã§ã®ãšã©ãŒåŠçã®æ瀺çãªæ§è³ªãæããããã«ãªããŸãã
èšèªã§å¯ŸåŠã§ãããã倧ããªæžå¿µãããããã®åé¡ã«å¯Ÿããã³ãã¥ããã£ã®æ確ãªåå¿ã¯ã if err != nil
ã¯ãããã®1ã€ã§ã¯ãªããšèšã£ãŠããŸãã
Goã¯å€ãã®çç±ã§å®ç§ã§ãã ãã®äžã§æãéèŠãªã®ã¯ãiferrïŒ= nilãã§ãã åé·ã«èŠãããããããŸããããã³ãŒãã£ã³ã°ãåŠã¶äººã ã«ãšã£ãŠã¯ãã³ãŒãã®ãããã°ãšã³ãŒãã®ä¿®æ£ã容æã«ãªããŸãã
@davecheney
ç§ã¯ãã®ç«å Žãåãã€ããã¯ãããŸããã ããããç§ãèŠã€ããŠããã®ã¯ãããã瀺åãã圌ãã®å°ããªè£ä»ããšãªã蚌æ ã§ã
NSã
try
ãæ¢åã®goã³ãŒãããŒã¹ã«é©çšã§ããå Žæã¯ãããããããŸã
NSã äžè¬ã«ããšã©ãŒåŠçã¯SLOCã®éèŠãªéšåãæ§æããŸããããã¯ãç§èªèº«ã®æž¬å®å€ãšGoããŒã ã«ãã£ãŠæ±ºå®ãããæ°å€ã«åºã¥ããŠããŸããåç §
çŸåšã®ç¶æ³ã§ã¯ãç§ãã¡ãèŠã€ããäŸã¯ããŸããããã¯ããããè¯ãã³ãŒãã§ã¯ãªãããšããŠåŽäžãããã®ã§ã¯ãªãããšå¿é ããŠããŸãã
次ã«äŸã瀺ããŸãã
llorllale:~/go/src/github.com/hyperledger/fabric$ cloc --exclude-dir=vendor .
2406 text files.
2256 unique files.
3130 files ignored.
http://cloc.sourceforge.net v 1.60 T=6.69 s (272.8 files/s, 58350.9 lines/s)
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
Go 1751 54365 34149 294005
YAML 35 547 2171 2060
Bourne Shell 26 354 325 1312
make 3 135 96 418
CSS 1 40 14 140
HTML 3 7 5 63
Python 1 50 103 57
Bourne Again Shell 1 1 6 50
Java 3 7 4 26
XML 2 1 4 2
--------------------------------------------------------------------------------
SUM: 1826 55507 36877 298133
--------------------------------------------------------------------------------
llorllale:~/go/src/github.com/hyperledger/fabric$ tryhard -l . | grep -v vendor | less | wc -l
1417
å ¬å¹³ãæãããã«ãtryhardãèŠã€ããå Žæã®æ°ã«é¢ããããŒã¿ã¯ãã©ããã³ã°ãšã©ãŒãå¿ èŠãšããèŠåã«ãã£ãŠæ··ä¹±ããå¯èœæ§ããããŸãã ããšãã°ãããªãã®äŒç€Ÿã®æ £ç¿ã
if err != nil {
return errors.Wrap(err)
}
...
if err != nil {
return errgo.Notef(err, "error doing x")
}
ããã¯tryhardã«ãã£ãŠå ±åãããªãã§ãããã
ç§ã®äŒç€Ÿã§ã¯ãã®ãããªå€§äŒããããŸãã åçŽãªæ€çŽ¢ãšçœ®æãå®è¡ããŠãããããã€ããããšã©ãŒãªã¿ãŒã³ã«æ»ããšã次ã®çµæãåŸãããŸãã
Language files blank comment code
---------------------------------------------------------------------------------------
Go 2488 40317 15901 297038
tryhardã¯2736ã®çœ®æãå ±åããŠããŸãããæ®ãã®ã©ããã³ã°ãæåã§ç¢ºèªãããšãçŽ1850ãéå°è©äŸ¡ãããŠããããã«èŠãããããã³ãŒãããŒã¹ã®30äžè¡ã§åèšçŽ4500 try
䜿çšéãèŠç©ãã£ãŠããŸãã
ïŒå人çã«ã¯ããšã©ãŒåŠçã®çŸåšã®æ瀺æ§ã«è³æã§ãããæ°ã«ããŸãããïŒ
ããšãã°ãããªãã®äŒç€Ÿã®æ £ç¿ã
[ãšã©ãŒãã«ã¹ã¿ã ã¡ãã»ãŒãžã§ã©ãããã]
ããã¯tryhardã«ãã£ãŠå ±åãããªãã§ãããã
ããããã€ã³ãã§ãâ try
ããããŒã¶ã«ã¯if err != nil return err
ãã€ããããªã¿ãŒã³ãåçŽåããã ãã§ãã«ã¹ã¿ã ã¡ãã»ãŒãžãšã³ã³ããã¹ãã«ãããšã©ãŒã®ã©ããã³ã°ããµããŒãããŠããŸããã
if err != nil
ã®å¯äžã®å埩æ§ã¯ãä»ã®æ»ãå€ã®ãŒãå€ãæå®ããå¿
èŠãããã®ã§ä¿®æ£ã§ãããšæããŸãã èšèªãæŽæ°ããŠããããæé€ããããšãã§ããŸãã äŸãã°ïŒ
ä»æ¥ã®Goã§ããã®ã·ã°ããã£ãæã€é¢æ°ãããå ŽåïŒ
func add(x, y string) (int, error)
é¢æ°ã®ã©ããã«ã次ã®ããã«æžãå¿ èŠããããŸãã
func add(x, y string) (int, error) {
// ...
if err != nil {
return 0, err
}
é¢æ°å šäœã§åããŒãå€ãç¹°ãè¿ãããã«ã©ã€ã¿ãŒã«åŒ·å¶ããŸãã
èšèªããšã©ãŒä»¥å€ã®æ»ãå€ã®ãŒãå€ãèªåçã«å ¥åã§ããã°ãã¯ããã«ç°¡åã«ãªããŸãïŒãããŠããšã©ãŒã®åé·æ§ãšå¯èªæ§ã«ã»ãšãã©ã³ã¹ããããããŸããïŒã
func add(x, y string) (int, error) {
// ...
if err != nil {
return ..., err
}
// ...
}
func main() {
add("8", "beep") // returns 0, error(`strconv.ParseInt: parsing "beep": invalid syntax`)
}
DBã¯ãšãªãåŒã³åºããšçžäºäœçšããå€ãã®ã³ãŒãã®çµéšãããé¢æ°å
šäœã§ãŒãå€ãç¹°ãè¿ããªããã°ãªããªãããšããGoã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã®å¯äžã®æ¬ ç¹ã§ãããšèšããŸãã ããã§ãªããã°ãç§ã¯ãã®ææ¡ã®ææ
ã«åæããŸãïŒ if err != nil
æŸã£ãŠãããŠãã ããïŒ
泚ïŒã¯ããååä»ãã®æ»ãå€ã¯ããã_ãœãŒã_éæã§ããŸãïŒhttps://play.golang.org/p/MLV8Y52HUBYïŒãããã®ææ³ã䜿çšããŠèªåã®ã³ãŒãããŒã¹ã«ããã€ãã®é¢æ°ãå®è£ ããåŸãç§ã¯ã©ãã ãã®è¶³ããããããæãåºããŸãã-éã®ååä»ãæ»ãå€ã¯æ¬¡ã®ãšããã§ãã ç§ã¯ãã€ãååä»ãã®æ»ãå€ãã·ã£ããŠã€ã³ã°ããããšã«ãªããŸãã
ããšãã°ãããªãã®äŒç€Ÿã®æ £ç¿ã
[ãšã©ãŒãã«ã¹ã¿ã ã¡ãã»ãŒãžã§ã©ãããã]
ããã¯tryhardã«ãã£ãŠå ±åãããªãã§ããããããããã€ã³ãã§ãâ
try
ããããŒã¶ã«ã¯if err != nil return err
ãã€ããããªã¿ãŒã³ãåçŽåããã ãã§ãã«ã¹ã¿ã ã¡ãã»ãŒãžãšã³ã³ããã¹ãã«ãããšã©ãŒã®ã©ããã³ã°ããµããŒãããŠããŸããã
ããã¯æ¬åœã§ããç§ã¯èª¬æçãªæååãè¿œå ããããšãå¯èœã«ããããªã¢ã³ããèããŠããŸããã ãšã©ãŒãªã¿ãŒã³ã®å€§éšåïŒã4000 / 4500ïŒã¯ãã³ã³ããã¹ããªãã®errgo.Mask(err)
ã§ããã説æãªãã®try()
ãšåçã§ãããšèããŠããŸããããçŸåšã¯errgoã¯ã¹ã¿ãã¯æ
å ±ãè¿œå ããtryã¯ïŒãŸã ïŒè¿œå ããªããããæ©èœã
@ianlancetaylorããã«ææ¡ããããŸãã @miekgã¯ãç§ãã¡ã®èšèªã®ãªãŒããŒã®1人ãšããŠãif err != nil
ã眮ãæããããšããã¯ãè¿œæ±ããªãããšãææ¡ããŠããŸãã å人çã«ã¯ãä»ã®ææ¡ã®ããã«æ±ãã®ã§ã¯ãªãã golang-nuts
ã«ç§»åããŠããã®è³ªåã®éèŠæ§ã䞻匵ããããšããŠããããã«æããŸãã ããã¯ããªãã®æå³ã§ã¯ãªããããããŸããããããã¯ç§ãæãã圱é¿ã§ãã
ç§ãã¡ã®ãšã©ãŒåŠçæ¹æ³ã¯ç¬ç¹ã§ãããä»ã®èšèªããã倧ããªä»å 䟡å€ããããšæããŸãã ããã¯ç§ãæ§ç¯ããã·ã¹ãã ã®ãšã©ãŒã«ã€ããŠã®ç§ã®èãæ¹ãå®å šã«å€ãããã®çµæãç§ã¯ãã匷åãªãœãããŠã§ã¢ãšã³ãžãã¢ã«ãªããŸããã ããå€ãã®Goéçºè ãç²åŸããããã«ã倧声ã§å°æ°æŽŸãéšå€è ã«è©®çŽ¢ããããããŸããã ã³ãŒãã®ç°¡æœãããã¬ãŒããªãããããšã§ç©¶æ¥µçã«ã¯ããè¯ããªãã®ã§ããšã©ãŒã®åŠçæ¹æ³ãéžæããæ¹æ³ã¯ãã®1ã€ã§ãããããç¹å®ã®äºæã«ã€ããŠã¯å³ããæ¹éãåãå¿ èŠããããšæããŸãã
ããã¯ãGoogleå ã®ããŒã ãã³ãã¥ããã£ãšã®ä¿¡é Œãšä¿¡é Œãç¯ãããŸãã¯èšèªããšã³ã·ã¹ãã ããŸãã¯ãã®ãŠãŒã¶ãŒã«ãšã£ãŠè¯ããªãçŸåšã®è»éãç¶ç¶ããæ©äŒã§ãã
GoããŒã ã¯ããã®ææ¡ããã®ãŸãŸåãå ¥ããäžæ¹ã§ãããæ確ãªä»å 䟡å€ãæã€ä»ã®ç¡é¢ä¿ãªèšèªã®å埩ãåŒãç¶ãè¿œæ±ãããããé¡ãããŸãã
ãã©ãã«ãŒã«ã¯ã¹ã¬ããããªãå¯èœæ§ããããŸãããå人çã«ã¯ããã®ææ¡ãå ¬åŒã®ç«å Žã§å¿çãããéãã«ææ§ã«ãªãå¯èœæ§ã®ããGoogleã°ã«ãŒãã«è¿œãããããªãããšãä¿èšŒããããšæããŸãã
ãã®ãããã¯ã¯ãã§ã«Googleã°ã«ãŒãã§ãè°è«ãããŠããŸãã
ïŒ32437ã®çŸåšã®ããŒãžã§ã³ã¯æºè¶³ã®ãããã®ã§ã¯ãããŸããã tryïŒïŒãã«ãã€ã³ã¯ãèšç·ŽãããŠããªãç®ã«å€ãã®å®è¡ãã¹ãé ããŸãã ãã§ãã¯ãšãã³ãã«ã䜿ã£ãå ã®ææ¡ã¯éåžžã«ç解ãããããcheckããŒã¯ãŒããéç«ã£ãŠããŸããã
çŸåšãçµã¿èŸŒã¿ã®tryïŒïŒã¯é¢æ°ã®ããã«èŠããŸããããã«ãããå¶åŸ¡ãããŒãå€æŽã§ãããã©ããã¯æããã§ã¯ãããŸããã panicïŒïŒããããŸãããïŒç§ã¯ä¿¡ããŠããŸããïŒåžžã«ç¬èªã®ã©ã€ã³äžã«ãããç®ç«ã€ååãããããã®äœ¿çšã¯ã»ãšãã©ãããŸããã äžæ¹ãtryïŒïŒã¯ãè€éãªåŒã®äžã«é ããããšããããŸãã
@theckman Robertã¯ãGo with RobãšKenã®æåã®ã€ãã¬ãŒã·ã§ã³ãèšèšããRobertãšRussã¯æ©ã段éã§ããŒã ã«åå ããŸããã 圌ãã¯æåããGoã«åãçµãã§ããŸããã ææ¡ããå ã®Goäœæè ã«ãã£ãŠæ±ºå®ããããšã©ãŒåŠçã®ç²Ÿç¥ãšççŸããããã©ãããç¥ãããšã¯åœŒãã«ä¿¡é Œã§ãããšæããŸãã
ä»æ¥ã®ããã«ãšã©ãŒåŠçãåçµãããšããææ¡ã®ååã¯å«ãã§ãã ãã®ãããªææ¡ã¯ããã®ãããã¯ã«é¢ããå°æ¥ã®ãã¹ãŠã®ææ¡ãçŠæ¢ããŸãã
代ããã«ããã¶ã€ã³ã®å埩ãåãå ¥ããã ãã§ã¯ã©ãã§ããããã ãã§ãã¯/ãã³ãã«ã®ææ¡ããããŸããã ããããããã€ãã®æ¬ ç¹ãè°è«ãããŸããã ãããè©Šçšææ¡ã«ã€ãªãããŸããã ãã®ææ¡ã®ããã€ãã®æ¬ ç¹ã«ã€ããŠãããã§èª¬æããŸãã ããããããã¯ãæ£ããã¢ãããŒããèŠã€ãããŸã§ãå¥ã®ããè¯ãææ¡ã«ã€ãªããã§ãããã
ç§ãã¡ã®ãšã©ãŒåŠçæ¹æ³ã¯ãŠããŒã¯ã§ã
Rustã§ã®ãšã©ãŒåŠçã¯ãæŠå¿µçã«ã¯Goã§è¡ããã®ãšäŒŒãŠããŸãïŒãšã©ãŒã¯å€ã§ãããæ瀺çãªå¶åŸ¡ãããŒã§ããã代ããã«åèšåã䜿çšããå Žåã¯è€æ°ã®æ»ãå€ã䜿çšããŸãïŒã Rustã«ã¯ãGoãšåãåé¡ãããã詳现ãªãšã©ãŒåŠçãè¡ãããŸããã ããã«ãããRustã¯è©ŠããŠã¿ãŸããïŒ ãã¯ãããããŠæçµçã«ã¯ïŒ ãªãã¬ãŒã¿ãŒã Rustã³ãã¥ããã£ã¯ããšã©ãŒåŠçã«é¢ããŠGoã³ãã¥ããã£ãããããã«å³æ Œã ãšæããŸãïŒãšã©ãŒåŠçã®RFCãšè°è«ã¯åçºçã§ãïŒã 圌ãã¯ãæªããšã©ãŒåŠçã®æ»ããããåã䜿ããã«ããšã©ãŒåŠçã®åé·æ§ãæžããæ¹æ³ãèŠã€ããŸããã ç§ãã¡ãã§ãããšç¢ºä¿¡ããŠããŸãã
èšèªããšã³ã·ã¹ãã ããŸãã¯ãã®ãŠãŒã¶ãŒã«ãšã£ãŠè¯ããªãçŸåšã®è»é
ããªãã¯äœã«ã€ããŠè©±ããŠããŸããïŒ Goã¯åžžã«æ¹åãããŠããŸãã ãã®ãããªçŽ æŽãããèšèªãããŒã«ãããã¥ã¡ã³ãã«ç¡æã§ã¢ã¯ã»ã¹ã§ããã®ã¯çŽ æŽãããããšã§ãïŒèšè«ã®èªç±ã®ããã«ïŒã
@theckman Robertã¯ãGo with RobãšKenã®æåã®ã€ãã¬ãŒã·ã§ã³ãèšèšããRobertãšRussã¯æ©ã段éã§ããŒã ã«åå ããŸããã 圌ãã¯æåããGoã«åãçµãã§ããŸããã ææ¡ããå ã®Goäœæè ã«ãã£ãŠæ±ºå®ããããšã©ãŒåŠçã®ç²Ÿç¥ãšççŸããããã©ãããç¥ãããšã¯åœŒãã«ä¿¡é Œã§ãããšæããŸãã
ä»æ¥ã®ããã«ãšã©ãŒåŠçãåçµãããšããææ¡ã®ååã¯å«ãã§ãã ãã®ãããªææ¡ã¯ããã®ãããã¯ã«é¢ããå°æ¥ã®ãã¹ãŠã®ææ¡ãçŠæ¢ããŸãã
代ããã«ããã¶ã€ã³ã®å埩ãåãå ¥ããã ãã§ã¯ã©ãã§ããããã ãã§ãã¯/ãã³ãã«ã®ææ¡ããããŸããã ããããããã€ãã®æ¬ ç¹ãè°è«ãããŸããã ãããè©Šçšææ¡ã«ã€ãªãããŸããã ãã®ææ¡ã®ããã€ãã®æ¬ ç¹ã«ã€ããŠãããã§èª¬æããŸãã ããããããã¯ãæ£ããã¢ãããŒããèŠã€ãããŸã§ãå¥ã®ããè¯ãææ¡ã«ã€ãªããã§ãããã
ç§ãã¡ã®ãšã©ãŒåŠçæ¹æ³ã¯ãŠããŒã¯ã§ã
Rustã§ã®ãšã©ãŒåŠçã¯ãæŠå¿µçã«ã¯Goã§è¡ããã®ãšäŒŒãŠããŸãïŒãšã©ãŒã¯å€ã§ãããæ瀺çãªå¶åŸ¡ãããŒã§ããã代ããã«åèšåã䜿çšããå Žåã¯è€æ°ã®æ»ãå€ã䜿çšããŸãïŒã Rustã«ã¯ãGoãšåãåé¡ãããã詳现ãªãšã©ãŒåŠçãè¡ãããŸããã ããã«ãããRustã¯è©ŠããŠã¿ãŸããïŒ ãã¯ãããããŠæçµçã«ã¯ïŒ ãªãã¬ãŒã¿ãŒã Rustã³ãã¥ããã£ã¯ããšã©ãŒåŠçã«é¢ããŠGoã³ãã¥ããã£ãããããã«å³æ Œã ãšæããŸãïŒãšã©ãŒåŠçã®RFCãšè°è«ã¯åçºçã§ãïŒã 圌ãã¯ãæªããšã©ãŒåŠçã®æ»ããããåã䜿ããã«ããšã©ãŒåŠçã®åé·æ§ãæžããæ¹æ³ãèŠã€ããŸããã ç§ãã¡ãã§ãããšç¢ºä¿¡ããŠããŸãã
èšèªããšã³ã·ã¹ãã ããŸãã¯ãã®ãŠãŒã¶ãŒã«ãšã£ãŠè¯ããªãçŸåšã®è»é
ããªãã¯äœã«ã€ããŠè©±ããŠããŸããïŒ Goã¯åžžã«æ¹åãããŠããŸãã ãã®ãããªçŽ æŽãããèšèªãããŒã«ãããã¥ã¡ã³ãã«ç¡æã§ã¢ã¯ã»ã¹ã§ããã®ã¯çŽ æŽãããããšã§ãïŒèšè«ã®èªç±ã®ããã«ïŒã
Rustã®éçºã®æŽå²ã¯ããã®èåŸã«ãã人ç©ã圌ããäœãããŠããã®ãèŠåœãã€ããªãã£ãããšã瀺ããŠããŸãã 圌ãã¯åºæ¬çã«Haskellãããšã©ãŒåŠçã®ååãã³ããŒããŸãããããããã¯åœä»€åïŒçŸå®äžçïŒïŒã®ããã°ã©ãã³ã°ã«ã¯é©ããŠããŸããã ãããã®?
ãã¯ãã¯ãæåã«å€±æãããšã©ãŒåŠçã·ã¹ãã ã®åãªãåé¿çã§ãã
@ianlancetaylorããã«ææ¡ããããŸãã @miekgã¯ãç§ãã¡ã®èšèªã®ãªãŒããŒã®1人ãšããŠã
if err != nil
ã眮ãæããããšããã¯ãè¿œæ±ããªãããšãææ¡ããŠããŸãã å人çã«ã¯ãä»ã®ææ¡ã®ããã«æ±ãã®ã§ã¯ãªããgolang-nuts
ã«ç§»åããŠããã®è³ªåã®éèŠæ§ã䞻匵ããããšããŠããããã«æããŸãã ããã¯ããªãã®æå³ã§ã¯ãªããããããŸããããããã¯ç§ãæãã圱é¿ã§ããç§ãã¡ã®ãšã©ãŒåŠçæ¹æ³ã¯ç¬ç¹ã§ãããä»ã®èšèªããã倧ããªä»å 䟡å€ããããšæããŸãã ããã¯ç§ãæ§ç¯ããã·ã¹ãã ã®ãšã©ãŒã«ã€ããŠã®ç§ã®èãæ¹ãå®å šã«å€ãããã®çµæãç§ã¯ãã匷åãªãœãããŠã§ã¢ãšã³ãžãã¢ã«ãªããŸããã ããå€ãã®Goéçºè ãç²åŸããããã«ã倧声ã§å°æ°æŽŸãéšå€è ã«è©®çŽ¢ããããããŸããã ã³ãŒãã®ç°¡æœãããã¬ãŒããªãããããšã§ç©¶æ¥µçã«ã¯ããè¯ããªãã®ã§ããšã©ãŒã®åŠçæ¹æ³ãéžæããæ¹æ³ã¯ãã®1ã€ã§ãããããç¹å®ã®äºæã«ã€ããŠã¯å³ããæ¹éãåãå¿ èŠããããšæããŸãã
ããã¯ãGoogleå ã®ããŒã ãã³ãã¥ããã£ãšã®ä¿¡é Œãšä¿¡é Œãç¯ãããŸãã¯èšèªããšã³ã·ã¹ãã ããŸãã¯ãã®ãŠãŒã¶ãŒã«ãšã£ãŠè¯ããªãçŸåšã®è»éãç¶ç¶ããæ©äŒã§ãã
GoããŒã ã¯ããã®ææ¡ããã®ãŸãŸåãå ¥ããäžæ¹ã§ãããæ確ãªä»å 䟡å€ãæã€ä»ã®ç¡é¢ä¿ãªèšèªã®å埩ãåŒãç¶ãè¿œæ±ãããããé¡ãããŸãã
圌ãã¯60幎代ããã®çŸåšã®åã·ã¹ãã ã§ã¯æ·±å»ãªããšã¯äœãã§ããŸããã 圌ãã¯æçµçã«Go2.0ã§80幎代ã®ã¢ã€ãã¢ãåããå¿ èŠããããŸã
ããªãã¯äœã«ã€ããŠè©±ããŠããŸããïŒ Goã¯åžžã«æ¹åãããŠããŸãã ãã®ãããªçŽ æŽãããèšèªãããŒã«ãããã¥ã¡ã³ãã«ç¡æã§ã¢ã¯ã»ã¹ã§ããã®ã¯çŽ æŽãããããšã§ãïŒèšè«ã®èªç±ã®ããã«ïŒã
@ngrillyãã®æåŸã®éšåã¯ããããããã倧ããªè°è«ã®ããã®ãã®ã§ãã ãã®ææ¡ãçãããããšãªãããã®ã³ã¡ã³ãã«ããããã®ééãå ããããšã§ããŠãŒã¶ãŒãšã³ãã¥ããã£/ãšã³ã·ã¹ãã ã®ãªãŒããŒã·ãããšã®éã®äžæŽåã®ææ ãé«ãŸã£ãŠããŸãã
æ®ãã®è°è«ã§ã¯ãæ§æã«èªç¥çãªãŒããŒããããè¿œå ããããšã¯åå©ã§ã¯ãªããšæããŸãã 圌ãã圌ãã®ããã«åãäœããèŠã€ããŠãããŠããããã§ããç§ãã¡ã¯åœŒãã§ã¯ãããŸããã
誰ããèªåã®å¥œããªæ°ããgolang2.0æ©èœã«ã€ããŠææ¡ãæåºãããšã httpsïŒ//github.com/golang/go ïŒããã³ãã®ä»ã®æ©èœïŒã®ãã©ãŒã¯ã®ãã©ã³ããæäŸããããã®äžçã¯ã©ãã»ã©çŽ æŽããããã®ã«ãªãã§ãããããã®ææ¡ãå®è£ ãããªããžããªãå¿ èŠã§ãïŒã
åæããŸãããïŒ
@ av86743ãã®ææ¡ã®ç¯å²ãè¶ ããŠããããã§ãã ãã®è¡åæ¹éãææ¡ããææ¡ãæåºããŠãã ããã
誰ããææ¡æžèªäœã®äœãã«åºã¥ããŠãããæãåã«å€ãã®ç¡é§ãªåªåã®ãªã¹ã¯ã®ãããªãç§ã¯ããã«ããã€ãã®ææŠãèŠãŸãã ããããããªãã¯ãã®éãã£ãšã¬ãã¥ãŒãããããªããã©ãŒã¯ã«è²»ãããŸããã
ãã®æ§æã¯ã©ãã§ããïŒ
# call error handler
try callFunction(), errorHandler()
# error handler with anonymous function
variable := try callSomething(), func(err *Error) { # error handling }
@theckmanãã®è°è«ãä»ã®å Žæã«ç§»ããšããç§ã®ææ¡ãããããéèŠã§ãªããšæãããå Žåã¯ããè©«ã³ç³ãäžããŸãã ç§ã¯ç§ã®èŠæ±ã§ç§ã®çç±ã説æããŸããããããŠç§ã¯åœŒãããŸã ç«ã£ãŠãããšä¿¡ããŠããŸãã GoããŒã ã¯ãææ¡ã ãã§ãªãã¡ãŒãªã³ã°ãªã¹ãã®ãã£ã¹ã«ãã·ã§ã³ãæ€èšããŸãã
ããªãªãžãã«ã®Goäœè ããšãã£ããã£ãŠããŸããããtryãã®ææ¡ã¯ã3人ã®ãªãªãžãã«ã®Goäœè ã®1人ã§ãã
ç§ã¯ãã®ææ¡ã«åŒ·ãåæããŸããå€æŽããå¿ èŠãããã®ã¯ãgo fmtã ãã§ã1è¡ã®ifã¹ããŒãã¡ã³ããèš±å¯ããããã«gofmtãäœæããããšã ãã ãšæããŸãã
ç§ã¯æ¬åœã«äžè¡æ¬²ãã
if err != nil { return wrappedErr{err} }
3è¡ã®ä»£ããã«
if err != nil {
return wrappedErr{err}
}
@ av86743ãã®ææ¡ã®ç¯å²ãè¶ ããŠããããã§ãã ãã®è¡åæ¹éãææ¡ããææ¡ãæåºããŠãã ããã
@theckmanããªãã¯ç§ã«äœããã¹ãããèšã£ãŠããŸãããããŠããã¯äžå¯§ã§ããã ãã§ãªããå€èŠçã«å€±ç€Œã§ãã ããªãã¯èªåã®å¥œããªããã«èªåã®äœçœ®ã決ããããšãã§ããŸãããç§èªèº«ããããããããã«ããä»ã®èª°ããããªããããèšããšãã«ãžã£ã³ãããããªãã®ããã§ããã«è¡ããç¿ã§ã¯ãããŸããã
誰ããææ¡æžèªäœã®äœãã«åºã¥ããŠãããæãåã«å€ãã®ç¡é§ãªåªåã®ãªã¹ã¯ã®ãããªãç§ã¯ããã«ããã€ãã®ææŠãèŠãŸãã ããããããªãã¯ãã®éãã£ãšã¬ãã¥ãŒãããããªããã©ãŒã¯ã«è²»ãããŸããã
ããã¯[..._ç°¡æœã«ããããã«çç¥ãããå®å šã«é©åãªèšèªã§ã®èª¬æ_...]ã®ãç¡é§ãªåªåãã«ãããŸããã
ãã ããã³ãŒããŒã«ãšã£ãŠã¯ãããã¯äºçŽ°ãªããšã§ããã䟿å©ãªæŒç¿ã§ãããšåæã«ãGoã³ãã¥ããã£ãžã®ãµãŒãã¹ã§ããããŸãã
@ av86743ããªããææ¡ããããšã¯èå³æ·±ãã¢ã€ãã¢ã ãšæããŸãããããŠãé¢ä¿ã®ãªãåé¡ã®ã³ã¡ã³ããšããŠããã倱ãããããšãæãã§ããŸããã§ããã å ¬çãªæ€èšã®ç«å Žã§ãããè¿œæ±ããããšã«èå³ããªãå Žåã¯ãå¥ã®åé¡ãæèµ·ããããšãæå±ããŠç³ãèš³ãããŸããã
ãã®ç¹å®ã®ææ¡ã¯@griesemerããã®ãã®Goã§ã®ã©ãããããŠããªããšã©ãŒãªã¿ãŒã³ã®åé·æ§ã«ã€ããŠã圌ã10幎éå ãªãæãã«æ²žéš°ããŠãããšã¯ä¿¡ããããŸããã ãã ãã圌ã¯åªãããšã³ãžãã¢ã§ããããšã³ãžãã¢ã¯ïŒèªèãããïŒåé¡ã®è§£æ±ºçãèãåºããŸãã ããããæ¢ããã®ã¯éåžžã«é£ããã§ãã ç§ãã¡ã¯åé¡ã解決ããã®ã奜ãã§ãã åé¡ãå ãã ãã§ãããããçš®é¡ã®ã¢ã€ãã¢ãæãã€ãããšãã§ããŸãã ãã®æèããã»ã¹ãããªãé²ãã ããç§ãã¡ã®èª°ããç§ãã¡ã®æšå®äžã®è§£æ±ºçãææ çã«ææŸãã_ããããããã¯çµå±ã®ãšããå®éã«ã¯åé¡ã§ã¯ãªã_ãšèããã®ã¯é£ããã§ãã çµå±ã®ãšãããç§ãã¡ã¯ç¥çã«èšãã°èµ€ã¡ãããç£ãã ã®ã§ããããæšãŠãã®ã¯ç°¡åã§ã¯ãããŸããã
ç§ã®å人çãªçãã¯ãããã«é¢ããGoããŒã ã®æšè«ããã»ã¹ã次ã®ããã«ãªã£ãããšã§ãã
tryãrecoverïŒïŒã®ãããªãšã©ãŒãèŠã€ããå Žåã«ãã£ããããããã«ãdeferã«catchïŒïŒé¢æ°ãè¿œå ããã®ã¯ã©ãã§ããã
äŸïŒ
func doSomthing()(err error){
//return error
}
func main(){
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
try doSomthing()
}
å€ãã®æ©èœã§
func Foo() (err error) {
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
try{
file1 := open("file1")
defer file1.Close()
file2 := open("file2")
defer file2.Close()
}
//without try
file3,err := open("file3")
defer file3.Close()
}
tryãrecoverïŒïŒã®ãããªãšã©ãŒãèŠã€ããå Žåã«ãã£ããããããã«ãdeferã«catchïŒïŒé¢æ°ãè¿œå ããã®ã¯ã©ãã§ããã
äŸïŒfunc doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
å€ãã®æ©èœã§
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
ããã¯ãåãšã©ãŒãåå¥ã®æ¹æ³ã§åŠçããã®ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ããã€ãã®èª¬æïŒ
try
ææ¡ã¯ããã®ã¹ã¬ããã§äž»åŒµããŠããããšãšã¯å察ã«ãæ°ããæ§æãæ°ããããŒã¯ãŒããå°å
¥ããŠããŸããã ããã¯ãæ°ããæ©èœãè¿œå ããããã«å®è¡ã§ããå¯èœæ§ã®ããæå°éã®å€æŽã«ã€ããŠãæ°ããçµã¿èŸŒã¿ãå°å
¥ããã ãã§ãã ãããéèŠãªã®ã§ããããè°è«ãããšãã¯æ£ç¢ºã«èšã£ãŠãã ããã æ°ããæ§æãšæ°ããããŒã¯ãŒãã®è¿œå ãšãçµã¿èŸŒã¿ã®è¿œå ã«ã¯å€§ããªéãããããŸãã åè
ã¯å€§ããªå€æŽã§ãããåŸè
ã¯æ¯èŒçå°ããªè¿œå ã§ãã try
ææ¡ã瀺åããŠããã®ã¯ãæ¯èŒçãã€ããŒãªè¿œå ã§ãã
@ianlancetaylorã¯ããã®è°è«ãä»ã®å ŽæïŒgolang-nutsïŒã§è¡ãããæ¹ãããããšã«åæããŸãã ããã«ææ¡ã¯ãããŸããã
確ãã«ã @ bitfield ã ã Goã§ã®ã©ãããããŠããªããšã©ãŒãªã¿ãŒã³ã®åé·æ§ã«ã€ããŠã®å ãªãæããã¯ãããŸãããããããšãããããŸã:-)ãããããšã©ãŒãã§ãã¯ã¯ããããå¿ èŠä»¥äžã«åé·ã ãšæããŸãã ãããŠããã®åãææ ãã³ãã¥ããã£ã«ãã£ãŠç¹°ãè¿ãæèµ·ãããŠãããšããäºå®ã¯ãç§ãã¡ïŒGoããŒã ïŒããã®ä¿¡å¿µãæã£ãŠããã ãã§ã¯ãªãããšãæ確ã«ç€ºããŠããŸãã ç§ã¯ãäœãããããããã«å€ãã®ãã¬ãã·ã£ãŒããããšãŸã§ã¯èšããŸãã-ç§ãã¡ã¯ããã«é·ãéåãçµãã§ããŸããããããŠç§ãã¡ã¯ãæ£ãããã¢ãããŒããåŸ ã€ããšã«éåžžã«æºè¶³ããŠããŸãã
try
ææ¡ã¯ããšã©ãŒãã§ãã¯ã®åé¡ã«å¯ŸåŠããããã«ç§ãã¡ãèŠã€ããïŒã³ãã¥ããã£ã®è²¢ç®ããã®å€å€§ãªå©ããåããïŒæå°éã®è§£æ±ºçã«é¢ãããã®ã§ãã try
ææ¡ã¯ããã¹ãŠã®ãšã©ãŒãã¹ãã§ç¹å®ã®æ¹æ³ã§ãšã©ãŒãåŠçããå¿
èŠãããå ŽåãããŸã£ãã圹ã«ç«ããªãããšããäºå®ã«ã€ããŠéåžžã«æ確ã§ãã try
ã¯ãé¢æ°å
ã®ãã¹ãŠã®ãšã©ãŒãåãæ¹æ³ã§ãã¹ãããã³åŠçãããå ŽåïŒãããŠã defer
ã䜿çšããããšããå§ãããŸãïŒããŸãã¯åã«è¿ãããå Žåã«ã®ã¿åœ¹ç«ã¡ãŸãã ããã§ããæ確ã«ããã®ã¯é£ããã§ãããææ¡ãè¿°ã¹ãŠããããšãç¹°ãè¿ããŸãããïŒ try
ã¯ãã¹ãŠã®ãšã©ãŒã·ããªãªã§åœ¹ç«ã€ããã§ã¯ãããŸããã ããã¯ããªãã®æ°ã®å Žåã«åœ¹ç«ã¡ãŸãã ãã以å€ã®å Žåã¯ã if
ã¹ããŒãã¡ã³ãã䜿çšããŸãã
@griesemer tryã¯ãšã©ãŒãçºçãããããããGoã«ã¯RAIIããªããããå€ãã®å Žåãé¢æ°ããã®ãŸãŸã«ããŠããããšã¯ã§ããŸããã
@ sirkon ãRAIIããã®è°è«ã«ã©ã®ããã«é¢é£ããŠãããããããŸããã try
ã®æ¢åã®ãã¿ãŒã³ã眮ãæããif ..., err := f(); err != nil { return ..., err }
ããŠ... := try(f())
ã try
ã䜿çšããŠãªãœãŒã¹ã解æŸãããã°ããã£ãå Žåãããã¯ç¢ºãã«äºåã«ååšããŠããŸããã try
ã®å°å
¥ã¯ããªãœãŒã¹è§£æŸã®ãã°ã匷åãé²æ¢ãããŸããã
@ sirkon ãRAIIããã®è°è«ã«ã©ã®ããã«é¢é£ããŠãããããããŸããã
try
ã®æ¢åã®ãã¿ãŒã³ã眮ãæããif ..., err := f(); err != nil { return ..., err }
ããŠ... := try(f())
ãtry
ã䜿çšããŠãªãœãŒã¹ã解æŸãããã°ããã£ãå Žåãããã¯ç¢ºãã«äºåã«ååšããŠããŸãããtry
ã®å°å ¥ã¯ããªãœãŒã¹è§£æŸã®ãã°ã匷åãé²æ¢ãããŸããã
ã¹ã¬ãããèªãã§ãã ãããäŸããããŸããïŒ
info := try(try(os.Open(fileName)).Stat())
@sirkonç§ã¯ãã®äŸãæ°åèŠãŸããã ãããããããšã«åæããŸãã ããããããå°ãèããŠã¿ãŸãããã ææ¡ãããŠããtry
ãã«ãã€ã³ã¯ãåºæ¬çã«Goã³ãŒãã«ããç¹å®ã®çš®é¡ã®å®åæã®æ§æç³è¡£ã§ãã ãããã£ãŠããã®äŸãå
ã®ã³ãŒãã«å€æã§ããŸãã
f, err := os.Open(fileName)
if err != nil {
return err
}
info, err := f.Stat()
if err != nil {
return err
}
ãã®ã³ãŒãã«ãåããã°ããããŸãã ç§ã¯ç¢ºãã«ãã®ãããªã³ãŒããèŠãŠããŸããã try
çµã¿èŸŒãŸããŠããããããã°ãæžãããããªã£ãããèŠã¥ãããªã£ããããããšã¯ç§ã«ã¯ããããŸããã
[ @ianlancetaylorãç§ã殎ã£ãããã§ãã]
@sirkonãã®ãã°ã¯ã try
ããããšãªããããšããã§ã«å¯èœã§ã-Goã¯ãæªãã³ãŒããæžãããšã劚ããŸããã ãŸãã¯ãããã奜転ãããŠã try
ãèš±å¯ãããã¹ãã§ã¯ãªãçç±ãšããŠæªãã³ãŒãã䜿çšããããšã¯ã説åŸåã®ããè°è«ã§ã¯ãããŸããã 代ããã«ã go vet
ã¯åé¡ã®ããã±ãŒã¹ã«ãã©ã°ãç«ãŠãå¿
èŠããããŸãã
defer
ã¯ãé¢æ°ãæ»ã£ããšãã«ã¯ãªãŒã³ã¢ããããGoã€ãã£ãªã ã§ãããããã¯ããŸãæ©èœããŸãã ãã¡ãããããã§ã®æ£ããã¢ãããŒãã¯æ¬¡ã®ãšããã§ãã
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
ããã以äžãšæ¯èŒããŠãã ããïŒ
f, err := os.Open(filename)
if err != nil {
return ..., err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return ..., err
}
try
ãããšããœãŒã¹ã¯äž»ãªé¢å¿äºã§ãããã¡ã€ã«ã®ãã¡ã€ã«æ
å ±ã®ååŸã«éäžããŸãã åŸæ¥ã®ã¢ãããŒãã䜿çšãããšãã»ãšãã©ã®ãœãŒã¹ã³ãŒãã¯èµ·ãããããšã©ãŒãæžå¿µããŠããŸãã ãããŠããã¯ãã¹ãŠåãã§ãã ãšã©ãŒãè£
食ãããå Žåã§ãã try
ã¢ãããŒãã¯çŸããæ©èœããŸãã
defer errd.Wrap(&err, "failed to do X for %s", filename)
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
errd
ããã±ãŒãžã®ãããªãã®ã䜿çšããŸãïŒåé¡ïŒ32676ãåç
§ïŒã
@griesemer
ç§ã®å°æ¥ã®èªå·±å®è¡ã³ãŒãã¬ãã¥ãŒã¯ãå¶åŸ¡ãããŒã¡ã«ããºã ãããèªèº«ã®ã©ã€ã³äžã«ããã¹ãã§ãããšãŸã å«ã³ç¶ããŠããŸãã ãã®ã¢ãããŒãã¯ãçŸåšã®ææ¡å
ã§æå¹ïŒåŒ·å¶ãªãïŒã§ããïŒ èªã¿ãããã«å ããŠããã詳现ãªãšã©ãŒåŠçããžãã¯ãžã®ãªãã¡ã¯ã¿ãªã³ã°ã容æã«ãªããŸãã
defer errd.Wrap(&err, "failed to do X for %s", filename)
f, err:= os.Open(filename)
try(err) // check is so much a better term
defer f.Close()
info, err := f.Stat()
try(err)
ãŸãããã®handle
ãžã®ã¢ãããŒãã¯ããã§ã¯èŠæ ããããŸãããè€æ°ã®å»¶æãæ··ä¹±ããããšã¯ãããŸãããïŒ ãããšããé¢æ°ã¹ã³ãŒãã®åæããããŸããïŒ ãããããªããå¿åã®æ©èœã«ã¯ç¬èªã®ã¹ã³ãŒããä»äžãããŸããïŒ ãããŠã·ã£ããŠã€ã³ã°... eesh-誰ãæåã«ãäœã2çªç®ã«ïŒ
ããã¯ãã¹ãŠãGoã³ãŒããæžãããã®2ã€ã®ãã¢ãŒãããããããã«æããŸãã ããã§ã¯ãªããšèšã£ãŠãã ããã
@griesemer確ãã«ããã°ã¯ä»æ¥ãçºçããå¯èœæ§ããããŸãããçŸåšã®tryã®å®è£ ã«ãããå°æ¥ããã«è延ããããã«ãªããšåŒ·ãæããŠããŸãã ç§ãã§ããïŒïŒãthink.OfïŒHasïŒChainingïŒïŒãOfïŒMethodsïŒã®ã»ãŒãã¹ãŠã®äººæ°ã®ããèšèªããæ¥ã誰ãããè¯ããæªãã圌ãã«æ ¹ä»ããŠããŸãã ãããã®èšèªã¯ãã¹ãŠããã¿ãŒã³ãèªç¶ã§å®å šã«ããç¬èªã®ã€ãã£ãªã ãæäŸããŸãã åã·ã¹ãã ããã¹ãŠã®å€ã«ä»éããé害æ¡ä»¶ãå²ãåœãŠãããã«åŒ·å¶ãããããGoã§ããã«é害ã«ã¶ã€ãããŸãããããåé¿ããããã®åççãªãã¿ãŒã³ã¯ãããŸããïŒãŸãã¯ãè©Šè¡ææ¡ãååšããŸããïŒã
ãã®ææ¡ãåãå
¥ããããã°ã圌ãã¯if err
ãã€ã©ãŒãã¬ãŒããåé¿ããæ¹æ³ã«ãªããæ
£ã芪ããã æ¹æ³ã§ã³ãŒããæžãããšãã§ããããã«ãªããŸãã tryãäœæãããåã«æžãããstackoverflowã®åçãããã°æçš¿ãªã©ã«10幎è¿ãã®Goã³ãŒããå«ãŸããããšãé€ããŠã 圌ãã¯ããã«errãšifã¹ããŒãã¡ã³ããtryã§åé€ããããšãåŠã³ãŸãã 圌ãã¯ãtryããããŒã¶ã«ã®Stat()
ããã«ãå¿
èŠãªãã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸã§ã try
ã©ãããããã³ãŒãã貌ãä»ããããšãã§ãããã¡ã€ã«ãµã€ãºãæãã§ããŸãã ããã¯åœŒããæ
£ããŠãããã¿ãŒã³ãªã®ã§ãGoãæžããŠãããšãã«ãããé©çšããã®ã¯åœç¶ã§ãã æãã¿ãŒã²ãããçµã£ãGoOSã¯ãã¹ãŠããã¡ã€ã«ãšããŠæ±ããããããå€ãã®ãªãœãŒã¹ãªãŒã¯ãçºçãããšæ³å®ããã®ã劥åœã§ãã
ããã¯ãç§ããä»æ¥ãã§ã«ãããè¡ãããšãã§ããããšãã声æã«åŒ·ãå察ããçç±ã«ç§ããããããŸã-ããªãã¯åã«ã§ããªãããã§ãã 確ãã«-ãã¡ã€ã«ãã³ãã«ããªãŒã¯ããå¯èœæ§ããããŸãã ããããGoã¯ããã°ã©ããŒã«ãã¹ã³ãŒãå
ã«èå¥åãæãããŠãã¡ã€ã«ããªãŒã¯ããããšãã¹ãããããæ©äŒãäžããŸããã ã¹ããããããåèå¥åf
ã¯ããã¡ã€ã«ãã³ãã«ããªãŒã¯ãããŠããŸãã ãã®æ©èœã䜿çšããã«ã¯ãGoãšã³ã·ã¹ãã ã®ç¹å®ã®èåãªã€ãã£ãªã ãå£ããŠããå¿
èŠããããŸãã ãããã£ãŠãä»æ¥èšèšãããæ©èœãå°å
¥ãããšãGoã§ãªãœãŒã¹ããªãŒã¯ãããªã¹ã¯ãæããã«é«ãŸããŸãã
ãšã¯ããã httpsïŒ //github.com/golang/go/issues/32825#issuecomment -506882164ã§è¿°ã¹ãããã«ãããã€ãã®å°ããªèª¿æŽãè¡ãããå Žåãå®éã«ã¯try
ããµããŒãããŸãããå€æŽã¯èšèªãžã®è¿œå ãæè¿ããŸããã è©Šè¡ã«å¿
èŠãªã®ã¯ãå²ãåœãŠã®RHSã§ã®ã¿æå¹ã«ããæ»ãå€ãã¢ãã¬ã¹æå®ã§ããªãããã«ããããšã ãã ãšæããŸãã tryã®äœ¿çšæ³ã®ãè¯ããäŸïŒ1è¡ã«1åã®è©Šè¡ã§ããåŸåããããŸãïŒããtryã䜿çšãããå¯äžã®ãæ¹æ³ã«ããŸãã
info := try(try(os.Open(filename)).Stat()) // compiler error
f := try(os.Open(filename)) // valid
// we were forced to assign f, so we still have an identifier to Close (serve linters and users alike)
defer f.Close()
info := try(f.Stat())
a, b := try(strconv.Atoi("1")), try(strconv.Atoi("2")) // also valid
a, b := try(strconv.Atoi("1"), strconv.Atoi("2")) // maybe?
a, b := try strconv.Atoi("1"), strconv.Atoi("2")
ããã¯èšèªã«èªç¶ã«é©åãã try
ã®çŸåšã®ãã¹ãŠã®å©ç¹ãïŒå©ç¹ãšèŠãªãå Žåã¯ãã¹ãããããšãé€ããŠïŒæ¬ ç¹ãªãã§ç¶æãããšæããŸãã tryã®ãã¹ãã¯ãã ãã«ãæå©ã«ãªããšã¯æããŸãããç¯çŽã¯ã»ãšãã©ãããŸããããæªçšã®å¯èœæ§ã¯ç¡éã«ãããŸãã ä»æ¥ã¯ç¹ã«æªãæããŠããªãã®ã§ããããç§ã«ã§ããæåã®ããšã§ãã
total := try(try(os.Open(filename)).Stat()).Size() + try(strconv.Atoi(try(ioutil.ReadAll(os.Stdin))))
ããããããªããç§ãã¡ã«ä»»ããã°ã_we_ã¯ææªã®ããšãèããã§ãããã
@daved try(err)
ã2è¡ç®ã«é
眮ããããšã¯ãæ¢åã®try
ããããŒã¶ã«ã§å®å
šã«ãµããŒããããŠããŸãã try
ã¯ãæåŸã®å€ãerror
ãšå
¥åããŸããããã¯ã try(err)
ãšæžããšèªç¶ã«æºããããŸãã
defer
ã«é¢ããããªãã®æžå¿µã«åŸããã©ããã¯ããããŸãããç°ãªããã³ãã©ãŒãå¿
èŠãªå Žåã defer
ã¯æ£ããéžæã§ã¯ãªãå¯èœæ§ããããŸãã 代ããã«ãåŸæ¥ã®if
ãå¿
èŠã«ãªãå ŽåããããŸãïŒææ¡ã«æèšãããŠããŸãïŒã
@cstocktonãã¹ããããtry
ã¯éåžžã«åé¡ã«ãªãå¯èœæ§ãããããšã«åæããŸãã ãããã try
ãããã°ãã»ãšãã©ã®ã³ãŒãã¯ããªããäžããïŒæå¹ãªïŒãŸãã å°é家ã¯ãç空ã§ã³ãŒãã£ã³ã°ããã®ã§ã¯ãªããã¹ã¿ã€ã«ã¬ã€ããã³ãŒãã¬ãã¥ãŒãããã³ã°ãããã©ã¯ãã£ã¹ã«åŸãåŸåããããŸãã ã§ããããç§ã¯ããã§ã¯ããã»ã©å¿é
ããŠããŸããïŒæªãã³ãŒããééã£ãã³ãŒããæžãããšãå¯èœã§ããã°ã誰ãããããããããšãããç¥ã£ãŠããŸã-ããã§ãïŒã
ã¹ã¿ã€ã«ã®åé¡ãšããŠãç§ãã¡ã¯ããªãã奜ããããªå¶éãèšèªã«èª²ããŠããŸãã-ç§ãã¡ã¯ãã®ããã«go vet
ã䜿çšããŸããã çµå±ãæžããããœãããŠã§ã¢ã®å Žåãå¹æã¯åãã§ãã ãããããããèšèªã§æããªãããšã«ãã£ãŠãç§ãã¡ã¯èªåèªèº«ãçžãä»ããŠããŸããã ãããã®å¶éãé©åã«èšå®ããã®ã¯é£ãããããä»æ§ãäžå¿
èŠã«è€éã«ãªããŸãã go vet
ã調æŽããæ¹ãã¯ããã«ç°¡åã§ãèšèªã調æŽãããããå€ãã®ããšãåŠã¶ã®ã§ãããã¹ããŒãã«ãªããŸãã
@griesemer説æããŠãããŠããããšãã ã³ãŒãäŸã§ã¯ãæåã®è¡ãvar err error
å Žåãæãè¿ãã¯äž¡æ¹ã®ãã§ãã¯æžã¿ãšã©ãŒã«åœ±é¿ãäžããå¯èœæ§ããããŸããïŒ ã·ã£ããŠã€ã³ã°ãå°æ¥å¯ŸåŠãããå¯èœæ§ã®ããæžå¿µäºé
ã§ãããšãã話ãèŠãŠããŸããã ããã«ã©ã®ããã«é¢é£ãã/å¯èœæ§ããããŸããïŒ
tryãrecoverïŒïŒã®ãããªãšã©ãŒãèŠã€ããå Žåã«ãã£ããããããã«ãdeferã«catchïŒïŒé¢æ°ãè¿œå ããã®ã¯ã©ãã§ããã
äŸïŒfunc doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
å€ãã®æ©èœã§
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
ããã¯ãåãšã©ãŒãåå¥ã®æ¹æ³ã§åŠçããã®ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ä»ã®ãŠãŒã¶ãŒãã³ãããããããã«
func Foo() (err error) {
defer func(){
if err:=catch();err!=nil{
//found error
}
}()
file1 :=try open("file1")
defer file1.Close()
file2 :=try open("file2")
defer file2.Close()
//without try
file3,err := open("file3")
defer file3.Close()
}
@davedãããã®äŸã§ã¯ã err
ãçµæerror
ã®ååã§ãããšæ³å®ãããŠããŸããã try
ã¯ãååïŒãŸãã¯ååããªãå ŽåïŒã«é¢ä¿ãªããåžžã«ãã®çµæãšã©ãŒå€æ°ãèšå®ããŸãã err
ãšããããŒã«ã«å€æ°ãããå Žåãããã¯å¥ã®å€æ°ã§ãã çµæãšã©ãŒãåç
§ããå Žåã¯ãå¥ã®ååãä»ããå¿
èŠããããŸãã ãããç¡å¹ã§ããå Žåã¯ãã§ã«ããããšã«æ³šæããŠãã ããã
func f(...) (..., err error) {
var err error // << err already declared
...
äžæ¹ãããªããæžãå ŽåïŒ
func f(...) (..., err error) {
a, b, ... err := g() // redeclaration of err
...
å²ãåœãŠã®err
ã¯ãçµæãã©ã¡ãŒã¿ãªã¹ãã§æå®ããããã®ãšåãã§ãã ããã§ã¯ãéåžžã«é·ãéãã§ã«ããã§ãã£ãããšãšäœãå€ããã¯ãããŸããã
PSïŒ try
è°è«ã®ããã«ãã®åé¡ããã€ãžã£ãã¯ããã®ããããŠãå
ã®ææ¡ã«æ»ãå¿
èŠããããŸããããã¯ã解é€ãããææ¥ïŒ7æ1æ¥ïŒã«åã³è°è«ã§ããããã«ãªããŸãã
@godcong catch()
é¢æ°ïŒãŸãã¯åæ§ã®é¢æ°ïŒã§ã¯ããšã©ãŒãååŸããããšã¯ã§ããŸãããèšå®ããããšã¯ã§ããŸããïŒéåžžããšã©ãŒãã³ãã©ãŒãšããŠåäœããé
延é¢æ°ã§ãå²ãã§ããé¢æ°ã®ãšã©ãŒãèšå®ããå¿
èŠããããŸãïŒã ã catch()
ããå²ãã§ããé¢æ°ã®ãšã©ãŒæ»ãå€ã®ã¢ãã¬ã¹ã§ãã*error
ãè¿ãããã«ããããšã§ãæ©èœãããããšãã§ããŸãã ããããèšèªã«æ°ããã¡ã«ããºã ãè¿œå ãã代ããã«ããšã©ãŒçµæåã䜿çšããªãã®ã¯ãªãã§ããïŒ ããã説æãããŠããtry
ææ¡ãåç
§ããŠãã ããã
ãŸããäžèšã®PSãåç §ããŠãã ããã
@griesemer
ããã§ããæ確ã«ããã®ã¯é£ããã§ãããææ¡ãè¿°ã¹ãŠããããšãç¹°ãè¿ããŸããããè©ŠããŠã¿ããšããã¹ãŠã®ãšã©ãŒã·ããªãªã§åœ¹ç«ã€ããã§ã¯ãããŸããã ããã¯ããªãã®æ°ã®å Žåã«åœ¹ç«ã¡ãŸãã ãã以å€ã®å Žåã¯ãifã¹ããŒãã¡ã³ãã䜿çšããŸãã
ããã¯ãŸãã«try()
ææ¡ã®èŽåœçãªæ¬ é¥ã ãšæããŸãã以åã¯ãšã©ãŒãã§ãã¯ãè¡ãå¯äžã®æ¹æ³ããããŸããããä»ã§ã¯2ã€ãããã³ãŒãããŒã¹å
šäœã«æ··åšããŠããŸãã ãŸããå°ãªããšãç§ãåãçµãã§ããã³ãŒãããŒã¹ã§ã¯ã if err != nil
20ïŒ
æªæºãtry()
ã«çœ®ãæããããšãã§ããŸããããã¯éèŠã§ã¯ãããŸãããããšã©ãŒåŠçã¹ã¿ã€ã«ã«åå²ããŸãã
å人çã«ã¯ã代ããã«ãã¹ãŠã®if err != nil
ã±ãŒã¹ã®95ïŒ
ã眮ãæããã®ã«åå匷åãªãšã©ãŒåŠçæ§é ã奜ãã§ãããã ããã¯å€ãã®äººã奜ãã ã£ããšæããŸãã
@griesemerããªããåç §ããŠããã¹ã¿ã€ã«ã¬ã€ããã°ãããã©ã¯ãã£ã¹ãäŸãããã¥ã¡ã³ããªã©ã¯ãã¹ãŠæ代é ãã§ããããã人ã ãåŠã³ãããŒã«ã
ããã§è§åºŠãåãæ¿ããŸããæŠèª¬ããæœåšçãªå¯äœçšã«å¯ŸããŠååã«åŒ·åãªtryã¹ããŒãã¡ã³ãããã¹ãããããã®ãŠãŒã¹ã±ãŒã¹ã¯äœã§ããïŒ ä»æ¥ã®Goã³ãŒãã¯ããã§ãŒã³å¯èœã§ãã¹ãå¯èœã§ãè©Šè¡åé¢ãããæ¬åŒ§ããŒãã£ãã©ãã«ã§ãä¹±æŽã«è¡šç€ºã§ããããã«ããããšã§ãã©ã®ããã«å©çãåŸãã®ã§ããããã ç§ã®æšæž¬ã§ã¯ãããã§ã¯ãªãããã¹ããè©Šãããã«æ±ãããã人ã¯ããªããšæããŸããé¢æ°ãšããŠå®è£ ãããŠãããããææ¡ã«ä»å±ããŠããŸãã èšèªä»æ§ãããè€éã«ãªãããããã¹ãã®åé€ãã¢ãã¬ã¹æå®å¯èœãªã©ã®å¶çŽãè¿œå ããŠããã¹ãã®ä¹±çšã埮åŠãªãšã©ãŒãå¶éããå¿ èŠã¯ãããŸããã ããã§ã®ããŒãã¯ãèšèªã®è€éãã®å°å ¥ãé²ãããã§ããããããšããšã©ãŒãåŠçããããã®ããè¯ãæ¹æ³ãè¿œå ããããã§ããïŒ
ããã§ã®ç®æšãèšèªä»æ§ãããè€éã«ããªãããšã§ããå Žåãéžæã¯æ確ã§ãããžã§ããªãã¯ãªã¿ãŒã³ãšãã©ã¡ãŒã¿ãŒã䜿çšããŠæ°ããé¢æ°ãè¿œå ããªãã§ãã ãããä»»æã«ãã¹ãå¯èœã§ãå¶åŸ¡ãããŒãæäŸããæå®ãããå€ã®ã¢ãªãã£ãå€æŽããŸãïŒããããããããç¹å®ã®çµã¿èŸŒã¿ã€ã³ã¿ãŒãã§ãŒã¹ãæºãããŠããå Žåã«éããŸãïŒãããããç§ãå¿ããŠãã以äžã®ãã®ãããšãã°åäŸã®ãªãè€éããæã€é¢æ°ã ãšã©ãŒåŠçãæ¹åããããšãç®æšã§ããå Žåããšã©ãŒãçæããæ°ããæ¹æ³ãå°å ¥ããã«ãããè¡ãå¿ èŠããããšæããŸãã
@sirkonç§ã¯ãã®äŸãæ°åèŠãŸããã ãããããããšã«åæããŸãã ããããããå°ãèããŠã¿ãŸãããã ææ¡ãããŠãã
try
ãã«ãã€ã³ã¯ãåºæ¬çã«Goã³ãŒãã«ããç¹å®ã®çš®é¡ã®å®åæã®æ§æç³è¡£ã§ãã ãããã£ãŠããã®äŸãå ã®ã³ãŒãã«å€æã§ããŸããf, err := os.Open(fileName) if err != nil { return err } info, err := f.Stat() if err != nil { return err }
ãã®ã³ãŒãã«ãåããã°ããããŸãã ç§ã¯ç¢ºãã«ãã®ãããªã³ãŒããèŠãŠããŸããã
try
çµã¿èŸŒãŸããŠããããããã°ãæžãããããªã£ãããèŠã¥ãããªã£ããããããšã¯ç§ã«ã¯ããããŸããã
åŸæ¥ã®ãããŒããé
ãããšããã¡ã€ã«ãéããå¿
èŠãããããšã«æ°ä»ãäœå°ãå¢ããããšã¯æããã§ãããã®try
ã¯ã人ã
ãé·ãéã®ããããã·ã§ãŒãã«ããã奜ãåŸåãããããããã®çš®ã®ãªãŒã¯ãåŒãèµ·ãããŸãã
@godcong
catch()
é¢æ°ïŒãŸãã¯åæ§ã®é¢æ°ïŒã§ã¯ããšã©ãŒãååŸããããšã¯ã§ããŸãããèšå®ããããšã¯ã§ããŸããïŒéåžžããšã©ãŒãã³ãã©ãŒãšããŠåäœããé 延é¢æ°ã§ãå²ãã§ããé¢æ°ã®ãšã©ãŒãèšå®ããå¿ èŠããããŸãïŒã ãcatch()
ããå²ãã§ããé¢æ°ã®ãšã©ãŒæ»ãå€ã®ã¢ãã¬ã¹ã§ãã*error
ãè¿ãããã«ããããšã§ãæ©èœãããããšãã§ããŸãã ããããèšèªã«æ°ããã¡ã«ããºã ãè¿œå ãã代ããã«ããšã©ãŒçµæåã䜿çšããªãã®ã¯ãªãã§ããïŒ ããã説æãããŠããtry
ææ¡ãåç §ããŠãã ããããŸããäžèšã®PSãåç §ããŠãã ããã
Goã®åã·ã¹ãã ã¯60幎代ã«ç«ã¡åŸçããŠãããããåœç¶ããšããžã±ãŒã¹ãããŸãåŠçã§ããŸããã§ããã 80幎代ã®ã¢ã€ãã¢ãåããã®ã«ååãªå èŠã®æãããå Žåã¯ããšã©ãŒãçºçãããã埮åŠãªãããŒãå¶åŸ¡ããæ¹æ³ããããŸãã ããªãã¯ä»ãäžäžã®æã«ã¬ã©ã¹ãšéå±ã®å»ºç©ã建èšããããšããŠããŸãããããã®äžäžã®æã«ã¯é»æ°ãšæ°Žéã®ãã€ãããªãã®ã§ãããªãããããæã£ãŠããªãã®ã¯æªãããšã§ãã
golang/go
èªäœã§ãæ°ããæ¹åããããšã©ãŒæ©èœãã©ã®çšåºŠæ¡çšããããã確èªããã®ã¯èå³æ·±ãããšã§ãã ãã£ããšããŠãã
go2 fmt
ã«ãã¬ãŒã³ãªgo1.x
ãåºåãããªãã·ã§ã³ããããã©ããã確èªããããšãèå³æ·±ãã§ãããã
ç§èªèº«ã®çµéšãããè¿ããããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããŠä»¥æ¥ã次ã®ããã«ãªã£ãŠããŸãã
import "github.com/pkg/errors"
func caller(arg string) error {
val, err := callee(arg)
if err != nil {
return errors.Warpf(err, "failed to do something with %s", arg)
}
err = anotherCallee(val)
if err != nil {
return errors.Warpf(err, "failed to do something with %s", val)
}
return nil
}
ãµããŒãããŒã ã¯ãæ¬çªç°å¢ã§çºçããåé¡ã«ã€ããŠç§ã®æèŠãå¿ èŠãšããããšã¯ãã£ãã«ãããŸããã
ç§èŠã§ããããšã©ãŒåŠçã®æ¹åã¯å®åã³ãŒããæžããããšã§ã¯ãªãããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããã®ãã䟿å©ãªæ¹æ³ãæäŸãããšæããŸãã ç§ã¯ãŸã tryïŒïŒã䜿çšããããã®è¯ãè³¢æãªæ¹æ³ãèŠã€ããããšãã§ããŸããã
ãã¶ãã延æããŠã³ã³ããã¹ããè¿œå ããŸãã
func caller(arg string) (err error) {
defer func() {
switch t := err.(type) {
case CalleeErr:
err = errors.Wrapf(err, "failed to do something with %s", arg)
case AnotherCalleeErr:
err = errors.Wrapf(err, "failed to do something with %s", val)
}
}()
val := try(callee(arg))
try(anotherCallee(val)
return nil
}
ã¿ã€ãã³ã°ã®å€ããç¯çŽããããã«ã¯èŠããŸããããèªã¿ããããšããã©ãŒãã³ã¹ãç ç²ã«ããŠããŸãã
次ã®ããã«tryïŒïŒã䜿çšããããšã«ãªããŸãã
func caller(arg string) error {
val, err := callee(arg)
try(errors.Warpf(err, "failed to do something with %s", arg))
err = anotherCallee(val)
try(errors.Warpf(err, "failed to do something with %s", val))
return nil
}
ããã¯æ°è¡ãæžãããŸããããã ãã§ãã
ç§ã«ã¯ããã®åé¡ã®ã»ãšãã©ã®è§£æ±ºçã¯ãäŸå€ã䜿çšããä»ã®èšèªããåé¢ãããŠãããšç§ãæã£ãŠãã1ã€ã®ããšãå£ããŠããããã«èŠããŸããã€ãŸãããšã©ãŒåŠçã¡ã«ããºã ã¯å¶åŸ¡ãããŒãšããŠäœ¿çšãããŸããã ãããã®ãœãªã¥ãŒã·ã§ã³ã®ã»ãšãã©ã¯ãäœããã®åœ¢ã®å¶åŸ¡ãããŒïŒãã§ãã¯/åŠçãè©Šè¡ããã£ãããæåŸ ïŒãè¿œå ããŸãããã®æç¹ã§ãGoããŒã ã¯äŸå€ãè¿œå ããŠ1æ¥ãšåŒã¶æ¹ããããšæããŸãã
ã«ããŒã«äŒŒãif
ãšreturn
ç¹å¥ãªã±ãŒã¹ãããã°ããã®ã§ãã
return err if err != nil
PSèšèªãã¶ã€ã³ã®çµéšãæµ ãã®ã§ã容赊ãã ãããæããªããšãèšã£ãå Žåã¯ãé æ ®ãªãææããŠæããŠãã ããã
tryãrecoverïŒïŒã®ãããªãšã©ãŒãèŠã€ããå Žåã«ãã£ããããããã«ãdeferã«catchïŒïŒé¢æ°ãè¿œå ããã®ã¯ã©ãã§ããã
äŸïŒfunc doSomthing()(err error){ //return error } func main(){ defer func(){ if err:=catch();err!=nil{ //found error } }() try doSomthing() }
å€ãã®æ©èœã§
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() try{ file1 := open("file1") defer file1.Close() file2 := open("file2") defer file2.Close() } //without try file3,err := open("file3") defer file3.Close() }
ããã¯ãåãšã©ãŒãåå¥ã®æ¹æ³ã§åŠçããã®ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ä»ã®ãŠãŒã¶ãŒãã³ãããããããã«
func Foo() (err error) { defer func(){ if err:=catch();err!=nil{ //found error } }() file1 :=try open("file1") defer file1.Close() file2 :=try open("file2") defer file2.Close() //without try file3,err := open("file3") defer file3.Close() }
ããªãã®äŸã§ã¯ããã¹ãŠã®ãšã©ãŒãåãdefferã§åŠçããŸãã ã«ã¹ã¿ã ã¡ãã»ãŒãžãšã«ã¹ã¿ã æ å ±ããšã©ãŒã«è¿œå ãããå Žåã¯ã©ããªããŸããïŒ
@ianlancetaylor ãæšå®ãªã¿ãŒã³ãããµããŒãããããã«ãïŒ=ãæŒç®åãæ¡åŒµããããšãææ¡ãã人ã¯ããŸããïŒåºæ¬çã«ãé¢æ°åŒã³åºããªãã§tryãšãŸã£ããåãããã«åäœããŸãã ããã¯ç§ãäž¡åŽã§èŠãå€ãã®æžå¿µã解決ããã§ãããïŒ
try
ã¯ããããé¢æ°ãšããŠå®è£
ããéãã誰ãã100ïŒ
æºè¶³ã§ãããã©ããããããªãååãä»ããããšã«åºå·ããŠããéããè«äºãåŒãã§ããŸããtry
ã¯åäŸã®ãªãæ°ã®ããšãè¡ãã append()
ãããªå
¥åãæã¡ããŠããã¿ã¹ãã¿ãŒã³ïŒ if err != nil
ïŒã®ä»£ããã«panic()
ãããªå¶åŸ¡ãããŒã«åœ±é¿ãäžããŸãã ãtry
å
¥ãåã¯ãå³å¯ãªæè¡çè°è«ããå°ãåºãããä»å 䟡å€ãšããŠã§ã¯ãªããé¢æ°ãšããŠå®è£
ãããšãã決å®ã®çµæã§ããtry
ã¯ãäžäœäºææ§ãç¶æããããã®é¢æ°ãšããŠå®è£
ãããŠããŸãã¿ã€ãã®ããã«åçŽã«ãªã¿ãŒã³ãæšæž¬ãããšãç©äºã¯ç°¡æœã«èŠãã次ã®ããã«ãé²ããããã«æããŸãã
f, err := os.Open(filename)
if err != nil {
return ..., err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return ..., err
}
_ãã®åäœã®æ£ããã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã®èª¬æãããã«æ¿å ¥ããŸã_ããããŸã§ã¯ãçãå€æ°å®£èšãä»ããŠæšå®ããããªã¿ãŒã³ã解決ããŸãã
f := os.Open(filename)
defer f.Close()
info := f.Stat()
ããã¯ã以äžãããã¯ããã«æŽç¶ãšèŠããŸãã
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
ããã«ãããäžèšã®ãã¹ãŠã®æžå¿µã解決ãããŸãããïŒç§ã®æèŠã§ã¯ïŒããå°ãã奜ãã«ãªãããšæããäžäœäºææ§ãç¶æããŸãã 説æãå°ãç°¡åã«æããŸããã try()
ã®é¢æ°åŒã³åºãã§ã®ãæé»ã®ãæ»ãã¯ãä»ã®ãã¹ãŠã®èšèªã§ã®try
ã®ãŠããã¿ã¹ãªæå³ãèãããšãæ¬åœã«å Žéãã«æããŸãã å®è£
ã«ã€ããŠ100ïŒ
話ãããšã¯ã§ããŸããããã»ãŒåãåªåã§å®è¡ã§ããå¯èœæ§ãããããã§ãã AssignStmt
ã¯ãçµã¿èŸŒã¿ãšåãããã¯ãšã³ãã³ã³ãã€ã«ãéç¥ããããã«ãLHSã®ã©ã®åŒãerrå€ãçç¥ããããæå®ãããã£ãŒã«ããè¿œå ã§ããŸããïŒ
ãã®ãŸãŸã®ãšã©ãŒãã§ãã¯ã奜ãã§ããããããæ¬åœã«è§£æ±ºããªããã°ãªããªãåé¡ã§ãããªããæ°ããããŒã¯ãŒããããããããè¯ã解決çã ãšæããŸãã ã©ã®ãœãªã¥ãŒã·ã§ã³ã«ãå¶åŸ¡ãããŒã®å€æŽãå«ãŸããå¯èœæ§ãé«ãããããããå¯èœãªéãæ確ã«ããããšãæåã§ãã
ãã®äŸã§ã¯ã on
err
ãèšå®ããããã³ã«on
æ¡ä»¶ãè©äŸ¡ãããŸãã
func example() (foo int, err error) {
on err != nil {
return foo, err
}
foo, err = calcThis()
foo, err = calcThat(foo)
return
}
ããã¯ãé¢æ°ã·ã°ããã£ã§æ»ãå€ã®ååã宣èšããªããŠãæ©èœããŸãã
func example() (*int, error) {
var err error
on err != nil {
return nil, err
}
foo, err = calcThis()
foo, err = calcThat(&foo)
return &foo, nil
}
ããã¯è€æ°åèšå®ããããšãã§ããŸãã äžèªç¶ãªäŸã次ã«ç€ºããŸãã
func example() (*int, error) {
var err error
on err != nil {
return nil, err
}
foo, err = calcThis()
on err != nil {
return &foo, err
}
foo, err = calcThat(&foo)
return
}
ç§ã®ç®ã«ã¯ãããã¯Goã®ã¹ã¿ã€ã«ãšèªã¿ããããç¶æããªãããåã¹ãããã§äœãèµ·ãã£ãŠããããæ確ã«ããŸãïŒãã©ãã€ã ãç解ãããšïŒãããã¯ã err
ãèšå®ããããã³ã«ãã®æ¡ä»¶ãå¹æçã«æ¿å
¥ããããã§ãã
次ã®ããšãã§ããŸãã
func example() (foo int, err error) {
var message string
on err != nil {
return foo, errors.Wrap(err, message)
}
message = "failed to calc this"
foo, err = calcThis()
message = "failed to calc that"
foo, err = calcThat(foo)
return
}
æåŸã«ãããã«ã¯ãšã©ãŒåŠçãè¶ ããé©çšæ§ããããŸãã foo == 0ã®å Žåã«æ»ãããã§ããïŒ å¥ã®äžèªç¶ãªäŸïŒ
func example(i int) bool {
on x == 0 {
return false
}
x = calcSomeInt(i)
return true
}
@cstockton
ãã®æ¹æ³ã§ãšã©ãŒãåãé€ãã®ã¯å°ãç°¡åããããšæè°ããããšããŠããŸãããã次ã®ããã«ãªããŸããã
json.Unmarshal
ãªã©ã®_only_ãšã©ãŒãè¿ãé¢æ°ãåãããèœãšãç©Žãã§ãã IMEã®åªããã³ãŒãã¬ãã¥ãŒã¢ã¯ããããéåžžã«è¿
éã«ç£èŠããããšãåŠã³ãŸããhttp.Handler
ã¡ãœãããªã©ããšã©ãŒå€ãè¿ããªãé¢æ°ã§ã¯ãæ§æãšã©ãŒãçºçããŸããã ãããç§ãèããããšãã§ãããã¹ãŠã®é·æãæ¯èŒæ€èšããæãããªæ¬ ç¹ã«æ°ä»ããªãã£ãåŸãç§ã¯...ãã§ã³ã¹ã«ããŸãã ç§ãèæ ®ããŠããªãæããã§ãªãæ¬ ç¹ãããã®ã§ã¯ãªãããšæããŸãã ããããç§ã¯ãããã©ãã«åãã£ãŠããã®ãã奜ãã«ãªãå§ããŠããŸãã
ç§ã¯ãããæ£ãã察å¿æ¹æ³ã§ããããšãé¡ã£ãŠããŸãããããŠç§ã¯ã³ãããããŠããŸãã
æ·±å»ãªãã§ã€ã¯ãã¹ã
7/1/19ã§ãã¯ãªã¹ã»ã¹ããã¯ãã³[email protected]ã¯æžããŸããïŒ
@ianlancetaylorãµããŒãããããã« "ïŒ="æŒç®åãæ¡åŒµããããšãææ¡ãã人ã¯ããŸãã
ãæšå®ãªã¿ãŒã³ã-åºæ¬çã«ãé¢æ°ãªãã§è©ŠããŠã¿ãã®ãšãŸã£ããåãããã«åäœããŸã
é»è©±ã [...]
ãã®å Žåãç§ãèå³ããããããã®ã¯ãç§ãã¡ãäœããæã£ãŠãããšããããšã§ã
ãcommaOKããã©ãã€ã ã«é¡äŒŒããŠããããerrããçç¥ãããŠããŸãã
è²å人ã¯ãæ確ã«å®çŸ©ãããç¶æ³äžã§èš±å¯ãããŸãã 䟡å€
泚æããŸããããããæå¹ã«ããã®ã«ããèªäœã§ã¯æããã«ååã§ã¯ãããŸãã
åœé¡ã
ã«ã·ãªã
ãã®ãã°ã¯ãã§ã«çºçããŠããå¯èœæ§ããããŸããè©ŠããŠã¿ãŠãã©ããã¯é¢ä¿ãããŸãããGoã䜿çšããŠããäžæ£ãªã³ãŒãã®èšè¿°ãé²ãããšã¯ã§ããŸããã ãŸãã¯ãããã奜転ãããŠãè©Šè¡ãèš±å¯ãããã¹ãã§ã¯ãªãçç±ãšããŠæªãã³ãŒãã䜿çšããããšã¯ã説åŸåã®ããè°è«ã§ã¯ãããŸããã 代ããã«ãç£å»ã¯åé¡ã®ããã±ãŒã¹ã«ãã©ã°ãç«ãŠãå¿ èŠããããŸãã
@griesemeråæããŸããã ããŒã¹ãããŒã¯ãç¯çŽã§ããŸããããã€ã³ã¿æŒç®ã¯ãäžè¯ã§å£ããã³ãŒããç°¡åã«èšè¿°ã§ãããšããåæã§ãGoããé€å€ãããŸããã ããã¯ããã°ã®æ€åºãããå°é£ã«ããã®ãšåãã¿ã€ãã®æ©èœã ãšæããŸãã
data := try(ioutil.ReadAll(try(os.Open("foo.txt"))))
try
ã®å
žåçãªäŸã§
data := try(ioutil.ReadAll(try(http.Get("http://example.com/")).Body))
äžèšã¯æ£ããã³ãŒãã®ããã«èªã¿åãããŸãããå¿çæ¬æãå®å šã«èªã¿åããããã®åŸããããŒãã¹ã§éãããããšããèŠä»¶ã¯ç¡èŠãããŸãã ååã«é·ãèŠãŠã¿ããšãééã£ãäŸã®å«ãªåªé ãã¯ãå°æ¥ãããã®ã¿ã€ãã®ãã°ãçºçããããšãæããã«ããã¯ãã§ãã
ãã®æç¹ã§ã³ãŒããæžã以äžã®ããšãã¬ãã¥ãŒãã人ãšããŠãç§ã¯Goãäžæ£ç¢ºããããã»ã©é åçã«ããæ©èœãè¿œå ããªãããšãæã¿ãŸãã
@ jesse-amanoä»£å ¥æŒç®åã䜿çšãããšãæ瀺çãªä»£å ¥ã¹ããŒãã¡ã³ãããªããšãå®éã«ã¯ãã®ã±ãŒã¹ãçºçããªããªããŸãã以äžã¯ãä»æ¥ãšãŸã£ããåãããã«åäœããŸãã
json.Unmarshal(...)
(http.Handler)(h).ServeHTTP(w, r)
ãšã©ãŒãè¿ãã ãã®å€ã«ã€ããŠã¯ã return json.Unmarshal(...)
ããã«è¿ãããè³æ Œããããifãããã¯ã®å€åŽã«å€ãååšããå¿
èŠããªããããããã³ã³ãã¯ããªåœ¢åŒã§è¡šãããšãã§ããŸãã
if err := json.Unmarshal(...); err != nIl {
return err
}
ãã®å Žåãç§ãèå³ããããããã®ã¯ããcomma OKããã©ãã€ã ã«é¡äŒŒãããã®ãããããšã§ããããã§ã¯ãæ確ã«å®çŸ©ãããç¶æ³ã§ã¯ããerrãæ åœè ãçç¥ã§ããŸãã 泚ç®ã«å€ããŸããããããæå¹ãªææ¡ã«ããã®ã«ããèªäœã§ã¯æããã«ååã§ã¯ãããŸããã
åäœã¯ã芪ãŸãã¯ä»»æã®ãã¹ããšãã§ãŒã³ãªãã§è©Šãã®ãšåãã§ãã 倧å€æ°ã®äººãèšèãå£ããã«èªç¶ã«æãããã®ãèŠã€ããã®ã¯é£ãããšæããŸãã Goã®äœè
ã¯ãã®ã¿ã€ãã®æ©èœãGoã«è¿œå ããããšãããªã決å¿ããŠããããã§ãã®ã§ãçŸåšã®åœ¢åŒã®try
ã¯Goã«é©ããŠããªãããšã絶察ã«ç¢ºä¿¡ããŠããã®ã§ã代æ¿æ¡ãæ·±ãæãäžããŠããŸãã ããã¯ç§ãèããããšãã§ããæãè¿ããã®ã§ãããBCãå£ãããšã¯ãããŸããããããã§ãååãªæ°ã®äººã
ã«ãšã£ãŠæ£ãããšã¯æããããªããããããŸããã ãããã«ããããã©ã€ã®ææ¡ãæåŠããããã誰ãããã£ãšå€ãã®äººãåæã§ããäœããæãã€ãããšãé¡ã£ãŠããŸãã
ç·šéïŒ@ jesse-amanoç³ãèš³ãããŸãããããªãã®ãã€ã³ããå®å šã«éããŸããïŒ ãšã©ãŒãè¿ããªãé¢æ°å ã«ãããšãå žåçãªå²ãåœãŠã«ãŠã³ãã®äžäžèŽã®ã³ã³ãã€ã«ãšã©ãŒã衚瀺ããããšæããŸããïŒ è©ŠããŠã¿ããšããããããã®ããã®æ°ããã¿ã€ãã®ã³ã³ãã€ã©ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšæããŸãã
@beoran https://github.com/golang/go/issues/32825#issuecomment -507126700ã«ã€ããŠïŒãšã©ãŒåŠçã¯ç¶æ³ããšã«ãã§ã«ç°ãªããŸãïŒãšã©ãŒãå€æŽããã«è¿ãå Žåãããã°ãè£
食ããããšã©ãŒãè¿ãå ŽåããããŸãããšã©ãŒãçºçããå Žåããšã©ãŒãïŒæ£ããïŒç¡èŠã§ããå ŽåããããŸãã ãããããã¹ãŠå
±æããå¯äžã®ããšïŒãšã©ãŒãç¡èŠããå Žåãé€ãïŒã¯ã err != nil
ãã¹ãã§ãïŒããã¯ãã§ã«è€æ°ã®æ¹æ³ã§å®è¡ã§ããŸãïŒã æ°ããèšèªæ©èœãããããã¹ãŠã®ã±ãŒã¹ïŒãŸãã¯ãããã®95ïŒ
ïŒããã£ããã£ããã®ã¯è¯ãããšã§ããããã®ãããªæ§é ã¯ããã§ã«æã£ãŠããä»ã®å¶åŸ¡æ§é ãšéçŽäº€çã«å¹²æžããå¯èœæ§ãéåžžã«é«ããªããŸãã ã€ãŸããç§ãã¡ãæåŸ
ã§ããæåã®æ¹æ³ã¯ããããã®ã±ãŒã¹ã®ããã€ãïŒããããã20ïŒ
ããããã50ïŒ
ïŒãæ¹åããããšã§ãã
@cstockton https://github.com/golang/go/issues/32825#issuecomment -507136111ã«ã€ããŠïŒãã¹ããããtry
ãæ®ã£ãŠããå¯äžã®é害ã§ããã go vet
ã§ã¯äžååãªå Žåããã¹ããããtry
çŠæ¢ããããšãæ€èšã§ãããšæããŸã-ããã¯ååã«ç°¡åã§ãã ããããçŸæç¹ã§ã¯ãç§ãã¡ã¯ãŸã FUDïŒææãäžç¢ºå®æ§ãçãïŒã®æ®µéã«ãããå®éã«try
ãçå£ã«å®éšãã人ã¯èª°ãããªããšæããŸãã ç§ã¯ããããŠãã人ã
ãååãã«å ±åããããšã«æ³šæããŸãã
PSïŒ try
åé¡ã¯ããã£ãŒãããã¯ã®ããã«åã³éãããŠããŸãã ããããç¶ããŸãããã
@cstocktonããã絶察ã«ã æ確ã«ããããã«ãç§ãç®æããŠããã®ã¯ãã»ãšãã©ã®å Žåããšã©ãŒå€ããã£ããã£ããã«json.Unmarshal
ãããªé¢æ°ãåŒã³åºãããšã¯_ãã§ã«_æªãç¿æ
£ã§ãããéåžžã¯defer file.Close()
代ããã«æªãç¿æ
£ãšã¯èŠãªãããªããšããããšdefer func() { err = file.Close(); if err != nil { ... }; }()
ããããŠç§ãã¡ã¯ããªãç°¡åã«éããèŠåããããšãåŠã³ãŸããã ãããã£ãŠãããã¯ïŒããããïŒããªãã®ææ¡ãããå€æŽã«äŒŽãã§ãããã ç§ã¯åœåã誰ãããšã©ãŒãåŠçããã€ããã§ç¡éªæ°ã«foo := strconv.ParseFloat(bar, 64)
ã䜿çšããŠãããšæããŸããããç°¡åã«æ€èšããçµæãçµå±ã®ãšããåé¡ã§ã¯ãªããšæããŸãã
@sirkon https://github.com/golang/go/issues/32825#issuecomment -507167388ã«ã€ããŠïŒãã®ãããªæããã«ä¿®é£ŸãããŠããªãã¹ããŒãã¡ã³ãã¯ãè°è«ããé€å€ããŠãã ãããããã«ã¯å ŽæããããŸããã 念ã®ããã«èšã£ãŠãããŸãããGoã®ã¢ã€ãã¢ã®å€ãã¯ãå®éã«ã¯60幎代ã§ã¯ãªã80幎代ã®ãã®ïŒããã±ãŒãžãåå¥ã®ã³ã³ãã€ã«ãªã©ïŒã§ãããå€ãã¯ã¯ããã«è¥ããã®ã§ãïŒãŽã«ãŒãã³ãã€ã³ã¿ãŒãã§ã€ã¹ïŒã ãããã®ã¢ã€ãã¢ã¯ãŸã å€ãããã«èŠãããããããŸãããããããã¯æã®è©Šç·Žã«èããŠããŸããïŒå°ãªããšãCSãåºåã£ãŠããããããªæéïŒã
@turtleDev https://github.com/golang/go/issues/32825#issuecomment -507231353ã«ã€ããŠïŒGoã¯äŸå€åŠçãè¡ãã panic
ãšdefer
ãšrecover
-ãã®çšèªã«ã¯Goã«ãšã£ãŠèª€è§£ãæããããªæå³åããå«ãŸããŠããããããäŸå€åŠçããšã¯åŒã³ãŸããã ãã ããæ確ã«ããããã«ãGoã¯try-catch
ã§raise
ãå®è¡ã§ãããã¹ãŠã®ããšãå®è¡ã§ããŸãïŒ try-catch
ãšã¯å¯Ÿç
§çã«ã defer
ã䜿çšã§ããããïŒæ¡ä»¶ä»ãïŒã ããããšãã
@sorenvonsarvort https://github.com/golang/go/issues/32825#issuecomment -507268293ã«ã€ããŠïŒã±ãŒã¹ããšã«ç°ãªããšã©ãŒè£
食ãå¿
èŠãªå Žåã¯ã if
ã¹ããŒãã¡ã³ãã䜿çšããŠãã ããã ãã¶ã€ã³ããã¥ã¡ã³ããã芧ãã ããã ãã®è³ªåã¯ãããŸã§äœåºŠãçããããŠããŸããã ããããšãã
@cstockton https://github.com/golang/go/issues/32825#issuecomment -507306652ã«ã€ããŠïŒã¯ãããã®ãããªã¡ã«ããºã ã«ã€ããŠèããŸããã å
·äœçã«ã¯ããããŒãã«ãããããããšãèãã try
ãæäŸãã代ããã«ããšã©ãŒãã³ãã©ãŒã宣èšããhandle
æäŸããã ãã§ãã ãã³ãã©ãŒãååšããå ŽåïŒãããŠãã®å Žåã®ã¿ïŒãå²ãåœãŠã®LHSã«err
ãæ®ãã ãã§ãæé»çã«ãã§ãã¯ãããŸãïŒé衚瀺ã®try
ïŒã èŠãç®ã¯è¯ãã§ãããå®å
šã«èŠããªãã®ã§ã倧ããªèµ€ãæã§ãã äŸå€åŠçãã³ãŒãå
ã®ããããå Žæã§æ瀺çã«è¡šç€ºããå¿
èŠããããŸãã ããããªããã°ãã³ãŒããèªãã§ãšã©ãŒãã§ãã¯ãã©ãã§èµ·ãã£ãŠãããã確èªããããšã¯ã»ãšãã©äžå¯èœã§ãã
@griesemeræ確ã«ããŠãããŠããããšãã ãããããããã¯ãšãªã«ããªãŒã«ã¯ç°ãªããŠãŒã¹ã±ãŒã¹ããããã»ãšãã©ã®å Žåããããã¯ã·ã§ã³ã³ãŒãããŒã¹ã§èŠã€ããã®ã¯éåžžã«å°é£ã§ãã ãã®ããããããŒæ§é ã®å¶åŸ¡ã¯éãããéãããããŸããã æ°ããã³ã³ã¹ãã©ã¯ããè¿œå ãããšãreturnã®ãããªããšãè¡ããããŒã³ã³ã¹ãã©ã¯ãã®æ°ããã³ã³ãããŒã«ãããããããã®äžè²«æ§ã倱ãããŸãã
@ matthew-noken https://github.com/golang/go/issues/32825#issuecomment -507323973ã«ã€ããŠïŒããªãã¯èå³æ·±ãã¢ã€ãã¢ãææ¡ããŠããŸãã ãããã¬ãŒã®ãŠã©ãããã€ã³ãã¡ã«ããºã ã«éåžžã«ãã䌌ãŠããŸãã çããªããã°ãªããªãããã€ãã®è³ªåããããŸãïŒ on
ãããã¯ã¯æ»ãå¿
èŠããããŸããïŒããã§ãªããã°ã¹ãã²ããã£ã³ãŒãã®åå°ã«å
¥ãã®ã§ãç§ã¯ããæãã§ãããïŒïŒ ãã®ãããªon
ã¹ããŒãã¡ã³ããè€æ°æã€ããšã¯ã§ããŸããïŒ on
æ¡ä»¶ã¯ã©ã®ãããè€éã«ãªãå¯èœæ§ããããŸããïŒå²ãåœãŠããšã«è©äŸ¡ããå¿
èŠããããŸãïŒïŒ on
ã¹ããŒãã¡ã³ãã§å€æ°ãäžæã«èå¥ããå¿
èŠããããããä»»æã®åŒã䜿çšã§ããªãããšã«æ³šæããŠãã ããã ãŸããGoã®ããã¢ãããïŒ on
æ§é ã¯ãä»ã®å Žæã§å®è¡ãããç®ã«èŠããªãã³ãŒããæå³ããŸãã
ãããããã«è©³ãã調ã¹ããå Žåã¯ãä»ã®å ŽæïŒgolang-nutsããŸãã¯å¥ã®æ°ããææ¡ïŒã§ããã«ã€ããŠè°è«ããããšããå§ãããŸãã ããããšãã
@as https://github.com/golang/go/issues/32825#issuecomment -507345821ïŒ
ãã€ã³ã¿æŒç®ã¯ãæªããå£ããã³ãŒããç°¡åã«æžãããšãã§ãããšããåæã§ãGoããé€å€ãããŸãã
å®éã«ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå°é£ãŸãã¯äžå¯èœã«ãªããããé€å€ãããŸããïŒãã¡ãããå®å šã§ãªãã³ãŒããäœæããããšãã§ããŸãïŒã ããããããã§ããéèŠãªç¹ã¯ããã®æ±ºå®ãè£ä»ããå ·äœçãªèšŒæ ãšçµéšããã£ããšããããšã§ãã
ãã¹ããããtry
ãæ®åãŸãã¯äžè¬çã«ãªããšããçµéšã蚌æ ã¯ãŸã ãããŸããã ãã ãã httpsïŒ //github.com/golang/go/issues/32825#issuecomment-507358397ãåç
§ããŠ
@turtleDev https://github.com/golang/go/issues/32825#issuecomment -507368167ã«ã€ããŠïŒ panic
ã¯_æ£ç¢ºã«_äŸå€ã§ãããé
延é¢æ°å
ã®recover
ã¯æ¬è³ªçã«catch
ã Goã§ã¯äŸå€ã䜿çšããŠã³ãŒããèšè¿°ããããšã¯ãå§ãããªããããæ¬çªã³ãŒãã§ã¯èŠã€ããã®ãé£ããå ŽåããããŸãã ãããã¯äŸå€çãªç¶æ³ã§ã®ã¿äœ¿çšãããã¹ãã§ãã
å¶åŸ¡ãããŒæ§é ã®æ°ã«ã€ããŠïŒææ¡ã¯ã try
ãåãªãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã§ãããä»ã«ã¯äœããªãããšãéåžžã«æ確ã«ããŠããŸãã
ç§ã¯ãã®ã¹ã¬ããã®ãã®ã¹ã¬ããã®æè¿ã®ã³ã¡ã³ãã®ããã€ãã«çããããšããŸããã ããããå®éã®try
å·ïŒ32437ã®try
ææ¡ã«å¯Ÿããæ°ããã³ã¡ã³ããç¶ããŸãããïŒä»æ¥ã®æç¹ã§åã³ããã¯ã解é€ãããŸããïŒã ãã®åé¡ã¯leave err != nil alone
è°è«ã®ããã«äºçŽããŠãããŠãã ããã ããããšãã
@cstockton https://github.com/golang/go/issues/32825#issuecomment -507306652ã«é¢ããå¥ã®ã³ã¡ã³ãïŒãããå®è£ ããå Žåã¯ã
func f() int { ... }
...
x := f()
ã«å€æŽããŸã
func f() (int, error) { ... }
x := f()
ãçªç¶ãéãã«å€§ããç°ãªãããšãæå³ããŸãã
@lparããã¹ãŠã®goãªããžããªã§å®è¡ããŸããã çµæã¯ãã®èŠç¹ã«ãããŸãïŒ https ïŒ
@ianlancetaylorç§ã¯å®éãããã¯ã»ãšãã©ã®å Žåéåžžã«ããŸãæ©èœããããè¯ããšã©ãŒå ±åãå°å ¥ããããšã«ãã圱é¿ãã¯ããã«å°ãªããããšæããŠããŸãã 2ã€ã®äž»ãªã±ãŒã¹ã®å®å šãªäŸãèããŠã¿ãŸããããæåã«ãåŒã³åºãå ããšã©ãŒãè¿ããŸãã
func f() int { ... }
func a() error {
x := f() // if f() is updated to return an error, we get automatic error propagation by default
...
}
func b() {
x := f() // if f() is updated to return an error, we get the same compiler error
// assignment mismatch: 1 variable but pkg.f returns 2 values
}
äžè¬çãªã±ãŒã¹ã§ã¯ãããã¯ãã®ã¢ãããŒãã®è¯ãå©ç¹ã ãšæããŸãããããåé¡ãåŒãèµ·ããã³ãŒããŒã±ãŒã¹ã¯ããã§ã«è匱ã§ãããšç§ã¯ä¿¡ããŠããŸãã æ¬åœã«åä»ã§ãããšç§ãèããããšãã§ããã®ã¯ããã¥ãŒããã¯ã¹ããããããã¯ããããšã ãã§ãã
func (t *T) a() error {
t.mu.Lock()
x := f() // if f() is updated to return an error, we get automatic error propagation by default
if x > 15 {
t.mu.Unlock()
return errors.New("t > 15")
}
...
}
ãããããã®ããã«èšè¿°ãããã³ãŒãã¯ãæå¹ãªããã°ã©ã ç¶æ ãæã€ããã«æåããããã«å€éšã©ã€ãã©ãªåŒã³åºãã«äŸåããŠããå Žåããã§ã«ãããããã¯ã®åœ±é¿ãåãããããšæããŸãã ãããã¯ãè¶ ããŠåç¶ã§ããã¹ã³ãŒãã«æ ŒçŽãããŠããå Žåãåãã©ã€ãã©ãªãNPEãä»ããŠã©ã³ã¿ã€ã ãããã¯ãåŒãèµ·ãããšããããããã¯ãçºçããå¯èœæ§ããããŸãã ããã«ããã®ãããªã³ãŒããäœæããäž»ãªåæ©ã¯ãããŒãäžã«ååšãã延æè ã®ååŸå䟡ã§ãã ã¹ã¿ãã¯äžã«ååšããã·ã³ã°ã«ãã£ãã¡ãŒã®ããã©ãŒãã³ã¹ãåäžããŠããããããã®ãããªã³ãŒãã¯å®éã«ã¯å¿ èŠãããŸããã ãã®ã¿ã€ãã®ãšã©ãŒã®æŽŸçã¯ç°¡åã«ä¿®æ£ã§ãããšæããŸãã
æåŸã«ãããŒã«ã§ãè©Šè¡ãã®æ¬ ç¹ããµããŒããããšããè°è«ã®ããã«ãããã§ãé©çšã§ããŸãã go-modulesã®æ¡çšãå¢ããŠããããšãèãããšããŠãŒã¶ãŒã®é¡ã®åã«ãã®ãããªå€æŽãæ確ã«è¡šç€ºããããã«ããã©ã€ãã©ãªã¢ããã°ã¬ãŒããªã³ãã£ã³ã°ãã¹ããããæ³šå ¥ãã絶奜ã®æ©äŒããããŸãã
@griesemer
å¶åŸ¡ãããŒæ§é ã®æ°ã«ã€ããŠïŒææ¡ã¯ãtryãåãªãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã§ãããä»ã«ã¯äœããªããšããããšã¯éåžžã«æ確ã§ãã
ç³ãèš³ãããŸãããã try
ã¯ïŒCã®ãããªïŒãã¯ãã«ã¯ãªããªãã®ã§ãäºå®äžããšã³ããŠãŒã¶ãŒã«ãšã£ãŠã¯ãããŒã¹ããŒãã¡ã³ãã®å¥ã®ã³ã³ãããŒã«ã«ãããŸããã
çŸæç¹ã§ã¯å®¢èŠ³çãªè°è«ã¯ãªããšæããŸãã®ã§ããã£ãšè¯ããšã©ãŒåŠçãå¿
èŠãããããªããšèªããŸããã try
ã¯æåã®è§£æ±ºçã§ã¯ãªããããããŸããã
ç¹°ãè¿ããŸããããããã¯ç§ã®æèŠã§ãããç§ã¯ãããã代衚ããŠããã ãã§ãã GoããŒã ã¯ããããŸã§ä»¥äžã«å€ãã®ããšãèããŠãããšæããŸãã
ãµã€ãïŒããã¯ããã®åé¡ã¯ãäžæ¹ã§1335 upvotesãæã£ãŠããããšãå¥åŠãªãšããŠç§ãæã€try
ææ¡ïŒïŒ32437ïŒã®ã¿279 downvotesãæã£ãŠããŸãã ããã2ã€ã®ææ¡ã¯çžäºã«æä»çã§ãããããããã«è³æãã人ã
ãtry
ææ¡ã«å察ããããšã§ãã³ãã¥ããã£ã®ææ
ãããæ確ã«ãªãããšãæåŸ
ããŸãã
@griesemer
ãšã©ãŒåŠçã¯ç¶æ³ããšã«ãã§ã«ç°ãªããŸãããšã©ãŒãå€æŽããã«è¿ãå Žåãè£ é£Ÿããããšã©ãŒãè¿ãå Žåããšã©ãŒã«å¯ŸåŠããå Žåããšã©ãŒãïŒæ£ããïŒç¡èŠããå ŽåããããŸãã
ããã§åæããŸãããããã ãã¯æããã§ãã
ãããããã¹ãŠå ±æããå¯äžã®ããšïŒãšã©ãŒãç¡èŠããå Žåãé€ãïŒã¯ã
err != nil
ãã¹ãã§ãïŒããã¯ãã§ã«è€æ°ã®æ¹æ³ã§å®è¡ã§ããŸãïŒã æ°ããèšèªæ©èœãããããã¹ãŠã®ã±ãŒã¹ïŒãŸãã¯ãããã®95ïŒ ïŒããã£ããã£ããã®ã¯è¯ãããšã§ããããã®ãããªæ§é ã¯ããã§ã«æã£ãŠããä»ã®å¶åŸ¡æ§é ãšéçŽäº€çã«å¹²æžããå¯èœæ§ãéåžžã«é«ããªããŸãã ã€ãŸããç§ãã¡ãæåŸ ã§ããæåã®æ¹æ³ã¯ããããã®ã±ãŒã¹ã®ããã€ãïŒããããã20ïŒ ããããã50ïŒ ïŒãæ¹åããããšã§ãã
ææ¡ãããtry()
ã¹ããŒãã¡ã³ããif
ãšreturn
ãéçŽäº€çã«ãå¹²æžãããã®ã§ããã®è°è«ã¯æ£ãããªããšæããŸãã ããã®äœäººãã®äººã
ã¯ãŸãã«ãã®çç±ã§try()
ãå«ããŸãããããç§ã¯åæããŸããã Goã¯Oberonã§ã¯ãªããã·ã³ãã«ã§ãããããã«ã§ã¯ãããŸãããGoã®æ¹ãå®çšçã§ãã
ç§ãã¡ãåæããªãã®ã¯ãããªããèªããããã«ã䜿çšæ³ãšé©çšæ§ãéãããŠããã if
ãšreturn
ãã§ã«æ£ããå®è¡ã§ããèšèªæ§é ãæ°ã«ããããšã¯äŸ¡å€ããããšããããšã§ãã try()
å§åãããŠããŸã£ããæã£ãŠããããªããšæããŸãã ãªã¿ãŒã³ãšçŽäº€ããŠããªããŠãããã匷åã§äžè¬çã«åœ¹ç«ã€try()
ã¯ãããããã»ãšãã©ã®Goããã°ã©ããŒãæãã§ãããã®ã§ãã
@beoran ã
ããªãã¯ããã匷åãªããããäžè¬çã«åœ¹ç«ã€ã try()
ã欲ãããšæžããã
@griesemerã¯4ã€ã®ç¶æ³ã«èšåããŸããïŒ
try()
ãèšèšã«ãã1ã解決ããŸããããã¯æåéãif err != nil { return ..., err }
ã·ã§ãŒãã«ããã§ãã
æ¢åã®èšèªæ§é ã¯3ãš4ãââ解決ããŸãã if err != nil { ... }
ãšã©ãŒã«å¯ŸåŠããããšã¯ãã§ã«å¯èœã§ããããã®å Žåãããç°¡æœãªæ§é ãèŠã€ããããšã¯å°é£ã§ãã _
ãšã©ãŒã¯ãã§ã«ç¡èŠã§ããŸãã
ããã«ããã2ãæ®ããŸãïŒè£
食ããããšã©ãŒãè¿ããŸãïŒã try()
ææ¡ã§ã¯ãdeferã¹ããŒãã¡ã³ãã䜿çšããŠãšã©ãŒãè£
食ããããåãšã©ãŒãç°ãªãæ¹æ³ã§è£
食ããå¿
èŠãããå Žåã¯ãæšæºã®if err != nil { ... }
æ§é ã䜿çšããããšããå§ãããŸãã
çç±ã¯ææ¡ã®ãã®éšåã§ãã説æãããŠã
ãã®ææ¡ã®æåã®å埩ã¯ããšã©ãŒåŠçã®äž»èŠéšåããã®2ã€ã®ã¢ã€ãã¢ã«è§ŠçºãããŸãããããã¯ãæŒç®åã§ã¯ãªãçµã¿èŸŒã¿ã䜿çšããããšãšãæ°ãããšã©ãŒãã³ãã©èšèªæ§é ã§ã¯ãªããšã©ãŒãåŠçããããã®éåžžã®Goé¢æ°ã§ãã ãã®æçš¿ãšã¯å¯Ÿç §çã«ããšã©ãŒãã³ãã©ãŒã«ã¯ãåé¡ãåçŽåããããã«åºå®é¢æ°ã·ã°ããã£
func(error) error
ãŸããã ãšã©ãŒãã³ãã©ã¯ããšã©ãŒãçºçããå Žåãå²ãã§ããé¢æ°ããtry
è¿ãããçŽåã«ãtry
ã«ãã£ãŠåŒã³åºãããŸãã 次ã«äŸã瀺ããŸããhandler := func(err error) error { return fmt.Errorf("foo failed: %v", err) // wrap error } f := try(os.Open(filename), handler) // handler will be called in error case
ãã®ã¢ãããŒãã§ã¯ãå¹ççãªãŠãŒã¶ãŒå®çŸ©ã®ãšã©ãŒãã³ãã©ãŒãæå®ã§ããŸããããæããã«æ£ããçãããªãå€ãã®è³ªåãéãããŸããããã³ãã©ãŒãæäŸãããŠãããnilã®å Žåã¯ã©ããªãã§ããããã
try
ãããã¯ã«ãªãã¹ãã§ããããããšãååšããªããšã©ãŒãã³ãã©ãŒãšããŠæ±ãã¹ãã§ããïŒ ãã³ãã©ãŒãnil以å€ã®ãšã©ãŒã§åŒã³åºãããnilã®çµæãè¿ããå Žåã¯ã©ããªããŸããïŒ ããã¯ããšã©ãŒãããã£ã³ã»ã«ããããããšãæå³ããŸããïŒ ãŸãã¯ãå²ãã§ããé¢æ°ã¯nilãšã©ãŒã§æ»ãå¿ èŠããããŸããïŒ ãªãã·ã§ã³ã®ãšã©ãŒãã³ãã©ãŒãèš±å¯ãããšãããã°ã©ããŒãé©åãªãšã©ãŒåŠçãå®å šã«ç¡èŠããããã«ãªããã©ãããæ確ã§ã¯ãããŸããã§ããã ãŸããã©ãã§ãé©åãªãšã©ãŒåŠçãè¡ãã®ã¯ç°¡åã§ãããtry
1åçºçããã®ãèŠéããŸãã ãªã©ãªã©ã次ã®å埩ã§
defer
ããšã©ãŒã©ããã³ã°ã«[...]
äœããã®åœ¢ã§æ瀺çã«æäŸããããšã©ãŒãã³ãã©ãŒé¢æ°ããŸãã¯ãã®ä»ã®è¿œå ãã©ã¡ãŒã¿ãŒã䜿çšããã®ãè¯ãèãã§ãããšå°æ¥çã«å€æããå Žåããã®è¿œå ã®åŒæ°ãtryåŒã³åºãã«æž¡ãããšã¯ç°¡åã«å¯èœã§ãã
ããªãã¯ãã®æšè«ã«åæããŸãããïŒ
ç§ã¯ææ¡ã®ãã®éšåãç¥ã£ãŠããŸãããããã«åæããŸããããšã©ãŒãã³ãã©ãŒãæž¡ããšããèãã®ããã«è³ªåãéããããšããäºå®ã¯ããã®ãããªæ©èœãå¿ èŠãªããšããæå³ã§ã¯ãªãããã§ãã ããã¯ãåççãªæ¹æ³ã§ãããã®è³ªåã«çããããã«ããèããªããã°ãªããªãããšãæå³ããŸãã
ããã«ãä»ã§ã¯ã4ã€ã®ãšã©ãŒãŠãŒã¹ã±ãŒã¹ãã¹ãŠãif err != nil
ã¹ããŒãã¡ã³ãã§åŠçããŸããããã¯ãåºãç解ãããŠãããäžè²«æ§ã®ããGoã€ãã£ãªã ã§ãã ã±ãŒã¹1ã«try()
ã®ã¿ã䜿çšããå Žåã«ãã£ãŠã¯ã±ãŒã¹2ã«ã®ã¿ãdeferã¹ããŒãã¡ã³ãã§ãšã©ãŒã©ããã³ã°ãå®è¡ãããªãŒããŒããããæ°ã«ããªãå Žåã¯ããšã©ãŒåŠçã®ã³ãŒããif
åå²ãããããšãæå³ããŸãã try
äžè²«æ§ããªãããšã©ãŒåŠçãå€æŽãããå Žåã¯ãäžæ¹ãšä»æ¹ãåãæ¿ããå¿
èŠããããŸãã
ãã¹ãŠã®å Žåã«äœ¿çšã§ããtry()
ã®ãã匷åãªããŒãžã§ã³ã§ã¯ãã»ãšãã©ã®å Žåtry()
ã䜿çšã§ãããããGoã®æ°ããäžè²«ãããšã©ãŒåŠçã€ãã£ãªã ã«ãªããŸãã
ãã ããçŸåšã®try()
ã§ã¯ãååã«åºãé©çšã§ããããã§ã¯ãªããåè¿°ã®ãšã©ãŒåŠçã®äžæŽåãã³ãŒãããŒã¹ã«å°å
¥ããã®ã«ååãªå©äŸ¿æ§ãåŸãããŠããŸããã ãã®ãããçŸåšã®try()
ææ¡ã«å§åãããäœãããªãæ¹ãè¯ããšæããŸãã
@beoranã±ãŒã¹1ãš2ã¯ãé¢æ°ãããšã©ãŒãè¿ãã®ãå ±éããŠãããšæããŸãïŒããããè£ é£ŸãªããšããïŒããã±ãŒã¹3ãš4ã¯è¿ããŸããïŒãããããšã©ãŒã«å¯ŸåŠãããšã©ãŒãç¡èŠããŸãïŒã 'tryïŒïŒ `ã®çŠç¹ã¯ã±ãŒã¹1ãš2ã«ãããšæããŸãã
ãªãã·ã§ã³ã®ãã³ãã©ãŒé¢æ°ãåãå
¥ããããšã«ãããã±ãŒã¹1ãš2ãåŠçããããã«try()
ããããŒã¶ã«ãæ¹åã§ãããšãããã©ãã§ããããã ãã¡ãããããã«ã¯ææ¡ã«ãªã¹ããããŠãã質åã«å¯ŸããåççãªçããèŠã€ããå¿
èŠããããŸãããããã¯æ±ããããããã§ãã ãã®ãããªãã®ããµããŒãããŸããïŒ
ããã«ç§ãããŸãã ãã®å ŽåããŠãŒã¶ãŒã«ãšã©ãŒããã§ãã¯ããŠãããããå Žåã¯ããã§ãã¯ããããšã©ãŒïŒãã§ãã¯ãããäŸå€ã®ãããªãã®ïŒãè¿œå ããå¿ èŠããããŸãã ããããã°ãå¯èœãªéãæ瀺çã«ãªãããŠãŒã¶ãŒã¯ãã¹ãŠã®ãšã©ãŒããã§ãã¯ããŠããããšãããããŸãã
çé¢ç®ãªè©±ã§ãããç§ããããã®æ±ºå®ãäžããã®ã§ããã°ãKotlinã®?
æŒç®åãŸãã¯ãã³ãunwrap()
åäœã®ãããªãã®ãåå©çšããããšæããŸãã
ãããã®ãããããæ¹åããããšæããŸãã
getFile()?.getPath()?.toString()
ããªããååŸããå Žænil
åž°ãã«æ²¿ã£ãŠãšã©ãŒãçºçããå ŽåãŸãã¯
get_file().unwrap().get_path().unwrap().lossy_to_string()
ãšã©ãŒãçºçããå Žåãéäžã§ççºããŸãã Rustã¯ãè¡šçŸåè±ããªmatch
é¢æ°ã䜿çšããŠããšã©ãŒã培åºçã«æ€çŽ¢ãããããããåå¥ã«åŠçããŠããã§ãŒã³ã®äžäœã«ããçš®é¡ã®å€ãè¿ãããšã§ã2çªç®ãåŠçããŸãã
7/2/19ã«ãNicolasGrillyã®[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@beoranã±ãŒã¹1ãš2ã¯ãå ±éããŠãšã©ãŒãè¿ããšæããŸãã
æ©èœïŒããããè£ é£Ÿãªããšè£ 食ããïŒãã±ãŒã¹3ãš4
ããªãã§ãã ããïŒãããããšã©ãŒã«å¯ŸåŠãããšã©ãŒãç¡èŠããŸãïŒã 'tryïŒïŒ `ã ãšæããŸã
çŠç¹ã¯ã±ãŒã¹1ãš2ã«ãããŸããç§ã®ææ¡ã«ã€ããŠãã以äžã®è°è«ãèŠãããªãããšã«å°ããã£ããããŠããŸã
ããšã©ãŒãªã¿ãŒã³ãã®ããªã¿ãŒã³ãéšåã§ããå¿ èŠãããããš
ããšã©ãŒãã®éšåã§ã¯ãªãã察åŠããŸããã
ãããªããŸãããã£ãšå
¬åŒãªã¢ãããŒãã«åŸãã¹ãã ã£ãã®ãããããŸããã ç§
åã«ææ¡ãäœæããã®ãèŠæã§ãç§ã¯ãã¡ãã¡ã«è¡ãåŸåããããŸã
å Žæã
ç§ã®æèŠã§ã¯ãã±ãŒã¹1ãš2ã¯ãã倱æãã³ãã³ãã®æ¹ãé©ããŠããŸãã
ïŒããçšåºŠæ
£ããåŸïŒæ確ã«ç€ºãããŒã¯ãŒã
ããã°ã©ã ãããŒã®å€æŽã§ãããããã¯å¯Ÿè±¡å€ã§ãã
ãã®å®å
šãªæ§æã«é¢ããŠäžäŸ¿ãªäŒçµ±ã
ããããããããç¶ãã®ã¯ãç§ãã¡ãããã奜ããã©ããã«ããããããããã§ã
æåŸã®æ»ããã©ã¡ãŒã¿ãšããŠã®ãerrãã®äœçœ®ä»ãã¯éããªã
æ
£ç¿ã§ã¯ãªãæ³åŸã«ãªãã ããã¯å€ãã®ãæå³ããªãããŸãã¯
èæ
®ã«å
¥ããå¿
èŠã®ãããä»éçãªãçµæã
æå°éã®ãã®ãã
æ²æšãªãæ¥åèŠçã«ã®ã¿äŸ¿ä¹ãããã®ããããŸã
ææ¡ã ç§ã¯å人çã«æ³šæãæ ãã§ããããç§ã¯ããŸã
ç¹ã«ãŽãŒããŒã ãšãããŒããæ±ããŠããçç±ãç解ãã
ãµããŒããšæµæãããã§ããããšãå€æããããšã¯ééããªãå·ã€ããŠããŸã
çŽ æŽãããã
ããã¯æ¿æ²»çã€ããªãã®ãŒã®è¡çªã§ããããããç§ãã¡ã¯ããããæãäžããå¿
èŠããããŸã
ã¬ãŒããã³ã°ã®æ³šæãå¿
èŠãªæ¬åœã®ã«ãŒããæ¢ãããã«ãããæ·±ãã
@lootch try
ãæ©èœããããã«ããšã©ãŒãæåŸã®æ»ããã©ã¡ãŒã¿ãŒã§ããå¿
èŠãããããšã«ç¹ã«æžå¿µããããŸããïŒ ããã¯ãã§ã«äºå®äžã®æ
£ç¿ã§ã¯ãããŸãããïŒ
ïŒäœè«ã§ãããç§ãã¡ã¯æµæã«ã€ããŠãå·ã€ããããŠãããããã§ã¯ãããŸããã倧éšåã¯ç¹å€§ã®åå¿ã«æ€æ šããŠããŸããïŒ
@griesemerã¯ã
ããããã®Goãæžããããšããããšããç°¡åãªã³ã¡ã³ããæžããããšæããŸãïŒç§ã¯2009幎ã®æåã®å ¬éãªãªãŒã¹ããGoã䜿çšããŠããŸã-ç§ã®githubãåç §ããŠãã ããïŒãšã©ãŒåŠçã«é¢ãã人éå·¥åŠã®æ¹åã
ç§ã¯ãã®æ°å¹Žåã«ååã«ã€ã©ã€ã©ããŸãããç§ã¯å®éã«ãããã¯ã®åšãã«ç ç³ãæžããããããïŒã»ãšãã©ïŒãã§ãã¯ãããŠããªãäŸå€ã®ããã«æ©èœã§ããããã«å埩ããŸããïŒ https ïŒ
ãšã©ãŒç¶æ
ãäŒæããéåžžã«åé·ã§ããã圹ã«ç«ããªãæ¹æ³ãç¶æããããšã人ã
ãç±å¿ã«äž»åŒµããŠããã®ã¯ããããªããšã«æããŸãã ç§ã¯èªåã®ã³ãŒãïŒããã³ä»ã®ã³ãŒãïŒã«å®éã®ãã°ãæžããçºèŠããŸãããããã§ã¯ã人ã
ãif err != nil
æ¡ä»¶ãå°ç¡ãã«ããŠããã°ãäœæããŸããã ãããã®ãã°ãæžã蟌ãŸããçç±ã¯å®éã«ã¯ãããŸããã éçãã§ãã¯ã¯ãããã®ãã°ãå©ããããšã¯ã§ããŸããããªããããšã¯ã§ããŸããã
ãšã©ãŒåŠçã«é¢ãã人éå·¥åŠãæ¹åããããã®ææ¡ãæ¯æããŸãã
ææ¡ããã»ã¹ã¯ã httpsïŒ //golang.org/s/proposalãProposedChangestoGoããåŒçšããããã®ãã®ã§ãã
ãã®åé¡ã¯å€æŽãææ¡ããŠããªãã®ã§ãå®éã«ã¯å°ãã«ããŽãªãšã©ãŒã§ãã
誰ãããéžæããã®ãŸãŸã«ããŠããããšããã¿ã€ãã«ã®ææ¡ãæåºããå Žåãææ¡ã§ã¯ãªããšããŠãããéããã ãã§ãã
ããããå®éã«ã¯ããã®åé¡ã¯ïŒ32437ã®ãããªä»ã®åé¡ã®è°è«ã®å»¶é·ã«éããªãã®ã§ããäœãããªããããšãè°è«ããã®ã«é©ããå ŽæãšããŠéãããŸãŸã«ããŠãããŸãã
ããã«ç¹å®ã®æ±ºå®ã¯ãªããã¡ã¿æ±ºå®ã§ãããšããããšã瀺ãããã«ãææ¡-ä¿çãšããŒã¯ããŸããã
ãµã€ãïŒ
try
ããããŒã¶ã«ïŒïŒ32437ïŒã279ã®å察祚ããæã£ãŠããªãã®ã«ããã®åé¡ã1335ã®è³æ祚ãæã£ãŠããã®ã¯å¥åŠã ãšæããŸãã
ãã©ã€ããããŒã¶ã«ã¯æ°ä»ããé ã«ã¯ããã¯ãããŠããã®ã§ãå察祚ãæããããšã¯ã§ããŸããã§ããã ãããããã®ææ¡ãæåã«å ¥åãããçç±ã§ããããšæããŸãã
7/2/19ã«ãRobertGriesemerã®[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@lootchæåŸã«ããå¿ èŠã®ãããšã©ãŒã«ã€ããŠç¹ã«æžå¿µããããŸãã
try
ãæ©èœããããã®ãã©ã¡ãŒã¿ãè¿ããŸããïŒ ããã¯ãã§ã«äºå®äžã®ããšã§ã¯ãããŸãã
倧äŒïŒããããäºå®äžã®ãç³ã«æã蟌ãŸãããã
ãã®ãã¢ãéããŠãããšã©ãŒãããªãã·ã§ã³ã®ç¹å¥ãªãã®ã«ããå¿ èŠããããŸã
åŒæ°ã®åãšãããåãå ¥ããããªããªãããã«ãããã¹ãŠã®æ£ããçµæã®ããã«
å€ãã®å Žåãå€ãã®ééã£ããã®ã§ããã
ç¹å¥ãªæ¹æ³ã§å¯ŸåŠããŸããã
ãreturnãã¹ããŒãã¡ã³ãã調æ»ããå¿
èŠããããšããèããããã°
ããæ·±ãïŒãããŠtryã®ææ¡ã¯ãã®ããšã瀺åããŠããããã§ã
æ¹åïŒã®å Žåããšã©ãŒæ¡ä»¶ã¯ãåãªãå€ã§ã¯ãªãã
Goã®ã¢ãããŒãã¯ã
æ¥ä»ã§ãããããã§ãã«ãŒãã®å®¶ã§ãã
ç§ã¯Goã®å·§åŠãªããªãã¯ã®ããã€ããå«ãããŠãŒã¶ãŒã§ãïŒç§ã¯æã£ãŠããŸã
x ++ãšx--ã¯æ©èœããªããšä»ã®å Žæã§è¿°ã¹ãŸãã-ã»ãšãã©ã®å Žåãç§ã¯ã¹ãªããããŸã
æã
ã¢ãã-ç§ã®ã³ãŒãã§ã¯ïŒã ãããè©ŠããŠã¿ããã¯ç§ã«ãšã£ãŠãããã®1ã€ã®ãŸãŸã§ãã
ããããç§ã¯ãã®å°å
¥ã«ååçã«å察ããŸãããç§ã¯ãã æããŸã
ãããªã«å€ãã®ããšãèšãããŸããããããŠããã§ããã¹ãŠã®å¯èœãªæ¬ ç¹ã¯ããã§ã¯ãªããããããŸãã
æããã«ãããïŒç§ãèŠãŠãããã®ã®æå³ããªãçµæ
æçµçãªæ¿æ²»ç決å®ïŒã ããããã¹ãããã®ã¯è¯ããããããŸãã
ãŸãã¯æªãã
ç§ãèŠãŠããã®ã¯ããããã¯/å埩ãæªãã©ãããšããã®äžæ£ãæã«å
¥ãããšããããšã§ã
ç§ãã¡ãæ©ãŸããããã«æ»ã£ãŠããŠããŸãã ç¹°ãè¿ããŸãããç§ã¯ãŸã ã©ã¡ãã䜿çšããŠããŸããã
ç§ã¯ç¶ã®äžã§æãéãã¯ãããŒã§ã¯ãªãã®ã§ãç§ãããªããã°ãªããªãæ¥ãæããŸã
ãšãŠãé£ãããšæããŸããããããã¯/å埩ã奚å±ãããŠããŸãã
ãããé©åã§ãããŸããªæ©äŒã®ããã«ïŒãããã®ã©ããã«ãã£ãŠæ±ãããŸãã
ãšã©ãŒãæ»ã£ãŠããã ãã§ãããšãã圌ã®çŽ æŽããããã¬ãŒã³ããŒã·ã§ã³ã§ã®ããã»ãã€ã¯
å€ãç§ãæ£ããæãåºãã°ïŒãããã¯ãã¹ãŠã®ããšã«å¯ŸããŠã¯ããã«æ確ã«ãªãã§ããã
Goã¯ãã§ã«ãšã©ãŒãåŠçããŠããã ãã§ãªããå¿
èŠãªãã«æåŸ
ã§ããŸã
ãããè¶
ããŠå©çšå¯èœãªå¯èœãªãªãã·ã§ã³ã®æ²Œãæ¢çŽ¢ãã
å¢çã
ãšã¯èšããã®ã®ãè©ŠããŠã¿ãã®ã¯çã«ããªã£ãŠããŸãã
ãã¹ãŠããªãã·ã§ã³æ©èœã ãããã1ã€ã®å¯äœçšã¯ãããäœã§ãããã§ã
亀æãšã¯ïŒãäºå®äžã®ãçµæã¯ã©ããªãã
ããšã©ãŒãåã®åŒæ°ãæã€ããã«åŒ·å¶çãªãšã©ãŒåŠçé¢æ°
æ»ããã©ã¡ãŒã¿ãªã¹ãã®æåŸã«ãããŸããïŒ ããã¯ã©ã®ããã«å€åããŸãã
ããšã©ãŒã¯åãªã䟡å€ã§ããããšããèªèïŒ ããã¯ã©ã®ããã«é©åããŸãã
ä»ã§ã¯ãã£ãšé¡äŒŒãããã³ã³ãOKããã©ãã€ã ïŒ ããã¯ä»ã«äœãããŸãã
æ°ããååã¯çããŸããïŒ
äœããããã®ã¢ã°ã©ãã«ã§ã§ããŠããå±±ã¯
Goã人çãå€ãããã€ã«ã¹ããŒã³ã«å°éããããšã瀺ããŸãã ã»ãšãã©
確ãã«ã2013幎ã«çå®ã ã£ãä»®å®ã¯ããã¯ãããã§ã¯ãªããããããŸãã
ææã ããã¯èª°ã«ãšã£ãŠããã¥ãŒã¹ã§ã¯ãããŸããããGo2ã
ãããŸã§ã®ããã«Go1ãšã®äžäœäºææ§ãããããšã¯ããã»ã©çŽ æŽãããããšã§ã¯ãããŸãã
ããŸãã«ããã£ãããšææ¡ãããŸããïŒç§ã®æèŠã§ã¯ïŒã
@lootch詳现ãªåçããããšãããããŸãã 確ãã«ãæ¢åã®èšèªãäžäœäºææ§ã®ããæ¹æ³ã§æ¡åŒµããããšã¯éåžžã«é£ããã®ã§ããã®äžäœäºææ§ãå¿ èŠãªãå Žåã¯ãããããå¥ã®æ¹æ³ã§è¡ãå¯èœæ§ãããããšã«åæããŸãã éããªãïŒã¢ãžã¥ãŒã«ãäžè¬çã«ãªããšïŒãå³å¯ãªäžäœäºææ§ãå¿ èŠãšããªãèšèªå€æŽãè¡ãããšãã§ããããã«ãªããŸãã
ããªããèšãããã«ã try
ã¯ãªãã·ã§ã³ã®ã¡ã«ããºã ã§ãããç¹°ãè¿ã䟡å€ããããšæããŸããããã®åšãã®ãã¹ãŠã®ããŒãã©ã«ãããããããæ¢åã®Goæ©èœã䜿çšããŠç°¡åã«èª¬æã§ããéåžžã«åçŽãªã¡ã«ããºã ã§ãã t try
ãGo ourselfã®é¢æ°ãšããŠèšè¿°ããŸãïŒããã«èšãã°ããžã§ããªãã¯ã¹ã圹ã«ç«ã¡ãŸããïŒã å¯èœã§ããã°ãæ¢åã®ã³ãŒãã§ãšã©ãŒåŠçãè¡ãããã«try
ãªã©ã®ãã«ããŒé¢æ°ã䜿çšããããšã¯éåžžã«äžè¬çã§ãããšç¢ºä¿¡ããŠããŸãã çµå±ã®ãšããããšã©ãŒãå€ã§ãããšããRob Pikeã®è©±ã¯ããŸãã«ãšã©ãŒã䌎ãããã°ã©ãã³ã°ã§ãã
éåžžã«ãã€ããŒãªãã«ããŒé¢æ°ãè¿œå ããããšã«é¢ããŠã誰ããèªç±ã«ç¡èŠã§ããã»ã©ã®éšããããããšã¯ãç§ã«ãšã£ãŠãŸã éåžžã«é©ãã§ããã人ã
ã¯ãç¹å®ã®ã¹ã¿ã€ã«ã匷ã瀺åããon error
ãªã©ã®éèŠãªèšèªå€æŽãçå£ã«èããŠããŸããèšèªã§ã®ãšã©ãŒåŠçã®ã
ãæèŠããããšãããããŸãã ããã¯ãã¹ãŠéåžžã«èå³æ·±ããã®ã§ãã
ãã®ææ¡ããããè°è«ããã®ã«é©åãªå Žæã§ãããã©ããã¯ããããŸãããããã®ã¹ã¬ããã®tryããŒã¯ãŒãã«ã€ããŠã¯ãã§ã«æŽ»çºãªè°è«ãè¡ãããŠããã®ã§ãä»ã®ãšãããããã¯ã«ã€ããŠæ€èšããŸã:)
Googleã®äººã ã¯ãå éšã®Golangãªããžããªã«tryããŒã¯ãŒããå®è£ ãããã®åŸãæ¢åã®Googleã³ãŒãããŒã¹ããã®ããŒã¯ãŒãã䜿çšããããã«å€æããããšãããšããªãã®ã§ã¯ãªãããšæããŸãã å éšã®ã¿ã«ä¿æããããšã§ãç°¡åã«å ã«æ»ãããšãã§ããŸãïŒã€ãŸããã³ãã¥ããã£å šäœã§ã¯ãªããåäžã®äŒç€Ÿã«è² æ ãããããŸãïŒã
ããã«ãããå®éã®é«ã¹ãããã³ãŒãããŒã¹ã§ãã®æ©èœã«é¢ããå°ããªã±ãŒã¹ã¹ã¿ãã£ãè¡ãããšãã§ããŸãã Facebookã¯éå»ã«PHPã®æ©èœãšåæ§ã®ããšãè¡ã£ãŠããããã®ããã«ããŠãã³ãã¥ããã£å šäœã«ææ¡ããåã«ç¹å®ã®æ©èœã埮調æŽããããšãã§ããŸããã
tryããŒã¯ãŒããå®éã«ã©ã®ããã«äœ¿çšãããå®éã«ã©ã®ãããªäŸ¡å€ãè¿œå ããããã«ã€ããŠã®ã±ãŒã¹ã¹ã¿ãã£ãäœæããå Žåã説åŸåã®ããã±ãŒã¹ãæäŸã§ããŸãã ãããïŒä»®æ³çã«ïŒçŸå®äžçã®äŸ¡å€ãæäŸããªãã®ã§ããã°ããããç¥ã£ãŠãã䟡å€ããããŸãã çŽã®äžã§ã¯æ¬åœã«èŠæ ãããããã®ã®ãå®éã«ã¯ããŸããããªãå ŽåããããŸãããã®éãåæ§ã§ãã
@griesemerç§ã¯èªåèªèº«ãæ確ã«ããŠããªããããããŸããã Googleã¯ç¬èªã®Goãã«ãã瀟å ã§äœ¿çšããŠãããšæããŸãã ç§ã®ææ¡ã¯ãäžèšã§ãªã³ã¯ããããããå éšã®Googleãã«ãã«é©çšããŠãããGoogleã³ãŒãããŒã¹ïŒstdlibã ãã§ãªããç¹ã«Goã§èšè¿°ãããå éšãããžã§ã¯ãïŒãå€æããããšã§ãã Googleã®ãšã³ãžãã¢ãå®éã®ç¶æ³ã§æ°ãæé䜿çšãããšãå®éã«ã©ã®ããã«æ©èœãããã«ã€ããŠã®åªããæŽå¯ãåŸãããŸãã
ãã¡ãããèªåã§é©çšããŠãèªåã®ã³ãŒãããŒã¹ã§äœ¿çšããããšãã§ããŸãïŒç§ããããããããŸããïŒã ããããç§ã¯æ¯èŒçå°ããªã³ãŒãããŒã¹ãæã€åäžã®éçºè ã§ãããããå€ãã®GoogleåŸæ¥å¡ãããã䜿çšããå Žåãããã¯ä»£è¡šçãªãã®ã§ã¯ãããŸããã
å人çã«ã¯ãç§ã¯ãŸã ãã®æ©èœã«ã€ããŠã®ãã§ã³ã¹ã«ããŸãã äžæ¹ã§ãæ¯åæ°åã®ããŒã¹ãããŒã¯ãç¯çŽã§ãããšããäºå®ã«æè¬ããŠããŸãã ããããæã ç§ã¯æ æ°ã«ãªããããããŸããïŒçµå±ç§ã¯äººéã§ãïŒããããŠç§ãã§ããã ãå€ãã®tryã¹ããŒãã¡ã³ãããã¹ãããã ãã§ãã ãã®æ©èœãããã°ãããå°ãèŠåŸã身ã«ã€ããããšãã§ããŸãã ããããç§ãããã ã£ããšããŠããã³ãŒãããŒã¹ããã®ããŒã¯ãŒãã«èŠããã§ããéïŒãããã°å¯èœæ§ããããã®ã©ã€ãã©ãªã®æ¡åŒµæ§ã®èŠ³ç¹ããïŒãå€éšã©ã€ãã©ãªããã®ããŒã¯ãŒããä¹±çš/ä¹±çšããå¯èœæ§ããããŸãã
@Freeaqingmeäºè§£ããŸããã 確ãã«ãå
éšãªããžããªã«å¯ŸããŠtry
ãå®è¡ã§ããŸãã å€æããŠå
ã«æ»ãããšãã§ãããã©ããã¯ããããŸãããããã«ã¯ããªãã®ã³ã¹ããããããŸãã ãŸããå
éšã®è©³çŽ°ã«ã€ããŠã¯å ±åã§ããªãããããã®å®éšã«ã€ããŠã¯éèšïŒçµ±èšïŒã§ããå ±åã§ããŸããã§ããã ã€ãŸããã³ãã¥ããã£ã«ã¯ç§ãã¡ã®äž»åŒµãæ€èšŒããç°¡åãªæ¹æ³ããããŸããã æåŸã«ãGoogleã®ã³ãŒãããŒã¹ã¯ä»£è¡šçãªãã®ã§ã¯ãªãå¯èœæ§ããããŸãã
ããããæè¬ããŸãã
@griesemerè²»çšã®ãããäœæ¥ã«ãªãå¯èœæ§ãããããšãæè¬ããŸãã ãã®å Žåãç§ã¯ãããããŸããã ãã©ã€ããŒããããžã§ã¯ããé©çšããã ãã®å Žåã¯ãã³ã¹ããå¶éãããå¯èœæ§ããããŸãã ããããå®éã«ã¯ãããã¯Google瀟å¡ïŒç§ã¯ããã§ã¯ãããŸããïŒãå€æããããã®ãã®ã§ãã
åã ã®Googleãããžã§ã¯ããå éšã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã€ããŠå ±åããããšã¯ã§ããªããšã®ããšã§ããã ãã ããããããããã€ãã®éžè©±ãå ±æããããšãã§ããŸãã ããããç§ãå人çã«ãã£ãšäŸ¡å€ããããšæãã®ã¯ããããã©ã®ããã«æ©èœãããã«ã€ããŠå ±åããŠããGoogle瀟å¡ã§ãã 詳现ã«ç«ã¡å ¥ãããšãªãããXãæåŸ ããŠããŸããããAãBIã®ãããªã±ãŒã¹ã«ééãããšããYãèŠã€ãã£ãããªã©ã®ã¹ããŒãã¡ã³ãã¯éåžžã«äŸ¡å€ããããŸãã ãã®ãããªçš®é¡ã®ã¬ããŒããæ€èšŒããå¿ èŠã¯ãããŸããã
æåŸã«ãGoogleã®ã³ãŒãããŒã¹ã¯ä»£è¡šçãªãã®ã§ã¯ãªãå¯èœæ§ããããŸãã
ãããããããªãããããã§ãªããããããªãã ããããGoogleã§åããŠãã人ã¯ããããããã®ã§ãã³ãŒãããŒã¹ã®ã»ãšãã©ã¯ã1人ã®å人ãã©ã®ããã«èšè¿°ãããã§ã¯ãªããå€ãã®ç°ãªãè²¢ç®è ïŒåŸæ¥å¡ïŒã®è²¢ç®ã®é倧æã§ãããšæããŸãã ãã®ç¹ã§ãç§ã¯ç©äºãåŸãããšãã§ããã®ãšåãããã代衚çãªãã®ã«ãªãããšãæåŸ ããŠããŸãã 100ïŒ ä»£è¡šçãªã³ãŒãããŒã¹ã®ãããªãã®ã¯ãããããªãã§ãããã
ããè¯ã解決çãèŠã€ãããŸã§ã try
ã¯ç§ãã¡ãæ¢ããŠãããã®ã§ã¯ãããŸããã ããã«å¯ŸããŠãã€ã¢ã¹ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠã¯ãããŸãããæéããããŠGoAuthorsãå®è¡ããŠãã ããã ç§ãæ¯æ¥äžçäžã®gopherãšè©±ããŠããéããGoã³ãã¥ããã£ã®å€§å€æ°ã¯try
ææ¡ã®ATMãåãå
¥ããŠããªããšåŒ·ãä¿¡ããŠããŸãã
æ°ããæ§æãå°å
¥ãããšããããšã¯ã誰ããGoããŒãžã§ã³ãã¢ããã°ã¬ãŒãããå¿
èŠãããããšãæå³ããŸãã ç§ã®ã¯ãŒã¯ãããŒã¯go get
ãã®ãã³ãã³ãã©ã€ã³ãã䜿çšã§ãããšããäºå®ã«åºã¥ããŠãããããç§ã¯ãŸã Go 1.10ã䜿çšããŠããŸãïŒç§ã®GOPATH
ã¯ç§ã®PATH
ïŒ ã æè¿ãã¢ãžã¥ãŒã«ã䜿çšããä»ã®èª°ãã®ã©ã€ãã©ãªãgo get
ããããšãããšãã«åé¡ãçºçããŸããã .../v2
ãå©çšã§ããªããšãããšã©ãŒãçºçããŸããã ããã¯ãã³ãŒãããã§ã«åå²ãããŠããããšãæå³ããŸãïŒPython 2ãš3ãèããŠã¿ãŠãã ããïŒã ç§ã«ãšã£ãŠãGo1.11ã®åãšGo1.11ã®åŸã®äžçããããŸãã ããã¯éåžžã«ç
©ããããGoã§ã®ãšã©ãŒåŠçãšåæ§ã«æ©èœãããã®ã«æ°ããæ§æãå°å
¥ããããšã¯ãè¯ããã¬ãŒããªãã§ã¯ãããŸããã ããã¯ããå€ãã®æçåããããããŸãã
7/4/19ã§ãgonutz [email protected]ã¯æžããŸããïŒ
æ°ããæ§æã®å°å ¥ã¯ã誰ããGoãã¢ããã°ã¬ãŒãããå¿ èŠãããããšãæå³ããŸã
ããŒãžã§ã³ã ç§ã®ã¯ãŒã¯ãããŒã¯äºå®ã«åºã¥ããŠãããããç§ã¯ãŸã Go1.10ã䜿çšããŠããŸã
go get
ãã®ãã³ãã³ãã©ã€ã³ãã䜿çšã§ããããšïŒmy
GOPATH
ã¯ç§ã®PATH
ïŒã æè¿ãgo get
ããããšãããšãã«åé¡ãçºçããŸãã
ã¢ãžã¥ãŒã«ã䜿çšããä»ã®èª°ãã®ã©ã€ãã©ãªã.../v2
ã
å©çšäžå¯ã ããã¯ãã³ãŒãããã§ã«åå²ãããŠããããšãæå³ããŸãïŒèããŠã¿ãŠãã ããïŒ
Python 2ããã³3ïŒã ç§ã«ãšã£ãŠãGo1.11ã®åãšGo1.11ã®åŸã®äžçããããŸãã
ããã¯éåžžã«ç ©ããããæ©èœãããã®ã«æ°ããæ§æãå°å ¥ããŸã
Goã§ã®ãšã©ãŒåŠçãšåæ§ã«ãè¯ããã¬ãŒããªãã§ã¯ãããŸããã ãã
ããå€ãã®æçåãå°å ¥ããŸãããããæ °ãã§ãããªãã°ãç§ã¯å¯ŸããŠãŸã£ããåãç«å Žã«ããŸã
Goã¢ãžã¥ãŒã«ã æ £ããããã®æéãšæ©äŒãèŠã€ãããŸããã§ãã
圌ããšäžç·ãªã®ã§ãç§ãGo1.10ã«ãã ãã£ãŠããŸãã å€åããã¯ããã¹ãã§ã
æã€äŸ¡å€ã®ãã調æ»ã
ã«ã·ãªã
-
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããã
https://github.com/golang/go/issues/32825#issuecomment -508372318
-
ã«ã·ãªãã¬
2 Piet Retief St
ã±ã¹ãã«ïŒæ±éšèªç±å·ïŒ
9860åã¢ããªã«
PhãïŒ+27 58 653 1433
ã»ã«ïŒ+27 83 251 5824
FAXïŒ+27 58 653 1435
ç§ã¯æ°ããgolangéçºè
ã§ãïŒãŸã goã«ã€ããŠåŠãã§ããŸãïŒã ãšã©ãŒã管çããããã®ã§ãçŸåšã®ãšã©ãŒåŠçã¯è¯ããšæããŸãã Androidéçºè
ãšããŠãç§ã¯try-catch
ãgolangã®if err != nil{ }
ããããšã©ãŒã管çããã®ãé£ãããšæããŸãã ãããŠãæ瀺çãªãšã©ãŒåŠçã¯ãæé»çãªãšã©ãŒåŠçãããåžžã«åªããŠãããšæããŸãã
PSã ç§ã®èšèªã§ããããªããã
å£ããŠãªãâŠã
ããŒã ã倧奜ãã @ Daniel1984 :-)
ã¡ãªã¿ã«ã try
ææ¡ã§ã¯ã if err != nil
ã¯ãã®ãŸãŸã«ãªããŸãã ããã¯ããªãã«ãããçã«ããªã£ãŠããè¿œå ã®ãªãã·ã§ã³ãäžããã ãã§ãã
ç§ã¯try
ãå«ããã¹ãã§ã¯ãªããšèããŠããŸãã try
å«ããããšã«ã€ããŠïŒ
ãã
throws
ãšã¯ç°ãªããŸãïŒãnil
å°åæã®æµ·ãèŠãŠãããšãã«ãç®ãéè¬ããããªããªããŸãããçæ
try
ã¯ãæ¢åã®æäœã«éè€ããã¡ãœãããè¿œå ããŸããtry
ãçŸåšã®é¢æ°ããæ»ãã®ã¯äºæ³å€ã§ãããå¥åãããéæ³ã®ãããªãã®ã§ããtry
ã§äœãèµ·ãã£ãŠããã®ããèšèã§èª¬æããããšããé£ããã@griesemerããã¯ãŸãã«ç§ã奜ãã§ã¯ãªããã®ã§ãã ç©äºã¯åçŽã§ãªããã°ãªããŸãããåãããšãéæããããã®2ã€ã®æ¹æ³ãããã ãã§ãèšèªã«è€éããå ããããããŸããã ãã®if err != nil
åé·æ§ãåé¿ããããã®ãã¿ãŒã³ããããŸãã https://www.ardanlabs.com/blog/2019/07/an-open-letter-to-the-go-team-about-try.html
Go2ææ¡ïŒ32437ã¯ãèšèªã«æ°ããæ§æãè¿œå ããŠã
if err != nil { return ... }
ãã€ã©ãŒãã¬ãŒãã®ç ©ãããã軜æžããŸããããŸããŸãªä»£æ¿æ¡ããããŸããå ã®ææ¡ã¯æ®éçã«æãããŠããªããããïŒ32804ãšïŒ32811ã§ãã
ããã¯ã¹ã«å¥ã®éžæè¢ãæããã«ã¯ïŒãã®ãŸãŸã«ããŠã¿ãŸãããïŒ
if err != nil
æ§é ã®æ瀺çãªæ§è³ªã奜ãã«ãªã£ãã®ã§ããã®ããã«æ°ããæ§æãå¿ èŠãªçç±ãããããŸããã æ¬åœã«ãããªã«æªãã®ïŒ
éåžžã«ããã æ瀺çãªã³ãŒãã¯æ£ããã³ãŒãã§ãã äŸå€ãã³ãã©ãŒã§ç§ãèŠãææã¯ããã®ã²ã©ãèªããªãæ§é ããæ°žé ã«é¢ããã®ã«ååã§ãã
人ã
ãã³ã¡ã³ãããã ãã§ã倧ããªé
ããããããã§ã
ä»ããããæ°é®®ã§ãããšããå°è±¡ãåŸãã®ã¯ä»æ¹ããããŸããã§ãã
圌ããžã®ãã¥ãŒã¹ã
ãããèæ
®ã«å
¥ããå¿
èŠããããŸãã ãããŠã®æšã¯æããã«ããã§ã¯ãããŸãã
人ãèãããããããªãããã«éãã
ã«ã·ãªã
ãããŠãgofmtãå€æŽããŠãåçŽãªãã³ãããŒã«ãšãšã©ãŒãçºçãããŸã§ã®åäžè¡ã®ifã¹ããŒãã¡ã³ããèš±å¯ããŸãã
é¢æ°ãåŒã³åºããŸãã ããã¯å€ãã®æ··ä¹±ãåãé€ãã§ãããã
ãã以å€ã®ïŒ
err = myFunctionïŒïŒ
if errïŒ= nil {
ãšã©ãŒãè¿ã
}
èš±å¯ããïŒ
err = myFunctionïŒïŒ
if errïŒ= nil {return err}
ã¡ãªã¿ã«ãtryããããŒã¶ã«ã¯errïŒ= nilã ãã®å Žåã¯çµäºããŸãã ããã¯ããªãã«ãããçã«ããªã£ãŠããè¿œå ã®ãªãã·ã§ã³ãäžããã ãã§ãã
ãã®æ£ç¢ºãªæ£åœåã¯ãGoãããã«å¥ã®C ++ãCïŒãScalaãKotlinãªã©ã«ãªãæ¹æ³ã§ããã䜿ããããªãå Žåã¯äœ¿çšããå¿ èŠã¯ãããŸãããã¯ãæ©èœãè¥å€§åããèšèªãäœæããæ¹æ³ã§ãã
ç·šé-ããã¯ééã£ãæ¹æ³ã«åºããããå¯èœæ§ããããŸãã try
ãGoãæ©èœã®è¥å€§åããèšèªã«å€ãããšèšã£ãŠããã®ã§ã¯ãããŸããã ããã§ã®æ£åœåã«ã¯å°ãæ¬ é¥ããããšèšã£ãŠããŸã
@deanveloper ãtryãã§ãšã©ãŒã®åäœãç解ããã®ãé£ããäŸãã¯ã£ãããšãããŸãã
https://github.com/golang/go/issues/32437#issuecomment -498932961
å°ãç¹°ãè¿ããŸãããOPã«åæããŸãã
ããã«ãææ¡ããããã¹ãŠã®ä»£æ¿æ¡ã¯ã圹ã«ç«ããªãè€éãããããããŸãã
ã¹ã³ãŒãå ã«1è¡ãããªãå Žåã¯ãäžæ¬åŒ§ãçç¥ãããšäŸ¿å©ã§ãã
@æã
ããã¯ãã³ãŒãããã§ã«åå²ãããŠããããšãæå³ããŸãïŒPython 2ãš3ãèããŠã¿ãŠãã ããïŒã ç§ã«ãšã£ãŠãGo1.11ã®åãšGo1.11ã®åŸã®äžçããããŸãã
ç§ã¯é·ãéPythonããã°ã©ããŒã§ãããGoã¢ãžã¥ãŒã«ã«é¢ããŠããªããèšåãããšããããåå²ãã¯ãPython2ããPython3ãžã®ç§»è¡ã®æšäºã«å¹æµãããã®ã§ã¯ãããŸããã
ããã¯éåžžã«ç ©ããããGoã§ã®ãšã©ãŒåŠçãšåæ§ã«æ©èœãããã®ã«æ°ããæ§æãå°å ¥ããããšã¯ãè¯ããã¬ãŒããªãã§ã¯ãããŸããã ããã¯ããå€ãã®æçåããããããŸãã
try
ã¯ãããããŒã¶ã«ã«çµã¿èŸŒãŸããŠããé¢æ°ã§ãã å®å
šãªäžäœäºææ§ããããŸãã ã³ãŒãããã§ã«try
ãèå¥åãšããŠäœ¿çšããŠããå Žåããã®èå¥åã¯try
ãã«ãã€ã³ãã·ã£ããŠã€ã³ã°ããŸãã
@pongsatornw
ãšã©ãŒã管çããããã®ã§ãçŸåšã®ãšã©ãŒåŠçã¯è¯ããšæããŸãã Androidéçºè ãšããŠãgolangã§errïŒ= nil {}ãå®è¡ããå Žåããããtry-catchã§ãšã©ãŒã管çããã®ã¯é£ãããšæããŸãã ãããŠãæ瀺çãªãšã©ãŒåŠçã¯ãæé»çãªãšã©ãŒåŠçãããåžžã«åªããŠãããšæããŸãã
ææ¡ãå®å
šã«èªã¿ãŸãããïŒ try
ã¯ã if err != nil { return ..., err }
ç¹°ãè¿ããé€å€ããã®ã«åœ¹ç«ã€çµã¿èŸŒã¿é¢æ°ã§ãã Goã§ã®ãšã©ãŒåŠçã®äžè¬çãªããžãã¯ã¯åããŸãŸã§ãã ããã¯ãŸã æ瀺çã§ããããšã©ãŒã¯äŸç¶ãšããŠå€ã§ãããtry-catchïŒå¥åäŸå€ïŒã¯ãããŸããã
@kroppt
try
ã¯ãæ¢åã®æäœã«éè€ããã¡ãœãããè¿œå ããŸãã
try
ã¯ãå埩çãªã³ãŒããå æ°å解ããŠããã ãã§ãã append
ãšåãã§ãã ã¹ã©ã€ã¹ã«èŠçŽ ãè¿œå ãããã³ã«èªåã§æžãããšãã§ããŸããã append
ãåŒã³åºãæ¹ãç°¡åã§ãã
- ãšã©ãŒãã§ãã¯ã«äžæŽåãè¿œå ãããŸãã
äœããããã«å¿ããŠã [...:...]
ã䜿çšããŠã¹ã©ã€ã¹ããæåã§ãæäœããããšãã append
ã䜿çšããããšãã§ããŸãã ççŸã¯ãããŸããã ãããã¯ãã¿ã¹ã¯ããšã«ç°ãªãããŒã«ã§ãã ãšã©ãŒã«ã€ããŠãåãã§ãããæå
ã®ã¿ã¹ã¯ã«å¿ããŠããã¬ãŒã³ãªif err != nil { ... }
ãŸãã¯try
ã䜿çšããŸãã
try
ãçŸåšã®é¢æ°ããæ»ãã®ã¯äºæ³å€ã§ãããå¥åãããéæ³ã§ãã
æ°åãªã®ã§æå€ã§ãã 䜿ãã»ã©æ £ããŠããŸãã ãããŠãç§ã¯ãããéæ³ã ãšã¯æããŸããã tryã®ä»æ§ã¯éåžžã«ç°¡åã§ãã
- Goã®çµéšããªãããã°ã©ããŒã¯ç解ã§ããŸããã
try
ã§äœãèµ·ãã£ãŠããã®ããèšèã§èª¬æããããšããé£ããã
Goã®çµéšããªãããã°ã©ããŒã¯chan
ã defer
ã 'go ,
iota ,
ãããã¯,
å埩,
ç解ããŸãã, type assertions, and many other things either without reading the documentation.
try`ã¯ãããã®ã»ãšãã©ã«æ¯ã¹ãŠç°¡åã§ãã
- ãšã©ãŒåŠçã¯å€æŽãããŸããã
if err != nil
ãæŸã£ãŠããããã«é Œãgophersã«ãããšãããã¯è¯ãããšãããããŸãã;-)
@marcopeereboom
æ瀺çãªã³ãŒãã¯æ£ããã³ãŒãã§ãã äŸå€ãã³ãã©ãŒã§ç§ãèŠãææã¯ããã®ã²ã©ãèªããªãæ§é ããæ°žé ã«é¢ããã®ã«ååã§ãã
try
ã¯ãäŸå€åŠçãšã¯ãŸã£ããé¢ä¿ãããŸããã ææ¡å
šäœãèªã¿ãŸãããïŒ ããšãã°ãJavaãPythonã®ãããªäŸå€åŠçã«å¹æµãããã®ã¯ãããŸããã try
ã¯æ瀺çã§ãã ãšã©ãŒã¯é¢æ°ã®ã·ã°ããã£ã«èšèŒããå¿
èŠããããŸãã ãšã©ãŒã¯ãã³ãŒã«ãµã€ãã§åŠçããå¿
èŠããããŸãã ã¹ã¿ãã¯ã®å·»ãæ»ãã¯ãããŸããã NSã
@ gale93
ã¹ã³ãŒãå ã«1è¡ãããªãå Žåã¯ãäžæ¬åŒ§ãçç¥ãããšäŸ¿å©ã§ãã
ã»ãšãã©ã®gopherã¯åãèããæã£ãŠãããšæããŸããç§ã¯ãIssueTrackerã§åæ§ã®ææ¡ãäœåºŠãèªã¿ãŸããã ããããããã¯try
ãããã¯ããã«å€§ããªå€æŽã§ãã if
ã¹ããŒãã¡ã³ãã ãã§ãããè¡ãã®ã¯åççã§ã¯ãããŸããã ãããã£ãŠããããã¯ãåãå
¥ãããããã¹ãŠã®å Žæã§ãããå€æŽããå¿
èŠããããŸãã {
ããããã¯ã®éå§ãããŒã¯ããªãå Žåãæ¡ä»¶åŒã®çµäºãåºåãæ¹æ³ãæå®ããå¿
èŠããããŸãã ææ³ãããŒãµãŒãgofmtãªã©ãæŽæ°ããå¿
èŠããããŸããããã«ãããèšèªã®è¡šé¢ãå®å
šã«å€ãããŸãã
@ngrilly
ç¯åºŠãä¿ã¡ãèšèªãã·ã³ãã«ã«ä¿ã€ããšãéèŠã§ãã
ããªãã䜿çšããè°è«ã®ããã€ãã¯ãä»æ§ãžã®å€§å¹ ãªå€æŽãæ£åœåããå¯èœæ§ããããŸãã ããã«ã¯è¯ãç¹ã ãã§ã¯ãããŸããã
ç§ã¯ããããå©ãã«ãªãã害ãåãŒãããšããããšã«åºã¥ããŠæ±ºå®ãè©äŸ¡ããŠããŸãããå¿
ãããç¹å®ã®å²åŠãå®å
šã«å¶å®ããŠããããã§ã¯ãããŸããã ä»æ§ã®äžéšãgo
ãèšç«ãããç¹å®ã®ååã«éåããŠããããšã¯æ£ããã§ãããããã¯ãã¹ãŠç¯åºŠã«é¢ãããã®ã§ãã ãã®å€æŽã¯ããã¬ãã£ãã蚱容ããã®ã«ååãªãã©ã¹ã®åœ±é¿ãç§ã«äžããŸããã
ããã«ã¡ã¯@kroppt ã
èšèªãã·ã³ãã«ã«ä¿ã€ããšã¯éèŠã§ã
ç§ã¯åæããç§ãã¡å šå¡ãããã«åãçµãã§ãããšæããŸãã
ç§ã¯ããããå©ãã«ãªãã害ãåãŒãããšããããšã«åºã¥ããŠæ±ºå®ãè©äŸ¡ããŠããŸãããå¿ ãããç¹å®ã®å²åŠãå®å šã«å¶å®ããŠããããã§ã¯ãããŸããã
ç§ãã¡ã¯çããã®ã¡ãªãããšã³ã¹ãã«åºã¥ããŠtry
ãè©äŸ¡ããŠãããšæããŸãã è°è«ã¯ããããã®å©ç¹ãšã³ã¹ãã«é¢ããäºå®ã«åºã¥ãã³ã³ã»ã³ãµã¹ãå®çŸ©ããŠèŠã€ããããšã«ã€ããŠã§ããããã¯ã以åã®ã³ã¡ã³ãã§ç§ãããããšããããšã§ãã
ä»æ§ã®äžéšããgoãèšç«ãããç¹å®ã®ååã«éåããŠããããšã¯æ£ããã§ãã
éå»æ°å¹Žéãç§ã¯GoããŒã ãGoãšãã®ãã¶ã€ã³ã«ã€ããŠå
¬éããã»ãšãã©ãã¹ãŠãèªãã§ããŸãããInã¯ããªããäœãæå³ããã®ãç解ããŠããŸããã try
ææ¡ãGoã®åºæ¬ååã«éåããŠãããšã¯æããŸããã
@ngrilly
https://talks.golang.org/2012/splash.articleã¯ã go
éãã®èåŸã«ããããã€ãã®æŠå¿µããšãããæå¿«ããšåçŽãã«ã€ããŠèª¬æããŠããŸãã ããã¯ãç§ãã¡ã®äžéšããã®æ°ããå€æŽã§ç®ã«ãã察ç«ã ãšæããŸãã ç°¡åã§ãããããŸãæ確ã§ã¯ãããŸããã ç§ã«ã¯ãåçŽãã®åäžã¯ãæå¿«ãã®åªå€±ãããå°ããããã«æãããŸãã å€åç§ã¯ééã£ãŠããŠããã çšå¿æ·±ãã§ãã
@kropptãã®èšäºãäœååãèªãã ããšããããŸã;-) tryãã³ãŒããé£èªåãããšããèãã«åæããŸããã tryã¯ãå埩ã³ãŒããå æ°å解ããããã«äœ¿çšãããåãªãçµã¿èŸŒã¿é¢æ°ã§ãã ç§ãã¡ã¯ããã°ã©ããŒãšããŠåžžã«ãããè¡ã£ãŠããŸãã ç¹°ãè¿ããã¿ãŒã³ãç¹å®ãããšãã¯ãæ°ããé¢æ°ã§ãããé€å€ããŸãã ããããªããšããã¹ãŠã®ã³ãŒããã€ã³ã©ã€ã³åããã1ã€ã®é·ãmainïŒïŒé¢æ°ãäœæãããŸãã
@ngrilly
ããªãã説æããŠããããšã¯ç§ã®ããããã»ã¯ã·ã§ã³ã«ãããŸãïŒ
- ããã°ã©ããŒã¯ãããŒã¹ãããŒã¯ã®æ°ãæžãããŸãã
- ããã°ã©ããŒã¯ããã¯ãã®çŸåšã®é¢æ°ããæ»ãããã®çç¥åœ¢ãæã€ããšãã§ããŸãã
nil
å°åæã®æµ·ãèŠãŠãããšãã«ãç®ãéè¬ããããªããªããŸããã
ç¹°ãè¿ãã«ãªããŸãããããã§ååãæ®éçã«é©çšããŠããªãã®ã«ãååã®æ®éçãªé©çšã«ã€ããŠèšåããæå³ã¯ãããŸããã
tryãã³ãŒããé£èªåãããšããèãã«åæããŸãã
å€æŽã®ãã€ã³ãã¯ãã³ãŒããé£èªå/é衚瀺/ç°¡ç¥å/è¡šçŸããããšã§ããããããªããšãå ã®ãšã©ãŒãã§ãã¯ãããã¯ã衚瀺ãããŸãã åé¡ã¯ããããæå³ãããŸãæ確ã«ããªããã©ããã§ãã
go
å
ã
ãæå¿«ããæãªãã®ã§ã¯ãªããè²¢ç®ãããšããç¹ã§ãã·ã³ãã«ãã®çŽ æŽããããã©ã³ã¹ããšã£ãŠãããšæããŸãã 圌ããã©ã®ããã«ããããããã説æããããšã¯ã§ããŸããããç§ã®æèŠã§ã¯try
ã¯èª¬æããŠããŸããã
åé·æ§ãåé¡ãšèŠãªãã¹ãã§ã¯ãªããšæããŸãã ã³ãŒãã¯äººéãèªãã§ç解ããå¿ èŠããããŸãâãã®æéã¯ã³ã³ãã¥ãŒã¿ãŒãããé«äŸ¡ã§ãâãããŠ_ç解_ã¯å°é£ã§æéã®ãããéšåã«ãªãåŸåããããŸãã
goãšã©ãŒåŠçã®ã€ã³ãã³ãæ§é ã¯ãäœãèµ·ãã£ãŠããã®ãã远跡ããã®ã«åœ¹ç«ã¡ãŸãã ãã¹ãŠã®ãšã©ãŒãã§ãã¯ã¯æ瀺çã§ãã ã»ãšãã©ã®æªåŠçã®ãšã©ãŒãæ瀺çã§ãã ããã«ãããã³ãŒããããã«ç解ã§ããããã«ãªããŸãã
ãŸãã if err != nil
ãã§ãã¯ã¯é¢åã«æãããããããŸããããå®éã«ã¿ã€ãããå¿
èŠã¯ãªããšæããŸãã ç§ã¯èªåã®ç·šéè
ã«ãããããããã ãã§ãã
@kroppt
å€æŽã®ãã€ã³ãã¯ãã³ãŒããé£èªå/é衚瀺/ç°¡ç¥å/è¡šçŸããããšã§ããããããªããšãå ã®ãšã©ãŒãã§ãã¯ãããã¯ã衚瀺ãããŸãã
ãã ãããã®åŒæ°ã¯ä»»æã®é¢æ°åŒã³åºãã«äœ¿çšã§ããŸãã strings.HasPrefix("foobar", "foo")
ãåŒã³åºããšãã³ãŒããé£èªåãããŸããïŒ l := len("foo"); len("foobar") >= l && s[0:l] == "foo"
æžãããèªãã ãããŸããïŒ
@rossmcf
ãã¹ãŠã®ãšã©ãŒãã§ãã¯ã¯æ瀺çã§ãã
tryã¯ãŸã æ瀺çã«ãšã©ãŒããã§ãã¯ããŠããŸãã ããã¯è©Šç·Žã®ååšæ矩ã§ãã
ãŸããerrïŒ= nilãã§ãã¯ã¯é¢åã«æãããããããŸããããå®éã«å ¥åããå¿ èŠã¯ãªããšæããŸãã
å
¥åããã®ã¯é¢åã§ã¯ãããŸããã ã©ãã«ã§ãåã3è¡ããããšãèªãã®ãé¢åã§ãã ããã¯ç¹°ãè¿ãã§ãããããã°ã©ããŒãšããŠã®ç§ãã¡ã¯éåžžãããããé€å€ããåŸåããããŸãã ãã¶ãtry
ã¯ä»ã®æ¬ ç¹ããããŸãããããã¯ç§ãæãã«ããã§ã¯ãããŸããã
tryã¯ãŸã æ瀺çã«ãšã©ãŒããã§ãã¯ããŠããŸã
try
æœè±¡åãšstrings.HasPrefixã®éãã¯ãtry
æé»çã«è¿ãããããšã§ãã
goã³ãŒããèªããšããå®è¡ãããŒã¯æ¬¡ã®ããã«ãªããŸã§é¢æ°å ã«ãšã©ãŸãããšãããããŸãã
- æ»ãåãªãã§é¢æ°ã®éãæ¬åŒ§ãèªã
- ããŒã¯ãŒã
return
ãpanic
èªãsyscall.Exit(code)
èªã
try
ã§ã¯ãåãæ¹æ³ã§ã³ãŒããèªã¿åãããšãã§ããŸããã§ããã è¡ãèŠèŠçã«ã¹ãã£ã³ããŠãreturnãã¹ããŒãã¡ã³ãããŒãã§ããããšã確èªããŠããããããã®è¡ããã¹ãŠå®è¡ããããã1ã€ã®ãããã¯ã«ãªãããããã°ã©ã ãçµäºããããšããæå³ã§ã¯ãªããªããŸãã
@ngrillyæçš¿FYIã§è€æ°ã®äººã«è¿ä¿¡ã§ããŸããæ°æéã§10件ã®è¿ä¿¡ããããäžåºŠã«5件ã®è¿ä¿¡ããããšããã£ã¹ã«ãã·ã§ã³ããã©ããŒããã®ãé£ãããªããŸãã ããã€ãã®èª€è¬¬ãé€ããŠããªãã®æçš¿ãèªãã åŸãç§ã¯è©ŠããŠã¿ãããšã®å©ç¹ã説æããæ°ããå
·äœçãªè°è«ã圢æãããŠããã®ãèŠãããšããããŸããã if err != nil
å
¥åãé²ããšãã1ã€ã®å©ç¹ããããŸãã ããã«ã¯ããªãœãŒã¹ããªãŒã¯ç°¡æœã§ãªãã³ãŒãã®èšè¿°æ©èœããããŠææªã®å Žåãtryã®ãã¹ããå¯èœã«ãªããšããç ç²ã䌎ããŸãã
ææ¡è
ã«ãã£ãŠåœ¢æãããä»æ§ãšè°è«ã¯èª€è§£ãæããšæããŸããçŸåšãææªã®äŸã瀺ãããšãªããæè¯ã®äŸã®ã¿ãæäŸããŠããŸãã äžèšã®ãã€ãã¹ã®æ¬ ç¹ãæœåšçãªåé¡ãç·©åããèŠçŽ ã«ã€ããŠã¯ãè©äŸ¡ãèšåããããŠããŸããã ããã¯ãtryã®å®è£
ãææ¡ããå®èšŒããã䜿çšæ³ã«å¶éããªãçç±ãæ£åœåãããã®ã§ã¯ãããŸããã ããŒã«tryhard
䞻芳ããã«ãäžéšã®äººã
ã«åªãã審çŸæ§ãæäŸããããã³ã³ãã¯ããªã³ãŒãã瀺ãããã«äœ¿çšãããŠããtrytoohard
ããŒã«ãããããšã瀺ããŠãããã®ã®ãã¹ãŠã®æ©èœã¯ããããäœãã§ããããäŸãã°ãæ·±ããã¹ããããè©Šã¿ã¹ããŒãã¡ã³ãã æåŸã«ãååèªäœã¯äŸå€ãé€ããŠããã°ã©ãã³ã°ã®äžçã§éåšçã«é¢é£ä»ããããŠããããã¹ãå¯èœã§ãšã©ãŒã«é¢é£ä»ããããç¡é¢ä¿ã®å埩ãšãããã¯ã®çµã¿èŸŒã¿ãšããŠé£æ¥ããŠé
眮ãããç©äºãåã«å Žéãã«èŠããããã«ããŸãã ç§ã¯ãGoã®äœè
ããã£ãšè¯ããã®ãèãåºãèœåãä¿¡ããä¿¡é ŒããŠããŸãã
ããã§ã¯ãææ¡è
ããã®è¿ä¿¡ã§éæµããŠãããšæãããåäžã®ä»å 䟡å€ã§æ£åœåããã«ã¯ã³ã¹ããããããããŸããã if err != nil
ãšå
¥åããå¿
èŠããªããªããŸããã-ãšã©ãŒãšãšãã«ç±å¿ã«é²åŸ¡ãããæ ¹ä»ããŠãããã®ã¯æ¬¡ã®ãšããã§ãã Goã³ãã¥ããã£å
šäœã«ãã䟡å€èŠ³ã if err != nil
ã䜿çšããŠèšè¿°ãããã³ãŒãã¯æ倧10幎ã«ãªããŸããããã¯ãæã泚ç®ãã¹ãæè¡ã®é²æ©ïŒdockerãk8sãªã©ïŒã®ããã€ããåæã«äœ¿çšããããã¹ãŠå€§æåãåããŠããŸãã
if err != nil
ç· ããããã®ã¯ããã«ãã€ã³ã§é ããããšã®è² æ
ã§ã¯ãããŸããããèšèªã®æåã®æ žãšãªãèŠçŽ ãšããŠç§ãã¡å
šå¡ãèªèãã¹ãããšã§ãã ãããè² æ
ã§ãããšç§ãã¡ãéåçã«åãå
¥ãããšããŠãããããåãé€ãããã®åºæºã¯é«ãã劥åã®ãªããã®ã§ãªããã°ãªããŸããã ä»ã®ãšãããè©Šè¡ã®ããŸãã«ãå€ãã®åŽé¢ã劥åã§ãã
ã©ã¡ãã®æ¹æ³ãç°¡åãã«ã€ããŠã¯æèŠããããŸãããããã¯æèŠã§ãã äžããããè©Šè¡ã¯åçŽã§ãããçŸåšã®æ瀺çãªãã§ãã¯ã¯åçŽã§ãã ã©ã¡ãã®æ¹æ³ãç°¡åã§ãã ç§ã«ãšã£ãŠã®åé¡ã¯ãç¹å®ã®ã³ãŒãã®ãªãŒããŒãšã©ã€ã¿ãŒã®äž¡æ¹ã®èªç¥çè² è·ãå¢å ããããšã§ãã ä»ãäž¡æ¹ãç©äºãè¡ãããã«è€æ°ã®æ¹æ³ã解éããå¿ èŠããããŸãã ãããŠãã©ã€ã¿ãŒã¯ãäœæ¥äžã®ããã±ãŒãžããããžã§ã¯ãã®ä»ã®éšåãšã¯ç°ãªãæ¹æ³ã§ç©äºãè¡ãæ¹æ³ããç©äºãè¡ããªã¹ã¯ãéžæããå¿ èŠããããŸãã æ瀺çãªãã§ãã¯ã眮ãæããããšãããšã解æããå¥ã®ããšãšããŠæé»ã®ãªã¿ãŒã³ããããããèªç¥çè² è·ãå¢å ããŸãã
_ãã®ãã¹ãŠãå°ãèã«çœ®ããŠããšã©ãŒãåŠçãã2ã€ã®åãããã«åçŽãªæ¹æ³ãããããšãèãããšããŸã åé¡ããããŸãã_åçŽã¯ãã¯ãç°¡åã§ã¯ãããŸããã ãããŠãããã¯ãåé¿ããããã«èšèšããããã¹ãŠã®ãã®ãžã®æãéããŸãã
ãã®ãããªãã®ãè¿œå ããããã®åºæºã¯ã¯ããã«é«ãããã£ãŒã«ãããã®ããŒã¿ã§ããè¯ãããšã蚌æããããã«é·ãéå®éšçã§ããå¿ èŠããããŸãã
@cstockton
æçš¿FYIã§è€æ°ã®äººã«è¿ä¿¡ã§ããŸããæ°æéã§10件ã®è¿ä¿¡ããããäžåºŠã«5件ã®è¿ä¿¡ããããšããã£ã¹ã«ãã·ã§ã³ããã©ããŒããã®ãé£ãããªããŸãã
Ianã¯ã 7æ¥åã«ããã®ãã£ã¹ã«ãã·ã§ã³ãgolang-nutsã«ç§»åãã
@therealplato
tryæœè±¡åãšstrings.HasPrefixã®éãã¯ãtryãæé»çã«æ»ãããšã§ãã
ããã¯æ¬åœã ã é¢æ°ãèªãã§ãçµäºããã€ã³ããæ¢ããšãã¯ãreturnãpanicãlog.Panicãos.Exitãlog.Fatalãªã©ãæ¢ããŠè©ŠããŠã¿ãå¿ èŠããããŸãã ããã¯ãã®ãããªåé¡ã§ããïŒ é¢æ°å ã®åºå£ç¹ã®æ°ã¯åããŸãŸã§ãè©Šè¡ã®æç¡ã«ããããããæ瀺çã«ããŒã¯ãããŸãã
ããŒã¯ãŒããèªããªã¿ãŒã³ããããã¯
ãããã¯ã¯ããŒã¯ãŒãã§ã¯ãããŸããã çµã¿èŸŒã¿é¢æ°ã§ãã ããããç§ãã¡ã®èª°ãããèšèªãã¶ã€ã³ã«ç²ŸéããŠããGoããŒã ã®ææ¡ãæ¹å€ããã®ã§ããã°ãå°ãªããšããç©äºãé©åã«å®çŸ©ããããšãæ¯æããå¿ èŠããããŸãã ð
é¢æ°ãèªãã§ãçµäºããã€ã³ããæ¢ããšãã¯ãreturnãpanicãlog.Panicãos.Exitãlog.Fatalãªã©ãæ¢ããŠè©ŠããŠã¿ãå¿ èŠããããŸãã ããã¯ãã®ãããªåé¡ã§ããïŒ
try
ã¯ãåŒã衚瀺ãããå Žæã§ããã°ã©ãã«ã§ãæåéã衚瀺ãããå¯èœæ§ããããããããã¯åé¡ã§ãã Goã®ãã¹ãŠã®åºå£ç¹ã¯ãåäžã®ã¹ããŒãã¡ã³ããšããŠã®ã¿çºçããå¯èœæ§ããããŸããåŒãšããŠè¡šç€ºã§ããã®ã¯try
ã ãã§ãã
@ngrilly
Ianã¯ã7æ¥åã«ããã®ãã£ã¹ã«ãã·ã§ã³ãgolang-nutsã«ç§»åããããšãææ¡ããŸããïŒç¹å®ã®ã³ã¡ã³ãã«è¿ä¿¡ããæ¹æ³ãã¹ã¬ããããããŸããïŒããã®ææ¡ã¯ããã£ã¹ã«ãã·ã§ã³ããå ¬åŒãã§ããããšã確èªããããã«åŽäžãããŸããã ç§ãã¡ã¯ç§ãã¡ãå°ãããã®ãæã£ãŠããŸãã
ã¡ãã»ãŒãžãéå§ããŸã
@ user1
è¿ä¿¡1
@ user2
è¿ä¿¡2
çµäºã¡ãã»ãŒãž
ãããæå³ããããšã§ãã
@cstockton
if errïŒ= nilã®å ¥åãé²ããšãã1ã€ã®å©ç¹ããããŸãã
try
ã¯ã if err != nil
ã ãã§ãªãã if err != nil { return ..., err }
ïŒ3è¡ã§ãã©ãŒãããïŒã®ç¹°ãââè¿ãã®å
¥åãšèªã¿åããé²ããŸãã
ããã«ã¯ããªãœãŒã¹ããªãŒã¯ããæ°ããæ¹æ³ã®å°å ¥ãç°¡æœã§ãªãã³ãŒãã®èšè¿°æ©èœããããŠææªã®å Žåãè©Šè¡ã®ãã¹ããå¯èœã«ãªããšããç ç²ã䌎ããŸãã
ããªããèšåãããªãœãŒã¹ãªãŒã¯ã®ãªã¹ã¯ã¯ã vet
ãšlint
ã§é²ãããšãã§ããŸãã
ãç°¡æœã§ãªãã³ãŒããã«ã€ããŠã¯ã try
èŠç¹ã¯ãã£ãšç°¡æœãªã³ãŒããæžãããšãªã®ã§ãç§ã¯ããªãã®è°è«ãç解ããŠããŸããã
é床ã®é¢æ°åŒã³åºãã®ãã¹ãã®ãªã¹ã¯ã¯ã try
åºæã®ãã®ã§ã¯ãããŸããã é¢æ°åŒã³åºãã¯ãé床ã«ãã¹ããããå¯èœæ§ããããŸãã ãã€ãã®ããã«ãã³ãŒãã¬ãã¥ãŒãšãªã³ãã£ã³ã°ã圹ç«ã¡ãŸãã
ææ¡è ã«ãã£ãŠåœ¢æãããä»æ§ãšè°è«ã¯èª€è§£ãæããšæããŸããçŸåšãææªã®äŸã瀺ãããšãªããæè¯ã®äŸã®ã¿ãæäŸããŠããŸãã
ãã¶ãããã®æ°æã¡ã¯çžäºã§ãã ç§ãã¡ã¯ã¿ããªçŽ æµãªãŽãŒãã¡ãŒã§ãã 䟡å€å€æã«é¥ããªãããã«ããŸããã;-)
ææ¡è ããã®è¿ä¿¡ã§éæµããŠããã®ãããããŸãïŒãerrïŒ= nilã®å Žåã¯å ¥åããå¿ èŠããªããªããŸããã
ç¹°ãè¿ããŸããã l := len("foo"); len("foobar") >= l && s[0:l] == "foo"
ãšå
¥åããå¿
èŠã¯ãããŸããã
代ããã«strings.HasPrefix("foobar", "foo")
ã䜿çšã§ããŸãã
try
ãšã©ãéãã®ã§ããïŒ
以åã«èªãã ããã«ã check
ãšããååã®ãå¶éä»ãã try
ãåãå
¥ãããã¹ããçŠæ¢ããŸãã
if errïŒ= nilã䜿çšããŠèšè¿°ãããã³ãŒãã¯æ倧10幎ã«ãªããŸããããã¯ãæã泚ç®ãã¹ãæè¡ã®é²æ©ïŒdockerãk8sã...ïŒã®ããã€ããåæã«äœ¿çšããããã¹ãŠå€§æåãåããŠããŸãã
ãŸããCãC ++ãJavaãªã©ã§èšè¿°ãããåªããã³ãŒãããããããããŸãããã®äžé£ã®æšè«ã§ã¯ãGoã¯ãããŸããã
Goã§ã®ãšã©ãŒåŠçã«é¢ãããã£ã¹ã«ãã·ã§ã³ãèªãã ãšãã try
ææ¡ã«é¢ããŠå
šå¡ãåãããŒãžã«ãããšã¯æããªãã£ãã®ã§ã try
ãã©ã®ããã«ã§ãããã瀺ãããã°æçš¿ãæžãããšã«ããŸããã䜿çšããïŒ https ïŒ
Redditã«é¢ããé¢é£ãã£ã¹ã«ãã·ã§ã³ïŒ https ïŒ
ãã®åé¡ãtry
ã«åããŠããããšã¯ç¥ã£ãŠããŸãããç§ã®æçš¿ãããã€ãã®æ°ããèŠç¹ãããããããšãé¡ã£ãŠããŸã:)
Goã¯ç«ã¡åŸçããŠããŠãéæ³ã®ããŸãã¯åçŽãªã¢ã€ãã¢ã®ããã®è«çã®éã§èŠåŽããŠããŸãã
é·æïŒ
çæïŒ
if != nil
å®çšçã§ããã try
䜿çšããããšãã§ããŸããç§ã¯ãã®ã³ãã¥ããã£ãç¹ã«ã®ããã«æããŸãã ããã§ã¯ãGo Survey [1]ã§æ祚ããã人ã
ãšã¯ç°ãªããŸãã
ææš©è
ã¯ãããäž»ãªé¢å¿äºãšããŠéžæãããå°æ¥ã®æ€èšã«ä»»ãããããããŸããã
ãããããã®é
眮ã®ããã«åœ±é¿ããããšèŠãªãããŸããã
IMOãèšèªæ©èœã®è¿œå ã¯å€ããææ°ã®ããã°ã©ãã³ã°æ¹æ³ã§ã¯ããšãã£ã¿ãŒã«æ©èœãè¿œå ããŠããŸããã€ãŸãããšã¡ãããŸãã¯èšèªã¹ãããããã³ãŒãã®æãããã¿ãšè²ä»ãããªãã¡ã¯ã¿ãªã³ã°ãšãã©ãŒãããããããã°ãšãã¹ãããšã©ãŒã®è§£æ±ºçã®ææ¡ãgodocãŸãã¯ã¹ã¿ãã¯ãªãŒããŒãããŒããã®åŒçšã§ãã ããœãŒã¹ã³ãŒãã®äžã«UIã眮ãããœãŒã¹ã³ãŒããåé·ã®ãŸãŸã«ããŸã
ã³ãŒãã¯if err != nil
ãtry
æãããã
@ngrilly
tryã¯ãerrïŒ= nilã®å Žåã ãã§ãªããif errïŒ= nil {return ...ãerr}ïŒ3è¡ã§ãã©ãŒãããïŒã®ç¹°ãââè¿ãã®å ¥åãšèªã¿åããé²ããŸãã
ãerrïŒ= nilã®å Žåãå ¥åã§ããªããªãããšèšã£ãŠããã®ã¯ãå ¥åããã³ãŒããèªãã ããšãå®å šã«å¿ããŠããŸã£ãããšãæå³ããŠãããšæããŸããïŒ
ããªããèšåãããªãœãŒã¹ãªãŒã¯ã®ãªã¹ã¯ã¯ãç£å»ãšãªã³ãã§é²ãããšãã§ããŸãã
ããã§ãç£å»ãšãªã³ããåççãªéžæè¢ã§ã¯ãªããšæããçç±ã«ã€ããŠã®è°è«ããªã³ã¯ããŸããã
ãç°¡æœã§ãªãã³ãŒããã«ã€ããŠã¯ããã£ãšç°¡æœãªã³ãŒããæžãããšããã€ã³ããªã®ã§ãããªãã®äž»åŒµã¯ç解ã§ããŸããã
ã¯ãããç°¡æœã§ãªãã³ãŒãã
é床ã®é¢æ°åŒã³åºãã®å ¥ãåã®ãªã¹ã¯ã¯ãè©Šè¡ããç¹å®ã®ãã®ã§ã¯ãããŸããã é¢æ°åŒã³åºãã¯ãé床ã«ãã¹ããããå¯èœæ§ããããŸãã ãã€ãã®ããã«ãã³ãŒãã¬ãã¥ãŒãšãªã³ãã£ã³ã°ã圹ç«ã¡ãŸãã
èå³æ·±ãããšã«ãå®éã«ãããå解ããŠã¿ãŸãããã
1ïŒé床ã®é¢æ°åŒã³åºãã®å ¥ãåã®ãªã¹ã¯ã¯ãè©Šè¡ããç¹å®ã®ãã®ã§ã¯ãããŸããã
ã¯ããããã®èª°ããé¢æ°ãã©ã®ããã«æ©èœããããç解ããŠããŸãã
2ïŒé¢æ°åŒã³åºãã¯é床ã«ãã¹ããããå¯èœæ§ããããŸãã
ã¯ããããã®èª°ããé¢æ°ãã©ã®ããã«æ©èœããããç解ããŠããŸãã
3ïŒãã€ãã®ããã«ãã³ãŒãã¬ãã¥ãŒãšãªã³ãã£ã³ã°ã圹ç«ã¡ãŸãã
ã¯ããããªãã¯ãã§ã«lintåŒæ°ãäœæããŸããããã³ãŒãã¬ãã¥ãŒåŒæ°ãã¯ãç§ãããªãã«ãªã³ã¯ã§ãã
ãã¶ãããã®æ°æã¡ã¯çžäºã§ãã ç§ãã¡ã¯ã¿ããªçŽ æµãªãŽãŒãã¡ãŒã§ãã 䟡å€å€æã«é¥ããªãããã«ããŸããã;-)
åãããŸãããïŒ ãã®ææ¡ã«ã¯ãå®è£
ãæäŸããå®å
šãªæ©èœã®äŸã¯ãªããæå³ããã䜿çšæ³ã®ã¿ãå«ãŸããŠããŸãã ææ¡ã®åœ±é¿ã枬å®ããããã«äœ¿çšãããtryhard
ããŒã«ã¯ãæãéå®çã§åççãªåœ¢åŒã§try
ã䜿çšããŸãããããã¯åçŽãªäºå®ã§ãã
ç¹°ãè¿ããŸãããlïŒ= lenïŒ "foo"ïŒ;ãšå ¥åããå¿ èŠã¯ãããŸããã lenïŒ "foobar"ïŒ> = l && s [0ïŒl] == "foo"ã
代ããã«strings.HasPrefixïŒ "foobar"ã "foo"ïŒã䜿çšã§ããŸãã
è©ŠããŠã¿ããšã©ãéãã®ïŒ
ç§ã¯ããããã®å察ã®èŠæ¹ããäœçœ®ãæœåºããããã«æåãå°œãããŸãããããªããã°ç§ã¯ããã解äœããããã®è°è«ã圢æããããšãã§ããŸããã ããã§ã¯æ¬åœã«èŠããŸãããããããªããã ç§ã¯ãããç§ããããç解ã§ããå¯äžã®æ¹æ³ãã€ãŸãæåéãã«è§£éããã€ããã§ãã
ïŒ
strings.HasPrefix
ïŒã¯try
ã©ãéãã®ã§ããïŒ
func HasPrefix
func HasPrefixïŒsããã¬ãã£ãã¯ã¹æååïŒbool
HasPrefixã¯ãæååsããã¬ãã£ãã¯ã¹ã§å§ãŸããã©ããããã¹ãããŸãã
func
try
ã¯ãtry withsignatureïŒæ¬äŒŒã³ãŒãïŒãšåŒã°ããæ°ããé¢æ°ã®ãããªçµã¿èŸŒã¿é¢æ°ã§ããfunc try(expr) (T1, T2, ⊠Tn)
ããã§ãexprã¯ãã¿ã€ãT1ãT2ã... Tnã®n + 1ã®çµæå€ãšãæåŸã®å€ã®ãšã©ãŒãçæããçä¿¡åŒæ°åŒïŒéåžžã¯é¢æ°åŒã³åºãïŒãè¡šããŸãã exprãåäžã®å€ïŒnã¯0ïŒãšè©äŸ¡ãããå Žåããã®å€ã¯ãšã©ãŒåã§ããå¿ èŠããããtryã¯çµæãè¿ããŸããã åãšã©ãŒã®æåŸã®å€ãçæããªãåŒã§tryãåŒã³åºããšãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
tryãã«ãã€ã³ã¯ãæåŸã®çµæããšã©ãŒåã§ããå Žåã«ãå°ãªããšã1ã€ã®çµæãã©ã¡ãŒã¿ãŒãæã€é¢æ°å ã§ã®ã¿äœ¿çšã§ããŸãã å¥ã®ã³ã³ããã¹ãã§tryãåŒã³åºããšãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ïŒæ¬äŒŒã³ãŒãïŒã®ããã«é¢æ°åŒã³åºãfïŒïŒã§tryãåŒã³åºã
x1, x2, ⊠xn = try(f()) turns into the following (in-lined) code: t1, ⊠tn, te := f() // t1, ⊠tn, te are local (invisible) temporaries if te != nil { err = te // assign te to the error result parameter return // return from enclosing function } x1, ⊠xn = t1, ⊠tn // assignment only if there was no error
ã€ãŸãããexprãã«ãã£ãŠçæããããšã©ãŒåã®æåŸã®å€ãnilã®å Žåãtryã¯æåã®nåã®å€ãè¿ãã ãã§ãæåŸã®nilãšã©ãŒã¯åé€ãããŸãã ãexprãã«ãã£ãŠçæãããæåŸã®å€ãnilã§ãªãå Žåãå²ãã§ããé¢æ°ã®ãšã©ãŒçµæå€æ°ïŒäžèšã®æ¬äŒŒã³ãŒãã§ã¯errãšåŒã°ããŸãããä»ã®ååãä»ããŠããããååãä»ããããŠããªãå¯èœæ§ããããŸãïŒã¯ããã®nil以å€ã®ãšã©ãŒå€ã«èšå®ãããŸããå²ãã§ããé¢æ°ãæ»ããŸãã å²ãã§ããé¢æ°ãä»ã®ååä»ãçµæãã©ã¡ãŒã¿ãŒã宣èšããŠããå Žåããããã®çµæãã©ã¡ãŒã¿ãŒã¯ãããããæã€å€ãä¿æããŸãã é¢æ°ãä»ã®ååã®ãªãçµæãã©ã¡ãŒã¿ãŒã宣èšããå Žåããããã¯å¯Ÿå¿ãããŒãå€ãæ³å®ããŸãïŒããã¯ãæ¢ã«æã£ãŠããå€ãä¿æããããšãšåãã§ãïŒã
ãã®å³ã®ããã«tryãè€æ°ã®å²ãåœãŠã§äœ¿çšãããnil以å€ã®ãšã©ãŒãæ€åºãããå ŽåãïŒãŠãŒã¶ãŒå®çŸ©å€æ°ãžã®ïŒå²ãåœãŠã¯å®è¡ããããå·ŠåŽã®å€æ°ã¯ããããå®è¡ãããŸãããå²ãåœãŠãå€æŽãããŸãã ã€ãŸããtryã¯é¢æ°åŒã³åºãã®ããã«åäœããŸãããã®çµæã¯ãtryãå®éã®åŒã³åºããµã€ãã«æ»ã£ãå Žåã«ã®ã¿äœ¿çšã§ããŸãïŒå²ãã§ããé¢æ°ããæ»ãã®ã§ã¯ãããŸããïŒã çµæãšããŠãå·ŠåŽã®å€æ°ã«çµæãã©ã¡ãŒã¿ãŒãšããååãä»ããããŠããå Žåãtryã䜿çšãããšãçŸåšèŠãããäžè¬çãªã³ãŒããšã¯ç°ãªãçµæã«ãªããŸãã ããšãã°ãaãbãããã³errããã¹ãŠãå²ãã§ããé¢æ°ã®ååä»ãçµæãã©ã¡ãŒã¿ãŒã§ããå Žåããã®ã³ãŒãã¯
a, b, err = f() if err != nil { return }
fïŒïŒããšã©ãŒãè¿ãããã©ããã«é¢ä¿ãªããåžžã«aãbãããã³errãèšå®ããŸãã å¯Ÿç §çã«
a, b = try(f())
ãšã©ãŒãçºçããå Žåãaãšbã¯å€æŽãããŸããã ããã¯åŸ®åŠãªéãã§ããããã®ãããªã±ãŒã¹ã¯ãŸãã§ãããšèããŠããŸãã çŸåšã®åäœãäºæ³ãããå Žåã¯ãifã¹ããŒãã¡ã³ããä¿æããŸãã
ãããã¯ãtryã®èª¬æã«ããããã¹ãå šäœãstrings.HasPrefixã«ååšããªããšããç¹ã§ç°ãªããŸãã ããè¯ã質åã¯ãã©ã®ããã«äŒŒãŠããããšããããšã§ããç§ã¯ãã©ã¡ããé話ã®ããã€ãã®åŽé¢ãå ±æããä»ã«ã¯äœãå ±æããŠããªããšçããŸãã
ç§ã¯ä»¥åã«ããã§ãã¯ãšããååã®ãå¶éããããè©Šè¡ãåãå ¥ãããã¹ããçŠæ¢ããããšãèªã¿ãŸããã
tryã«å¯Ÿããç§ã®äžå¿çãªè°è«ãèªãã§ãããŠããããã§ãïŒå®è£ ã¯ååã«å¶éçã§ã¯ãããŸããã ã©ã¡ãã®å®è£ ããç°¡æœã§èªã¿ããããã¹ãŠã®ææ¡ã®äœ¿çšäŸãšäžèŽããå¿ èŠããããšæããŸãã
ææ¡ã«ã¯ãå®è£ ã«äžèŽããäŸãå«ããå¿ èŠããããŸããããã«ãããææ¡ãæ€èšããŠãããã¹ãŠã®äººããGoã³ãŒãã«å¿ ç¶çã«çŸãããã®ã«ãããããå¯èœæ§ããããŸãã ã©ã®èšèª/ç°å¢ã§ãçºçãããçæ³çã«èšè¿°ãããŠããªããœãããŠã§ã¢ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°æã«çŽé¢ããå¯èœæ§ã®ãããã¹ãŠã®ã³ãŒããŒã±ãŒã¹ã«å ããŠã è€æ°ã®ãã¹ãã¬ãã«ã§ã¹ã¿ãã¯ãã¬ãŒã¹ãã©ã®ããã«èŠããããªã©ã®è³ªåã«çããå¿ èŠããããŸãããšã©ãŒã®å Žæã¯ç°¡åã«èªèã§ããŸããïŒ ã¡ãœããå€ãç¡åé¢æ°ãªãã©ã«ã¯ã©ãã§ããïŒ fnïŒïŒã®åŒã³åºããå«ãè¡ã倱æããå Žåã以äžã¯ã©ã®ã¿ã€ãã®ã¹ã¿ãã¯ãã¬ãŒã¹ãçæããŸããïŒ
fn := func(n int) (int, error) { ... }
return try(func() (int, error) {
mu.Lock()
defer mu.Unlock()
return try(try(fn(111111)) + try(fn(101010)) + try(func() (int, error) {
// yea...
})(2))
}(try(fn(1)))
åççãªã³ãŒããããããæžãããããšã¯ããç¥ã£ãŠããŸãããä»ã§ã¯ãããŸã§ååšããªãã£ãããŒã«ãã€ãŸãæ確ãªå¶åŸ¡ãããŒãªãã§ã³ãŒããæžãå¯èœæ§ã®ããããŒã«ãæäŸããŠããŸãã ã§ãããããããããªããããèš±å¯ããã®ããæ£åœåããããšæããŸãããã®çš®ã®ã³ãŒãã®ãããã°ã«æéãç¡é§ã«ãããã¯ãããŸããã ç§ã¯ããããããšãç¥ã£ãŠããã®ã§ãããªãã圌ããèš±ãã°èª°ãããããããã ãããšããçµéšãç§ã«æããŠãããŸããã ãã®èª°ãã¯ãã°ãã°ç¥ããããŠããªãç§ã§ãã
Goã¯ãä»ã®éçºè ãšç§ãåããããµããæ§é ã䜿çšããããã«å¶éããããšã§ããäºãã®æéãç¡é§ã«ããããã®æå°éã®æ¹æ³ãæäŸããŸãã å§åçãªæ©æµãªãã«ããã倱ããããããŸããã ãtryã¯é¢æ°ãšããŠå®è£ ãããŠããã®ã§ããå§åçãªã¡ãªããã«ãªããšã¯æããŸããã ãã®çç±ãæããŠãã ããã
ãã®ãšã©ãŒåŠçã®åé¡ã«æéãç¡é§ã«ããªãã§ãã ããããžã§ããªãã¯ã¹ãæäŸããŠãã ãããRustã®çµæã®ãããªãã®ãäœæããŸãã
Goã¯ç«ã¡åŸçããŠããŠãéæ³ã®ããŸãã¯åçŽãªã¢ã€ãã¢ã®ããã®è«çã®éã§èŠåŽããŠããŸãã
é·æïŒ
- ãã€ã©ãŒãã¬ãŒããæžãã
- åçŽ
- ä»ã®èšèªã®äžã§ãæ¢åã®ãã¿ãŒã³
- ãªãã·ã§ã³
çæïŒ
- åŠç¿æ²ç·
- æ ¹åºã«ããéæ³
- æ°ããçš®é¡ã®ãã°
- Goã¯æèŠãããã
if != nil
å®çšçã§ãããtry
䜿çšããããšãã§ããŸããç§ã¯ãã®ã³ãã¥ããã£ãç¹ã«ã®ããã«æããŸãã ããã§ã¯ãGo Survey [1]ã§æ祚ããã人ã ãšã¯ç°ãªããŸãã
ææš©è ã¯ãããäž»ãªé¢å¿äºãšããŠéžæãããå°æ¥ã®æ€èšã«ä»»ãããããããŸããã
ãããããã®é 眮ã®ããã«åœ±é¿ããããšèŠãªãããŸãããIMOãèšèªæ©èœã®è¿œå ã¯å€ããææ°ã®ããã°ã©ãã³ã°æ¹æ³ã§ã¯ããšãã£ã¿ãŒã«æ©èœãè¿œå ããŠããŸããã€ãŸãããšã¡ãããŸãã¯èšèªã¹ãããããã³ãŒãã®æãããã¿ãšè²ä»ãããªãã¡ã¯ã¿ãªã³ã°ãšãã©ãŒãããããããã°ãšãã¹ãããšã©ãŒã®è§£æ±ºçã®ææ¡ãgodocãŸãã¯ã¹ã¿ãã¯ãªãŒããŒãããŒããã®åŒçšã§ãã ããœãŒã¹ã³ãŒãã®äžã«UIã眮ãããœãŒã¹ã³ãŒããåé·ã®ãŸãŸã«ããŸã
ã³ãŒãã¯if err != nil
ãtry
æãããã
ç§ã¯ããšã©ãŒã®åŠçãå¿ããããšãªããããå³å¯ãªãšã©ãŒåŠçã«æ祚ãã人ã§ããã è©ŠããŠã¯ãããŸããã
Rustã®Result
ã¿ã€ãã®ããã«ãªã¢ãŒãã§äœãããªã¡ã€ã¯ããã«ã¯ããžã§ããªãã¯ãããã¯ããã«å€ãã®ãã®ãå¿
èŠã«ãªããŸãã Result
åããžã§ããªãã¯ã®ã¿ã§äœæã§ããå Žåã§ããåå¿è
ããã°ã©ããŒã¯ããšã©ãŒãé©åã«åŠçããåã«ãžã§ããªãã¯ãç¥ã£ãŠããããé¢æ°ã Result
æ¹æ³ã§ãšã©ãŒãè¿ããå¿
èŠããããŸãã ãã
@deanveloper ãç§ã®ãã€ã³ãã¯æ¬¡ã®ãšããã§ãããæ§æã®å€æŽãããããžã§ããªãã¯ã®æ©æµãåããããšããããããããããã¯ã³ãã¥ããã£ã«ãåœãŠã¯ãŸããšæããŸãã
@txgruppiãžã§ããªãã¯ã¹ã®åªå 床ãé«ãããå¿ èŠãããããšã«åæã§ããŸãã ç§ã¯ããžã§ããªãã¯ããšã©ãŒåŠçã®è¯ã代æ¿ã«ãªããšã¯æããªããšèšã£ãŠããŸããã
@deanveloper ãç§ã®æèŠã§ã¯ããã®ãšã©ãŒåŠçã®åé¡ã¯åãªãèŠãç®ã§ãã人ã
ã¯ãããã€ãã®è¿œå ã³ãŒããå
¥åããå¿
èŠããããšããçç±ã ãã§ãå®å®ããŠããŠããŸãæ©èœãããã®ã«ã€ããŠè°è«ããããšã«æéãè²»ãããŠããŸãã ããè¯ãã³ãŒããæžãæ¹æ³ãåŠã³ãèšèšå€æŽã§ããã解決ããã ãã§ãã
誰ãããžã§ããªãã¯ã¹ãèšãåã«ãããè¯ãã³ãŒãã§ä¿®æ£ããã®ã¯åããããç°¡åã§ãïŒã³ã³ãã€ã«æãšã©ãŒ...
ã¹ãããããŸãã¯ããŒããŒããã¯ãã§è§£æ±ºã§ããŸããïŒ ãã®åŸãããã¯åé¡ã§ã¯ãããŸããã
@txgruppi
ããè¯ãã³ãŒããæžãæ¹æ³ãåŠã³ãèšèšå€æŽã§ããã解決ããã ãã§ãã
Robert Griesemerã圌ã®tryhard
ããŒã«ã䜿çšããŠèŠã€ããããã«ãæšæºã©ã€ãã©ãªå
ã®ãã¹ãŠã®ãšã©ãŒåŠçã³ãŒãã®70ïŒ
ã¯ãçŸåštry
é©ããŠããŸãã ïŒãŸã ååšããŠããªãïŒ fmt.HandleErrorf
é¢æ°ã䜿çšãããªã©ãã³ãŒããå€æŽãããšãããã«å€ãã®å¯Ÿè±¡ã«ãªããŸãã æšæºã©ã€ãã©ãªãæªãã³ãŒããšåŒã³ãããªããšæããŸãã
ã¹ãããããŸãã¯ããŒããŒããã¯ãã§è§£æ±ºã§ããŸããïŒ ãã®åŸãããã¯åé¡ã§ã¯ãããŸããã
ãŸããã³ãŒããèªãããšã§ããããŸãã ã ããç§ãã¡ã¯thing.Thing thing = new thing.Thing(thing.THING);
奜ãã§ã¯ãããŸãã
@ faiface ã 'if errïŒ= nil'ã¯ãé«å質ã®ãœãããŠã§ã¢ã®éçºã«
ãžã§ããªãã¯å»è¬åã®äžè¶³ã¯ãé«å質ã®ãœãããŠã§ã¢ã®éçºã®éäžã«ãããŸããïŒ ã¯ããããã§ãã
ç§ã®èŠæ¹ã§ã¯ããžã§ããªãã¯ãå®è£ ããã®ã«ååãªç¥èããªãã®ã§ã誰ãããããå®è£ ããå¿ èŠããããŸããããã®ãšã©ãŒåŠçã¯ããžã§ããªãã¯ãå®çŸã§ããå¿ã«ãšã£ãŠã¯æéã®ç¡é§ã§ãã ç§ã¯ãã®ãšã©ãŒåŠçã«å察ããŠããŸãããããã¯æªãããšã ããã§ãã解決ãã¹ããã£ãšéèŠãªããšãããã®ã§å察ã§ãã
@faifaceæšæºã©ã€ãã©ãªã¯ãå®éã®Goã³ãŒããé©åã«è¡šçŸãããã®ã§ã¯ãããŸããã ããã¯ãæšæºã©ã€ãã©ãªãã³ã³ããã¹ããè¿œå ããã«ãšã©ãŒãåçŽã«æž¡ãå¯èœæ§ãã¯ããã«é«ãããã§ããããšãã°ã io/ioutil
ã¯å®éã«ãšã©ãŒãè£
食ããå¿
èŠio
ã§çºçãããšã©ãŒãåçŽã«æž¡ãããšãã§ããŸãã
@deanveloper @faiface Go Corpusã«å¯ŸããŠå®è¡ãããå ŽåïŒ
--- stats ---
401679 (100.0% of 401679) func declarations
97496 ( 24.3% of 401679) func declarations returning an error
991348 (100.0% of 991348) statements
217490 ( 21.9% of 991348) if statements
88891 ( 40.9% of 217490) if <err> != nil statements
485 ( 0.5% of 88891) <err> name is different from "err" (-l flag lists details)
59500 ( 66.9% of 88891) return ..., <err> blocks in if <err> != nil statements
29391 ( 33.1% of 88891) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
596 ( 0.7% of 88891) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
52810 ( 59.4% of 88891) try candidates (-l flag lists details)
ãããã£ãŠãå®éã®ã³ãŒãã§ã¯ãifã¹ããŒãã¡ã³ãã®40ïŒ
ããšã©ãŒãã§ãã¯çšã«èšè¿°ãããŠããã try
䜿çšãããšããããã®59ïŒ
ããã®ãŸãŸäœ¿çšã§ããŸãã
åæããŸãã errïŒ= nilã®å Žåã¯åé¡ãããŸããã åäžã®ãšã©ãŒå€ãè¿ãé¢æ°ã«ãšã£ãŠã¯ãã·ã³ãã«ã§ã¯ãªãŒã³ã§ãã ãŸãããšã©ãŒã®ã³ã³ããã¹ããéèŠãªå Žåã®ãšã©ãŒããã±ãŒãžãšãã®åå /ã©ããé¢æ°ãæ°ã«å ¥ã£ãŠããŸãã ã³ãŒãããããã£ã§ã«ã¹ã¿ã ãšã©ãŒã䜿çšããã«ã¯ïŒç§ãç¥ãéãïŒãåã¢ãµãŒã·ã§ã³ãå®è¡ããããæšæºãšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ä»£ããã«äœãã䜿çšããå¿ èŠããããŸãã ãããã«ãããç§ã¯Goã³ãŒããèªãã ãæžãããããŠããšã©ãŒåŠçãçŸåšã©ã®ããã«æ©èœããŠãããã«ãªãããã®äžå¿«æãæããããšã¯ãããŸããã ç§ãééããç ©ãããã¯ãã¢ã€ãã ã®ã³ã¬ã¯ã·ã§ã³ãåŠçããçµæãšããŠè€æ°ã®ãšã©ãŒãçºçããå¯èœæ§ãããå Žåã§ãã ãã ããããã¯èšèšäžã®åé¡ã§ãããèšèªã®åé¡ã§ã¯ãããŸããã
ããšã©ãŒã®ã³ã³ããã¹ããéèŠãªå Žåããšèšããšãã¯ããããã¯ãŒã¯ã®äžæçãªäžæãçºçããããã«åè©Šè¡ãããå ŽåããŸãã¯ãæ€çŽ¢ãã¿ã€ãã®åŒã³åºãã®çµæãçºçããããã«çµæãè¿ãããªãå ŽåãæããŠããããšã«æ³šæããŠãã ãããå®éã«ã¯äœããããŸããããŸãã¯ãç§ã®ã²ããããæãSQLã¯ãšãªã«ã©ã³ãã ãªãsããè¿œå ããŠççºãããŠããŸãïŒããã¯ç§ã«é »ç¹ã«èµ·ãããŸã...ããããç¥çµæå·ããã§ãã¯ããå¿ èŠããããŸãïŒã
7/5/19ã«ãNicolasGrillyã®[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@kropptç§ã¯äœååãèªãã ;-)ç§ã¯è©ŠããŠã¿ããšããèãã«åæããŸãã
ã³ãŒããé£èªåããã tryã¯ãããã€ããå æ°å解ããããã«äœ¿çšãããçµã¿èŸŒã¿é¢æ°ã§ãã
å埩ã³ãŒãã ç§ãã¡ã¯ããã°ã©ããŒãšããŠåžžã«ãããè¡ã£ãŠããŸãã ç§ãã¡ãç¹å®ãããšã
ç¹°ãè¿ããã¿ãŒã³ãæ°ããé¢æ°ã§ãããé€å€ããŸãã ããããªãã£ãå Žåã
ãã¹ãŠã®ã³ãŒããã€ã³ã©ã€ã³åããã1ã€ã®é·ãmainïŒïŒé¢æ°ããããŸããç§ã¯ããªããäžèª å®ãšåŒã³ãããªããŸãããç§ã¯ã€ã¢ã³ã»ã©ã³ã¹ã»ãã€ã©ãŒã®
è°è«ãäžå¯§ã«ä¿ã€ããã®è¶ 人çãªåªåãšç§ã¯æ¬åœã«ã§ããŸãã
ãã®ãã©ãŒã©ã ã«æå³çã«åãã€ãããšã§èª°ããäœãåŸãããèŠãŠãã ããã
ãšã¯ããããç¹°ãè¿ããã¿ãŒã³ãç¹å®ãããšãã¯ããããèæ
®ã«å
¥ããŸãã
æ°ããé¢æ°ãã確ãã«ããããççŸããæ§é ãæäŸããããšã«ãã£ãŠã§ã¯ãããŸãã
ããã¯ãå²ç¢ã®éçºã®ãã®åŸæ段éã§ã¯ã2ã€ã§é·ããªããŸã
é ãããæ©èœïŒ1ã€ç®ã¯ãã
åŒæ°ãªã¹ãã¯ãç¹å¥ãªïŒãŸãã¯ä»ã®ãã¹ãŠã®ãã®ãšããŠïŒ error
å€ã§çµãããŸãã
ã»ãã³ãã£ãã¯ãšã©ãŒãšããŠïŒãããŠ2çªç®ã¯é ãããå¶åŸ¡ãããŒãæäŸããŸã
ããªã¿ãŒã³ããšé¡äŒŒããŠãããå®å
šã«åäžã§ã¯ãªãè¿åè·¯
声æã
ã延æãã䜿çšãããšå¯ŸåŠããããã«å°å
¥ãããçãããããªããŒããæ°ã«ããªãã§ãã ãã
ãtry-ç䌌é¢æ°ãã®ããé£è§£ãªäœ¿çšæ³ã§ã 誰ã
ä»ã®å Žæã§ã¯ã倧ãŸãã«ãã³ãŒãã§try
ã«åºããããããªã
ç§ã¯èªãã ããç§ã¯åãããã«æããŸãããããŠããã¯äžã«æµãããã¹ãã§ã¯ãããŸãã
ã«ãŒãããã
ç§ã¯ãããšã©ãŒãªã¿ãŒã³ãã®ããªã¿ãŒã³ãã®åŽé¢ã§ãããšè¿°ã¹ãŸããã
察åŠããå¿
èŠããããããšã©ãŒæãã®ææ¡ãæãè¿ããªããŸã
ãã®ååã ãã§ãªããã«ãŒã«ãããããæ²ããŸãã ç§èªèº«ãããã§ã
ã倱æãã®ææ¡ïŒæåŸã®åŒæ°ãæåã®åŒæ°ã«ç§»åããŸããããã¯
ç§ãäžå¹žã«ããïŒã
ããã«æ·±ãèšãã°ãSNOBOLãé€ããŠãã©ã®èšèªããããŸããã
ç§ã粟éããŠããããšã¯ãããã»ãã€ã¯ã説æããé£èºãéããŸãã
Goãæã£ãŠããçšåºŠã®ããšã©ãŒã¯äŸ¡å€ãã§ãããäœãã倱ãããŸãã
ããã»ã¹äžïŒãšã©ãŒãæ¡ä»¶ãã¯å€ã§ã¯ãããŸããã æå
é¢æ°ã®å®äºã¯ç¹æ®ãªã±ãŒã¹ã§ããããããããå¯èœã§ãã
倱æã
ããããïŒãããŠããã¯æ£åžžãªå®äºã«é©çšãããŸãã
è€æ°ã®å ŽåãïŒãã®ã¡ãªãããèæ
®ããŠæ±ãå¿
èŠããããŸããã
åŒã³åºãããé¢æ°ã¯ãã«é¢ããæèŠãç§ãã¡ã«äŒããªããã°ãªããªããšäž»åŒµããŸã
çç¥åœ¢ã§ã®å®æã®è³ªã
æ°žé ã«è¡ãããããã¯èª€è§£ã§ããããšã瀺ãããŠããŸãã
ãã€ã³ãã説æããããã«ããªãŒããŒããã®æ»ãå€ãæ€èšããŠãã ããã
io.EOFã¯ç¹æ®ãªã±ãŒã¹ã§ãããæåããããšãããã°ãæåããããšããããŸãã
倱æããŸãããGoæšæºã§ã¯ãèªãããã«ãšã©ãŒã§ãïŒ "io.ErrïŒ= nil"ïŒã
ãããççž®ããæ¹æ³ããããŸããïŒ ã»ãŒç¢ºå®ã«
ããã§ã¯ãããŸããããªããªããç§ãã¡ã¯ãã®ãééããããèš±ããããšã«ããªãæ
£ããŠããããã§ãã
ã«ãŒãåºå£ãåæ§ã®ãã¹ããŒã¿ã¹ããäŒããã®ãé·ãéåŸ
ã£ãŠããŸããã
æ¡ä»¶ã³ãŒãïŒæ€çŽ¢ã¯ãèŠã€ãã£ãå€ãŸãã¯å€±æã§çµäºããå ŽåããããŸãããã©ã®ããã«
å¥ã®ããšããããã®ãªããã©ã¡ããæããŸããïŒ ãã¹ããè¿œå ãã
ç¥èããã§ã«ååšããå Žæ-åãåé¡ãç°ãªã
ç°å¢ïŒã
ãããã¯ãåŸæ¥ã®èšèªã«å¯Ÿããå®éã®æ¡åŒµæ©èœã§ãããã€ã©ãŒã®åæž
æ¯èŒãããšããã¬ãŒãã¯ã°ãããŠããŸãã
ãããŠãäžé
æŒç®åãšã®æ¯èŒãåæ§ã«æå¹ã§ãïŒif ïŒïŒ
ãä¹±çšãããªãããã«ãèš±å¯ãããŠããªãå Žåã¯ãè©Šè¡ãèš±å¯ããŠã¯ãªããŸããã
å°ãªããšããããã®çç±ã§ã
ççŽã«èšã£ãŠãè©ŠããŠã¿ãŠãã ããã ããã¯Goãééã£ãããšã«å¯ŸããŠããé
åçã«ããŸã
芳客ã ãããããããšã®å±éºã®ã»ãã«-誰ãééã£ã人ã
ãæãã§ããã®ã
ç§ãã¡ã®ã³ãã¥ããã£ã«åå ããã«ã¯ïŒ -å
äŸã®åé¡ãšåé¡ããããŸã
æå³ãããçµæã®ã ç§ã¯ããããã¹ã¯ã©ããããããšèšãããããåãå
¥ããŸããã
äžäœäºææ§ãå¯èœãªãã€ã³ãã«ã¯ãŸã å°éããŠããŸãã
ç¡èŠãããã®ã§ããšã©ãŒåŠçã¯åé·ãªãŸãŸã§ãªããã°ãªããŸããã
ãããã¯/å埩ããããäžæµããææ Œããå¿
èŠããããŸã
ãã¹ãŠã®èª¬æãšãšãã«ããããã§ããèªçºçãªãã«ããŒãžã®åžæ°
ããã¯åå¿è
ïŒãããŠç§ãç§ã¯ãããæãã£ãŠããããšãèªããŸãïŒããã£ãšäœããŸã
èªä¿¡ãæã£ãŠäœ¿çšã§ããŸãã
ãšã©ãŒåŠçå
ã®ãdeferãæ§é ïŒç§ãæ¡çšãããã®-
ä»ã®å Žæã§ã®ã€ã³ããŒããå®çŸããã«-äžè²«ããŠãã¡ã€ãã©ã€ãº
SQLãã©ã³ã¶ã¯ã·ã§ã³ïŒtx.Rollback / tx.CommitïŒã¯ç§ã«ãšã£ãŠå瀺ã§ããã
ã®ç¯å²å
ã§åŠã¶ããšãã§ããããå€ãã®ååããããããããŸãã
Goããã§ã«æäŸããŠãããã®ïŒä»ã¯ãã®ããã¯ã¹å
ã«ãšã©ãŸããŸãããã
ãã®ãããªããšã®1ã€ã¯ãã«ãããå€ããŠããšã©ãŒå ±åã«æž¡ãããšã§ãã
åŸæ¥ã®æ¹æ³ã§å®è¡ããããerror.Methodsãã®ãªã¹ããæ©èœããã
çµæãå ±åãã代ããã«ãæ¡ä»¶ïŒio.EOFãsql.ErrNoRowsïŒ
çœé»ãšããŠã ããããç§ã¯ãã®ãããªåé¡ã§åŠæ ¡ã«éã£ãŠããŸãããç§ã®ææ¡
ãã€ãŒããããã®ã§ãä»ã®äººïŒããžã£ãŒãèããŠããŸããïŒïŒã«åãããã«è²ãŠãããŠãã ãã
å®çŸãžã®ã¢ã€ãã¢ã
ã«ã·ãªã
ãã¿ã€ãããã®ã¯é¢åã§ã¯ãããŸãããåããã®ãããå Žåãèªãã®ã¯é¢åã§ãã
ã©ãã§ã3è¡ã ããã¯ç¹°ãè¿ãã§ãããç§ãã¡ããã°ã©ããŒã¯éåžž
ããããé€å€ããåŸåããããŸãã ãã¶ãè©ŠããŠã¿ããšä»ã®æ¬ ç¹ããããŸãããããã¯ããã§ã¯ãããŸãã
ç§ãæãã«ãã
ç¹°ãè¿ããŸãããäžèª å®ãŸãã¯å°ãªããšãåçåã ç§ã¯ããããèªããŸã
3è¡ã¯ãæžã蟌ãŸãããããäœåºŠãèªã¿åãããŸããã
ç·©åããããšãç®çãšããGriesemerã®çã¿ã¯ãèªæžã§ã¯ãªãå·çã«ãããŸã
ãããããerrïŒ= nilãã¯éåžžã«ããç¥ãããŠããããŒã«ãŒã§ããããèªã¿åããå Žåã¯æ¬¡ã®ããã«ãªããŸãã
ãšãã£ã¿ãŒã䜿çšããŠãæ€çŽ¢ãããã®ãšã¯å¯Ÿç
§çã«ããã®ãã¿ãŒã³ã¯ã©ã¡ããç°¡åã§ãã
ã¹ãããã§ç°¡åã«ãã£ã³ã»ã«ã§ããŸãã ãããå æ°å解ããããšã¯åãã§ã¯ãããŸãã
ãªãŒã°ã ãããŠãäŸ¡æ Œã¯ééã£ãŠããŸãã
ãç§ãã¡ããã°ã©ããŒãã¯ãæåã«ãã£ãšè€éãªãã¿ãŒã³ãé€å€ããåŸåããããŸãã
ãŸãã«ããçºçããªãå Žåã§ãã ãŸãããif errïŒ= nil {return
err} "ã¯ãéåžžã«åçŽãªäžé£ã®åœä»€ã«ã³ã³ãã€ã«ãããŸãã
誰ãããŸãããããã§æãæããããŠãã ããã 1ã€ã¯çããããããšãã§ããŸã
ããããtry--thefunctionãã§èµ·ãããšç¢ºä¿¡ããŠããŸããïŒ
ã«ã·ãªã
@lootchããã人ãäžèª å®ãšåŒã¶ã®ã¯æ¬åœã«éçç£çã§ããããªãããã®ããã«ããŒã¯ããã¹ããŒãã¡ã³ãã¯ããªãåççã§ããããã圌ãã¯ããã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã
ç§ãã¡ã¯ããã°ã©ããŒãšããŠç¹°ãè¿ããã¿ãŒã³ãé€å€ããŸããããã¯çµ¶å¯Ÿã«çå®ã§ãã
ç¹°ãè¿ãã®å€ãã³ãŒãã¯èªã¿åããé ãããã®ã§ããããã©ã®ããã«äžèª å®ã§ããããããããŸããã
ãããã«å¯Ÿããããªãã®åè«ã¯åºæ¬çã«ã人ã«æ¥ãªãããããã¯ããã»ã©å€§ããããšã§ã¯ãªããã§ãã ãŸããå€ãã®äººã«ãšã£ãŠã¯ããã§ãã
ééã£ã人ã ãç§ãã¡ã®ã³ãã¥ããã£ã«åå ããããšã誰ãæãã§ããŸããïŒ
ããã¯è¶
å²æ
¢ãªã²ãŒãããŒãã³ã°ã§ãã ãŸãã tryhard
ããŒã«ã¯ã try
ãä»æ¥ã®Goã³ãŒãããŒã¹ã®å€ãã«çŽæ¥é©çšã§ããããšãæããã«ããŸããã ããã¯ãæšæºã©ã€ãã©ãªã®ãšã©ãŒåŠçã³ãŒãã®70ïŒ
ã«çŽæ¥é©çšã§ããŸãã ã³ãŒãã®å€æŽïŒ defer
ã䜿çšãããšã©ãŒè£
食ã®äœ¿çšãªã©ïŒã«ããããã¹ãŠã®Goã³ãŒãã®ãšã©ãŒåŠçã®80ïŒ
以äžã«é©çšã§ãããšæããŸãã
åæããŸãããç§ã¯ããã§ããŒã¯ãèžã¿è¶ããŠããŸãã è¬çœªããŸãã
ãã®è°è«ã®ããã«ç§ãã¡ã®äœäººãã¯éŠèŒªã®äžã§ç±ããªã£ãŠãããšæããŸã
茪ã«ãªã£ãŠåã£ãŠããŸãã
7/7/19ã§ãããã«Å trbaã®[email protected]ã¯æžããŸããïŒ
@lootchããã人ãäžèª å®ãšåŒã¶ã®ã¯æ¬åœã«éçç£çã ãç§ã¯
ããªãããã®ããã«ããŒã¯ããã¹ããŒãã¡ã³ãããããã§ããããã«ããããããã§ã¯ãªãããšãããªã確信ããŠããŸã
é©æ£ãç§ãã¡ã¯ããã°ã©ããŒãšããŠç¹°ãè¿ããã¿ãŒã³ãé€å€ããŸããããã¯çµ¶å¯Ÿã§ã
NSãç¹°ãè¿ãã®å€ãã³ãŒãã¯èªã¿åããé ãããã®ã§ããããã©ã®ããã«ãªã£ãŠããã®ãããããŸãã
ã©ã¡ããäžèª å®ããããã«å¯Ÿããããªãã®åè«ã¯åºæ¬çã«ã人ã«æ¥ãªãããããã¯ãã®ãããªãã®ã§ã¯ãããŸãã
倧ããããšãããŸããå€ãã®äººã«ãšã£ãŠã¯ããã§ããééã£ã人ã ãç§ãã¡ã®ã³ãã¥ããã£ã«åå ããããšã誰ãæãã§ããŸããïŒ
ããã¯è¶ å²æ ¢ãªã²ãŒãããŒãã³ã°ã§ãã ãŸãã
tryhard
ããŒã«ã¯ãããæããã«ããŸãã
try
ã¯ãä»æ¥ã®Goã³ãŒãããŒã¹ã®å€ãã«çŽæ¥é©çšã§ããŸãã ããã¯ããããšãã§ããŸã
æšæºã©ã€ãã©ãªã®ãšã©ãŒåŠçã³ãŒãã®70ïŒ ã«çŽæ¥é©çšãããŸãã ãš
ã³ãŒãã®å€æŽïŒdefer
ãªã©ã䜿çšãããšã©ãŒè£ 食ã䜿çšããããïŒãç§ã¯ä¿¡ããŠããŸã
ããã¯ããã¹ãŠã®Goã³ãŒãã®ãšã©ãŒåŠçã®80ïŒ ä»¥äžã«é©çšã§ããŸãã-
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ããã
https://github.com/golang/go/issues/32825#issuecomment -508971768
-
ã«ã·ãªãã¬
2 Piet Retief St
ã±ã¹ãã«ïŒæ±éšèªç±å·ïŒ
9860åã¢ããªã«
PhãïŒ+27 58 653 1433
ã»ã«ïŒ+27 83 251 5824
FAXïŒ+27 58 653 1435
@lootchèªå·±æèã®å°éå ·ïŒ è°è«ã茪ã«ãªã£ãŠè¡ãã®ãèŠãããšã®æ¬²æ±äžæºãç解ããããšãã§ããŸãã
ç§ãåãããã«èŠãŠãå察åŽã«ããŸãã
ãããããåæ¹ã¯ãäºããç解ã§ããŠããªãã ãã§ãã ãtryãã®äœ¿ãæ¹ãšããç§ã®ããã°æçš¿ãèªãã ããšããããŸã
7/7/19ã§ãããã«Å trbaã®[email protected]ã¯æžããŸããïŒ
[...]
ãããããåæ¹ãå察åŽãç解ã§ããŠããªãã ãã§ãã ãããŸãã
How touseãšããç§ã®ããã°æçš¿ãèªãã§ãã ãã'è©Šã'ïŒ ç§ãããããšãããšãã
'try'ã®äœ¿çšãå®éã«ã©ã®ããã«èŠãããã瀺ããæ»åšããããã«æåãå°œãããŸã
åãããªãïŒç§ã¯ããªãã£ãããšãåçœããŸããç§ã¯ç§ã決ããŠããå¿ èŠããªãããšãç±å¿ã«æãã§ããŸã:-)
ã¹ããã¯ãã³ãæèµ·ãããšæãåŽé¢ãæ€èšããŸãããïŒ
ãã©ã€ã®å©ç¹ã衚瀺ããã圌ã¯æãããäžè
¹ãæ±ããŸã
æããã«ãããŸããïŒ ç§ã¯åœŒã«åæããã®ã§ã¯ãªãããšæããŠããŸãã
ããªãã®ããã°ãåãæ¬ ç¹ã«èŠãããããããªãããšã
ããã§ãªãå Žåã¯ãç§ã«æããŠãã ãããè¯ãèªã¿ç©ã«ã¯ç¹å¥ãªå ŽæããããŸã
ç§ã®äººçã§:-)
ã«ã·ãªã
@lootchç§ã¯ããtryãã®ã§ããã ãå€ãã®åŽé¢ãïŒã€ãŸããé©çšãããå Žåãšé©çšãããªãå Žåã®äž¡æ¹ã§ïŒçãã³ãŒãã§è¡šç€ºãã
ããã¯ãé¢é£ããRedditãã£ã¹ã«ãã·ã§ã³ã§æãè³æãããã³ã¡ã³ãã§ããïŒ
ããã¯ãåãã®ãªãæ¶ç©ºã®æçšãªäŸã§ãã äŒè©±ã«å»ºèšçãªãã®ãè¿œå ããŠãããŠããããšããããã¯åã«ãã²ã©ããã ãã§ã¯ãããŸããã
@lootchç§ã¯ããtryãã®ã§ããã ãå€ãã®åŽé¢ãïŒã€ãŸããé©çšãããå Žåãšé©çšãããªãå Žåã®äž¡æ¹ã§ïŒçãã³ãŒãã§è¡šç€ºãã
ããã¯ãé¢é£ããRedditãã£ã¹ã«ãã·ã§ã³ã§æãè³æãããã³ã¡ã³ãã§ããïŒ
ããã¯ãåãã®ãªãæ¶ç©ºã®æçšãªäŸã§ãã äŒè©±ã«å»ºèšçãªãã®ãè¿œå ããŠãããŠããããšããããã¯åã«ãã²ã©ããã ãã§ã¯ãããŸããã
åŒæ°ãšããŠãã¡ã€ã«ãã¹ãæã€é¢æ°ïŒ ããã ãã§ããã®ã³ãŒããç§ã®ã¬ãã¥ãŒã«åæ Œããªãçç±ã«ãªããŸãã äžéšã®ãã£ãŒã«ããæ¬ èœããŠããå Žåã¯ã©ããªããŸããïŒ å泚æããŸãããïŒ
@sirkonãã¡ãããé·ãããªãããã«ãäŸã¯åçŽåãããŠããŸãã çºçããåé¡ãä¿®æ£ããããã«å¿ èŠãšãªãå€æŽã¯ããšã©ãŒåŠçã®æ £è¡ã«ã¯åœ±é¿ããŸããããããã§éèŠãªã®ã¯ããã ãã§ãã
çºçããåé¡ãä¿®æ£ããããã«å¿ èŠãšãªãå€æŽã¯ããšã©ãŒåŠçã®æ¹æ³ã«ã¯åœ±é¿ããŸããã
ããªããããèšã£ãã®ã§ïŒ
go
resp := Respondent{
Name: name,
Gender: try(parseField(s, &line, "gender")),
OS: try(parseField(s, &line, "os")),
Lang: try(parseField(s, &line, "lang")),
}
PSããªãã®ãªããžããªãèŠãŠã¿ãŸããã Goãããªãã®ã¿ã¹ã¯ã«ãšã£ãŠæªãããŒã«ã§ããããšãç¥ã£ãŠããŸããïŒ å®éã®Goã®ã¢ããªã±ãŒã·ã§ã³ãã©ã¯ãã£ã¹ã§ã¯ããã°ãæåã«è¡šç€ºãããã®ã¯éçºè ã§ã¯ãªãéçšãšã³ãžãã¢ã§ããããšãç解ããå¿ èŠããããŸãã é©åãªãšã©ãŒã¡ãã»ãŒãžã¯ãåé¡ãèªåã§è§£æ±ºããã®ã«åœ¹ç«ã€å ŽåããããŸãã
@sirkonããã
ããã«ãããšã©ãŒã¡ãã»ãŒãžãäžååã«ãªãããšããåç¥ã§ããïŒ
ãããã¯ã¢ãã«ã«å®å šã«é©åã§ãã ãã©ãŒãããã«ã¯ããã¹ãŠã®ãã£ãŒã«ããé çªã«å«ãŸããŠããå¿ èŠããããŸãã ãšã©ãŒã¡ãã»ãŒãžã¯ãããéåžžã«æ確ã«äŒããŸãã
ã³ãŒãã®å質ã«ç°è°ãå±ãããã®ãªããããªãã¯ãããããªãã®å質åºæºã«æžãçŽããŠã¿ãŸãããïŒ ãã®å Žåã¯ã try
ã䜿çšããããã«ã³ãŒããæžãçŽãããã«æåãå°œãããŸãã
PSããªãã®ãªããžããªãèŠãŠã¿ãŸããã Goãããªãã®ã¿ã¹ã¯ã«ãšã£ãŠæªãããŒã«ã§ããããšãç¥ã£ãŠããŸããïŒ
ç§ã®ä»äºã®ããã«å¥ã®ãã®ãææ¡ããŸããïŒ ç§ã¯ããªãã®æ°ã䜿çšããŸããã ãšããã§ãããã¯ããªããªããããã¯ã§ãã
@faiface
ç§ã®ä»äºã®ããã«å¥ã®ãã®ãææ¡ããŸããïŒ ç§ã¯ããªãã®æ°ã䜿çšããŸããã ãšããã§ãããã¯ããªããªããããã¯ã§ãã
ãã³ïŒ C ++ïŒ
@sirkon
ãã³ïŒ C ++ïŒ
ããã«è¡ããŸãã Goã§è§£æ±ºããåã«ãäž¡æ¹ã䜿çšããŸããã ç§ã¯æ¯ãè¿ã£ãããšããããŸããã
@sirkon try
ã®å€§ããªæ¬ é¥ã®1ã€ã¯ããšã©ãŒè£
食ãæããšã©ãŸãããããšã§ãã ãã®å Žåã®ããã°ã©ããŒã¯try
å¯èœãªã¢ããªã±ãŒã·ã§ã³ã瀺ããŠããã®ã§ããã¡ãããšã©ãŒè£
食ã¯ããŸãè¡ãããŠããŸããã
ãŸãã圌ããåãçµãã ãããžã§ã¯ãã«åºã¥ããŠäººã ã®ä¿¡çšãå·ã€ããããšã¯å®å šã«ãããã¯ããå€ããŠãããæ±ããããŠããŸããã ããªãã¯éå»ã®ããã€ãã®ã³ã¡ã³ãã§ããªã倱瀌ã§ããããããŠç§ã¯ããªãã«å°ãªããšããããç¥ã£ãŠãããããã§ãã
@deanveloperã³ã¡ã³ãããããšãããããŸãïŒ
ãšããã§
ãã®å Žåã®ããã°ã©ããŒã¯ãtryã®å¯èœãªã¢ããªã±ãŒã·ã§ã³ã瀺ããŠããã®ã§ããã¡ããããšã©ãŒè£ 食ã¯ããŸãè¡ãããŠããŸããã
ç§ã®ããã°ãåç
§ããŠããå Žåãå®éã«ã¯ããªãå€ãã®ãšã©ãŒè£
食ãè¡ãããŠããŸããã @ sirkonãšãŸã£ããåãæ¹æ³ã§ã¯ãããŸããã try
ã䜿çšããããã°ã©ã ããã®ãšã©ãŒã¡ãã»ãŒãžã¯æ¬¡ã®ãšããã§ãã
parse respondnts.txt: open respondnts.txt: no such file or directory
parse respondents.txt: line 12: parse field gender: expected "gender:"
parse respondents.txt: line 9: expected empty line
parse respondents.txt: line 4: parse field lang: EOF
@faifaceç§ã®ééãããã£ãšå
·äœçã«ãã¹ãã ã£ãã try
ã¯ãåãé¢æ°å
ã«è€æ°ã®ãšã©ãŒã¡ãã»ãŒãžãå¿
èŠãªå Žåã®ãšã©ãŒè£
食ãæšå¥šããŸããã check/handle
ãã©ãããšãååä»ããã³ãã©ãŒãã®å察ææ¡ã§ãããè¡ãããšãå¯èœtry
ã䜿çšããŠããïŒã§åã¡ãã»ãŒãžã®åšãã«è£
食ãè¿œå ã§ãããšéåžžã«äŸ¿å©
ãã ããç¹å®ã®ã±ãŒã¹ã§ã¯ããã§ãã¯/åŠçã¯ããã»ã©åœ¹ã«ç«ã¡ãŸããã§ããã ãããã catch
ããã³try
ã«å¯Ÿããä»ã®å察ææ¡ã®ææ¡ãããã¢ã€ãã¢ã¯ãè¿œå ã®è£
食ãè¿œå ããããã«ãšã©ãŒãåŠçããããšãã§ããã§ãããã
@deanveloperããŠããµãé¢æ°ã¯ç¬èªã®ã³ã³ããã¹ããæäŸããããšãæåŸ ããããããã»ãšãã©ã®å Žåãé¢æ°å ã®ãã¹ãŠã®ãšã©ãŒã«åãè£ é£Ÿã䜿çšããå¿ èŠããããŸãã ãã ãã1ã€ã®é¢æ°ã§ç°ãªãè£ é£Ÿãè¡ãå¿ èŠãããå Žåã§ããtryã䜿çšãããšç°¡åãªè§£æ±ºçããããŸãã
..., err := functionThatCanFail(...)
try(errors.Wrapf(err, ...))
ãŸãã¯ã倧ããªé¢æ°ãè€æ°ã®å°ããªé¢æ°ã«åå²ããã ãã§ãã
ãã®æç¹ã§ç§ã®ç®ã§@faifaceã¯1ã ãã§äœ¿çšããå¿
èŠããããŸãif err != nil
ãç§ã¯ããã¯å¥œã¿ã®åé¡ã ãšæããŸãã
ãã ããå Žåã«ãã£ãŠã¯ïŒstruct-initializingã®å Žåã®ããã«ïŒãè€æ°ã®é¢æ°ã«åå²ããããšã¯ãå§ãã§ããŸããã ç§ã¯æšæž¬ããŸãããç§ã¯å°ãæ°ãŸããã«ãªã£ãŠããŸãã
ç§ã¯å®éã«ã¯try
ã«å察ããŠããããã§ã¯ãããŸããããç§ãããã»ã©å€§ããªæ¯æè
ã§ã¯ãããŸããã ç§ã¯ããã«å¥ã®ããè¯ã解決çããããšæããŸãã
@deanveloper
ãã ããå Žåã«ãã£ãŠã¯ïŒstruct-initializingã®å Žåã®ããã«ïŒãè€æ°ã®é¢æ°ã«åå²ããããšã¯ãå§ãã§ããŸããã
æ¬åœã§ãããå¿
èŠãªç¹å®ã®è£
食ã¯ãã¹ãŠparseField
ããã®ãã®ã§ãããããããããç°ãªãæ¹æ³ã§è£
食ããå¿
èŠããããŸããã
ç§ã¯ããã«å¥ã®ããè¯ã解決çããããšæããŸãã
ããã¯ããªãå¯èœã§ãïŒ ããè¯ã解決çãèŠã€ãã£ããã1åã§try
ãããããããŸã:)
ã»ãšãã©ã®å Žåããµãé¢æ°ã¯ç¬èªã®ã³ã³ããã¹ããæäŸããããšãæåŸ ããããããé¢æ°å ã®ãã¹ãŠã®ãšã©ãŒã«åãè£ é£Ÿã䜿çšããå¿ èŠããããŸãã
@faifaceç§ã¯ãã®å£°æã«åŒ·ãå察ããŸãã ãã¹ãŠã®é¢æ°ã¯ãåŒã³åºãã¹ã¿ãã¯äžã®å¥ã®é¢æ°ã®ãµãé¢æ°ã§ãã ããã¯ããšã©ãŒåŠçãããŒã§åã責任ãããããšãæå³ããŸãïŒã€ãŸããäžäœã¹ã³ãŒãã«ãšã©ãŒã³ã³ããã¹ããæäŸããŸãïŒã
2ã€ã®ããŒã¿ãã£ã³ã¯ã1ã€ã®ãã¡ã€ã«ã«è¿œå ããé¢æ°ãæ³åããŠã¿ãŠãã ããã 'could not write to file'ã¹ããŒãã¡ã³ãããããããŠè¿ãå Žåããããã®è¿œå ã®ã©ãã倱æããããã©ã®ããã«åºå¥ããŸããïŒ
ç§ãã¡ã¯çæ æ°ãªçãç©ã§ãã ç§ãã§ããã°äžåºŠã ãäœãããããã§ãã ã¯ããGoã§åéºãå§ãããšãããšã©ãŒåŠçã¯å°ãé¢åã ãšæããŸããã æ°å¹ŽåŸãç§ã®èŠçã¯180床ã«ãªããŸãããç·Žç¿ããŸããã Goã§ã®çŸåšã®ãšã©ãŒåŠçã¯ã責任ããããã°ã©ãã³ã°ãšåªããèšèšãä¿é²ãããšæããŸãã ç§èŠã§ã¯ããã®ã¢ãããŒãã匱äœåãããå¥ã®ã¡ã«ããºã ãè¿œå ããããšã¯å€§ããªå€±æã§ãã
@mklimukç§ã®ã³ã¡ã³ãã®éèŠãªéšåã¯ããã»ãšãã©ã®å Žåãã§ãã ããªããæäŸããäŸã¯ãããããif err != nil
ã«ãã£ãŠæãããåŠçãããŸãã äœåºŠãææãããŠããããã«ã try
ã¯ãã¹ãŠã®ç¶æ³ãåŠçããããã«èšèšãããŠããããã§ã¯ãªããæãäžè¬çãªç¶æ³ã ããåŠçããããã«èšèšãããŠããŸãã
æšæºã©ã€ãã©ãªã®ãã¹ãŠã®ãšã©ãŒåŠçã³ãŒãã®70ïŒ
ãããã«äœ¿çšã§ããtry
ãããåãããšããã¹ãŠã®ãšã©ãŒåŠçã³ãŒãã®59ïŒ
ã«ãåœãŠã¯ãŸãããã蚌æ ã¯ãããããããããšã瀺ããŠããŸããéçã
@faifaceã¯ã try
ãæ瀺çãªãšã©ãŒåŠçã眮ãæããããšãã§ãããšããäºå®ã¯ããããã¹ãã§ãããšããæå³ã§ã¯ãããŸããã ç§ã®å Žåãã³ã³ããã¹ããè¿œå ããã«ãšã©ãŒãè¿ãããšã¯ãæãäžè¬çãªç¶æ³ãã§ã¯ãããŸããã ããã¯å察ã§ã:)
ãã®ã¹ã¬ããã«è³æãã人ã ã¯ããã®æ°ããã¹ããŒãã¡ã³ãããGoã³ãŒãã®åé·æ§ãæžããããã«ãå ã®Goãã¶ã€ã³ã®èåŸã«ãããã¹ãŠã®åªåïŒåçŽããæå¿«ããªã©ïŒãå°ç¡ãã«ããããšãæžå¿µããŠããŸãã
ãã¡ããã§ããã try
ã¯ã³ã³ããã¹ããªãã§ãšã©ãŒãè¿ãããã®ãã®ã§ã¯ãªãããšãç解ããŠãã ããã å®éãã³ã³ããã¹ããè¿œå ããæãäžè¬çãªã±ãŒã¹ïŒé¢æ°ããšã«1ã€ã®ã³ã³ããã¹ãïŒã¯ã try
ã«ãã£ãŠå€§å¹
ã«ç°¡ç¥åãããŠããŸãã
func doSomething() (err error) {
defer fmt.HandleErrorf(&err, "doing something")
x := try(oneThing())
try(anotherThing(x))
// ...
}
ã»ãšãã©ã®å Žåã oneThing()
ãšanotherThing()
ã¯ããèªäœã§ååãªã³ã³ããã¹ããè¿ããããåçŽãª"doing something: ..."
ã©ããããã ãã§ååã§ãã
ã¡ãªã¿ã«ãè£
食ãè¡ã人ã«ã¯ããã€ãã®èŠåã䜿çšã§ãããšæããŸãã stdlibã§ã¯ã copy: x to y
ãªã©ã®äžéšã®é¢æ°ããããå®è¡ããŸããåŒæ°ããããããç§ã¯å人çã«è£
食ãåŒã³åºãå
ã«ä»»ããŠããŸãã
ããšãã°ã Copy()
ãããå Žåã return errors.Wrap(err, "writing")
ãããªããšãè¡ãã Copy()
ã䜿çšããçºä¿¡è
ã¯errors.Wrapf(err, "copying from %v to %v", src, dst)
ãªã©ã§ã©ããããŸãã
ããã2ã€ã¯ããŸãæ··ããåãããæååãéè€ããããšããããŸãããstdlibã¹ã¿ã€ã«ã¯æ £çšçã§ãããšèšãã®ãæåã§ããïŒ ããããç§ã¯ããããã¹ãŠããã®ããã«æ¯ãèã£ãããšãèŠããŠããŸããã @faifaceã®äŸã§ååã ãšæãã®ã¯ããã ãã ãšæããŸãã ãã¶ãç§ã¯åé¡ãé転ãããŠããŸããããç§ã«ãšã£ãŠã¯ãç¹ã«ãäžãäžã«åããŠãã³ã³ããã¹ãæ å ±ãçç¥ããå Žåã«åããŠãããå°ãªãããšãè¡ãã決å®ãçºä¿¡è ã«ä»»ããæ¹ãã¯ãªãŒã³ã ãšæããŠããŸãã
è°è«ãããã®ã§ãç§ã¯å人çã«è£ 食ãçºä¿¡è ã«ä»»ããŠããŸããã
ã¯ãã ããšãã°ãHTTPãªã¯ãšã¹ãããJSONæ¬æã解æããããããŒãªã©ããã§ãã¯ããé¢æ°ã«ã€ããŠèããŠã¿ãŸãã æ§æçã«ç¡å¹ãªJSONãæäŸãããå Žåããã®è²¬ä»»ã¯ãå®éã«ã§ããããšã¯ãã¹ãŠããšã©ãŒãå ±åããããšã§ãã _caller_ã¯ãAPIã®ã©ã®éšåãåŒã³åºãããããšããŠããããèªèããŠããããã§ãŒã³ã«æž¡ããHTTPãšã©ãŒãçºè¡ããåã«ãããã«å¿ããŠãšã©ãŒãè£ é£Ÿããå¿ èŠããããŸãã
é¢æ°ãè€æ°ã®å Žæã§äœ¿çšãããå¯èœæ§ã®ããæ±çšã³ãŒããæ¬åœã«é€å€ããŠããå Žåããšã©ãŒãè£ é£Ÿããããã«å¿ èŠãªæ å ±ãé¢æ°ã«å«ãŸããŠããŸããã éã«ããããããã¹ãŠã®ã³ã³ããã¹ããæã£ãŠããå Žåããããã¯ããããã¹ã¿ã³ãã¢ãã³é¢æ°ãšããŠæå³ã®ããé¢æ°ã§ã¯ãªããã³ãŒããåå²ããŠå®éãããæŽçãããããã«èŠããããã®é¢æ°ãäœæããŠããã ãã§ãã
@lparããã®å ·äœäŸãæããŠãã ããã
ç§ã¯ãã§ã«å ·äœçãªäŸãæããŸãããïŒ parseJSONé¢æ°ãå®éã«ã³ã³ããã¹ããèªèããŠããŠãæ¬äœã解æããAPIãšã³ããã€ã³ããšã¢ã¯ãã£ããã£ãããŒãè£ é£Ÿã§ãããã©ãããæ€èšããŠãã ããã ããã¯ããã®ãšã³ããã€ã³ãã«åºæã§ãããããšã©ãŒãã©ããããããã«äœ¿çšã§ããããã«æ å ±ãæž¡ããŠããããšã瀺ããŠããŸãã
@lparããããŸãããããã¯ã if err != nil
ãåŒãç¶ã䜿çšããããã1ã€ã®äŸã§ãã ãŸãã¯ãããžãã¯ãè€æ°ã®é¢æ°ã«åå²ããŸãã
ãã ãã try
ãé©åã§ãªãäŸã瀺ãããšã¯ã try
ã«å¯Ÿããè°è«ã§ã¯ãªãããšãç解ããŠãã ããã try
ã¯ããã¹ãŠã®ãšã©ãŒåŠçã眮ãæããããšãæå³ãããã®ã§ã¯ãªããæãäžè¬çãªã±ãŒã¹ã ãã眮ãæãããã®ã§ãã
@ abejide001 try
ææ¡ã¯ãä»ã®å€ãã®èšèªã®åŸæ¥ã®ãtry / catchãã§ã¯ãªããRustã®try!
ãã¯ãã«ãã䌌ãŠããŸãã ããããŒã ãªã®ã«ç¬
ãã£ãš-ééã£ãåé¡ã«æçš¿ãããŸããã https://github.com/golang/go/issues/32437#issuecomment-509024693ã«ç§»åããŸããã
ç§ã¯æè¿ã try
ãã¯ããæã€å±éºãªãã¹ãæ©èœãšã®æèŠã®çžéã«åºã¥ããïŒ32968ã®ææ¡ãæçš¿ããŸããã é倧ãªæ¬ é¥ããªãããšãé¡ã£ãŠããŸãããèè
ãšããŠç§ã¯ãããèŠãã®ã«ãµãããã人ç©ã§ã¯ãããŸããã ã§ãããããã£ã³ãã_è©Šããªãã§ãã ãã_ïŒããªã:)ã«èŠãŠãè©äŸ¡ããŠãã³ã¡ã³ãããŠããããããšæããŸãã
æç²ïŒ
check
ãã¯ãã¯ã¯ã³ã©ã€ããŒã§ã¯ãããŸããïŒããã¯å€ãã®å埩çãªå Žæã§æã圹ç«ã¡ãŸãããã¯çµã¿èŸŒã¿ã§ããã1è¡ã«ãã¹ãããã try
ãããã¯ããã«å€ãã®ãããŒãå¯èœã«ããå
éšã®ã³ãŒãã®åœ¢ç¶ã«ã€ããŠã¯äºæããŠããŸããã ããã¯è£žã®ãªã¿ãŒã³ã奚å±ããŸããã
// built-in 'check' macro signature:
func check(Condition bool) {}
check(err != nil) // explicit catch: label.
{
ucred, err := getUserCredentials(user)
remote, err := connectToApi(remoteUri)
err, session, usertoken := remote.Auth(user, ucred)
udata, err := session.getCalendar(usertoken)
catch: // sad path
ucred.Clear() // cleanup passwords
remote.Close() // do not leak sockets
return nil, 0, err // dress before leaving
}
// happy path
// implicit catch: label is above last statement
check(x < 4)
{
x, y = transformA(x, z)
y, z = transformB(x, y)
x, y = transformC(y, z)
break // if x was < 4 after any of above
}
ãã ãã
try
ãé©åã§ãªãäŸã瀺ãããšã¯ãtry
ã«å¯Ÿããè°è«ã§ã¯ãªãããšãç解ããŠãã ãããtry
ã¯ããã¹ãŠã®ãšã©ãŒåŠçã眮ãæããããšãæå³ãããã®ã§ã¯ãªããæãäžè¬çãªã±ãŒã¹ã ãã眮ãæãããã®ã§ãã
ãããŠãç§ã以åã«æçš¿ããçµ±èšã«ãããšããããã¯ç§ã®ã³ãŒãã§æãäžè¬çãªã±ãŒã¹ã§ã¯ãããŸããã ç§ã®ã³ãŒãã§æãäžè¬çãªã±ãŒã¹ã¯ãæ»ãåã«ã©ããããããšã©ãŒã§ãã ãããã£ãŠã try
ã¯ããšã©ãŒãè¿ããã1æ¡ã®å²åïŒ*ïŒã«ã®ã¿é©åã§ãããããããè¯ããã®ãå¿
èŠã ãšæããŸãã
ïŒ*ïŒå®éã裞ã®err
ãªã¿ãŒã³ã€ã³ã¹ã¿ã³ã¹ã¯ãä¿®æ£ããå¿
èŠã®ãããšã©ãŒã§ããå¯èœæ§ãé«ããšæãåŸåããããŸãã
å®å šã«åæããŸãããiferrïŒ= nilãã¯ãã®ãŸãŸã«ããŠãããŸãã
@ abejide001
try
ææ¡ã¯ãä»ã®å€ãã®èšèªã®åŸæ¥ã®ãtry / catchãã§ã¯ãªããRustã®try!
ãã¯ãã«ãã䌌ãŠããŸãã ããããŒã ãªã®ã«ç¬
ããã ããç§ã«ãšã£ãŠã®æžå¿µäºé
ã§ããGoã¯ãã§ã«æ°åè
ã«ãšã£ãŠå¥åŠãªèšèªã§ãããããŠä»ã try
ãç¹æ³šã®ããžãã¯ãæã£ãŠããçç±ã説æããå¿
èŠããããŸãã FWIWããRust did itããšèšã£ãŠããèšèªã«äœããè¿œå ããããšãæ£åœåããæ£åœãªçç±ã§ã¯ãªããšæããŸããããã¯ããŸãç¥ãããŠããªãã ãã§ãã
@æ©èœãæ£åœåããããã«èšã£ãŠããã®ã§ã¯ãªããæ©èœãäœãããã®ããæ確ã«ããããã«èšã£ãŠããã ãã§ãã ç§ã¯try
ææ¡ã®çã£æäžã§ãã
ããã倧ããªéããçãããã§ã¯ãããŸãããããã¯ãã®ä»£ããã«ããŒã¯ãŒãã䜿çšããå Žåã§ããSwiftã®æ©èœã§ããããŸãã
æ£ç¢ºã«äœãéæããããšããŠããã®ãã«ã€ããŠã¯ãå€å°ã®æ··ä¹±ãããããã§ãã ç§èŠãåé¡ã¯ãšã©ãŒããã§ãã¯ããè€æ°ã®ifãããã¯ãæžã蟌ãã§ããªãããšã§ãã ããªãã¯ããããäžåºŠæžãã°å®äºã§ãã åé¡ã¯ããããã®ãããã¯ãè€æ°ããã³ãŒããèªã¿åãããšã§ãã ç§ãã¡ã¯æžããããèªãããšãããããããŸãã ãããŠããããã®ãããã¯ã¯å®éã®ã³ãŒããšçµ¡ã¿åã£ãŠãããããå®éã®ã³ãŒããé£èªåããŸãã ããã«æªãããšã«ãå€ãã®å Žåããããã¯ã»ãŒãŸã£ããåãã§ãããifãããã¯å ã®ã©ããã«ããããªæååã®éããããããŸããã
ç§ã¯å人çã«å€ããã§ãã¯ã奜ã¿ãŸãã-ãã©ãããåŠçããŸãããããã¯å°ãªããšããšã©ãŒãšããžãã¹ãã¹ãåé¢ããã®ã«è¯ãä»äºãããŸãã ãããŠãçŸåšã芪ãšã©ãŒãšåãããšãç¹°ãè¿ãå¯èœæ§ãé«ãååŒã³åºããšã¯å¯Ÿç §çã«ãæçµçã«åäžã®é¢æ°ã¹ã³ãŒãã³ã³ããã¹ããæã€ããšãã§ããå¯èœæ§ããããŸãã
@icholyã¯æžããïŒ
ããåçåããããšã©ãŒåŠçãèŠæ±ããå§åçãªã³ãã¥ããã£ãã£ãŒãããã¯ããããŸããïŒå¹Žæ¬¡èª¿æ»ããïŒã GoããŒã ã¯çŸåšãã®åé¡ã«åãçµãã§ããŸãã
ããã§èª¿æ»ã調ã¹ãŸããïŒ https ïŒ
ã©ããã質åã¯ããä»æ¥Goã䜿çšããŠå人çã«çŽé¢ããæ倧ã®èª²é¡ã¯äœã§ããïŒãã§ããã èããããçãã¯ããšã©ãŒåŠçãã§ãã
ãã®è³ªåãšåçã«åºã¥ããŠãããç°¡åãªæ§æãå¿ èŠã§ãããšã©ã®ããã«æšæž¬ãããã®ããçå£ã«çåã«æããŸãã ããšã©ãŒåŠçãã«ãçãããããããŸãããã決ããŠå¥ã®æ§æãèŠããã£ãããã§ã¯ãããŸããã 調æ»ã§ãã®ãªãã·ã§ã³ããã§ãã¯ããå Žåããšã©ãŒãã©ããããããã¹ã¿ãã¯ãã¬ãŒã¹ãæäŸãããããããšãèš±å¯ããã»ãããããšæããŸããã
ç§ã®ææ¡ã¯ããã¹ãŠã®ãšã©ãŒåŠçã®ææ¡ïŒäºå®äžã @ miekgãææ¡ããŠãããã®ïŒãã
ç§ã¯tryã®ææ¡ãè¡ã£ãã°ããã§ãããäœãã足ããªãå Žåãé€ããŠããå®åæã®ifã¹ããŒãã¡ã³ããåé€ãã[...}ã以å€ã«ãææ¡ãããŠããçç±ãèšãã®ãæ ã£ãŠããŸãã ããããã¹ããŒãã¡ã³ããå¿ èŠãªå Žåã«ãããã®å®åæãåé€ããçç±ã«ã€ããŠã¯èšåãããŠããŸããã
ç§ã¯ééããªãäžèšã«åæããŸãã æ°ãããšã©ãŒå€ã®å€æŽããGoã«é¢ãããšã©ãŒåŠçã®èŠæ ã«åœ¹ç«ã€ãã©ãããèŠãŠã¿ãŸãããã 次ã«ãããç°¡åãªæ§æãå¿ èŠãã©ããã確èªã§ããŸãã
ããã®äººã
ã¯ãè¿ããããã¹ãŠã®ãšã©ãŒã«æ³šéãä»ããå¿
èŠããããšæããŠããããã try
å察ããŠããŸãã çŸå®ã«ã¯ãçŸåšã®ã³ãŒãã³ãŒãã¹ïŒæšæºã©ã€ãã©ãªãå«ãïŒã§ã¯ããšã©ãŒãã§ãã¯ã®å²åãé«ãã泚éãªãã®ãšã©ãŒãè¿ããã try
æ©æµãåããŸãã ã³ãŒããã©ãããã¹ããã®ããªãã®ä¿¡å¿µã¯ãã³ãŒããéãšã¯äœã®é¢ä¿ããããŸããã ç§ã«ããªãã®æ矩ãæããŸãªãã§ãã ããã
@icholyãšã©ãŒãç¡èŠããããšã¯ã
ç§ã®ææ¡ã¯ããã¹ãŠã®ãšã©ãŒåŠçã®ææ¡ïŒäºå®äžã @ miekgãææ¡ããŠãããã®ïŒãã
ç§ã¯ããã«åŒ·ãåæããŸãã Goãšã©ãŒåŠçã®æ¹åãã©ã®æ©èœããµããŒããã¹ããã«ã€ããŠãå€ãã®åºæ¬çãªæèŠã®çžéãèŠãããŸãã 人ã ãèšåããæ©èœã®ããŸããŸãªãã£ã³ã¯ã¯ãã¹ãŠããã®ååãšæ§æãããã£ãŠãã€ã¯ã·ã§ãããåŒãèµ·ãããŠãããããè°è«ã¯ã©ãã«ãè¡ããŸããã
ææ¡ãããŠããæ°ãããšã©ãŒåŠçæ©èœã«å¯ŸããŠãããåºç¯ãªGoã³ãã¥ããã£ãå®éã«äœãæãã§ããã®ãã詳ããç¥ããããšæããŸãã
ããŸããŸãªæ©èœã人ã ãææ¡ããŠãããšã©ãŒåŠçæ©èœã®äžéšããªã¹ããã調æ»ããŸãšããŸããã ç§ã¯ææ¡ãããååãæ§æã泚ææ·±ã_çç¥_ããŸããããã¡ãããç§èªèº«ã®æèŠãæ¯æããã®ã§ã¯ãªãã調æ»ãäžç«ã«ããããšããŸããã
åå ãåžæããå Žåã¯ãå ±æçšã«ççž®ããããªã³ã¯ã次ã«ç€ºããŸãã
https://forms.gle/gaCBgxKRE4RMCz7c7
åå ãããã¹ãŠã®äººãèŠçŽçµæãèŠãããšãã§ããã¯ãã§ãã ããããã°ã人ã ãå®éã«äœãæãã§ããã®ããããããã£ãããtryã®ææ¡ãããããæäŸãããã©ããã«ã€ããŠã€ã³ããªãžã§ã³ããªè°è«ãè¡ãããšãã§ããã§ãããã ïŒãããŠãæ§æã«ã€ããŠã®è°è«ã«é²ããããããŸãããïŒ
@ lane-c-wagner泚éãªãã®ãšã©ãŒãè¿ãããšã¯ããŸã£ããè¿ããªãããšãšåãã ãšèšã£ãŠããã®ã§ããïŒ ç·šéïŒåã®ã³ã¡ã³ããä¿®æ£
@icholyããç§ã¯èª€è§£ããŸããã ããªããã裞ããšèšã£ããšããç§ã¯ããªããã_ãããšã©ãŒãç¡èŠããããšãæå³ããŠãããšæããŸããã
ãã®ææ¡ã¯ããããªãè¡åãæå¹ãªè¡åã§ãã£ãŠã¯ãªããªããšäž»åŒµããŠããŸãã ãã®å€æŽã¯ãã³ãŒããèªããããèšèªã®ãã¹ãŠã®ãŠãŒã¶ãŒã«åœ±é¿ããŸãã ãã®ãããæ倧ã®ããŒãã«ãç¹å®ãã調æ»ã§ã¯ããã®ããŒãã«ãä¿®æ£ãã䟡å€ããããã©ãããã³ãã¥ããã£ã«å°ããå¿ èŠããããŸãã ãã®ææ¡ã¯ããã®ãããªè³ªåã®æãè¿ãè©äŸ¡ã§ãã
ã誰ããèªç±ã«ç¡èŠã§ããããšèšãã®ã¯ãããŠãã ããtry
ã ä»ã®äººãæžããã³ãŒããèªã¿ãŸãã
@ tv42ããªããããã§ç§ã«è©±ããããŠ
ããªãã調æ»ãã@griesemerã¯éåžžã«äžè¶³ããŠããŸããã ç§ã¯ãšã©ãŒåŠçã«æ祚ããŸããããç§ãæå³ããåé¡ã¯ãåé·æ§ã§ã¯ãªããå®å šãªåã®å®å šæ§ã§ããã ãšã©ãŒã«ã€ããŠã®ã¿å¥ã®ãã®ãäœæããæ¹ãããã§ãããã
ãããŠãç§ã¯ãŸã åèšåãå¿ èŠã§ãã
ããã¯ããšã©ãŒïŒ= nilã®å Žåã«gofmtãçŸåšãã©ãŒãããããæ¹æ³ã«é¢ããææ¡ã§ãã
ïŒããã¯tryïŒïŒææ¡ã«ã€ããŠã®æèŠã§ã¯ãããŸãããïŒ
ifã¹ããŒãã¡ã³ãã次ã®ãããª1è¡ã®énilãšã©ãŒå€ãè¿ãå Žåã
err := myFunc()
if err != nil {
    return err
}
gofmtã¯ãç¬èªã®ifã¹ããŒãã¡ã³ãã«ãŒã«ãç·©åããŠã次ã®ããã«1è¡ã§ãã©ãŒãããã§ããŸãã
err := myFunc()
if err != nil { return err }
3è¡ã®ãšã©ãŒåŠçã³ãŒãã¯1è¡ã«ãªããŸãã æŽçæŽé ã ããã°ã©ã ãããŒã远跡ãããããªããŸãã
ããã§ã©ãã«ç·ãåŒããïŒããããèªããïŒã«ã€ããŠäœããã®å€æãå¿
èŠã«ãªããŸã
gofmtã«ãŒã«ã®å€æŽã 次ã®ãããªè£
食ãå«ãŸããŠããå ŽåããããŸãã
err := myFunc()
if err != nil { return fmt.Errorf("myFunc() blew up! %v", err }
ãã ããè€éãªè€æ°è¡ã®ãšã©ãŒåŠçã¯ãã®ãŸãŸã«ããŠããå¿ èŠããããŸããè€æ°è¡ã§æ確ãã€æ瀺çã§ãã
_try_ããããŒã¶ã«ã¯åãäžããããŸããïŒ https ïŒ
ãžã§ããªãã¯ã¯èª°ã§ããïŒ
ããã¯ããšã©ãŒïŒ= nilã®å Žåã«gofmtãçŸåšãã©ãŒãããããæ¹æ³ã«é¢ããææ¡ã§ãã
ç§ã¯ãããè©ŠããŸããããã³ãŒãã¯è€æ°è¡ã®ãã©ãŒãããããããã®æ¹æ³ã§ã¯ããã«èªã¿ã«ãããªã£ãŠããŸãã tryã¯ãã®è§£æ±ºçãããã¯ããã«åªããŠããŸãã
ããã§ã®IMOã®åé¡ã¯ããšã©ãŒåŠçã®å®è¡æ¹æ³ã§ã¯ãªããç¡èŠããããã©ããã§ãã if err != nil
æ§æããã®ãŸãŸã«ããŠã Error
æ»ãå€ã®ç¡ç¥ãå¶éããããšã¯ã§ããŸãããïŒ ã¬ã¬ã·ãŒã³ãŒãã®é倧床ãªãã·ã§ã³ä»ãã®ã³ã³ãã€ã©èŠå/ãšã©ãŒã«ããããã«ã
ããã§ã®IMOã®åé¡ã¯ããšã©ãŒåŠçã®å®è¡æ¹æ³ã§ã¯ãªããç¡èŠããããã©ããã§ãã
if err != nil
æ§æããã®ãŸãŸã«ããŠãError
æ»ãå€ã®ç¡ç¥ãå¶éããããšã¯ã§ããŸãããïŒ ã¬ã¬ã·ãŒã³ãŒãã®é倧床ãªãã·ã§ã³ä»ãã®ã³ã³ãã€ã©èŠå/ãšã©ãŒã«ããããã«ã
å€ãã®äººã¯ãç¡èŠããããšã©ãŒã衚瀺ãããªã³ã¿ãŒãæãã§ããŸãã
ãããé£ãããšã©ãŒã«ããããšæããŸããããã§ã«æžãããŠãã倧éã®ã¬ã¬ã·ãŒãèŠããšããªã³ã¿ãŒãå ¬å¹³ã§ãã
https://github.com/kisielk/errcheckã¯ãæªåŠçã®ãšã©ãŒã«ã€ããŠæããŠããã䟡å€ããããšæããŸã@plyhun @sorenvonsarvort
ïŒ32437ã®è°è«ã«èŠãããããã«ããã®ææ¡ã¯ä»ã®ãšããäºå®äžåãå ¥ããããŠããŸãã ééã åé¡ãå床çºçããå Žåã¯ãæ°ããææ¡ãéãããšãã§ããŸãã
å€ãã®ææ¡ãããŸãé©åããŠããªããšæããçç±ã®1ã€ã¯ãå®éã«ã¯2ã€ã®ç°ãªãåé¡ã«åæã«å¯ŸåŠããããšããŠããããã ãšæãå§ããŠããŸãã 確ãã«ãã»ãŒãã¹ãŠã®é¢æ°åŒã³åºãã®åŸã«err != nil
ãããã¯ããããšãã³ãŒãã®æµããå¥åŠãªæ¹æ³ã§åå²ãããå¯èœæ§ããããŸããã確ãã«å©ç¹ã¯ãããŸãããããã¯ååã«ãããªããšæããŸããåé¡ã ãã1ã€ã®åé¡ã¯ããšã©ãŒãçºçãããã©ããã«é¢ä¿ãªããè€æ°ã®è¿åãåŠçããã®ãéåžžã«äžæ Œå¥œã«ãªãå¯èœæ§ãããããšã§ãã
è€æ°ã®returné¢æ°ã¯ã2ã€ã®éã®ããããªéãã«ãããããããåäžã®returné¢æ°ãšã¯éåžžã«ç°ãªã£ãæããããŸãã ããã¯ãè€æ°ã®åŒæ°ãåãé¢æ°ã®åŒã³åºãã«è¿œå ã®å¶éããã£ãå Žåã®ãããªãã®ã§ãã æã
察åŠããã®ã¯éåžžã«å¥åŠã«æããŸãã è€æ°ã®æ»ãå€ãæã€é¢æ°ãåŒã³åºãå Žåãã»ãšãã©ã®å Žåãç¬èªã®è¡ã§åŒã³åºãå¿
èŠãããã :=
ãšçµã¿åããããšãä»ã®å Žæã§èª¬æãããŠããããŸããŸãªå€æ°ã·ã£ããŠã€ã³ã°ã®åé¡ã®äž»ãªåå ãšãªãããšããããããŸãã ã ã¡ãœããåŒã³åºãããããã«ãã§ãŒã³ããããšã¯ã§ããŸããããŸãããããããæ§é äœãã£ãŒã«ããšåãè¡ã®æ°ããå€æ°ã«çŽæ¥å²ãåœãŠãããšãã§ããŸããã
ããããªãã å€åããã¯ç§ã ãã§ãã ããããç§ã¯Goã10幎è¿ã䜿çšããŠãããè€æ°ã®æ»ãå€ãæã€é¢æ°ãåŒã³åºãããšã¯ãç§ã«ãšã£ãŠã¯å°ãåä»ãªããšããããŸãã
ããããšãããããŸããïŒ
if err != nil
ã«ã¯å®éã«1ã€ã®åé¡ãããã err
ã®ã¹ã³ãŒãã¯æ¬æ¥ãããé·ãif
ãã€ã³ã©ã€ã³åãããšåé¡ã¯è§£æ±ºããŸããããã¹ãŠã®ã±ãŒã¹ãã€ã³ã©ã€ã³åã§ããããã§ã¯ãããŸããã
if err := foo(); err != nil {
if _, err := bar(); err != nil {
md5-6a135eb952fe7b24b3389cb16d3244a1
a, err := bar()
if err != nil {
md5-d52f811d3e31bb368bd8045cfb2e93b4
var err error
baz.A, err = bar()
if err != nil {
if err != nil {}
ãããã¯ãå®äºããåŸã¯ã err
å€æ°ãé¢æ°ã¹ã³ãŒãã«ååšããªãããã«ããå¿
èŠããããŸãã ããã¯ãåé¡ãä¿®æ£ããããã®try()
ææ¡ããæ§ç¯ãããç§ã®ææ¡ã§ãhttps://github.com/golang/go/issues/33161ã 建èšçãªãã£ãŒãããã¯ã欲ããã§ãã
if errïŒ= nil {}ãããã¯ãå®äºããåŸã¯ãerrå€æ°ãé¢æ°ã¹ã³ãŒãã«ååšãããªãã§ãã ããã
ifãããã¯ãå®äºããåŸããªããããååšããªãã¯ããªã®ã§ããïŒ ã³ã³ãã€ã©ãŒã¯ãããæé©åã§ãïŒå¿ èŠãšæãããå ŽåïŒãerrïŒ= stmtïŒïŒ\ nif errïŒ= nil {}ãããã¯ãå®äºãããšããããã¯ã»ãšãã©åžžã«äžç·ã«ãªãããã粟ç¥çãªè² è·ã¯ãããŸããã
ç§ã¯ãŸã ããªãã®ææ¡ã詳现ã«æ€èšããŠããŸããïŒãã ãããããæžãåªåãããããšã«å¯Ÿãã称è³ã§ãïŒïŒã ãã ããäžèšã®ã³ã¡ã³ãã§ãæŠèª¬ããããã«ãåé¡ã解決ããããã®ææ¡ãæãäžããåã«ãèªèãããåé¡ã«ã€ããŠããã«èª¿æ»ããå¿ èŠããããšæããŸãã
@Freeaqingmeãšã©ãŒã¯ã if err != nil
ãããã¯ãå®äºããåŸã¯ååšããªãã¯ãã§ããããã¯äž»ã«ããã§ã«ååšããªãããã«åäœããŠããããã§ãã
CopyFileã®äŸã§ã¯ã r, err := os.Open(src)
åŸã«w, err := os.Create(dst)
ç¶ããŸãã 2çªç®ã®err
ã¯ãæåã®
ä»ã«ãå¥åŠãªããšããããŸãã err := foo()
以éã«bar.V, err = baz()
ãããªãã®ãããå Žåãã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ãããŠfooïŒïŒãäžèŠã«ãªã£ãå Žåã¯ã baz
åã«var err error
ãè¿œå ããå¿
èŠããããŸãã baz
è¡ã ã é¢æ°å
ã®å¥ã®å Žæããªãã¡ã¯ã¿ãªã³ã°ããŠãããã®ãããªä»ã®å Žæã«åœ±é¿ãäžããã¹ãã§ã¯ãªããšæããŸãã
æè¡çã«ã¯
r, err := os.Open(src)
if err != nil {
return ...
}
w, err := os.Create(dst)
err
ã®2çªç®ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãæåã®ã€ã³ã¹ã¿ã³ã¹ãã·ã£ããŠããŸããã ãããã¯å®éã«ã¯åãå€æ°ã§ãã https://golang.org/ref/spec#Short_variable_declarationsã§å€æ°ã®å宣èšã®èª¬æãåç
§ããŠ
func doSomeThingïŒïŒ{
rãerrïŒ= os.OpenïŒãã¡ã€ã«åïŒ
panicïŒfmt.ErrorfïŒerrã "ãã¡ã€ã«ãéããŸããã§ããïŒïŒ
s"ãfilenameïŒïŒ//
ããã¯ãããã¯ã§ãã
}
æšã2019幎10æ10æ¥ã«11:24ã§clearcodeã®[email protected]ã¯æžããŸããïŒ
çµã¿èŸŒã¿é¢æ°ãè¿œå ã§ãããšæããŸãã
䞻匵ããïŒïŒ
äŸïŒ
func doSomeThingïŒïŒãšã©ãŒ{
r, err := os.Open(filename) assert(err, "failed to open file: %s", filename) // in this step, just return the error
respãerrïŒ= http.GetïŒsomeURLïŒ
assertïŒerrã "ãªã¯ãšã¹ãã«å€±æããŸãã"ïŒ}
ããã³ãšã©ãŒãè¿ããªãå¥ã®é¢æ°ïŒ
func doSomeThingïŒïŒ{
rãerrïŒ= os.OpenïŒãã¡ã€ã«åïŒ
assertïŒerrã "ãã¡ã€ã«ãéããŸããã§ããïŒïŒ s"ãfilenameïŒ//ããã§ãããã¯ã«ãªããŸãã}
ãããã£ãŠãassertïŒerrorãargs ... interface {}ïŒã¯æ¬¡ãããåªããŠããŸãïŒif errïŒ= nil; {{
ãšã©ãŒãè¿ã}â
ããªããã³ã¡ã³ãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
ã
èŠç¹ã¯ãçŸåšã®ãšã©ãŒã§è¿ãããå®éã®ãšã©ãŒã確èªããããšããããšã§ãã
çŸåšã®è¡ã§æ©èœããŸãã
2019幎10æ11æ¥éææ¥åå9æ55å[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
func doSomeThingïŒïŒ{
rãerrïŒ= os.OpenïŒãã¡ã€ã«åïŒ
panicïŒfmt.ErrorfïŒerrã "ãã¡ã€ã«ãéããŸããã§ããïŒïŒ s"ãfilenameïŒïŒ//ããã¯ãããã¯ã§ãã}
11:24 clearcodeã®æšã2019幎10æ10æ¥ã«ã¯[email protected]
æžããŸããïŒçµã¿èŸŒã¿é¢æ°ãè¿œå ã§ãããšæããŸãã
䞻匵ããïŒïŒ
äŸïŒ
func doSomeThingïŒïŒãšã©ãŒ{
r, err := os.Open(filename) assert(err, "failed to open file: %s", filename) // in this step, just return the error
respãerrïŒ= http.GetïŒsomeURLïŒ
assertïŒerrã "ãªã¯ãšã¹ãã«å€±æããŸãã"ïŒ}
ããã³ãšã©ãŒãè¿ããªãå¥ã®é¢æ°ïŒ
func doSomeThingïŒïŒ{
rãerrïŒ= os.OpenïŒãã¡ã€ã«åïŒ
assertïŒerrã "ãã¡ã€ã«ãéããŸããã§ããïŒïŒ s"ãfilenameïŒ//ããã§ãããã¯ã«ãªããŸãã}
ãããã£ãŠãassertïŒerrorãargs ... interface {}ïŒã¯æ¬¡ãããåªããŠããŸãïŒif errïŒ= nil; {{
ãšã©ãŒãè¿ã}â
ããªããã³ã¡ã³ãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32825?email_source=notifications&email_token=AGUV7XQ5HO7GL3YP72R7BV3QN2N55A5CNFSM4H4DL33KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/AGUV7XS4JMK44QHIIR3RSGTQN2N55ANCNFSM4H4DL33A
ã
ççŽã«èšã£ãŠã
try
æäŸããæé»ã®ãªã¿ãŒã³ã¯å¿ èŠãããŸããã ãžã§ããªãã¯ã¹ãããå Žåã¯ã代ããã«ã¢ãã颚ã®åäœã䜿çšãããœãªã¥ãŒã·ã§ã³ããå§ãããŸããtype Result<T> interface { Expect(err error) T OrElse(defaultValue T) T } func From<T>(value T, err error) Result<T> { ... }
ç§ã«ãšã£ãŠãããã¯çŸåšææ¡ãããŠãããã«ãã€ã³ãããã¯ããã«ã¯ãªãŒã³ã§ãããè¿ãããã¡ãœããïŒå€ããšã©ãŒïŒãšçµæãæ¥å¢ãããããäžèšã«ããã«å€æŽãå ããå¿ èŠããããŸã
Rustã®OkãšErrã¯ãšãŠã䌌ãŠããŸãã
if err != nil {}
å€å1ãããè¯ããšæããŸãã
@Yanwenjiepyã¯æå³çãªãã®ã§ãç§ã¯Rustã®Result
ã¿ã€ãã®å€§ãã¡ã³ã§ãã
Goãç¿åŸããŠãã10åãçµã£ãŠããŸããã ç§ãèŠãŠããã³ãŒãã§æåã«æ°ä»ããã®ã¯ããã®ã³ããŒãäœåºŠãäœåºŠã貌ãä»ããããŠããããšã§ãã
someValue, err := someFunction();
if err != nil {
panic(err)
}
ç§ã¯æããã«å°é家ã§ã¯ãããŸãããããã®ã¹ã¬ããã«ãã©ãçãã®ã«äžç®èŠãã ãã§äŸ¡å€ããããããããŸããã
ããã¯ãåŠç¿çšã®ã³ãŒãã¹ãããããèŠãŠããããã§ãã å®éã®ã³ãŒãã¯ããããã¯ãã¯ã©ãã·ã¥ã ãã§ãªãããšã©ãŒãåŠçããå¿ èŠããããŸãã
æ¬åœã§ããããšã©ãŒã¯ã°ã«ãŒãåã§ããŸãïŒãããŠå€ãã®å Žåãããã¹ãã§ãïŒã ãã®ãããtry / catchãããã¯ã¯ä»ã®èšèªã«ååšããŸãã ããšãã°ã次ã®ãããªãã®ã¯ãç§ã«ãšã£ãŠæç«ã®ãããªåããã¯ããã«å°ãªãã§ãããã
try {
foo, throw err := someFunction();
bar, throw err := foo.get();
baz, throw err := bar.make();
qux, throw err := baz.transform();
} catch(err) {
// "Unable to foo bar baz qux."
tryHarder();
}
ããäžåºŠãå®å šãªçŽ 人ã ããããã³ãŒãã¯åãªãã·ã³ãã«ã§ãããããããååã«ç¹°ãè¿ãããå Žåã¯ããã®ããã®ã·ã³ãã«ãäœæããããšãã§ããŸãã ããã¯éåžžã«é »ç¹ã«ç¹°ãè¿ãããèšå·ã®ããã§ãã
RobPikeã®ErrorsAre Valuesã®æçš¿ãèŠãŠããã«ããŒã䜿çšããŠãšã©ãŒãããŒãžããããããã¹ãŠãäžåºŠã«åŠçããæ¹æ³ã確èªããããšããå§ãããŸãã å®éã«ã¯ã1ã€ã®å¥ã§ãã¹ãŠã®äŸå€ããã£ããããããšã¯ãå®éã«äœãèµ·ãã£ããã«ã€ããŠã®æ å ±ãé ãããšã«ãªããããäŸå€ãå«ãã»ãšãã©ã®èšèªã§ã¯æªãã¹ã¿ã€ã«ãšèŠãªãããŸãã ïŒãããŠãäŸãæ¡åŒµããŠããã£ãããããåã ã®äŸå€ãå解ãããã®æ å ±ãç Žæ£ããªãå Žåãã³ãŒãã¯Goãšåçã§ããéãçµäºããŸããïŒ
ãªã³ã¯ãããããšãã errWriter
ã¯å®å
šã«ç¡é£ãªè§£æ±ºçã§ãã
æ¬åœã§ããããšã©ãŒã¯ã°ã«ãŒãåã§ããŸãïŒãããŠå€ãã®å Žåãããã¹ãã§ãïŒã ãã®ãããtry / catchãããã¯ã¯ä»ã®èšèªã«ååšããŸãã ããšãã°ã次ã®ãããªãã®ã¯ãç§ã«ãšã£ãŠæç«ã®ãããªåããã¯ããã«å°ãªãã§ãããã
try { foo, throw err := someFunction(); bar, throw err := foo.get(); baz, throw err := bar.make(); qux, throw err := baz.transform(); } catch(err) { // "Unable to foo bar baz qux." tryHarder(); }
ããäžåºŠãå®å šãªçŽ 人ã ããããã³ãŒãã¯åãªãã·ã³ãã«ã§ãããããããååã«ç¹°ãè¿ãããå Žåã¯ããã®ããã®ã·ã³ãã«ãäœæããããšãã§ããŸãã ããã¯éåžžã«é »ç¹ã«ç¹°ãè¿ãããèšå·ã®ããã§ãã
åé¢æ°ãéè€ãããšã©ãŒã¿ã€ããè¿ãããã¹ãŠã®é¢æ°ã®çµæãé©åã«åŠçããå¿ èŠããããšããŸããããtryHarderïŒïŒãã©ã®ããã«èšè¿°ããŸããïŒ
try {
foo, throw err := someFunction(); // err could be TypeA and TypeB
bar, throw err := foo.get(); // err could be TypeB and TypeC
baz, throw err := bar.make(); // err could be TypeA and TypeC
qux, throw err := baz.transform(); // err could be TypeB and TypeD
} catch(err) {
tryHarder(); // tell me how to handle each error?
}
以äžã®ã³ãŒããç解ããã®ã«ä»ã®èª°ãã1åããããããŸããïŒ
foo, err := someFunction(); // err could be TypeA and TypeB
if err != nil {
// handle err
}
bar, err := foo.get(); // err could be TypeB and TypeC
if err != nil {
// handle err
}
baz, err := bar.make(); // err could be TypeA and TypeC
if err != nil {
// handle err
}
qux, err := baz.transform(); // err could be TypeB and TypeD
if err != nil {
// handle err
}
åé¢æ°ãéè€ãããšã©ãŒã¿ã€ããè¿ãããã¹ãŠã®é¢æ°ã®çµæãé©åã«åŠçããå¿ èŠããããšããŸãã
ãã®äŸã§ã¯ãããªãã¯å®å šã«æ£ããã§ãã
æãåèã«ãªãã³ã¡ã³ã
ç©äºãè¡ãæ¹æ³ã¯1ã€ã ãã§ãªããã°ãªããŸãã