try
ãã®ææ¡ã¯çµäºããŸããã
ã³ã¡ã³ãããåã«ã詳现ãªèšèšããã¥ã¡ã³ããèªã¿ã6æ6æ¥çŸåšã®ãã£ã¹ã«ãã·ã§ã³ã®èŠçŽã 6æ10æ¥çŸåšã®èŠçŽãããã³_æãéèŠãªããšã«çŠç¹ãåããç¶ããããã®ã¢ããã€ã¹_ãåç §ããŠãã ããã ããªãã®è³ªåãææ¡ã¯ãã§ã«åçãŸãã¯è¡ãããŠããå¯èœæ§ããããŸãã ããããšãã
try
ãšåŒã°ããæ°ããçµã¿èŸŒã¿é¢æ°ãææ¡ããŸããããã¯ãGoã§ã®ãšã©ãŒåŠçã«éåžžé¢é£ããå®åçãªif
ã¹ããŒãã¡ã³ããæé€ããããã«ç¹å¥ã«èšèšããããã®ã§ãã ä»ã®èšèªã®å€æŽã¯ææ¡ãããŠããŸããã ãšã©ãŒã®å¢å€§ãŸãã¯æãè¿ããæ¯æŽããããã«ãæ¢åã®defer
ã¹ããŒãã¡ã³ããšæšæºã©ã€ãã©ãªé¢æ°ã䜿çšããããšããå§ãããŸãã ãã®æå°éã®ã¢ãããŒãã¯ãèšèªã«ã»ãšãã©è€éããå ããã«ãæãäžè¬çãªã·ããªãªã«å¯ŸåŠããŸãã try
ãã«ãã€ã³ã¯ã説æãç°¡åã§ãå®è£
ãç°¡åã§ãä»ã®èšèªæ§é ã«çŽäº€ããå®å
šãªäžäœäºææ§ããããŸãã ãŸããå°æ¥çã«æ¡åŒµãããå Žåã«åããŠãã¡ã«ããºã ãæ¡åŒµããããã®éãéãããŸãŸã«ããŸãã
[以äžã®ããã¹ãã¯ãèšèšããã¥ã¡ã³ããããæ£ç¢ºã«åæ ããããã«ç·šéãããŠããŸãã]
try
çµã¿èŸŒã¿é¢æ°ã¯ãåŒæ°ãšããŠåäžã®åŒãåããŸãã åŒã¯n + 1åã®å€ïŒnã¯ãŒãã®å ŽåããããŸãïŒã«è©äŸ¡ãããå¿
èŠããããæåŸã®å€ã¯ã¿ã€ãerror
ã§ããå¿
èŠããããŸãã ïŒæåŸã®ïŒãšã©ãŒåŒæ°ãnilã®å Žåã¯ãæåã®nåã®å€ïŒååšããå ŽåïŒãè¿ããŸãããã以å€ã®å Žåã¯ããã®ãšã©ãŒã§å²ãã§ããé¢æ°ããæ»ããŸãã ããšãã°ã次ã®ãããªã³ãŒã
f, err := os.Open(filename)
if err != nil {
return âŠ, err // zero values for other results, if any
}
ã«ç°¡ç¥åã§ããŸã
f := try(os.Open(filename))
try
ã¯ãããèªäœãerror
ã®çµæãè¿ãé¢æ°ã§ã®ã¿äœ¿çšã§ãããã®çµæã¯ãå²ãã§ããé¢æ°ã®æåŸã®çµæãã©ã¡ãŒã¿ãŒã§ããå¿
èŠããããŸãã
ãã®ææ¡ã¯ãæšå¹Žã®GopherConã§æ瀺ãããå
ã®ãã©ãããã¶ã€ã³ããã®æ¬è³ªã«éå
ããŸãã ãšã©ãŒã®å¢å€§ãŸãã¯ã©ããã³ã°ãå¿
èŠãªå Žåã¯ã2ã€ã®ã¢ãããŒãããããŸããå®èšŒæžã¿ã®if
ã¹ããŒãã¡ã³ãã䜿çšãããããŸãã¯defer
ã¹ããŒãã¡ã³ãã䜿çšããŠãšã©ãŒãã³ãã©ãŒãã宣èšãããŸãã
defer func() {
if err != nil { // no error may have occurred - check for it
err = ⊠// wrap/augment error
}
}()
ããã§ã err
ã¯ãå²ãã§ããé¢æ°ã®ãšã©ãŒçµæã®ååã§ãã å®éã«ã¯ãé©åãªãã«ããŒé¢æ°ã¯ããšã©ãŒãã³ãã©ãŒã®å®£èšãã¯ã³ã©ã€ããŒã«æžãããŸãã äŸãã°
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
ïŒ fmt.HandleErrorf
ã*err
$ã食ãïŒã¯èªã¿ããããæ°ããèšèªæ©èœãå¿
èŠãšããã«å®è£
ã§ããŸãã
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ããšã©ãŒçµæãã©ã¡ãŒã¿ãŒã«ååãä»ããå¿ èŠãããããšã§ããããã«ãããAPIã®å質ãäœäžããå¯èœæ§ããããŸãã çµå±ã®ãšãããããã¯ã¹ã¿ã€ã«ã®åé¡ã§ãããã»ãã³ãã³ãæããªãããã«é©å¿ããã®ãšåãããã«ãæ°ããã¹ã¿ã€ã«ãæåŸ ããããã«é©å¿ãããšä¿¡ããŠããŸãã
èŠçŽãããšã try
ã¯æåã¯çããããã«èŠãããããããŸãããã1ã€ã®ç¹å®ã®ã¿ã¹ã¯ãããå°ãªãå®åæã§ã®ãšã©ãŒåŠçãããã³ãã®ã¿ã¹ã¯ãååã«åŠçããããã«ã«ã¹ã¿ãã€ãºãããæ§æç³è¡£ã§ãã ãã®ããã«ãããã¯å²ç¢ã®å²åŠã«ããŸãé©åããŸãã try
ã¯ã_ãã¹ãŠã®_ãšã©ãŒåŠçç¶æ³ã«å¯ŸåŠããããã«ã¯èšèšãããŠããŸããã _æãäžè¬çãª_ã±ãŒã¹ãé©åã«åŠçããèšèšãã·ã³ãã«ãã€æ確ã«ä¿ã€ããã«èšèšãããŠããŸãã
ãã®ææ¡ã¯ããããŸã§ã«å¯ãããããã£ãŒãããã¯ã®åœ±é¿ã匷ãåããŠããŸãã å ·äœçã«ã¯ã以äžããã¢ã€ãã¢ãåããŠããŸãã
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
try
ã®åœ±é¿ã調æ»ããããã®tryhard
ããŒã«ç§ã¯ãããåé²ããããã®æè¯ã®æ¹æ³ã§ããããšã«åæããŸãïŒã·ã³ãã«ãªãã¶ã€ã³ã§æãäžè¬çãªåé¡ãä¿®æ£ããŸãã
ç§ã¯ãã€ã¯ã·ã§ãããããããããŸããïŒãã®äŒè©±ã延æããŠãã ããïŒããRustã¯ããã«è¡ããèªã¿ããããåäžãããããã«ãçµã¿èŸŒã¿é¢æ°ã§ã¯ãªã?
æ¥å°ŸèŸæŒç®åã§æçµçã«è§£æ±ºããŸããã
gopherconã®ææ¡ã¯ãæ€èšãããã¢ã€ãã¢ã®äžã§?
ãåŒçšãããããç Žæ£ããã3ã€ã®çç±ã瀺ããŠããŸãã1ã€ç®ïŒãå¶åŸ¡ãããŒã®è»¢éã¯ååãšããŠããŒã¯ãŒãã䌎ããïŒãš3ã€ç®ïŒããã³ãã©ãŒã¯ããèªç¶ã«å®çŸ©ããããïŒããŒã¯ãŒãã䜿çšããã®ã§ããã§ãã¯ãé©çšããå¿
èŠããããŸããïŒã¯ããé©çšãããŸããã 2ã€ç®ã¯æäœã§ããã€ãŸããæ¥å°ŸèŸæŒç®åãé£éã«å¯ŸããŠããé©åã«æ©èœããå Žåã§ãã次ã®ãããªå Žåã«ã¯ããã«æªåããå¯èœæ§ããããšããããšã§ãã
check io.Copy(w, check newReader(foo))
ãããããïŒ
io.Copy(w, newReader(foo)?)?
ããããä»ã¯æ¬¡ã®ããã«ãªããŸãã
try(io.Copy(w, try(newReader(foo))))
åŒã³åºãããŠããäž»ãªé¢æ°ãããæããã§ã¯ãªãã®ã§ãããã¯æããã«3ã€ã®ãã¡ã®æªãæ¹ã ãšæããŸãã
ãããã£ãŠãç§ã®ã³ã¡ã³ãã®èŠç¹ã¯ã ?
ã䜿çšããªããšããgopherconææ¡ã§åŒçšããã3ã€ã®çç±ã¯ãã¹ãŠããã®try
ææ¡ã«ã¯åœãŠã¯ãŸããªããšããããšã§ãã ?
ã¯ç°¡æœã§éåžžã«èªã¿ããããã¹ããŒãã¡ã³ãæ§é ïŒå
éšé¢æ°åŒã³åºãéå±€ãå«ãïŒãææ§ã«ããããšã¯ãªããé£éå¯èœã§ãã ææ¡ãããtry()
ããã§ã«è¡ã£ãŠãã以äžã«å¶åŸ¡ãããŒãèŠãé ããã«ããã¥ãŒããããã«å€ãã®æ··ä¹±ãåãé€ããŸãã
æ確ã«ããããã«ïŒ
ããŸãã
func f() (n int, err error) {
n = 7
try(errors.New("x"))
// ...
}
ïŒ0ã "x"ïŒãŸãã¯ïŒ7ã "x"ïŒãè¿ããŸããïŒ åŸè ã ãšæããŸãã
ïŒå éšãã«ããŒé¢æ°ã®ããã«ïŒè£ 食ãåŠçããªãå Žåããšã©ãŒãªã¿ãŒã³ã«ååãä»ããå¿ èŠããããŸããïŒ ç§ã¯ããã¯æããªãã§ãããã
ããªãã®äŸã¯7, errors.New("x")
è¿ããŸãã ããã¯ããŸããªãæåºãããå®å
šãªããã¥ã¡ã³ãïŒhttps://golang.org/cl/180557ïŒã§æ確ã«ãªã£ãŠããã¯ãã§ãã
try
ã䜿çšããããã«ããšã©ãŒçµæãã©ã¡ãŒã¿ãŒã«ååãä»ããå¿
èŠã¯ãããŸããã é¢æ°ãæ®ã眮ãé¢æ°ãŸãã¯ä»ã®å Žæã§ãããåç
§ããå¿
èŠãããå Žåã«ã®ã¿ãååãä»ããå¿
èŠããããŸãã
åŒã³åºãå
ã®å¶åŸ¡ãããŒã«åœ±é¿ãäžããçµã¿èŸŒã¿ã®_function_ã«æ¬åœã«äžæºããããŸãã Go 1ã§æ°ããããŒã¯ãŒããè¿œå ã§ããªãããšãæè¬ããŸãããéæ³ã®çµã¿èŸŒã¿é¢æ°ã§ãã®åé¡ãåé¿ããããšã¯ç§ã«ã¯ééã£ãŠããããã«æããŸãã ä»ã®ãã«ãã€ã³ã®ã·ã£ããŠã€ã³ã°ã¯ãå¶åŸ¡ãããŒã®å€æŽã»ã©äºæž¬ã§ããªãçµæã«ã¯ãªããŸããã
åŸçœ® ?
ã®èŠãç®ã¯æ°ã«å
¥ããªãããããã§ãtry()
ãäžåã£ãŠãããšæãã
ç·šéïŒãŸããç§ã¯ãããã¯ãååšããããŒã¯ãŒãã§ã¯ãªãããšãå®å šã«å¿ããããšãã§ããŸããã
詳现ãªææ¡ã¯çŸåšããã«ããïŒãã©ãŒãããã®æ¹åãéããªãè¡ãããäºå®ã§ãïŒãå€ãã®è³ªåã«çããããšãã§ããã°å¹žãã§ãã
@dominikh詳现ãªææ¡ã§ã¯ããã«ã€ããŠè©³ãã説æããŠããŸããã panic
ãšrecover
ã¯ãå¶åŸ¡ãããŒã«ã圱é¿ãäžãã2ã€ã®çµã¿èŸŒã¿é¢æ°ã§ããããšã«æ³šæããŠãã ããã
æ¹åã®ããã®1ã€ã®èª¬æ/ææ¡ïŒ
if the last argument supplied to try, of type error, is not nil, the enclosing functionâs error result variable (...) is set to that non-nil error value before the enclosing function returns
代ããã«ããã¯is set to that non-nil error value and the enclosing function returns
ãšèšãããšãã§ããŸããïŒ ïŒs / before / andïŒ
æåã«èªãã ãšãã before the enclosing function returns
ã¯ãé¢æ°ãè¿ãããçŽåã®å°æ¥ã®ããæç¹ã§ãããããåŸã®è¡ã§ããšã©ãŒå€ã_æçµçã«_èšå®ããããã«èŠããŸããã æ£ãã解éã¯ãtryã«ãã£ãŠçŸåšã®é¢æ°ãè¿ãããå¯èœæ§ããããšããããšã§ãã ããã¯çŸåšã®èšèªã«ãšã£ãŠé©ãã¹ãåäœã§ãããããããæ確ãªããã¹ããæè¿ãããŸãã
ããã¯åãªãç ç³ã ãšæããŸããå°æ°ã®å£°ã®å察è
ãif err != nil ...
ã®ç¹°ãè¿ãã®äœ¿çšã«ã€ããŠãŽã©ã³ãããããã誰ãããããçå£ã«åãæ¢ããŸããã åé¡ãªããšæããŸãã äžè¶³ããŠããã®ã¯ã次ã®2ã€ã®çµã¿èŸŒã¿æ©èœã ãã§ãã
ãªã誰ãããã®ãããªé¢æ°ãæžãã®ãããããªãããæ³å®ãããåºåã¯äœã«ãªãã®ã
try(foobar())
foobar
ã(error, error)
$ãè¿ããå Žå
å¶åŸ¡ãããŒã«é¢ãã以åã®æžå¿µãæ€åãã ?
ã®äœ¿çšãææ¡ããªããªããŸããã ã²ããŸãã察å¿ããè©«ã³ããŸãïŒãã ããå®å
šãªææ¡ãå©çšå¯èœã«ãªã£ãåŸãåé¡ãæåºãããŠããã°ãããã¯èµ·ãããªãã£ãããšãææããããšæããŸãïŒã
åçŽåããããšã©ãŒåŠçã®å¿
èŠæ§ã«ã¯åæããŸããããããã¯ææŠã ãšç¢ºä¿¡ããŠããŸãã ææ¡ã«èšèŒãããŠããtry
ã¯ããããè¡ãããã®æãæªãæ¹æ³ã§ã¯ãªãããã§ãã
@webermasterããããŒã¶ã«ã®ããã¥ã¡ã³ãã§èª¬æãããŠããããã«ãæåŸã®error
ã®çµæã®ã¿ãã try
ã«æž¡ãããåŒã«ç¹å¥ã§ãã
@dominikhã®ããã«ãç§ãåçŽåããããšã©ãŒåŠçã®å¿ èŠæ§ã«åæããŸããã
åçŽæ¹åã®è€éããæ°Žå¹³æ¹åã®è€éãã«ç§»è¡ããŸãããããã¯ãã£ãã«è¯ãèãã§ã¯ãããŸããã
ãã ãããšã©ãŒåŠçã®ææ¡ãåçŽåããããšã絶察ã«éžæããå¿ èŠãããå Žåã¯ããããç§ã®å¥œãŸããææ¡ã«ãªããŸãã
ãã®ãããªå€æãããã«ç°¡åã«å®è¡ã§ãããšã©ãŒãè¿ãé¢æ°ã®ãµãã»ããã§try
ã䜿çšããããã«Goã³ãŒããå€æããããŒã«ãïŒåãå
¥ãããã段éã§ïŒããã«äŒŽãããšãã§ããã°äŸ¿å©ã§ããã»ãã³ãã£ã¯ã¹ã®å€æŽã ç§ã«ã¯3ã€ã®å©ç¹ããããŸãã
try
ãã©ã®ããã«äœ¿çšãããããããã«ç解ããããšãã§ããŸããtry
ãGoã®å°æ¥ã®ããŒãžã§ã³ã«ç»å Žããå Žåã人ã
ã¯ãããå©çšããããã«ã³ãŒããå€æŽããããšæãã§ãããã ç°¡åãªã±ãŒã¹ãèªååããããŒã«ããããšãéåžžã«åœ¹ç«ã¡ãŸããtry
ã䜿çšããæ¹æ³ããããšãå®è£
ã®å¹æã倧èŠæš¡ã«èª¿ã¹ãã®ãç°¡åã«ãªããŸãã ïŒããšãã°ãæ£ç¢ºæ§ãããã©ãŒãã³ã¹ãããã³ã³ãŒããµã€ãºãïŒãã ããå®è£
ã¯ããããç¡èŠã§ããã»ã©èæ
®ã«å
¥ããã»ã©åçŽãªå ŽåããããŸãã裞ã®try(foo())
ãå®éã«åŒã³åºãå
ã®é¢æ°ãã解æŸããããšãçµæã«å¿ããŠé¢æ°ã®æµããå€ããå¯èœæ§ããããšããèŠèŠçãªæãããã倱ããããšæããŸãã
ååã«æ
£ããã°try
ã§äœæ¥ã§ãããšæããŸãããã³ãŒãã¬ãã¥ãŒã®æé»ã®ãããŒãå¹ççã«èªèããããã«try
ã匷調ããããã«è¿œå ã®IDEãµããŒãïŒãŸãã¯ãã®ãããªãã®ïŒãå¿
èŠã«ãªããšæããŸã/ãããã°ã»ãã·ã§ã³
ç§ãæãæžå¿µããŠããã®ã¯ãdeferã¹ããŒãã¡ã³ããæºè¶³ã§ããããã«æ»ãå€ã«ååãä»ããå¿ èŠãããããšã§ãã
ã³ãã¥ããã£ãäžæºãèšã£ãŠããå
šäœçãªãšã©ãŒåŠçã®åé¡ã¯ã if err != nil
ã®å®åæãšãšã©ãŒãžã®ã³ã³ããã¹ãã®è¿œå ã®çµã¿åããã ãšæããŸãã ãããã質åã§ã¯ãåŸè
ã¯å¥ã®åé¡ãšããŠæå³çã«çç¥ãããŠãããšæ確ã«è¿°ã¹ãããŠããŸãããããã¯äžå®å
šãªè§£æ±ºçã«ãªããšæããŸããã次ã®2ã€ã®ããšãèããåŸããã£ã³ã¹ãäžããããšæããŸãã
err
ã宣èšããŸããfunc sample() (string, error) {
var err error
defer fmt.HandleErrorf(&err, "whatever")
s := try(f())
return s, nil
}
if err != nil
ãã€ã©ãŒãã¬ãŒããæã€ãã«ããŒwrapf
é¢æ°ã䜿çšããŸããfunc sample() (string, error) {
s, err := f()
try(wrapf(err, "whatever"))
return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
if err != nil {
// err = wrapped error
}
return err
}
ã©ã¡ãããããŸãããã°ãç§ã¯ããã«å¯ŸåŠããããšãã§ããŸãã
func sample() (string, error) {
var err error
defer fmt.HandleErrorf(&err, "whatever")
s := try(f())
return s, nil
}
ããã¯æ©èœããŸããã deferã¯ãæ»ãå€ãšã¯é¢ä¿ã®ãªãããŒã«ã«ã®err
å€æ°ãæŽæ°ããŸãã
func sample() (string, error) {
s, err := f()
try(wrapf(err, "whatever"))
return s, nil
}
func wrapf(err error, format string, ...v interface{}) error {
if err != nil {
// err = wrapped error
}
return err
}
ããã¯ããŸãããã¯ãã§ãã ãã ããnilãšã©ãŒã®å Žåã§ãwrapfãåŒã³åºããŸãã
ãããïŒç¶ç¶ããŠïŒæ©èœããIMOã¯ã¯ããã«æ確ã«ãªããŸãã
func sample() (string, error) {
s, err := f()
if err != nil {
return "", wrap(err)
}
return s, nil
}
try
ã䜿çšããã人ã¯èª°ãããŸããã
ãªã誰ãããã®ãããªé¢æ°ãæžãã®ãããããªãããæ³å®ãããåºåã¯äœã«ãªãã®ã
try(foobar())
foobar
ã(error, error)
$ãè¿ããå Žå
é¢æ°ããè€æ°ã®ãšã©ãŒãè¿ãã®ã¯ãªãã§ããïŒ é¢æ°ããè€æ°ã®ãšã©ãŒãè¿ãå Žåã¯ãæåã«é¢æ°ã2ã€ã®å¥ã ã®ãšã©ãŒã«åå²ããããããã1ã€ã®ãšã©ãŒã®ã¿ãè¿ãããã«ããå¿ èŠããããŸãã
äŸãæããŠè©³ããæããŠãã ããã
@cespare ïŒ try
ã䜿çšããããã«ã try
ã«é©ããæ¢åã®ã³ãŒããæžãæããgo fix
ã誰ããæžãããšãã§ããã¯ãã§ãã æ¢åã®ã³ãŒããã©ã®ããã«åçŽåã§ããããç解ããŠãããšåœ¹ç«ã€å ŽåããããŸãã try
ã¯åãªãæ§æäžã®ç³è¡£ã§ãããäžè¬çãªãã¿ãŒã³ããæ¬è³ªçã«åãåºåã³ãŒããçæããçããœãŒã¹ã³ãŒãã«çœ®ãæãããããã³ãŒããµã€ãºãããã©ãŒãã³ã¹ã«å€§ããªå€åã¯ãªããšäºæ³ãããŸãã try
ã䜿çšããã³ãŒãã¯ãå°ãªããšãtry
ãå°å
¥ãããããŒãžã§ã³ã§ããGoããŒãžã§ã³ã䜿çšããããã«ãã€ã³ããããããšã«ã泚æããŠãã ããã
@lestrrat ïŒ try
ãå¶åŸ¡ãããŒãå€æŽã§ããããšãåŠã¶å¿
èŠãããããšã«åæããŸããã IDEã¯ãããç°¡åã«åŒ·èª¿ã§ãããšæããŸãã
@Goodwine ïŒ @ randall77ããã§ã«ææããŠããããã«ãæåã®ææ¡ã¯æ©èœããŸããã ç§ãã¡ãèãã1ã€ã®ãªãã·ã§ã³ïŒãã ããããã¥ã¡ã³ãã§ã¯èª¬æãããŠããŸããïŒã¯ã error
ã®çµæã瀺ãäºåã«å®£èšãããå€æ°ãæã€å¯èœæ§ã§ãïŒæåã«ååšããå ŽåïŒã ããã«ãããçµæã«ååãä»ããå¿
èŠããªããªãã defer
ã§äœ¿çšã§ããããã«ãªããŸãã ããããããã¯ããã«éæ³ã«ãªããŸãã ããã¯æ£åœåãããŠããªãããã§ãã æ»ãçµæã«ååãä»ããéã®åé¡ã¯æ¬è³ªçã«è¡šé¢çãªãã®ã§ããããããæãéèŠãªã®ã¯ã go doc
ãšãã®å人ã«ãã£ãŠæäŸãããèªåçæãããAPIã«ãããŸãã ãããã®ããŒã«ã§ããã«å¯ŸåŠããã®ã¯ç°¡åã§ãïŒãã®ããŒãã«é¢ãã詳现ãªèšèšããã¥ã¡ã³ãã®FAQãåç
§ããŠãã ããïŒã
@nictuku ïŒæ確åã®ããã®ããªãã®ææ¡ã«ã€ããŠïŒs / before / and /ïŒïŒããªããåç §ããŠãã段èœã®çŽåã®ã³ãŒãã¯æ£ç¢ºã«äœãèµ·ããããæ確ã«ããŠãããšæããŸãããç§ã¯ããªãã®ãã€ã³ããç解ããŠããŸããs / before / and / mayæ£æãããæ確ã«ããŸãã å€æŽããŸãã
CL180637ãåç §ããŠãã ããã
ç§ã¯å®éã«ãã®ææ¡ãæ¬åœã«å¥œãã§ãã ããããç§ã«ã¯1ã€ã®æ¹å€ããããŸãã Goã®é¢æ°ã®åºå£ç¹ã¯ãåžžã«return
ããŒã¯ãããŠããŸãã ãããã¯ãåºå£ç¹ã§ããããããã¯å£æ»
çãªãšã©ãŒã§ãããéåžžã¯çºçãââãããšãæå³ããŠããŸããã
return
ã§ã¯ãªãããããµãããã®ã§ããé¢æ°ã®åºå£ç¹ãäœæãããšãã³ãŒããã¯ããã«èªã¿ã«ãããªãå¯èœæ§ããããŸãã è¬æŒã§ããã«ã€ããŠèããããšããããŸããããã®ã³ãŒããã©ã®ããã«æ§æãããŠããããç解ããã®ã¯é£ããã§ãã
func CopyFile(src, dst string) error {
r, err := os.Open(src)
if err != nil {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
defer r.Close()
w, err := os.Create(dst)
if err != nil {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
if _, err := io.Copy(w, r); err != nil {
w.Close()
os.Remove(dst)
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
if err := w.Close(); err != nil {
os.Remove(dst)
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}
ãã®ã³ãŒãã¯å€§ããªæ··ä¹±ã®ããã«èŠãããããããããšã©ãŒåŠçãã©ããã§ã¯ãæå³ã®ããããã®ã§ãããã try
ã䜿çšããåããã®ãšæ¯èŒããŠã¿ãŸãããã
func CopyFile(src, dst string) error {
defer func() {
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}()
r, err := try(os.Open(src))
defer r.Close()
w, err := try(os.Create(dst))
defer w.Close()
defer os.Remove(dst)
try(io.Copy(w, r))
try(w.Close())
return nil
}
ç¹°ãè¿ãããã³ãŒããã¯ããã«å°ãªãã®ã§ããããäžç®èŠãŠãèŠæ ããè¯ããªããšæããããããŸããã ãã ããæåã®äŸã§é¢æ°ãè¿ãããã¹ãŠã®ã¹ããããèŠã€ããã®ã¯éåžžã«ç°¡åã§ããã ãããã¯ãã¹ãŠã€ã³ãã³ãããã return
ã§å§ãŸãããã®åŸã«ã¹ããŒã¹ãç¶ããŸãã ããã¯ããã¹ãŠã®æ¡ä»¶ä»ãæ»ãå€ãæ¡ä»¶ä»ããããã¯å
ã«ããå¿
èŠããããããã«ãã£ãŠgofmt
æšæºã«ãã£ãŠã€ã³ãã³ããããããã§ãã return
ã¯ãåè¿°ã®ããã«ãå£æ»
çãªãšã©ãŒãçºçããããšãèšããã«é¢æ°ãçµäºããå¯äžã®æ¹æ³ã§ããããŸãã 2çªç®ã®äŸã§ã¯ã return
ã1ã€ãããªããããé¢æ°_ever_ãè¿ãå¿
èŠãããã®ã¯nil
ã ãã®ããã§ãã æåŸã®2ã€ã®try
åŒã³åºãã¯èŠãããã§ãããæåã®2ã€ã¯å°ãé£ãããã©ããã«ãã¹ããããŠããå Žåãã€ãŸãproc := try(os.FindProcess(try(strconv.Atoi(os.Args[1]))))
ã®ããã«ãããšããã«é£ãããªããŸãã
é¢æ°ããæ»ãããšã¯ãç¥èãªãããšã§ããããã«æãããŸãããã®ãããé¢æ°ã®ãã¹ãŠã®åºå£ç¹ã¯return
ã§ããŒã¯ããå¿
èŠããããšç§ã¯å人çã«èããŠããŸãã
誰ãããã§ã«ããã5幎åã«å®è£
ããŸããã ããªããèå³ãæã£ãŠãããªããããªãã¯ããããšãã§ããŸã
ãã®æ©èœãè©Šã
https://news.ycombinator.com/item?id=20101417
5幎åã«ASTããªããã»ããµã䜿çšããŠGoã§tryïŒïŒãå®è£ ããå®éã®ãããžã§ã¯ãã§äœ¿çšããŸãããããã¯éåžžã«äŸ¿å©ã§ããïŒ https ïŒ//github.com/lunixbochs/og
ãšã©ãŒãã§ãã¯ãå€ãé¢æ°ã§äœ¿çšããäŸã次ã«ç€ºããŸããhttps ïŒ//github.com/lunixbochs/poxd/blob/master/tls.go#L13
ããã«è²»ãããåªåã«æè¬ããŸãã ããã¯ç§ããããŸã§ã«èŠãäžã§æãåä»ãªè§£æ±ºçã ãšæããŸãã ãããããããã°æã«å€ãã®äœæ¥ãçºçãããšæããŸãã ãããã°ãããã³ã«unwrappingtryãšifãããã¯ãè¿œå ããå®äºæã«åã©ããããã®ã¯é¢åã§ãã ãŸããèæ ®ããå¿ èŠã®ããéæ³ã®errå€æ°ã«ã€ããŠãæ°ã«ãªããŸãã ç§ã¯æ瀺çãªãšã©ãŒãã§ãã¯ã«æ©ãŸãããããšããªãã®ã§ãããããç§ã¯ééã£ã人ã«å°ããŸãã ããã¯ãã€ãããããã°ã®æºåãã§ããŠããããšç§ãé©ãããŸããã
@griesemer
ãšã©ãŒã©ããã³ã°ãåŠçããæ¹æ³ãšããŠã®deferã®ææ¡ããã䜿çšã«é¢ããç§ã®åé¡ã¯ãç§ã瀺ããã¹ããããïŒä»¥äžã§ç¹°ãè¿ãïŒã®åäœãããŸãäžè¬çã§ã¯ãªãããšã§ããããã§ãªããšãã
ã®ããã«..åå¿è ã¯ãããç¥ããªãã§ããããããã®ããã«åœŒãããã°ãæã£ãŠãããªãã°ã圌ãã¯ããã¡ãããç§ã¯ååä»ãã®ãªã¿ãŒã³ãå¿ èŠã§ããã«è¡ããŸããã圌ãã¯ãããããŸãããã¯ãã§ããããããŸããããªãã®ã§ã¹ãã¬ã¹ãæããã§ãããã
var err error
defer fmt.HandleErrorf(err);
try
ã¯ãã§ã«éæ³ã®ããã§ãããããæåŸãŸã§è¡ã£ãŠããã®æé»ã®ãšã©ãŒå€ãè¿œå ããããšãã§ããŸãã Goã®ãã¹ãŠã®ãã¥ã¢ã³ã¹ãç¥ã£ãŠãã人ã§ã¯ãªããåå¿è
ã®ããšãèããŠãã ããã ãããååã«æ確ã§ãªãå Žåãç§ã¯ãããæ£ãã解決çã§ã¯ãªããšæããŸãã
ãŸãã¯...ãã®ããã«å»¶æã䜿çšããããšãææ¡ããªãã§ãã ãããããå®å šã§ãããªããèªã¿ãããå¥ã®æ¹æ³ãè©ŠããŠãã ããã
@deanveloper確ãã«ããã®ææ¡ïŒããã«èšãã°ãåãããšãè©Šã¿ãããšããææ¡ïŒã¯ãæ瀺çã«è¡šç€ºãããreturn
ã¹ããŒãã¡ã³ãããœãŒã¹ã³ãŒãããåé€ããŸããããããçµå±ã®ãšãããææ¡ã®èŠç¹ã§ããããã§ããã ãã¹ãŠåãif
ã¹ããŒãã¡ã³ããšreturns
ã®å®åæãåé€ããŸãã return
ãä¿æããå Žåã¯ã try
ã䜿çšããªãã§ãã ããã
ãã®çš®ã®å¶åŸ¡ãããŒãGoïŒããã³ä»ã®å€ãã®èšèªïŒã§è¡šçŸãããæ¹æ³ã§ããããã return
ã¹ããŒãã¡ã³ãïŒããã³panic
ïŒãããã«èªèããããã«äœ¿çšãããŸãã return
ã®å Žåãšåãããã«ã try
ããæ
£ããŠããå¶åŸ¡ãããŒãå€æŽãããã®ãšããŠèªèãããããšã¯ãããã»ã©ç解ãããŠããªãããã§ãã åªããIDEãµããŒããããã«ã圹ç«ã€ããšã¯ééããããŸããã
ç§ã«ã¯2ã€ã®æžå¿µããããŸãïŒ
ç§ã®çµéšã§ã¯ãååŒã³åºããµã€ãã®çŽåŸã«ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã¯ãç°¡åã«ãããã°ã§ããã³ãŒããçšæããããã«éèŠã§ãã ãããŠãååä»ãã®è¿åã¯ãããæç¹ã§ç§ãç¥ã£ãŠããã»ãŒãã¹ãŠã®Goéçºè ã«æ··ä¹±ãåŒãèµ·ãããŸããã
ãããã€ããŒã§ã¹ã¿ã€ã«äžã®æžå¿µã¯ãæ®å¿µãªãããã³ãŒãã®äœè¡ãtry(actualThing())
ã§ã©ãããããããšããããšã§ãã try()
ã§ã©ãããããã³ãŒãããŒã¹ã®ã»ãšãã©ã®è¡ã衚瀺ãããããšãæ³åã§ããŸãã ããã¯æ®å¿µãªããšã§ãã
ãããã®æžå¿µã¯åŸ®èª¿æŽã§å¯ŸåŠããããšæããŸãã
a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)
check()
ã¯try()
ãšã»ãšãã©åãããã«åäœããŸãããé¢æ°ã®æ»ãå€ãäžè¬çã«æž¡ãåäœããããããã代ããã«ã³ã³ããã¹ããè¿œå ããæ©èœãæäŸããŸãã ããã§ããªã¿ãŒã³ãããªã¬ãŒãããŸãã
ããã«ããã try()
ã®å©ç¹ã®å€ããä¿æãããŸãã
errors.Wrap(err, "context message")
ãªã©ã®ãšã©ãŒã©ããã³ã°ã®çŸåšã®ææ¡ãã©ã€ãã©ãªãšé£æºããŸãa, b, err := myFunc()
è¡ã«å®åæã¯ãããŸããdefer fmt.HandleError(&err, "msg")
ã§ãšã©ãŒã説æããããšã¯åŒãç¶ãå¯èœã§ãããæšå¥šããå¿
èŠã¯ãããŸãããcheck
ã®ã·ã°ããã£ã¯ãã©ããããŠããé¢æ°ããä»»æã®æ°ã®åŒæ°ãè¿ãå¿
èŠããªããããå°ãåçŽã§ãã@ s4n-gtãã®ãªã³ã¯ãããããšãã æ°ã¥ããªãã£ãã
@Goodwineãã€ã³ããååŸããŸããã ããçŽæ¥çãªãšã©ãŒåŠçãµããŒããæäŸããªãçç±ã«ã€ããŠã¯ãèšèšããã¥ã¡ã³ãã§è©³ãã説æãããŠããŸãã ãŸããïŒæšå¹Žã®Gopherconã§ãã©ããèšèšãå
¬éãããŠããïŒ1幎ã»ã©ã®éã«ãæ瀺çãªãšã©ãŒåŠçã«å¯Ÿããæºè¶³ã®ãã解決çãåºãŠããªãã£ãããšãäºå®ã§ãã ãããããã®ææ¡ãæå³çã«ãããçç¥ããŠããçç±ã§ãïŒä»£ããã«ã defer
ã䜿çšããããšãææ¡ããŠããŸãïŒã ãã®ææ¡ã¯ããã®ç¹ã§å°æ¥ã®æ¹åãžã®æããŸã éãããŸãŸã«ããŠããŸãã
ãã®ææ¡ã§ã¯ããã¹ããšãã³ãããŒã¯ããšã©ãŒãè¿ãããšãã§ããããã«ããã±ãŒãžãã¹ããå€æŽããããšã«èšåããŠããŸãã ããããããªã©ã€ãã©ãªã®å€æŽãã§ã¯ãããŸãããã func main() error
ãåãå
¥ããããšãæ€èšã§ããŸãã ããã¯å°ããªã¹ã¯ãªãããæžãããšãã¯ããã«è¯ãããã§ãããã ã»ãã³ãã£ã¯ã¹ã¯æ¬¡ãšåçã§ãã
func main() {
if err := newmain(); err != nil {
println(err.Error())
os.Exit(1)
}
}
æåŸã®æ¹å€ã ææ¡èªäœã«å¯Ÿããæ¹å€ã§ã¯ãªãããæµããå¶åŸ¡ããæ©èœãã®åè«ã«å¯Ÿããäžè¬çãªåå¿ã«å¯Ÿããæ¹å€ã§ãã
ãé¢æ°ããããŒãå¶åŸ¡ããŠããã®ãæ°ã«å
¥ããªããã«å¯Ÿããå¿çã¯ãã panic
ãããã°ã©ã ã®ãããŒãå¶åŸ¡ããŠããïŒããšãããã®ã§ãã ãã ãã try
ã«ã¯é©çšãããªãã panic
ããããå®è¡ããŠãåé¡ããªãçç±ã¯ããã€ããããŸãã
panic
ã¯ãçŽæçã«å®è¡ã§ããã¹ã¿ãã¯ã®ã©ããã解é€ãç¶ãããããåå¿è
ã®ããã°ã©ããŒã«ãšã£ãŠã¯äœ¿ãããããã®ã§ãã panic
ãã©ã®ããã«æ©èœããããç解ããããã«ããããã©ã®ããã«æ©èœãããã調ã¹ãå¿
èŠã¯ãããŸããã åå¿è
ã®ããã°ã©ããŒã¯recover
ã«ã€ããŠå¿é
ããå¿
èŠãããããŸããããªããªããåå¿è
ã¯éåžžããããã¯å埩ã¡ã«ããºã ãæ§ç¯ããŠããªãããã§ãã
panic
ã¯èŠãããååã§ãã ããã¯å¿é
ããããããŸãããããŠããã¯ããããå¿
èŠããããŸãã ã³ãŒãããŒã¹ã«panic
ã衚瀺ãããå ŽåãããšãäºçŽ°ãªããšã§ãã£ãŠãããããã¯ã_åé¿_ããæ¹æ³ãããã«èããã¹ãã§ãã
æåŸã®ãã€ã³ããã䟿ä¹ããŠã panic
ãåŒã³åºãã«ãã¹ãããããšã¯ã§ããªããããããã«èŠããããªããŸãã
ããã°ã©ã ã®æµããå¶åŸ¡ããããšã¯éåžžã«ç°¡åã§ããããããäœããããã«ã€ããŠçŽæçã§ããããããããã¯ãçºçããŠãåé¡ãããŸããã
try
é¢æ°ã¯ããããã®ç¹ã®ããããæºãããŠããŸããã
$ïŒ$ 10 $ïŒ$ã®ããã¥ã¡ã³ãã調ã¹ãªããšã try
ãäœãããã®ããæšæž¬ããããšã¯ã§ããŸããã å€ãã®èšèªã¯ããŒã¯ãŒããããŸããŸãªæ¹æ³ã§äœ¿çšããŠãããããå²ç¢ã§ã®æå³ãç解ããã®ã¯å°é£ã§ãã
try
ã¯ãç¹ã«é¢æ°ã®å Žåãç§ã®ç®ã«çãŸããŸããã _ç¹ã«_æ§æã®åŒ·èª¿è¡šç€ºãé¢æ°ãšããŠåŒ·èª¿è¡šç€ºãããå Žåã _ESPECIALLY_ Javaã®ãããªèšèªã§éçºããåŸã try
ã¯äžèŠãªå®åæãšèŠãªãããŸãïŒäŸå€ããã§ãã¯ãããŠããããïŒã
try
ã¯ãåã®ã³ã¡ã³ãproc := try(os.FindProcess(try(strconv.Atoi(os.Args[1]))))
ã®äŸã®ããã«ãé¢æ°åŒã³åºãã®åŒæ°ã§äœ¿çšã§ããŸãã ããã«ãããçºèŠãããã«å°é£ã«ãªããŸãã
ç§ã®ç®ã¯ãç¹ã«ããããæ¢ããŠãããšãã§ããã try
é¢æ°ãç¡èŠããŸãã ç§ã®ç®ã¯ããããèŠãã§ãããããããã«os.FindProcess
ãŸãã¯strconv.Atoi
ã®åŒã³åºãã«ã¹ãããããŸãã try
ã¯æ¡ä»¶ä»ãã®æ»ãå€ã§ãã å¶åŸ¡ãããŒãšãªã¿ãŒã³ã¯ã©ã¡ããGoã®ããã¹ã¿ã«ã§ä¿æãããŸãã é¢æ°å
ã®ãã¹ãŠã®å¶åŸ¡ãããŒã¯ã€ã³ãã³ãããããã¹ãŠã®æ»ãå€ã¯return
ã§å§ãŸããŸãã ãããã®æŠå¿µã®äž¡æ¹ãæ··ãåãããŠãèŠéããããé¢æ°åŒã³åºãã«ãããšãå°ãæ°åãæªããªããŸãã
ãããããã®ã³ã¡ã³ããšç§ã®æåŸã®ã³ã¡ã³ãã¯ããã®ã¢ã€ãã¢ã«å¯Ÿããç§ã®å¯äžã®æ¬åœã®æ¹å€ã§ãã ç§ã¯ãã®ææ¡ãæ°ã«å ¥ããªãã£ãã®ã§å€ãããããããªããšæããŸãããããã§ãããã¯å²ç¢ã«ãšã£ãŠå šäœçãªåå©ã ãšæããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãä»ã®ãœãªã¥ãŒã·ã§ã³ãããGoã«äŒŒãŠãããšæããŸãã ãããè¿œå ããŠããã ããã°å¹žãã§ãããããã§ãæ¹åã§ãããšæããŸãã®ã§ãã©ãããã°ããã®ãããããŸããã
@buchanaeãããããã ãã ããèšè¿°ãããŠããããã«ãfmtã¹ã¿ã€ã«ã®ãã©ãŒããããããã±ãŒãžããèšèªèªäœã«ç§»åããã¯ãŒã ã®çŒ¶ãéããŸãã
ãã ããèšè¿°ãããŠããããã«ãfmtã¹ã¿ã€ã«ã®ãã©ãŒããããããã±ãŒãžããèšèªèªäœã«ç§»åããã¯ãŒã ã®çŒ¶ãéããŸãã
ããèŠç¹ãã ããç°¡åãªäŸïŒ
a, b, err := myFunc()
check(err, "calling myFunc")
@buchanaeæ瀺çãªãšã©ãŒåŠçãtry
ãšããçŽæ¥çã«é¢é£ä»ããããšãæ€èšããŸããã詳现ãªèšèšããã¥ã¡ã³ããç¹ã«èšèšã®å埩ã«é¢ããã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã check
ã®å
·äœçãªææ¡ã§ã¯ãç§ãæ£ããç解ããŠããã°ãAPIã®ãããªfmt.Errorf
ïŒ check
ã®äžéšãšããŠïŒã®ãããªãã®ãä»ããŠã®ã¿ãšã©ãŒãå¢ããããšãã§ããŸãã äžè¬ã«ããšã©ãŒæååãä»ããŠå
ã®æååãåç
§ããæ°ãããã®ãäœæããã ãã§ãªãããšã©ãŒã䜿çšããŠããããçš®é¡ã®ããšãå®è¡ãããå ŽåããããŸãã
ç¹°ãè¿ããŸããããã®ææ¡ã¯ãã¹ãŠã®ãšã©ãŒåŠçç¶æ³ã解決ããããšã¯ããŠããŸããã ã»ãšãã©ã®å Žåã try
ã¯ãåºæ¬çã«æ¬¡ã®ããã«ãªã£ãŠããã³ãŒãã«ã¯æå³ããããšæããŸãã
a, b, c, ... err := try(someFunctionCall())
if err != nil {
return ..., err
}
ãã®ããã«èŠããã³ãŒãã¯éåžžã«ãããããããŸãã ãããŠããã®ããã«èŠãããã¹ãŠã®ã³ãŒããããå€ãã®ãšã©ãŒåŠçãå¿
èŠãšããããã§ã¯ãããŸããã ãŸãã defer
ãæ£ãããªãå Žåã§ãã if
ã¹ããŒãã¡ã³ãã䜿çšã§ããŸãã
ç§ã¯ãã®è¡ã«åŸããªãïŒ
defer fmt.HandleErrorf(&err, âfoobarâ)
ããã¯åºã«ã€ã³ããŠã³ããšã©ãŒãèœãšããŸãããããã¯çããããšã§ãã ãã®ãããªãã®ã䜿çšããããã®ãã®ã§ããïŒ
defer fmt.HandleErrorf(&err, âfoobar: %vâ, err)
ãšã©ãŒã®éè€ã¯å°ãéæ¹ã«æ®ããŠããŸãã ããã¯å®éã«ã¯ææ¡ã«çŽæ¥é©åã§ã¯ãªããããã¥ã¡ã³ãã«é¢ãããµã€ãã³ã¡ã³ãã«ãããŸããã
@buchanaeã«ãã£ãŠæèµ·ããã2ã€ã®æžå¿µãreïŒååä»ããªã¿ãŒã³ãšã³ã³ããã¹ããšã©ãŒãå ±æããŸãã
ååä»ãã®æ»ãå€ã¯ããã®ãŸãŸã§ã¯å°ãé¢åã§ãã ãããã¯ããã¥ã¡ã³ããŒã·ã§ã³ãšããŠã®ã¿æ¬åœã«æçã ãšæããŸãã ãããã«ãã£ãšå€§ããå¯ããããã®ã¯å¿é ã§ãã ã§ãããããŸãã«ãªã£ãŠãã¿ãŸããã ããã«ã€ããŠãã£ãšèããŠããã£ãšå ·äœçãªèããæäŸããŸãã
try
ã䜿çšã§ããããã«ã³ãŒããæ§é åããŠããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããªãããã«ããããšãæ¬åœã«æžå¿µãããŠãããšæããŸãã å
¬åŒã®ãšã©ãŒã©ããã³ã°æ©èœã䜿çšããŠãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããã®ããè¯ãæ¹æ³ãæäŸããŠããããšãèãããšãããã玹ä»ããã®ã¯ç¹ã«å¥åŠãªææã§ãã
ææ¡ãããtry
ã¯ãããã€ãã®ã³ãŒããéåžžã«åªãããã®ã«ãããšæããŸãã ããã¯ãçŸåšã®ãããžã§ã¯ãã®ã³ãŒãããŒã¹ããå€ããå°ãªããã©ã³ãã ã«éžæããé¢æ°ã§ããååã®äžéšãå€æŽãããŠããŸãã æ§é äœãã£ãŒã«ãã«å²ãåœãŠããšãã«try
ãã©ã®ããã«æ©èœãããã«ç¹ã«æéãåããŸããã ïŒããã¯ãç§ã®ææ¡ã®èªã¿æ¹ãæ£ããããšããããŠãããæ©èœããããšãåæãšããŠããŸããïŒïŒ
æ¢åã®ã³ãŒãïŒ
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
err := dbfile.RunMigrations(db, dbMigrations)
if err != nil {
return nil, err
}
t := &Thing{
thingy: thingy,
}
t.scanner, err = newScanner(thingy, db, client)
if err != nil {
return nil, err
}
t.initOtherThing()
return t, nil
}
try
ïŒ
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
try(dbfile.RunMigrations(db, dbMigrations))
t := &Thing{
thingy: thingy,
scanner: try(newScanner(thingy, db, client)),
}
t.initOtherThing()
return t, nil
}
newScanner
ã倱æããå¯èœæ§ãããããšãããŸãæçœã§ãªãããšãé€ããŠãèªã¿ãããã倱ãããšã¯ãããŸããã ãããã try
Goã®ããäžçã§ã¯ãããã°ã©ããŒã¯ãã®ååšã«ãã£ãšææã«ãªãã§ãããã
@josharian main
ãerror
$ãè¿ãããšã«ã€ããŠïŒåãå¹æãåŸãã®ã«å¿
èŠãªã®ã¯ãããªãã®å°ããªãã«ããŒé¢æ°ã ãã®ããã§ãã main
ã®çœ²åãå€æŽããããšãæ£åœåããããã©ããã¯ããããŸããã
ãfoobarãã®äŸã«ã€ããŠïŒããã¯æªãäŸã§ãã ç§ã¯ãããããããå€æŽããå¿ èŠããããŸãã ãããæã£ãŠããŠãããŠããããšãã
defer fmt.HandleErrorf(&err, âfoobar: %vâ, err)
err
ã®è©äŸ¡ãæ©ããããããå®éã«ã¯ããã¯æ£ãããããŸããã ãããåé¿ããæ¹æ³ã¯ããã€ããããŸãããå
ã®ïŒæ¬ é¥ããããšæãïŒHandleErrorfã»ã©ã¯ãªãŒã³ãªæ¹æ³ã¯ãããŸããã ããçŸå®çãªå®äŸã1ã€ã2ã€ã®ãã«ããŒé¢æ°ãããã°ãããšæããŸãã
ç·šéïŒãã®åæè©äŸ¡ã®ãã°ã¯äŸã«ååšããŸã
ããã¥ã¡ã³ãã®çµããè¿ãïŒ
defer fmt.HandleErrorf(&err, "copy %s %s: %v", src, dst, err)
@adgã¯ãã try
ã¯ãäŸã§äœ¿çšããŠãããšããã«äœ¿çšã§ããŸãã ç§ã¯ããªãã®ã³ã¡ã³ããåãããŸãïŒååä»ãã®è¿åã¯çŸç¶ã®ãŸãŸã§ãã
ãšã©ãŒæååãä»ããŠå ã®æååãåç §ããæ°ãããã®ãäœæããã ãã§ãªãããšã©ãŒã䜿çšããŠããããçš®é¡ã®ããšãå®è¡ãããå ŽåããããŸãã
try
ã¯ããšã©ãŒã«å¯ŸããŠäººã
ããããããšæããã¹ãŠã®çš®é¡ã®ããšãåŠçããããšããã®ã§ã¯ãªãã倧å¹
ã«åçŽåããããã®å®çšçãªæ¹æ³ãèŠã€ããããšãã§ãããã®ã ããåŠçããŸãã ç§ã®check
ã®äŸãåãããã«é²ãã§ãããšæããŸãã
ç§ã®çµéšã§ã¯ããšã©ãŒåŠçã³ãŒãã®æãäžè¬çãªåœ¢åŒã¯ãåºæ¬çã«ã¹ã¿ãã¯ãã¬ãŒã¹ãè¿œå ããã³ãŒãã§ãããã³ã³ããã¹ããè¿œå ãããããšããããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãããã°ã«ãšã£ãŠéåžžã«éèŠã§ããããšãããããŸãããããã§ã¯ãã³ãŒãå šäœã§ãšã©ãŒã¡ãã»ãŒãžã远跡ããŸãã
ããããããããä»ã®ææ¡ããã¹ãŠã®ãšã©ãŒã«ã¹ã¿ãã¯ãã¬ãŒã¹ãè¿œå ããã§ããããïŒ éã«è¿·ã£ãã
@adgã瀺ããäŸã§ã¯ã2ã€ã®æœåšçãªé害ããããŸãããã³ã³ããã¹ãã¯ãããŸããã newScanner
ãšRunMigrations
èªäœããã©ã¡ããééã£ãŠãããã瀺ãã¡ãã»ãŒãžãæäŸããªãå Žåã¯ãæšæž¬ããå¿
èŠããããŸãã
@adgã瀺ããäŸã§ã¯ã2ã€ã®æœåšçãªé害ããããŸãããã³ã³ããã¹ãã¯ãããŸããã newScannerãšRunMigrationsèªäœããã©ã¡ããééã£ãŠãããã瀺ãã¡ãã»ãŒãžãæäŸããªãå Žåã¯ãæšæž¬ããå¿ èŠããããŸãã
ããã§ããããããã®ç¹å®ã®ã³ãŒãã§è¡ã£ãèšèšäžã®éžæã§ãã ã³ãŒãã®ä»ã®éšåã§ãšã©ãŒãé »ç¹ã«ã©ããããŸãã
@deanveloperãä»ã®äººãã¡ãšåãããã«ããããã°ãé£ãããªããããããªããšããæžå¿µãå
±æããŠããŸãã 䜿çšããªãããšãéžæã§ããã®ã¯äºå®ã§ããããµãŒãããŒãã£ã®äŸåé¢ä¿ã®ã¹ã¿ã€ã«ã¯ç§ãã¡ã®ç®¡çäžã«ã¯ãããŸããã
ç¹°ãè¿ãã®å°ãªãif err := ... { return err }
ãäž»èŠãªãã€ã³ãã§ããå Žåã httpsïŒ//github.com/golang/go/issues/27794ãææ¡ããŠããããã«ããæ¡ä»¶ä»ããªã¿ãŒã³ãã§ååãã©ããçåã«æããŸãã
return nil, err if f, err := os.Open(...)
return nil, err if _, err := os.Write(...)
?
ã¯try
ãããé©ããŠãããšæããŸãããŸãããšã©ãŒã®ããã«åžžã«defer
ã远跡ããªããã°ãªããªãããšã泚æãå¿
èŠã§ãã
ããã«ããã try/catch
æ°žä¹
ã«äœ¿çšããäŸå€ãçºçããå Žåã®ã²ãŒããéããããŸãã
ããã«ãããtry / catchãæ°žä¹ ã«äœ¿çšããŠäŸå€ãçºçããå Žåã®ã²ãŒããéããããŸãã
ç§ã¯ããã§å€§äžå€«ã§ãã
ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã«é¢ããŠäžèšã§æèµ·ãããæžå¿µã®ããã€ãã«åæããŸãã ãšã©ãŒãè¿ãã ãã§ãªããåžžã«ã³ã³ããã¹ãã§è£ 食ããŠããè¿ãããã«ããã£ãããšç§»è¡ããããšããŠããŸãã ãã®ææ¡ã§ã¯ãååä»ãã®æ»ããã©ã¡ãŒã¿ã䜿çšããããã«é¢æ°ãå®å šã«å€æŽããå¿ èŠããããŸãïŒè£žã®æ»ããã»ãšãã©äœ¿çšããªããããå¥åŠã«æããŸãïŒã
@griesemerãèšãããã«ïŒ
ç¹°ãè¿ããŸããããã®ææ¡ã¯ãã¹ãŠã®ãšã©ãŒåŠçç¶æ³ã解決ããããšã¯ããŠããŸããã ã»ãšãã©ã®å Žåãåºæ¬çã«æ¬¡ã®ããã«ãªã£ãŠããã³ãŒããè©ŠããŠã¿ãã®ã¯çã«ããªã£ãŠãããšæããŸãã
aãbãcã... errïŒ= tryïŒsomeFunctionCallïŒïŒïŒ
errïŒ= nil {ã®å Žå
æ»ã...ããšã©ãŒ
}
ãã®ããã«èŠããã³ãŒãã¯éåžžã«ãããããããŸãã ãããŠããã®ããã«èŠãããã¹ãŠã®ã³ãŒããããå€ãã®ãšã©ãŒåŠçãå¿ èŠãšããããã§ã¯ãããŸããã ãŸããdeferãæ£ãããªãå Žåã§ããifã¹ããŒãã¡ã³ãã䜿çšã§ããŸãã
ã¯ãããããè¯ãããšã§ã¯ãããŸããããæ £çšçãªã³ãŒãã¯åžžã«ãšã©ãŒãã©ãã/è£ é£ŸããŸããïŒ ããããstdlibã«ã³ã³ããã¹ã/ã©ãããšã©ãŒãè¿œå ããããã®æŽç·Žããããšã©ãŒåŠçã¡ã«ããºã ãå°å ¥ããŠããçç±ã ãšæããŸãã ç§ãèŠãããã«ããã®ææ¡ã¯æãåºæ¬çãªãŠãŒã¹ã±ãŒã¹ã®ã¿ãèæ ®ããŠããããã§ãã
ããã«ããã®ææ¡ã¯ã延æåŒã³åºãã§ååä»ããã©ã¡ãŒã¿ãŒã䜿çšããŠã_åäžã®å Žæ_ã§è€æ°ã®å¯èœãªãšã©ãŒæ»ããµã€ããã©ãã/è£ é£Ÿããå Žåã®ã¿ãæ±ããŸãã
ãã ããåäžã®é¢æ°ã§ããŸããŸãªãšã©ãŒã«ããŸããŸãªã³ã³ããã¹ããè¿œå ããå¿ èŠãããå Žåã¯ãäœãããŸããã ããšãã°ãDBãšã©ãŒãè£ é£ŸããŠããšã©ãŒã®çºçå ã«é¢ãã詳现æ å ±ãååŸããããšãéåžžã«éèŠã§ãïŒã¹ã¿ãã¯ãã¬ãŒã¹ããªããšä»®å®ïŒã
ããã¯ç§ãæã£ãŠããå®éã®ã³ãŒãã®äŸã§ã-
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
if err != nil {
return err
}
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
if err != nil {
tx.Rollback()
return fmt.Errorf("insert table: %w", err)
}
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
if err != nil {
tx.Rollback()
return fmt.Errorf("insert table2: %w", err)
}
return tx.Commit()
}
ææ¡ã«ãããšïŒ
ãšã©ãŒã®å¢å€§ãŸãã¯ã©ããã³ã°ãå¿ èŠãªå Žåã¯ã2ã€ã®ã¢ãããŒãããããŸããå®èšŒæžã¿ã®ifã¹ããŒãã¡ã³ãã䜿çšãããããŸãã¯deferã¹ããŒãã¡ã³ãã䜿çšããŠãšã©ãŒãã³ãã©ãŒãã宣èšãããŸãã
ããã¯ãå®èšŒæžã¿ã®ifã¹ããŒãã¡ã³ãã«åºå·ããããšããã«ããŽãªãŒã«åé¡ããããšæããŸãã ããã«ã察åŠããããã«ææ¡ãæ¹åã§ããããšãé¡ã£ãŠããŸãã
GoããŒã ããžã§ããªãã¯ã¹ãåªå
ããããšã匷ããå§ãããŸããããã¯ãGoãæãæ¹å€ãèãå Žæã§ããããšã©ãŒåŠçãåŸ
ã€ããã§ãã ä»æ¥ã®ãã¯ããã¯ã¯ããã»ã©èŠçã§ã¯ãããŸããïŒ go fmt
ã¯ãããäžåã«äžŠã¹ãå¿
èŠããããŸãïŒã
try()
ã®æŠå¿µã«ã¯ããã§ãã¯/ãã³ãã«ããã®check
ã®ãã¹ãŠã®åé¡ããããŸãã
Goã®ããã«ã¯èªããŸããã 人ã
ã¯ãGoã®ããã«èŠããã®ã§ãåŸç¶ã®nilãã¹ããªãã§ä»£å
¥æ§æãæãã§ããŸãã ãã§ãã¯/åŠçã«å¯Ÿãã13ã®åå¥ã®å¿çãããã瀺åããŸããã ããã§_å®æçãªããŒã_ãåç
§ããŠãã ããïŒ
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes
f, # := os.Open(...) // return on error
f, #panic := os.Open(...) // panic on error
f, #hname := os.Open(...) // invoke named handler on error
// # is any available symbol or unambiguous pair
ãšã©ãŒãè¿ãé¢æ°åŒã³åºãããã¹ããããšãæäœã®é åºããããã«ãããªãããããã°ã劚ããããŸãã ãšã©ãŒãçºçãããšãã®ç¶æ³ãã€ãŸãåŒã³åºãã·ãŒã±ã³ã¹ã¯æ確ã§ããå¿
èŠããããŸãããããã§ã¯ããã§ã¯ãããŸããã
try(step4(try(step1()), try(step3(try(step2())))))
ããã§ãèšèªãçŠæ¢ããŠããããšãæãåºããŠãã ããã
f(t ? a : b)
ããã³f(a++)
ã³ã³ããã¹ããªãã§ãšã©ãŒãè¿ãã®ã¯ç°¡åã§ãã ãã§ãã¯/ãã³ãã«ã®äž»ãªçç±ã¯ãã³ã³ããã¹ãåãä¿é²ããããšã§ããã
ããã¯ãã¿ã€ãerror
ãšæåŸã®æ»ãå€ã«é¢é£ä»ããããŠããŸãã ä»ã®æ»ãå€/ã¿ã€ãã®äŸå€ç¶æ
ãæ€æ»ããå¿
èŠãããå Žåã¯ã if errno := f(); errno != 0 { ... }
ã«æ»ããŸãã
è€æ°ã®çµè·¯ãæäŸããŠããŸããã ã¹ãã¬ãŒãžãŸãã¯ãããã¯ãŒã¯APIãåŒã³åºãã³ãŒãã¯ã誀ã£ãå
¥åãäºæããªãå
éšç¶æ
ã«ãããšã©ãŒãšã¯ç°ãªãæ¹æ³ã§ãã®ãããªãšã©ãŒãåŠçããŸãã ç§ã®ã³ãŒãã¯ããããã®1ã€ãreturn err
ãããã¯ããã«é »ç¹ã«å®è¡ããŸãã
@gopherbot add Go2ãLanguageChange
rust
ã®ããã«ã ?
ã ãã䜿çšããŠçµæãã¢ã³ã©ããããã®ã¯ã©ãã§ãã
tryïŒïŒã®åŒã³åºãã«æççãªçç±ã¯ã2ã€ã®æé»çãªãã€ã³ãã£ã³ã°ã§ããå¯èœæ§ããããŸãã æ»ãå€ãšã©ãŒã®ãã€ã³ãã£ã³ã°ãštryïŒïŒã®åŒæ°ã確èªã§ããŸããã tryïŒïŒã«ã€ããŠã¯ãæ»ãå€ã«ãšã©ãŒãããåŒæ°é¢æ°ã§tryïŒïŒã䜿çšããå¿ èŠããããšããã«ãŒã«ãäœæã§ããŸãã ããããæ»ãå€ãžã®ãã€ã³ãã¯ããã§ã¯ãããŸããã ãããã£ãŠããŠãŒã¶ãŒããã®ã³ãŒãã®æ©èœãç解ããã«ã¯ãããå€ãã®è¡šçŸãå¿ èŠã ãšæããŸãã
func doSomething() (int, %error) {
f := try(foo())
...
}
%error
ãå«ãŸããŠããªãå ŽåãtryïŒïŒã䜿çšããããšã¯ã§ããŸãããæ¢åã®æ§æã«æ°ããèŠä»¶/æ©èœãè¿œå ããããšã¯å°é£ã§ãã
æ£çŽãªãšãããfooïŒïŒã«ãïŒ errorãå¿ èŠã ãšæããŸãã
ã«ãŒã«ããã1ã€è¿œå
詳现ãªèšèšããã¥ã¡ã³ãã§ã以åã®å埩ã§ãtryçµã¿èŸŒã¿é¢æ°ã«ãšã©ãŒãã³ãã©ãŒãæž¡ãããšãææ¡ãããŠããããšã«æ°ä»ããŸããã ãã®ãããªïŒ
handler := func(err error) error {
return fmt.Errorf("foo failed: %v", err) // wrap error
}
f := try(os.Open(filename), handler)
ãŸãã¯ããã«è¯ãããã®ããã«ïŒ
f := try(os.Open(filename), func(err error) error {
return fmt.Errorf("foo failed: %v", err) // wrap error
})
ããã¥ã¡ã³ãã«èšèŒãããŠããããã«ãããã¯ããã€ãã®çåãæèµ·ããŸããããã®ãããªãšã©ãŒãã³ãã©é¢æ°ãŸãã¯ã¯ããŒãžã£ããªãã·ã§ã³ã§æå®ããå¯èœæ§ãç¶æããŠããã°ããã®ææ¡ã¯ã¯ããã«æãŸãããæçšã§ãããšæããŸãã
第äºã«ãé¢æ°ãæ»ãåå ãšãªãå¯èœæ§ã®ããçµã¿èŸŒã¿ãæ°ã«ãªããŸããããå°ãèªè»¢è»ã«ä¹ãã«ã¯ããtryããšããååã¯çãããŠãæ»ãå¯èœæ§ãããããšã瀺åã§ããŸããã ãããã£ãŠã attempt
ã®ãããªé·ãååã®æ¹ãç§ã«ã¯é©ããŠããããã§ãã
ç·šéïŒç¬¬3ã«ãçæ³çã«ã¯ãgoèšèªã¯æåã«ãžã§ããªãã¯ã¹ãååŸããå¿ èŠããããŸããéèŠãªãŠãŒã¹ã±ãŒã¹ã¯ããã®tryé¢æ°ããžã§ããªãã¯ã¹ãšããŠå®è£ ã§ããããšã§ããããã«ããããã€ã¯ã·ã§ãã£ã³ã°ãçµäºã§ãã誰ããèªåã®å¥œã¿ã®ãšã©ãŒåŠçãååŸã§ããŸãã
ããã«ãŒãã¥ãŒã¹ã«ã¯ããã€ãã®ãã€ã³ãããããŸãã try
ã¯éåžžã®é¢æ°ã®ããã«åäœããªãïŒæ»ãããšãã§ããïŒã®ã§ãé¢æ°ã®ãããªæ§æãäžããã®ã¯è¯ããããŸããã return
ãŸãã¯defer
æ§æã®æ¹ãé©åã§ãã
func CopyFile(src, dst string) (err error) {
r := try os.Open(src)
defer r.Close()
w := try os.Create(dst)
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a âtryâ fails
}
}()
try io.Copy(w, r)
try w.Close()
return nil
}
@sheerunããã«å¯Ÿããäžè¬çãªåè«ã¯ã panic
ãå¶åŸ¡ãããŒãå€æŽããçµã¿èŸŒã¿é¢æ°ã§ãããšããããšã§ãã ç§ã¯å人çã«ããã«åæããŸããããããã¯æ£ããã§ãã
panic(...)
ã¯ã return
ãé¢æ°ããæãåºãå¯äžã®æ¹æ³ã§ãããšããèŠåã«å¯Ÿããæ¯èŒçæ確ãªäŸå€ã§ãïŒãããã¯æå³ãããŠããŸããïŒã 3åã®1ãè¿œå ããæ£åœãªçç±ãšããŠãã®ååšã䜿çšããã¹ãã§ã¯ãªããšæããŸãããã®ã»ãã³ãã£ã¯ã¹ã䜿çšããŠã tryf
ã®ãããªãªãã·ã§ã³ã®æ¡åŒµé¢æ°ã䜿çšããŠããªã¢ã³ããè¿œå ã§ããå¯èœæ§ããããŸãã
func tryf(t1 T1, t1 T2, ⊠tn Tn, te error, fn func(error) error) (T1, T2, ⊠Tn)
ããã翻蚳ããŸã
x1, x2, ⊠xn = tryf(f(), func(err error) { return fmt.Errorf("foobar: %q", err) })
ããã«
t1, ⊠tn, te := f()
if te != nil {
if fn != nil {
te = fn(te)
}
err = te
return
}
ããã¯ïŒ try
ã䜿çšãã代ããã«ïŒæ瀺çãªéžæã§ããããããã®èšèšã®ä»¥åã®ããŒãžã§ã³ã®è³ªåã«å¯Ÿãã劥åœãªåçãèŠã€ããããšãã§ããŸãã ããšãã°ãæ¡åŒµé¢æ°ãnilã®å Žåãäœãããã«å
ã®ãšã©ãŒãè¿ãã ãã§ãã
try
ãåŸæ¥ã®ãšã©ãŒåŠçã«åã£ãŠä»£ãããçµæãšããŠãšã©ãŒãã¹ãžã®æ³šéä»ããããå°é£ã«ãªãã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
ã¡ãã»ãŒãžããã°ã«èšé²ãããã¬ã¡ããªã«ãŠã³ã¿ãŒãæŽæ°ããããšã§ãšã©ãŒãåŠçããã³ãŒãã¯ããã¹ãŠãtry
ããããšãæåŸ
ããŠãããªã³ã¿ãŒãšéçºè
ã®äž¡æ¹ãããæ¬ é¥ããããäžé©åã§ãããšèŠãªãããŸãã
a, b, err := doWork()
if err != nil {
updateCounters()
writeLogs()
return err
}
Goã¯éåžžã«ç€Ÿäº€çãªèšèªã§ãããããŒã«ïŒfmtãlintãªã©ïŒã«ãã£ãŠäžè¬çãªã€ãã£ãªã ãé©çšãããŸãã ãã®ã¢ã€ãã¢ã®ç€ŸäŒç圱é¿ã念é ã«çœ®ããŠãã ãã-ã©ãã§ãããã䜿ããããšæãåŸåããããŸãã
@politician ãç³ãèš³ãããŸããããããªããæ¢ããŠããèšèã¯_social_ã§ã¯ãªã_opinionated_ã§ãã Goã¯ç¬åµçãªããã°ã©ãã³ã°èšèªã§ãã æ®ãã®éšåã«ã€ããŠã¯ãç§ã¯ããªããåŸãŠãããã®ã«ã»ãšãã©åæããŸãã
GodepãããŸããŸãªãªã³ã¿ãŒã®ãããª@beoranã³ãã¥ããã£ããŒã«ã¯ãGoãæèŠãããã瀟äŒçã§ãããèšèªã䜿çšãããã©ãã®å€ãããã®çµã¿åããã«ç±æ¥ããããšã瀺ããŠããŸãã ããŸãããã°ãç§ãã¡ã¯äž¡æ¹ãšãtry
ã次ã®ãã©ãã§ãã£ãŠã¯ãªããªãããšã«åæããããšãã§ããŸãã
@politicianæ確ã«ããŠãããŠããããšããç§ã¯ããããã®ããã«ç解ããŠããŸããã§ããã ãã©ããé¿ããããšããã¹ãã ãšããããšã«ã¯ç¢ºãã«åæã§ããŸãã
ç§ã¯ããã«ã€ããŠæ··ä¹±ããŠããŸãã
ããã°ããïŒãšã©ãŒã¯å€ã§ããç§ã®èŠ³ç¹ããã¯ãç¡èŠãããªãããã«è©äŸ¡ãããããã«èšèšãããŠããŸãã
ãããŠãRop Pikeãèšã£ãããšã¯ããå€ãããã°ã©ã ããããšãã§ãããšã©ãŒã¯å€ã§ããããããšã©ãŒãããã°ã©ã ããããšãã§ããããšä¿¡ããŠããŸãã
error
ãexception
ãšèŠãªãã¹ãã§ã¯ãããŸãããããã¯ãæèã ãã§ãªããã³ãŒãã£ã³ã°ã®ããã«ãè€éããã€ã³ããŒããããããªãã®ã§ãã
ããã®èšèªã䜿çšããŠããšã©ãŒåŠçãç°¡çŽ åããŠãã ãããã -ãããã€ã¯
ããã«ããã®ã¹ã©ã€ãã確èªã§ããŸã
if
ãä»ãããšã©ãŒãã§ãã¯ãç¹ã«åä»ãªç¶æ³ã®1ã€ã¯ããã¡ã€ã«ãéãããšãã§ãïŒNFSãªã©ïŒã .Close()
ãããšã©ãŒãè¿ãããå¯èœæ§ãããå ŽåãçŸåšã次ã®ããã«èšè¿°ããŠãããšæããŸãã
r, err := os.Open(src)
if err != nil {
return err
}
defer func() {
// maybe check whether a previous error occured?
return r.Close()
}()
defer try(r.Close())
ã¯ããã®ãããªãšã©ãŒãåŠçããããã®ç®¡çå¯èœãªæ§æãæã€ããã®è¯ãæ¹æ³ã§ããããïŒ å°ãªããšãã r.Close()
ãšw.Close()
ããã®ãšã©ãŒãç¡èŠããªãããã«ãææ¡ã®CopyFile()
ã®äŸãäœããã®æ¹æ³ã§èª¿æŽããããšã¯çã«ããªã£ãŠããŸãã
@seehuhné 延é¢æ°ã«ã¯æ»ãåããªããããäŸã¯ã³ã³ãã€ã«ãããŸããã
func doWork() (err error) {
r, err := os.Open(src)
if err != nil {
return err
}
defer func() {
err = r.Close() // overwrite the return value
}()
}
æåŸ ã©ããã«åäœããŸãã ããŒã¯ååä»ãã®æ»ãå€ã§ãã
ç§ã¯ææ¡ã奜ãã§ããã @ seehuhnã®äŸãåæ§ã«å¯ŸåŠããå¿ èŠããããšæããŸãïŒ
defer try(w.Close())
ãšã©ãŒããŸã èšå®ãããŠããªãå Žåã«ã®ã¿ãCloseïŒïŒãããšã©ãŒãè¿ããŸãã
ãã®ãã¿ãŒã³ã¯ãšãŠãé »ç¹ã«äœ¿çšãããŸã...
ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã«é¢ããæžå¿µã«åæããŸãã ããã¯ããšã©ãŒã¡ãã»ãŒãžãéåžžã«ããããããïŒãããŠæ確ã«ïŒä¿ã¡ããããã°ããã»ã¹ã容æã«ãããã¹ããã©ã¯ãã£ã¹ã®1ã€ã ãšæããŸãã
ç§ãæåã«èããã®ã¯ã fmt.HandleErrorf
ãtryf
é¢æ°ã«çœ®ãæããããšã§ããããã®é¢æ°ã¯ããšã©ãŒã®åã«è¿œå ã®ã³ã³ããã¹ããä»ããŸãã
func tryf(t1 T1, t1 T2, ⊠tn Tn, te error, ts string) (T1, T2, ⊠Tn)
ããšãã°ïŒç§ãæã£ãŠããå®éã®ã³ãŒãããïŒïŒ
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil {
return nil, errors.WithMessage(err, "load config dir")
}
b := bytes.NewBuffer(nil)
if err = templates.ExecuteTemplate(b, "main", c); err != nil {
return nil, errors.WithMessage(err, "execute main template")
}
buf, err := format.Source(b.Bytes())
if err != nil {
return nil, errors.WithMessage(err, "format main template")
}
target := fmt.Sprintf("%s.go", filename(pkgPath))
if err := ioutil.WriteFile(target, buf, 0644); err != nil {
return nil, errors.WithMessagef(err, "write file %s", target)
}
// ...
}
次ã®ããã«å€æŽã§ããŸãã
func (c *Config) Build() error {
pkgPath := tryf(c.load(), "load config dir")
b := bytes.NewBuffer(nil)
tryf(emplates.ExecuteTemplate(b, "main", c), "execute main template")
buf := tryf(format.Source(b.Bytes()), "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
tryf(ioutil.WriteFile(target, buf, 0644), fmt.Sprintf("write file %s", target))
// ...
}
ãŸãã¯ã @ agnivadeã®äŸããšããšïŒ
func (p *pgStore) DoWork() (err error) {
tx := tryf(p.handle.Begin(), "begin transaction")
defer func() {
if err != nil {
tx.Rollback()
}
}()
var res int64
tryf(tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res), "insert table")
_, = tryf(tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res), "insert table2")
return tryf(tx.Commit(), "commit transaction")
}
ãããã @ josharianã¯ããã®è§£æ±ºçã«èºèºããè¯ãç¹ãæèµ·ããŸããã
ãã ããèšè¿°ãããŠããããã«ãfmtã¹ã¿ã€ã«ã®ãã©ãŒããããããã±ãŒãžããèšèªèªäœã«ç§»åããã¯ãŒã ã®çŒ¶ãéããŸãã
ç§ã¯ãã®ææ¡ã«å®å šã«è³æããŠãããå€ãã®äŸã§ãã®å©ç¹ãèŠãããšãã§ããŸãã
ãã®ææ¡ã«é¢ããç§ã®å¯äžã®æžå¿µã¯ã try
ã®åœåã§ããä»ã®èšèªãšã®é¢ä¿ã¯ãä»ã®èšèªããæ¥ããšãã®ç®çã«ã€ããŠã®éçºè
ã®èªèãæªããå¯èœæ§ããããšæããŠããŸãã Javaãããã§èŠã€ãããŸãã
ç§ã«ãšã£ãŠã¯ããã«ãã€ã³ãpass
ãšåŒã¶æ¹ããããšæããŸãã ããã«ãããäœãèµ·ãã£ãŠããã®ããããããè¡šãããšãã§ãããšæããŸãã çµå±ã®ãšããããšã©ãŒãåŠçããŠããã®ã§ã¯ãªããåŒã³åºãå
ãåŠçã§ããããã«ãšã©ãŒãè¿ããŸãã try
ã¯ããšã©ãŒãåŠçããããšããå°è±¡ãäžããŸãã
ããã¯ãäž»ã«ã察åŠããããšããŠããåé¡ïŒãéåžžããšã©ãŒåŠçã«é¢é£ããã¹ããŒãã¡ã³ãã®å®åæãïŒãç§ã«ãšã£ãŠåé¡ã§ã¯ãªããããç§ããã¯äžæºã§ãã ãã¹ãŠã®ãšã©ãŒãã§ãã¯ãåçŽã«if err != nil { return err }
ã§ããå Žåããã®ããã«ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãè¿œå ããããšã«äœããã®äŸ¡å€ããããŸãïŒãã ããGoã¯åŸåã«ãã£ãŠæ¯èŒçã·ã¥ã¬ãŒããªãŒã®èšèªã§ãïŒã
å®éãnil以å€ã®ãšã©ãŒãçºçããå Žåã«ç§ãããããããšã¯ãç¶æ³ã«ãã£ãŠããªãç°ãªããŸãã ãã¶ãç§ã¯t.Fatal(err)
ãããã§ãã 食ãã¡ãã»ãŒãžreturn fmt.Sprintf("oh no: %v", err)
ãè¿œå ãããã®ãããããŸããã ãã¶ãããšã©ãŒããã°ã«èšé²ããŠç¶è¡ããŸãã ãã¶ããSafeWriterãªããžã§ã¯ãã«ãšã©ãŒãã©ã°ãèšå®ããŠç¶è¡ããäžé£ã®æäœã®æåŸã«ãã©ã°ããã§ãã¯ããŸãã å€åç§ã¯ä»ã®è¡åãåãå¿
èŠããããŸãã ãããã¯ããããtry
èªååã§ããŸããã ãããã£ãŠã try
ã®åŒæ°ãããã¹ãŠã®if err != nil
ãããã¯ãåé€ãããšãããã®ã§ããå Žåããã®åŒæ°ã¯æå¹ã§ã¯ãããŸããã
ãããã®_äžéš_ãæé€ããŸããïŒ ãã¡ããã ããã¯ç§ã«ãšã£ãŠé
åçãªææ¡ã§ããïŒ ãŸãã ç§ã¯æ¬åœã«å¿é
ããŠããŸããã ç§ã«ãšã£ãŠã if err != nil
ã¯ãäžæ¬åŒ§ãdefer
ã®ããã«ãGoã®äžéšã«ãããŸããã GoãåããŠäœ¿çšãã人ã«ãšã£ãŠã¯åé·ã§å埩çã«èŠããããšã¯ç解ããŠããŸãããGoãåããŠäœ¿çšãã人ã¯ãããŸããŸãªçç±ãããèšèªãåçã«å€æŽããã®ã«æé©ãªå Žæã§ã¯ãããŸããã
Goã®å€§å¹ ãªå€æŽã®åºæºã¯ãåŸæ¥ãææ¡ãããå€æŽã¯ãïŒAïŒéèŠã§ãããïŒBïŒå€ãã®äººã ã«åœ±é¿ãåãŒããïŒCïŒææ¡ã«ãã£ãŠååã«è§£æ±ºãããåé¡ã解決ããå¿ èŠããããšãããã®ã§ããã ç§ã¯ãããã®3ã€ã®åºæºã®ãããã«ã確信ãæãŠãŸããã Goã®ãšã©ãŒåŠçã¯ãã®ãŸãŸã§ãšãŠãæºè¶³ããŠããŸãã
@peterbourgonãš@deanveloperããšã³ãŒããããã«ãGoã«ã€ããŠã®ç§ã®ãæ°ã«å ¥ãã®1ã€ã¯ãã³ãŒããããŒãæ確ã§ãããpanicïŒïŒãPythonã®ããã«æšæºã®ãããŒå¶åŸ¡ã¡ã«ããºã ã®ããã«æ±ãããªãããšã§ãã
ãããã¯ã«é¢ããè°è«ã«é¢ããŠã¯ããããã¯ïŒïŒã¯äŸ¡å€ããªããããã»ãšãã©ã®å Žåãåç¬ã§è¡ã«è¡šç€ºãããŸãã fmt.Println(panic("oops"))
ã¯ã§ããŸããã ããã«ããããã®å¯èŠæ§ã倧å¹
ã«åäžãã人ã
ãèããŠãããããã¯ããã«try()
ã«å¹æµãããã®ã«ãªããŸãã
é¢æ°çšã«å¥ã®ãããŒå¶åŸ¡æ§é ãããå Žåã¯ããããè¡ã®å·Šç«¯ã®é ç®ã§ããããšãä¿èšŒãããŠããã¹ããŒãã¡ã³ãã§ããããšã_far_ã«ãªããŸãã
ææ¡ã®äŸã®1ã€ã¯ãç§ã«ãšã£ãŠåé¡ãçªãæ¢ããŸãã
func printSum(a, b string) error {
fmt.Println(
"result:",
try(strconv.Atoi(a)) + try(strconv.Atoi(b)),
)
return nil
}
å¶åŸ¡ãããŒã¯å®éã«ã¯ããŸãç®ç«ããªããªããéåžžã«ãããŸãã«ãªããŸãã
ããã¯ããã¹ãŠã®ãšã©ãŒãæ瀺çã«åŠçããå¿ èŠããããšããRobPikeã®åœåã®æå³ã«ãåããŠããŸãã
ããã«å¯Ÿããåå¿ã¯ãããã§ã¯äœ¿çšããªããããšã§ãããåé¡ã¯ãä»ã®ã©ã€ãã©ãªãããã䜿çšãããããã°ãèªã¿åãã䜿çšãããåé¡ã«ãªãããšã§ãã ããã«ãããç§ã®äŒç€Ÿã¯go 2ãæ¡çšããã try
ã䜿çšããªãã©ã€ãã©ãªã®ã¿ã䜿çšãå§ããããã«ãªããŸãã ç§ãããã ãã§ã¯ãªãå Žåãããã¯é€ç®a-la python2 / 3ã«ã€ãªããå¯èœæ§ããããŸãã
ãŸãã try
ã®ååã¯ãæçµçã«catch
ãæ§æã«è¡šç€ºãããããšãèªåçã«æå³ããJavaã«æ»ããŸãã
ã§ããããããããã¹ãŠã®ããã«ãç§ã¯ãã®ææ¡ã«_匷ã_å察ããŠããŸãã
try
ã®ååã奜ãã§ã¯ãããŸããã ããã¯ã倱æã®ãªã¹ã¯ãé«ãäœããããããšãã_è©Šã¿_ãæå³ããŸãïŒç§ã¯è±èªãæ¯åœèªãšããªãããã_try_ã«å¯ŸããŠæåçãªåèŠããããããããŸããïŒãããŸããªå€±æãäºæ³ãããå Žåã¯ã代ããã«try
ã䜿çšãããŸãïŒãšã©ãŒåŠçã®åé·æ§ãæžãããããšããåæ©ïŒãããŠæ¥œèŠ³çã§ãã ããã«ããã®ææ¡ã®try
ã¯ãå®éã«ã¯ãšã©ãŒã_ãã£ãã_ããŠæ©æã«è¿ããŸãã @HiImJCã®pass
ã®ææ¡ã奜ãã§ãã
ååã®ã»ãã«ã return
ã®ãããªã¹ããŒãã¡ã³ããåŒã®éäžã«é ãããŠããã®ã¯æ°ãŸããã§ãã ããã¯GoãããŒã¹ã¿ã€ã«ãå£ããŸãã ã³ãŒãã¬ãã¥ãŒãé£ãããªããŸãã
äžè¬ã«ããã®ææ¡ã¯ãã³ãŒããçãããããã®æŠåšãæã¡ããšã©ãŒãã©ããããåªåãããçç±ãããã«å°ãªãæ æ°ãªããã°ã©ããŒã«ã®ã¿å©çãããããããšãããããŸãã ãŸããã¬ãã¥ãŒãé£ãããªãïŒè¡šçŸã®éäžã§æ»ãïŒã®ã§ããã®ææ¡ã¯å²ç¢ã®ã倧èŠæš¡ãªããã°ã©ãã³ã°ãã®ç®çã«åãããšæããŸãã
èšèªã説æãããšãã«ç§ãäžè¬çã«èšãGoã«ã€ããŠã®ç§ã®ãæ°ã«å ¥ãã®1ã€ã¯ãã»ãšãã©ã®å Žåãç©äºãè¡ãæ¹æ³ã¯1ã€ãããªããšããããšã§ãã ãã®ææ¡ã¯ãåãããšãè¡ãããã®è€æ°ã®æ¹æ³ãæäŸããããšã«ããããã®ååã«å°ãåããŠããŸãã ç§ã¯å人çã«ãããã¯å¿ èŠã§ã¯ãªããèšèªã®åçŽããšèªã¿ããããå¢ãã®ã§ã¯ãªããåãé€ãã ãããšæããŸãã
ç§ã¯å
šäœçã«ãã®ææ¡ã奜ãã§ãã defer
ãšã®çžäºäœçšã¯ãè¿œå ã®ã³ã³ããã¹ããè¿œå ããªããããšã©ãŒãè¿ã人éå·¥åŠçãªæ¹æ³ãæäŸããã®ã«ååã§ããããã«æãããŸãã @josharianããã©ããããããšã©ãŒã¡ãã»ãŒãžã«å
ã®ãšã©ãŒãå«ããæ¹æ³ã«ã€ããŠææããåé¡ã«å¯ŸåŠããã®ã¯è¯ãããšã§ããã
æ¬ ããŠããã®ã¯ããããããŒãã«äžã®ãšã©ãŒæ€æ»ææ¡ãšçžäºäœçšãã人éå·¥åŠçãªæ¹æ³ã§ãã APIã¯ãã©ã®ã¿ã€ãã®ãšã©ãŒãè¿ããã«ã€ããŠéåžžã«æ éã«æ€èšããå¿ èŠããããããã©ã«ãã¯ãããããè¿ããããšã©ãŒã¯ãŸã£ããæ€æ»ã§ããªããã¯ãã§ãã ããããã°ãé¢æ°ã·ã°ããã£ã«ãã£ãŠææžåãããŠããããã«ããšã©ãŒãæ£ç¢ºã«æ€æ»ã§ããç¶æ ã«ç°¡åã«ç§»è¡ã§ããã¯ãã§ãïŒãç¶æ³Aã§ã¯çš®é¡Xã®ãšã©ãŒãå ±åããç¶æ³Bã§ã¯çš®é¡Yã®ãšã©ãŒãå ±åããŸããïŒã
æ®å¿µãªãããçŸæç¹ã§ã¯ããã®ææ¡ã¯æã人éå·¥åŠçãªãªãã·ã§ã³ãïŒç§ã«ãšã£ãŠïŒæãæãŸãããªããã®ã«ããŸãã ä»»æã®ãšã©ãŒã®çš®é¡ãç²ç®çã«ééããŸãã ããã¯ãè¿ããããšã©ãŒã®çš®é¡ãAPIã®ãŠãŒã¶ãŒãããããã©ã®ããã«æ¶è²»ãããã«ã€ããŠèããªãããã«ãããããæãŸãããªããšæããŸãã ãã®ææ¡ã®è¿œå ãããå©äŸ¿æ§ã¯ç¢ºãã«çŽ æŽãããã§ãããããªããæäŸããïŒãŸãã¯ãªãŒã¯ããïŒãšã©ãŒæ å ±ã«ã€ããŠæ éã«èããããšã®ç¥èŠããã䟡å€ããããç¥èŠãããå©äŸ¿æ§ãç¥èŠããã䟡å€ãäžåããããæªãè¡åãå©é·ããã®ã§ã¯ãªãããšæããŸãã
çµåµèã¯ã try
ã«ãã£ãŠè¿ããããšã©ãŒãããã©ããäžå¯ãã§ã¯ãªããšã©ãŒã«å€æãããå Žåã«çºçããŸãã æ®å¿µãªãããããã«ã¯ããªãæ·±å»ãªæ¬ ç¹ããããŸããããã¯ã defer
ããšã©ãŒèªäœãæ€æ»ã§ããªããªãããã§ãã ããã«ã try
ãå®éã«æãŸããçš®é¡ã®ãšã©ãŒãè¿ããŠãŒã¹ã±ãŒã¹ïŒã€ãŸãã try
ãäžæ³šæã§ã¯ãªãæ
éã«äœ¿çšããããŠãŒã¹ã±ãŒã¹ïŒãé²ããŸãã
å¥ã®è§£æ±ºçã¯ããã®ãµã€ãããè¿ãããå¯èœæ§ã®ãããšã©ãŒã®çš®é¡ãå®çŸ©/ãã¯ã€ããªã¹ãã«ç»é²ããããã«ããªãã·ã§ã³ã®2çªç®ã®åŒæ°ãtry
ã«ãããšããïŒç Žæ£ãããïŒã¢ã€ãã¢ãåå©çšããããšã§ãã ããšã©ãŒã®çš®é¡ããå®çŸ©ããæ¹æ³ã2ã€ãããå€ïŒ io.EOF
ãªã©ïŒãŸãã¯ã¿ã€ãïŒ *os.PathError
ã *exec.ExitError
ïŒã®ããããã§ãããããããã¯å°ãåä»ã§ãã é¢æ°ã®åŒæ°ãšããŠå€ã§ãããšã©ãŒã®çš®é¡ãæå®ããã®ã¯ç°¡åã§ãããåãæå®ããã®ã¯å°é£ã§ãã ãããã©ã®ããã«åŠçãããã¯ããããŸããããã¢ã€ãã¢ãããã«æãåºããŸãã
@josharianãææããåé¡ã¯ãerrã®è©äŸ¡ãé ãããããšã§åé¿ã§ããŸãã
defer func() { fmt.HandleErrorf(&err, "oops: %v", err) }()
èŠæ ãã¯è¯ããããŸããããæ©èœããã¯ãã§ãã ãã ãããšã©ãŒãã€ã³ã¿ãŒããŸãã¯äžè¬çãªãã€ã³ã¿ãŒã®æ°ãããã©ãŒãããåè©/ãã©ã°ãè¿œå ããããšã§ããã«å¯ŸåŠã§ããå Žåã¯ããã¬ãŒã³ãª%v
ã®ããã«éåç
§ãããå€ãåºåããããšããå§ãããŸãã äŸã®ç®çã®ããã«ãããã%*v
ãšåŒã³ãŸãããïŒ
defer fmt.HandleErrorf(&err, "oops: %*v", &err)
é害ã¯ããŠããããã®ææ¡ã¯ææã«èŠãããšæããŸããããšã©ãŒã«ã³ã³ããã¹ããè¿œå ãã人éå·¥åŠãæããããšãéèŠã§ããããã«æãããŸãã
ç·šéïŒ
å¥ã®ã¢ãããŒãã¯ã Stringer
ãå®è£
ããæ§é äœã§ãšã©ãŒãã€ã³ã¿ãã©ããããããšã§ãã
type wraperr struct{ err *error }
func (w wraperr) String() string { return (*w.err).Error() }
..ã
defer handleErrorf(&err, "oops: %v", wraperr{&err})
ç§ã®èŠ³ç¹ããã®ããã€ãã®ããšã ãªãç§ãã¡ã¯æ°è¡ã®ã³ãŒããä¿åããããšãããã»ã©å¿é ããŠããã®ã§ããïŒ ç§ã¯ããããå°ããªé¢æ°ãæ害ã§ãããšèããŠããã®ãšåãç·ã«æ²¿ã£ãŠèããŠããŸãã
ããã«ããã®ãããªææ¡ã¯ãç§ãå¿é ããŠããããã€ãã®ãéæ³ãã®ãšã©ãŒãæ£ããåŠçãã責任ãåãé€ããæªçšãããŠæ æ°ãå©é·ããã³ãŒãã®å質ãäœäžãããã°ãçºçããããšãçºèŠããŸããã
è¿°ã¹ãããŠããææ¡ã«ã¯å€ãã®äžæ確ãªæ¯ãèããããã®ã§ãããã¯ããæ確ãª_æ瀺çãª_äœåãªã3è¡ããããã§ã«åé¡ããããŸãã
çŸåšã瀟å ã§ã¯æ§ãããªãã¿ãŒã³ã䜿çšããŠããŸãã ç§ãã¡ãæžãããšãã«åæ§ã«æ··åãããåä¿¡ãæã£ãŠããèšäºãããã«ãããŸã-httpsïŒ//bet365techblog.com/better-error-handling-in-go
ãã ãã check
/ handle
ã®ææ¡ãé²è¡ããããšãèŠè¶ããŠäœ¿çšããŸããã
ãã§ãã¯/åŠçã¯ããšã©ãŒåŠçãããç°¡æœã«ããããã®ã¯ããã«å
æ¬çãªã¢ãããŒãã§ããã ãã®handle
ãããã¯ã¯ããããå®çŸ©ããããã®ãšåãé¢æ°ã¹ã³ãŒããä¿æããŠããŸãããã defer
ã¹ããŒãã¡ã³ãã¯ãããããã®ãªãŒããŒãããã䌎ãæ°ããã³ã³ããã¹ãã§ãã ããã¯ãgoã®ã€ãã£ãªã ãšäžèŽããŠããããã«èŠããŸãããããšã©ãŒãçºçãããšãã«ãšã©ãŒãè¿ãã ãããšããåäœãå¿
èŠãªå Žåã¯ãæ瀺çã«handle { return err }
ãšããŠå®£èšã§ããŸãã
Deferã¯ãæããã«erråç §ãç¶æãããŠããããšã«äŸåããŠããŸããããããã¯ã¹ã³ãŒãã®å€æ°ã䜿çšããŠãšã©ãŒåç §ãã·ã£ããŠã€ã³ã°ãããšåé¡ãçºçããããšãããããŸããã ãããã£ãŠãgoã§ãšã©ãŒãåŠçããæšæºçãªæ¹æ³ãšèŠãªãããã»ã©ã®ç¢ºå®ãªæ¹æ³ã§ã¯ãããŸããã
ãã®å Žåã try
ã¯ããŸã解決ãããŠããªãããã§ãä»ã®äººãšåãããã«ãåã«æ æ°ãªå®è£
ãã延æãã¿ãŒã³ã䜿ããããŠããŸãæãããããŸãã
延æããŒã¹ã®ãšã©ãŒåŠçãAThingã«ãªãå Žåã¯ã次ã®ãããªãã®ããšã©ãŒããã±ãŒãžã«è¿œå ããå¿ èŠããããŸãã
f := try(os.Create(filename))
defer errors.Deferred(&err, f.Close)
延æãããCloseã¹ããŒãã¡ã³ãã®ãšã©ãŒãç¡èŠããããšã¯ãããªãäžè¬çãªåé¡ã§ãã ãããå©ããããã®æšæºçãªããŒã«ãããã¯ãã§ãã
æ»ãçµã¿èŸŒã¿é¢æ°ã¯ãåãããšãè¡ãããŒã¯ãŒãããã売ãã«ããã§ãã
Zig [1]ã®ãããªããŒã¯ãŒãã ã£ããããã£ãšæ¬²ããã§ãã
èšèªã®åã·ã¹ãã ã䜿çšããŠå眲åãè¡šçŸã§ããããã®åäœãé¢æ°ã®éåžžã®åäœãæ··ä¹±ãããçµã¿èŸŒã¿é¢æ°ã¯ãå®éã®èšèªã®é²åãåé¿ããããã«ç¹°ãè¿ã䜿çšã§ãããšã¹ã±ãŒããããã®ããã«èŠããŸãã
ãã®çš®ã®å¶åŸ¡ãããŒãGoïŒããã³ä»ã®å€ãã®èšèªïŒã§è¡šçŸãããæ¹æ³ã§ãããããreturnã¹ããŒãã¡ã³ãïŒããã³ãããã¯ïŒãããã«èªèããããã«äœ¿çšãããŸãã ãªã¿ãŒã³ã®å Žåãšåãããã«ãããçšåºŠæ £ããåŸãå¶åŸ¡ãããŒãå€æŽããããšãšããŠtryãèªèããããšã¯ããã»ã©ç解ãããŠããªãããã§ãã åªããIDEãµããŒããããã«ã圹ç«ã€ããšã¯ééããããŸããã
ããªãé ããšããã«ãããšæããŸãã gofmtãããã³ãŒãã§ã¯ããªã¿ãŒã³ã¯åžžã«/^\t*return /
ãšäžèŽããŸããããã¯ãæ¯æŽãªãã§ç®ã§ç¢ºèªããã®ã¯éåžžã«ç°¡åãªãã¿ãŒã³ã§ãã äžæ¹ã try
ã¯ãã³ãŒãå
ã®ã©ãã«ã§ãçºçããå¯èœæ§ããããé¢æ°åŒã³åºãã®å¥¥æ·±ãã«ä»»æã«ãã¹ããããŸãã ã©ããªã«å€ãã®ãã¬ãŒãã³ã°ãè¡ã£ãŠããããŒã«ã®æ¯æŽãªãã«ãé¢æ°å
ã®ãã¹ãŠã®å¶åŸ¡ãããŒãããã«èŠã€ããããšãã§ããŸãã
ããã«ããåªããIDEãµããŒããã«äŸåããæ©èœã¯ãåªããIDEãµããŒãããªããã¹ãŠã®ç°å¢ã§äžå©ã«ãªããŸãã ã³ãŒãã¬ãã¥ãŒããŒã«ãããã«æãæµ®ãã³ãŸãâ Gerritã¯ç§ã®ããã«ãã¹ãŠã®è©Šã¿ã匷調ããŸããïŒ ããŸããŸãªçç±ã§ãIDEã掟æãªã³ãŒãã®åŒ·èª¿è¡šç€ºã䜿çšããªãããšãéžæãã人ã¯ã©ãã§ããïŒ acmeã¯try
ã匷調ãå§ããŸããïŒ
èšèªæ©èœã¯ããšãã£ã¿ãŒã®ãµããŒãã«äŸåããã®ã§ã¯ãªããããèªäœã§ç解ãããããã®ã§ãªããã°ãªããŸããã
@kungfusheepç§ã¯ãã®èšäºã奜ãã§ãã 延æã ãã§ã©ããããããšã«æ³šæããããšã¯ã try
ãªãã§ãã§ã«ããªãèªã¿ããããåäžãããŸãã
ç§ã¯ãGoã®ãšã©ãŒãæ¬åœã«åé¡ã ãšæããŠããªããã£ã³ãã«ããŸãã ããã§ãã if err != nil { return err }
ã¯ãäžéšã®é¢æ°ã§ããªãéåããããšããããŸãã ã»ãšãã©ãã¹ãŠã®ã¹ããŒãã¡ã³ãã®åŸã«ãšã©ãŒãã§ãã¯ãå¿
èŠãªé¢æ°ãäœæããŸããããã©ãããšãªã¿ãŒã³ä»¥å€ã®ç¹å¥ãªåŠçã¯å¿
èŠãããŸããã§ããã æã
ãç©äºãããè¯ãããè³¢ãBufferæ§é äœããªãã ãã§ãã æã
ããã¯æ¬¡ã
ãšç°ãªãéèŠãªã¹ãããã§ãããäœããããŸããããªãã£ãå Žåã¯åã«ç絡ããå¿
èŠããããŸãã
try
ã¯ç¢ºãã«ãã®ã³ãŒããã¯ããã«èªã¿ãããããå®å
šãªäžäœäºææ§ãåããŠããŸããã try
ã¯éèŠãªæ©èœã§ã¯ãªãããšã«åæããŸãããããã£ãŠã人ã
ãããŸãã«ãæããŠããå Žåã¯å€åãããæã£ãŠããªãã®ãæåã§ãã
ãã ããã»ãã³ãã£ã¯ã¹ã¯éåžžã«æ確ã§ãã try
ã衚瀺ããããšãã¯ãã€ã§ããããããŒãã¹ããã©ã£ãŠããããæ»ã£ãŠããŸãã ç§ã¯æ¬åœã«ãããããåçŽã«ãªãããšã¯ã§ããŸããã
ããã¯ãç¹æ®ãªã±ãŒã¹ã®ãã¯ãã®ããã«èŠããŸãã
@dominikh try
ã¯åžžã«/try\(/
ãšäžèŽããã®ã§ãããªãã®ãã€ã³ããå®éã«äœã§ãããã¯ããããŸããã ããã¯åæ§ã«æ€çŽ¢å¯èœã§ãããç§ãä»ãŸã§èãããã¹ãŠã®ç·šéè
ã¯æ€çŽ¢æ©èœãæã£ãŠããŸãã
@qrpnxz圌ãèšãããã£ãã®ã¯ãããã°ã©ã ã§æ€çŽ¢ã§ããªããšããããšã§ã¯ãªããç®ã§æ€çŽ¢ããã®ãé£ãããšããããšã ãšæããŸãã æ£èŠè¡šçŸã¯åãªãã¢ãããžãŒã§ããã /^\t*
ã«éç¹ã眮ããŠããããã¹ãŠã®ãªã¿ãŒã³ãè¡ã®å
é ã«ããããšã§æããã«ç®ç«ã€ããšãæå³ããŸãïŒå
é ã®ç©ºçœãç¡èŠããŸãïŒã
ãã£ãšèããŠã¿ããšãããã€ãã®äžè¬çãªãã«ããŒé¢æ°ãããã¯ãã§ãã ããããããããã¯ãæ®ã眮ãããšåŒã°ããããã±ãŒãžã«å«ãŸããŠããå¿ èŠããããŸãã
ãªã¿ãŒã³ã«ååãä»ããªãããã«ãã圢åŒã§check
ã®ææ¡ã«å¯ŸåŠããã«ã¯ã次ã®ããã«nilããã§ãã¯ããé¢æ°ã䜿çšããŠãããè¡ãããšãã§ããŸãã
func Format(err error, message string, args ...interface{}) error {
if err == nil {
return nil
}
return fmt.Errorf(...)
}
ããã¯ã次ã®ããã«ååä»ããªã¿ãŒã³ãªãã§äœ¿çšã§ããŸãã
func foo(s string) (int, error) {
n, err := strconv.Atoi(s)
try(deferred.Format(err, "bad string %q", s))
return n, nil
}
ææ¡ãããfmt.HandleErrorã代ããã«é
延ããã±ãŒãžã«å
¥ããŠããšã©ãŒãçºçãããããšãã§ããŸããDeferãã«ããŒfuncãdeferred.Exec
ãšåŒã³ããšã©ãŒãnil以å€ã®å Žåã«ã®ã¿å®è¡ããããã·ãŒãžã£ã®æ¡ä»¶ä»ãexecãååšããå¯èœæ§ããããŸãã
ãŸãšãããšã次ã®ãããªãã®ãåŸãããŸã
func CopyFile(src, dst string) (err error) {
defer deferred.Annotate(&err, "copy %s %s", src, dst)
r := try(os.Open(src))
defer deferred.Exec(&err, r.Close)
w := try(os.Create(dst))
defer deferred.Exec(&err, r.Close)
defer deferred.Cond(&err, func(){ os.Remove(dst) })
try(io.Copy(w, r))
return nil
}
ããäžã€ã®äŸïŒ
func (p *pgStore) DoWork() (err error) {
tx := try(p.handle.Begin())
defer deferred.Cond(&err, func(){ tx.Rollback() })
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
try(deferred.Format(err, "insert table")
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
try(deferred.Format(err, "insert table2"))
return tx.Commit()
}
if err != nil
ãããç¶æ
ãããã©ãã«ã§ãtry
ãããç¶æ
ã«ãªããŸãã ããã¯ææ¡ãããåé¡ãã·ããããããã解決ããŸããããã ããçŸåšã®ãšã©ãŒåŠçã¡ã«ããºã ã¯ããããåé¡ã§ã¯ãªããšç§ã¯äž»åŒµããŸãã å·¥å ·ãšãã®åšãã®æ€æ»ãæ¹åããå¿ èŠããããŸãã
ããã«ã if err != nil
ã¯ãããžãã¹ããžãã¯èšèªã®è¡ãä¹±éã«ããã®ã§ã¯ãªãããã®ããäžã«ãããããå®éã«ã¯try
ãããèªã¿ããããšäž»åŒµããŸãã
file := try(os.OpenFile("thing")) // less readable than,
file, err := os.OpenFile("thing")
if err != nil {
}
ãããŠãããGoããã®ãšã©ãŒåŠçã«ãããŠãã£ãšéæ³ã®ããã§ãããªãããªããããå®å
šã«ææããªãã®ãã ããšãã°ããŠãŒã¶ãŒããšã©ãŒãå²ãåœãŠãªãå ŽåãGoã¯çµã¿èŸŒã¿ã®try
ãæé»çã«åŒã³åºãããšãã§ããŸãã äŸãã°ïŒ
func getString() (string, error) { ... }
func caller() {
defer func() {
if err != nil { ... } // whether `err` must be defined or not is not shown in this example.
}
// would call try internally, because a user is not
// assigning an error value. Also, it can add a compile error
// for "defined and not used err value" if the user does not
// handle the error.
str := getString()
}
ç§ã«ãšã£ãŠãããã¯å®éã«ã¯éæ³ãšæœåšçãªå¯èªæ§ãç ç²ã«ããŠåé·æ§ã®åé¡ãéæããã§ãããã
ãããã£ãŠãäžèšã®äŸã®ããã«ãåé¡ããçã«è§£æ±ºããããçŸåšã®ãšã©ãŒåŠçãç¶æããããšãææ¡ããŸãããåé·æ§ãšã©ããã³ã°ã解決ããããã«èšèªãå€æŽãã代ããã«ãèšèªãå€æŽããã«ãããŒã«ãšæ€èšŒãæ¹åããŸãçµéšãããè¯ãããããã®ã³ãŒãã®ã
ããšãã°ãVSCodeã«ã¯iferr
ãšããã¹ããããããããå
¥åããŠEnterããŒãæŒããšãå®å
šãªãšã©ãŒåŠçã¹ããŒãã¡ã³ãã«å±éãããŸã...ãããã£ãŠããããæžãã®ã¯é¢åã§ã¯ãªããåŸã§èªãæ¹ãããã§ãããã ã
@josharian
ããããããªã©ã€ãã©ãªã®å€æŽãã§ã¯ãããŸããããfunc mainïŒïŒãšã©ãŒãåãå ¥ããããšãæ€èšã§ããŸãã
ããã«é¢ããåé¡ã¯ããã¹ãŠã®ãã©ãããã©ãŒã ããããäœãæå³ãããã«ã€ããŠæ確ãªã»ãã³ãã£ã¯ã¹ãæã£ãŠããããã§ã¯ãªããšããããšã§ãã ãªã©ã€ãã¯ãå®å
šãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å®è¡ãããŠãããåŸæ¥ã®ãGoããã°ã©ã ã§ããŸãæ©èœããŸããããã€ã¯ãã³ã³ãããŒã©ãŒãã¡ãŒã ãŠã§ã¢ãŸãã¯WebAssemblyã ããäœæãããšããã«ã os.Exit(1)
ãäœãæå³ããã®ããæ確ã«ãªããŸããã çŸåšã os.Exit
ã¯ã©ã€ãã©ãªåŒã³åºãã§ãããããGoã®å®è£
ã¯ç¡æã§æäŸãããŠããŸããã ãã ãã main
ã®åœ¢ã¯èšèªã®åé¡ã§ãã
ããããããããããæãããçããææ¡ã«ã€ããŠã®è³ªåïŒ try
ã¯å¯å€ååŒæ°ã®åŒæ°ãšã©ã®ããã«çžäºäœçšããŸããïŒ ããã¯ãæåŸã®åŒæ°ã«å¯å€ååŒæ°ããªãå¯å€ååŒæ°ïŒishïŒé¢æ°ã®æåã®ã±ãŒã¹ã§ãã ããã¯èš±å¯ãããŠããŸããïŒ
var e []error
try(e...)
ãªãããããã®ãã¯ããŠããã çãã¯ãããããã ãšæããŸãïŒããã§ãªãå Žåã¯ããå±éãããã¹ã©ã€ã¹ã®é·ãã0ã®å Žåã¯ã©ããªããŸããããæçµçã«ä»æ§ãè¡šçŸãããšãã«èŠããŠããããšãã§ããããã«ããããæ瀺ããã ãã§ãã
try
ã®ææ¡ã¯ãå¶åŸ¡ãããŒã®å¯èªæ§ãç ç²ã«ããŠéèšãä¿é²ããããããããã®åºæ¬çãªä¿¡æ¡ãšäžèŽããŠããŸãããtry
çµã¿èŸŒã¿ã¹ããŒãã¡ã³ããäœæããããšãæ€èšããŠãã ããã ããããã°ã if
ã®ãããªä»ã®å¶åŸ¡ãããŒã¹ããŒãã¡ã³ããšã®æŽåæ§ãé«ãŸããŸãã ããã«ããã¹ããããæ¬åŒ§ãåé€ãããšãèªã¿ãããããããã«åäžããŸããdefer
ãªã©ã䜿çšããã«å®è£
ããŸãã ïŒä»ã®äººãææããŠããããã«ïŒããã¯ãã§ã«çŽç²ãªgoã§å®è£
ããããšã¯ã§ããªãã®ã§ãå
éšã§ããå¹ççãªå®è£
ã䜿çšããããšãã§ããŸããããã«ã¯2ã€ã®åé¡ããããŸãã
第äºã«ãç§ã¯ã¯ããã«æªããšæããŸãã ããã«ãããã¹ãŠã®äŸã¯ããšã©ãŒãè¿ãåçŽãªåŒã³åºãã§ããããã£ãšé°æ¹¿ãªã®ã¯ããã§ãã
func doit(abc string) error {
a := fmt.Sprintf("value of something: %s\n", try(getValue(abc)))
log.Println(a)
return nil
}
ãã®ã³ãŒãã¯ãã®sprintfã®éäžã§çµäºããå¯èœæ§ãããããã®äºå®ãèŠéããã¡ã§ãã
ç§ã®æ祚ã¯ããŒã§ãã ããã¯goã³ãŒããããè¯ãããããšã¯ãããŸããã èªã¿ããããªãããšã¯ãããŸããã ããã¯ãããããå ç¢ã«ããããšã¯ãããŸããã
åã«ãèšããŸãããããã®ææ¡ã¯ãããäŸç€ºããŠããŸããGoã«é¢ããèŠæ ã®90ïŒ ã¯ããifã¹ããŒãã¡ã³ããã«ãŒããæžããããªãããšãããã®ã ãšæããŸãã ããã«ãããããã€ãã®éåžžã«åçŽãªifã¹ããŒãã¡ã³ããåé€ãããŸãããèªç¥çè² è·ãè¿œå ãããé¢æ°ã®åºå£ç¹ãèŠéãããããªããŸãã
ãããã¡ã€ã³ã§äœ¿çšããããšã¯ã§ãããæ°ãããŠãŒã¶ãŒãæãããšãã«æ··ä¹±ããå¯èœæ§ãããããšãææããããšæããŸãã æããã«ãããã¯ãšã©ãŒãè¿ããªããã¹ãŠã®é¢æ°ã«åœãŠã¯ãŸããŸãããå€ãã®äŸã«è¡šç€ºããããããmainã¯ç¹å¥ã ãšæããŸãã
func main() {
f := try(os.Open("foo.txt"))
defer f.Close()
}
ã¡ã€ã³ã§ãããã¯ãè©ŠããŠã¿ãã®ãåãå ¥ãããããã©ããã¯ããããŸããã
ããã«ãæ®å¿µãªããšã«ããã¹ãïŒ func TestFoo(t* testing.T)
ïŒã§ã¯ç¹ã«åœ¹ç«ã¡ãŸãã:(
ããã«é¢ããŠç§ãæ±ããŠããåé¡ã¯ããšã©ãŒãçºçãããšãã«åžžã«ãšã©ãŒãè¿ããããšæ³å®ããŠããããšã§ãã ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããŠè¿ãå Žåãããšã©ãŒãçºçãããšãã®åäœãå€ãããå Žåã å€åããã¯è¿ããããšã©ãŒã®çš®é¡ã«äŸåããŸãã
ç§ã¯æ¬¡ã®ããã«èŠãããããããªãtry / catchã«äŒŒããã®ã奜ãã§ããã
foo()
ã次ã®ããã«å®çŸ©ãããŠãããšä»®å®ããŸã
func foo() (int, error) {}
ãã®åŸãããªãã¯ããããšãã§ããŸã
n := try(foo()) {
case FirstError:
// do something based on FirstError
case OtherError:
// do something based on OtherError
default:
// default behavior for any other error
}
ããã¯
n, err := foo()
if errors.Is(err, FirstError) {
// do something based on FirstError
if errors.Is(err, OtherError) {
// do something based on OtherError
} else {
// default behavior for any other error
}
ç§ã«ãšã£ãŠããšã©ãŒåŠçã¯ã³ãŒãããŒã¹ã®æãéèŠãªéšåã®1ã€ã§ãã
ãã§ã«å€ãããgoã³ãŒãã¯if err != nil { return err }
ã§ãããäœåãªã³ã³ããã¹ããè¿œå ããã«ã¹ã¿ãã¯ã®æ·±éšãããšã©ãŒãè¿ããŸããããã«ïŒããããïŒæ ¹æ¬çãªãšã©ãŒãfmt.Errorf
ã©ããã³ã°ã§ãã¹ã¯ããŠã³ã³ããã¹ããè¿œå ããŸãã
if err != nil { return err }
眮ãæããã ãã®éæ³ã®ãããªæ°ããããŒã¯ãŒããæäŸããããšã¯ãå±éºãªéã®ããã«æããŸãã
ããã§ããã¹ãŠã®ã³ãŒããtryã®åŒã³åºãã«ã©ãããããŸãã ããã¯ã次ã®ãããªããã±ãŒãžå
ã®ãšã©ãŒã®ã¿ãåŠçããã³ãŒãã®å Žåã¯å€å°åé¡ãããŸããïŒãã ããèªã¿ãããã¯æªããªããŸãïŒã
func foo() error {
/// stuff
try(bar())
// more stuff
}
ããããäžããããäŸã¯æ¬åœã«æããããã®ã§ãããåºæ¬çã«ãåŒã³åºãå
ã¯ãäŸå€åŠçã®ããã«ãã¹ã¿ãã¯ã®éåžžã«æ·±ããšã©ãŒãç解ããããšããŸãã
ãã¡ãããããã¯ãã¹ãŠéçºè
ãããã§æ£ããããšãè¡ããã©ããã«ããã£ãŠããŸãããéçºè
ã¯ãåŸã§ãããä¿®æ£ããããªã©ã®ãšã©ãŒãæ°ã«ããªãããã®åªããæ¹æ³ãæäŸããŸãïŒãããŠãããã©ã®ããã«è¡ããããã¯èª°ããç¥ã£ãŠããŸãïŒã
*ãç¹°ãè¿ããæžããã«ã¯ã©ãããã°ããããããïŒé©åãªïŒãšã©ãŒåŠçãããç°¡åã«ããéçºè
ã®çç£æ§ãé«ããã«ã¯ã©ãããã°ãããããšã¯å¥ã®èŠ³ç¹ããåé¡ãæ€èšããããšæããŸãã
ãããæ¬çªã³ãŒãã®å®è¡ã«ã©ã®ããã«åœ±é¿ããããèããå¿
èŠããããŸãã
*泚ïŒããã¯å®éã«ã¯ç¹°ãè¿ããæžãããã®ã§ã¯ãªããç¹°ãè¿ãããå
容ãå€æŽããã ãã§ããããã¹ãŠãtry()
ã«å«ãŸããŠãããããã³ãŒããèªã¿ã«ãããªããŸãã
æåŸã®ãã€ã³ãïŒæåã«ææ¡ãèªãã®ã¯è¯ãããšã®ããã«æããŸããããããããã¹ãŠã®èœãšãç©ŽïŒå°ãªããšããªã¹ããããŠãããã®ïŒã«åãæããå§ããŸããããã¯ãããããŸãããããã¯å€ãããŸããã®ãããªãã®ã§ãã
ããã®å€ãã¯äž»èŠ³çãªãã®ã ãšæããŸãããããã¯ç§ãæ°ã«ãããŠããããšã§ãã ãããã®ã»ãã³ãã£ã¯ã¹ã¯éåžžã«éèŠã§ãã
ç§ãèŠããã®ã¯ãPOC /ãã¢ã¬ãã«ã®ã³ãŒãã§ããšã©ãŒããæ£ãããå®è¡ã§ããããã«ãæ¬çªã¬ãã«ã®ã³ãŒãã®èšè¿°ãšä¿å®ãç°¡åã«ããæ¹æ³ã§ãã
ãšã©ãŒã³ã³ããã¹ãã¯ç¹°ãè¿ãçºçããããŒãã®ããã§ã...
仮説ïŒã»ãšãã©ã®Goé¢æ°ã¯ã (T1, T2, T3, error)
ã§ã¯ãªã(T, error)
ãè¿ããŸã
try
ãtry(T1, T2, T3, error) (T1, T2, T3)
$ãšããŠå®çŸ©ãã代ããã«ã次ã®ããã«å®çŸ©ããå Žåã¯ã©ããªããŸãã
try(func (args) (T1, T2, T3, error))(T1, T2, T3)
ïŒ ïŒããã¯æŠç®ã§ãïŒ
ã€ãŸãã try
åŒã³åºãã®æ§ææ§é ã¯åžžã«æåã®åŒæ°ã§ãããè€æ°ã®å€ãè¿ãåŒã§ãããæåŸã®åŒæ°ã¯ãšã©ãŒã§ãã
次ã«ã make
ãšåæ§ã«ãããã«ãã2åŒæ°åœ¢åŒã®åŒã³åºããžã®æãéãããŸãã2çªç®ã®åŒæ°ã¯è©Šè¡ã®ã³ã³ããã¹ãã§ãïŒããšãã°ãåºå®æååã %v
ã®æååïŒã
ããã«ããã (T, error)
ã®å Žåã§ãé£éãå¯èœã«ãªããŸãããIMOãéåžžå¿
èŠãšããªãè€æ°ã®è¿åãé£éãããããšã¯ã§ããªããªããŸãã
@ cpuguy83ææ¡ãèªããšããšã©ãŒãã©ããããããšã劚ãããã®ã¯äœããªãããšãããããŸãã å®éã try
ã䜿çšããªãããããè¡ãã«ã¯è€æ°ã®æ¹æ³ããããŸãã ããããå€ãã®äººã¯äœããã®çç±ã§ãããæ³å®ããŠããããã§ãã
if err != nil { return err }
ã¯ããããã¿ã€ãã³ã°ã®éã®ç
©ããããé€ãã°ã try
$ãšåãããã«ãåŸã§ä¿®æ£ããŸãããšåãã§ãã
æ¬åŒ§ã®ãã¢ã®å åŽã«ãããã®ãããã€ã©ãŒãã¬ãŒãã®4è¡ããšã«ããé¢æ°ã¹ããããããèªã¿ã«ããããšãããããŸããã
ããããããã¯ãªã®ã§ãããªããããªããæ©ãŸãããããã®ç¹å®ã®ãèœãšãç©Žãã®ããã€ããææãããªãã°ãããã¯çŽ æŽãããã§ãããã
èªã¿ãããã¯åé¡ã®ããã§ããã次ã®ããã«ãtryïŒïŒãç®ç«ãããããã«fmtãæ瀺ããã®ã¯ã©ãã§ããããã
f := try(
os.Open("file.txt")
)
@MrTravisB
ããã«é¢ããŠç§ãæ±ããŠããåé¡ã¯ããšã©ãŒãçºçãããšãã«åžžã«ãšã©ãŒãè¿ããããšæ³å®ããŠããããšã§ãã
åæããŸããã ããã¯ãããªãããã®ããã®éèšãæ£åœåããã®ã«ååãªé »åºŠã§ãããããšæã£ãŠããããšãåæãšããŠããŸãã ããããªããšããšã©ãŒãããããããåŠçããã®ã«éªéã«ãªããŸããã
ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããŠè¿ãå Žåãããšã©ãŒãçºçãããšãã®åäœãå€ãããå Žåã
ãã®ææ¡ã§ã¯ããããã¯å šäœã®ã³ã³ããã¹ãããšã©ãŒã«è¿œå ããããã®ãã¿ãŒã³ã«ã€ããŠèª¬æããŠããŸãã @josharianã¯ãäŸã«ãšã©ãŒãããããšãææããŸãããããããåé¿ããããã®æåã®æ¹æ³ã¯æ確ã§ã¯ãããŸããã ç§ã¯ãããåŠçããæ¹æ³ã®ããã€ãã®äŸãæžããŸããã
ããå
·äœçãªãšã©ãŒã³ã³ããã¹ãã«ã€ããŠãã try
ãæ©èœããŸãããã®ããšãæãŸãªãå Žåã¯ã try
ã䜿çšããªãã§ãã ããã
@boomlindeãŸãã«ç§ã®ãã€ã³ãã ãã®ææ¡ã¯ããšã©ãŒåŠçã®ãã倧ããªåé¡ã解決ããããã®ããŒã«ãæäŸããã®ã§ã¯ãªããåäžã®ãŠãŒã¹ã±ãŒã¹ã解決ããããšããŠããŸãã æ£ç¢ºã«ããªããææããããšãªããæ ¹æ¬çãªè³ªåã ãšæããŸãã
ããã¯ãããªãããã®ããã®éèšãæ£åœåããã®ã«ååãªé »åºŠã§ãããããšæã£ãŠããããšãåæãšããŠããŸãã
ç§ã®æèŠãšçµéšã§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã¯å°æ°æŽŸã§ãããçç¥æ§æãä¿èšŒãããã®ã§ã¯ãããŸããã
ãŸãã defer
ã䜿çšããŠãšã©ãŒãåŠçããã¢ãããŒãã«ã¯ãèãããããã¹ãŠã®ãšã©ãŒãåãããã«åŠçããããšãåæãšããŠãããšããåé¡ããããŸãã defer
ã¹ããŒãã¡ã³ãã¯ãã£ã³ã»ã«ã§ããŸããã
defer fmt.HandleErrorf(&err, âfoobarâ)
n := try(foo())
x : try(foo2())
foo()
ãšfoo2()
ããè¿ãããå¯èœæ§ã®ãããšã©ãŒã«å¯ŸããŠç°ãªããšã©ãŒåŠçãå¿
èŠãªå Žåã¯ã©ããªããŸããïŒ
@MrTravisB
fooïŒïŒãšfoo2ïŒïŒããè¿ãããå¯èœæ§ã®ãããšã©ãŒã«å¯ŸããŠç°ãªããšã©ãŒåŠçãå¿ èŠãªå Žåã¯ã©ããªããŸããïŒ
次ã«ãä»ã®ãã®ã䜿çšããŸãã ããã@boomlindeãèšã£ãŠãããã€ã³ãã§ãã
å人çã«ãã®ãŠãŒã¹ã±ãŒã¹ãé »ç¹ã«ç®ã«ããããšã¯ãªããããããŸããããå€ãã®äººãç®ã«ããŸãã try
ãè¿œå ããŠãå®éã«ã¯åœ±é¿ã¯ãããŸããã å®éããŠãŒã¹ã±ãŒã¹ããŸãã§ããã»ã©ã try
ãè¿œå ãããããšã«ãã圱é¿ã¯å°ãªããªããŸãã
@qrpnxz
f := try(os.Open("/foo"))
data := try(ioutil.ReadAll(f))
try(send(data))
ïŒã¯ãã ReadFile
ãããããã®ç¹å®ã®äŸã¯ããã€ã³ãã§ã¯ãªããã©ããã«ããŒã¿ãã³ããŒããããã®æè¯ã®æ¹æ³ã§ã¯ãªãããšãç解ããŠããŸãïŒ
tryã®ã€ã³ã©ã€ã³ã解æããå¿
èŠãããããããããèªãã®ã«ããã«æéãããããŸãã ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã¯å¥ã®åŒã³åºãã§ã©ãããããŸãã
ãŸããããã§ã®defer
ãšã©ãŒãã³ãã©ãŒã¯ããšã©ãŒãæ°ããã¡ãã»ãŒãžã§ã©ãããã以å€ã¯é©åã§ã¯ãªããšäž»åŒµããŸã...ããã¯çŽ æŽãããããšã§ããããšã©ãŒãç°¡åã«åŠçããããšãããããšã©ãŒãåŠçããããšã®æ¹ãéèŠã§ããäœãèµ·ãã£ãã®ããèªã人éã
ãã³ãå Žåãå°ãªããšãæŒç®åã¯æ¥å°ŸèŸïŒåŒã³åºãã®æåŸã«?
ãè¿œå ãããŸãïŒã§ãããå®éã®ããžãã¯ãæãäžããããã«äœåãªè² æ
ããããŸããã
panic
ã¯å¥ã®ãããŒå¶åŸ¡é¢æ°ã§ããå¯èœæ§ããããŸãããå€ãè¿ããªããããäºå®äžã¹ããŒãã¡ã³ãã«ãªããŸãã ãããtry
ãšæ¯èŒããŠãã ãããããã¯åŒã§ãããã©ãã§ãçºçããå¯èœæ§ããããŸãã
recover
ã«ã¯å€ãããããããŒå¶åŸ¡ã«åœ±é¿ããŸããã defer
ã¹ããŒãã¡ã³ãã§çºçããå¿
èŠããããŸãã ãããã®defer
ã¯éåžžãé¢æ°ãªãã©ã«ã§ããã recover
ã¯äžåºŠã ãåŒã³åºãããããã recover
ãã¹ããŒãã¡ã³ããšããŠå¹æçã«çºçããŸãã ç¹°ãè¿ããŸããããããã©ãã§ãçºçããå¯èœæ§ã®ããtry
ãšæ¯èŒããŠãã ããã
ãããã®ç¹ã¯ã try
ã䜿çšãããšã以åã«ææããããã«ããããŸã§ã«ãªãæ¹æ³ã§å¶åŸ¡ãããŒã远跡ããããšãéåžžã«å°é£ã«ãªãããšãæå³ãããšæããŸãããã¹ããŒãã¡ã³ããšåŒã®éãã¯ããããŸããã§ãããææããã
次ã®ãããªã¹ããŒãã¡ã³ããèš±å¯ãã
if err != nil {
return nil, 0, err
}
ãããã¯ã«return
ã¹ããŒãã¡ã³ãã®ã¿ãå«ãŸãããã®ã¹ããŒãã¡ã³ãã«æ¹è¡ãå«ãŸããŠããªãå Žåã¯ã1è¡ã§gofmt
ã§ãã©ãŒããããããŸãã äŸãã°ïŒ
if err != nil { return nil, 0, err }
gofmt
ãïŒæ§é äœãªãã©ã«ã®ããã«ïŒæ¹è¡ããã§ã«ååšããå Žåã«æ¹è¡ãä¿æãããªããã€ã³ã«ãªãããã«èšèšã§ããŸãã ãªããã€ã³ã«ãããã©ã€ã¿ãŒã¯ãšã©ãŒåŠçã匷調ããããšãã§ããŸãgofmt
ãåŒã³åºãããšã§ãã³ãŒããæ°ããã¹ã¿ã€ã«ã«èªåçã«ç§»æ€ã§ããŸããreturn
ã¹ããŒãã¡ã³ãå°çšãªã®ã§ãäžå¿
èŠã«ãŽã«ãã³ãŒãã«æªçšãããããšã¯ãããŸããtry
åŒã䜿çšãããšããããããŸãåŠçã§ããŸããtry
ãã©ã€ã¿ãŒã«å¯ããããå Žåãããå°ãªãã¹ããŒã¹ãå ããå埩ã³ãŒãã¯ãªãŒããŒã«åœ¹ç«ã¡ãŸãtry
ãææ¡ããŠããŸãã ããšãã°ããã®ã³ã¡ã³ããŸãã¯æ¬¡ã®ãããªã¹ã¿ã€ã«ã玹ä»ãããã®ã³ã¡ã³ãf, err := os.Open(file)
try(maybeWrap(err))
err
å€ã«é¢ãããããŸãããåãé€ããŸãã ãããã£ãŠããã®ãã©ãŒã ãäžè¬çã«äœ¿çšããããšæããŸãã ãããã¯ãã»ãŒåãã§ããå Žåã«1è¡ãèš±å¯ããããšã¯ãæ»ãå€ãäœã§ãããã«ã€ããŠãæ瀺ãããŠããããšãé€ããŠã§ããdefer
ããŒã¹ã®ã©ããã³ã°ãäžæ確ã«ãããããããšã¯ãããŸããã ã©ã¡ããã©ããã³ã°ãšã©ãŒã®éå£ãé«ããåè
ã¯godoc
ã®å€æŽãå¿
èŠã«ãªãå ŽåããããŸãtry
ã䜿çšããå Žåã«ã€ããŠè°è«ããå¿
èŠã¯ãããŸãããtry
ãŸãã¯ä»ã®äœããããããšãæé€ããŸããã try
ãåãå
¥ãããããšããŠããå€åã¯ãã©ã¹ã«ãªãå¯èœæ§ããããŸãtesting
ã©ã€ãã©ãªãŸãã¯main
é¢æ°ãšã®è² ã®çžäºäœçšã¯ãããŸããã å®éãææ¡ãåãªãæ»ãå€ã§ã¯ãªãåäžè¡ã®ã¹ããŒãã¡ã³ããèš±å¯ããå Žåãã¢ãµãŒã·ã§ã³ããŒã¹ã®ã©ã€ãã©ãªã®äœ¿çšãæžããå¯èœæ§ããããŸãã æ€èšvalue, err := something()
if err != nil { t.Fatal(err) }
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }
èŠçŽãããšããã®ææ¡ã¯ã³ã¹ããäœãããªããã€ã³ããããã«èšèšã§ããæäœã®ã¿ã§ãããããã以äžã®å€æŽãæé€ããããã¹ãŠãæ瀺çã«ä¿ã¡ãªãããåé·ãªãšã©ãŒåŠçã³ãŒããèªãæéã軜æžããŸãã try
ã«å
¥ãåã«ãå°ãªããšãæåã®ã¹ããããšèŠãªãå¿
èŠããããšæããŸãã
移æ€ãããããã€ãã®äŸ
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
try(dbfile.RunMigrations(db, dbMigrations))
t := &Thing{
thingy: thingy,
scanner: try(newScanner(thingy, db, client)),
}
t.initOtherThing()
return t, nil
}
func NewThing(thingy *foo.Thingy, db *sql.DB, client pb.Client) (*Thing, error) {
err := dbfile.RunMigrations(db, dbMigrations))
if err != nil { return nil, fmt.Errorf("running migrations: %v", err) }
t := &Thing{thingy: thingy}
t.scanner, err = newScanner(thingy, db, client)
if err != nil { return nil, fmt.Errorf("creating scanner: %v", err) }
t.initOtherThing()
return t, nil
}
ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããªãããã¹ããŒã¹äœ¿çšéã§ç«¶äºåããããŸãã
func (c *Config) Build() error {
pkgPath := try(c.load())
b := bytes.NewBuffer(nil)
try(emplates.ExecuteTemplate(b, "main", c))
buf := try(format.Source(b.Bytes()))
target := fmt.Sprintf("%s.go", filename(pkgPath))
try(ioutil.WriteFile(target, buf, 0644))
// ...
}
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil { return nil, errors.WithMessage(err, "load config dir") }
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err != nil { return nil, errors.WithMessage(err, "execute main template") }
buf, err := format.Source(b.Bytes())
if err != nil { return nil, errors.WithMessage(err, "format main template") }
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
// ...
}
å
ã®ã³ã¡ã³ãã§ã¯ãæ¶ç©ºã®tryf
ã䜿çšããŠãã©ãŒããããæ·»ä»ããŸããããããã¯åé€ãããŠããŸãã ãã¹ãŠã®åå¥ã®ã³ã³ããã¹ããè¿œå ããæåã®æ¹æ³ã¯äžæã§ãããããããtry
ã¯é©çšã§ããŸããã
@ cpuguy83
ç§ã«ãšã£ãŠã¯ã try
ã®æ¹ãèªã¿ããããªã£ãŠããŸãã ãã®äŸã§ã¯ãããã¡ã€ã«ãéãããã¹ãŠã®ãã€ããèªã¿åããããŒã¿ãéä¿¡ããããšèªã¿ãŸãã éåžžã®ãšã©ãŒåŠçã§ã¯ãããã¡ã€ã«ãéãããšã©ãŒãçºçãããã©ããã確èªãããšã©ãŒåŠçããããå®è¡ããŠããããã¹ãŠã®ãã€ããèªã¿åããäœããçºçãããã©ããã確èªããŸã...ããšèªã¿ãŸãã err != nil
ãã¹ãã£ã³ã§ããããšã¯ããã£ãŠããŸãã try
ã®æ¹ãç°¡åã§ãããªããªãããããèŠããšããã«åäœããããããã§ããerrïŒ= nilã®å Žåã«æ»ããŸãã ããªãããã©ã³ããæã£ãŠãããªããç§ã¯ãããäœãããããèŠãªããã°ãªããŸããã ããã¯äœã§ãã§ããŸãã
ãŸãããšã©ãŒãæ°ããã¡ãã»ãŒãžã§ã©ãããã以å€ã¯ãããã§ã®é 延ãšã©ãŒãã³ãã©ãŒã¯é©ââåã§ã¯ãªããšäž»åŒµããŸãã
延æã§ã§ããããšã¯ä»ã«ããããšæããŸãããããã§ãã try
ã¯åçŽãªäžè¬çãªã±ãŒã¹ã§ãã ãã£ãšäœããããããšãã¯ãã€ã§ããå€ãè¯ãGoãšã©ãŒåŠçãåžžã«ãããŸãã ããã¯ãªããªãããšã¯ãããŸããã
@zeeboãããç§ã¯ããã«å€¢äžã§ãã
@kungfusheepã®èšäºã§ã¯ããã®ãããª1è¡ã®ãšã©ãŒãã§ãã¯ã䜿çšããŠããã®ã§ãè©ŠããŠã¿ãããšã«ããŸããã ããããç§ãä¿åãããšããã«ãgofmtã¯ããã3è¡ã«æ¡åŒµããŸãããããã¯æ²ããããšã§ããã stdlibã®å€ãã®é¢æ°ã¯ããã®ããã«1è¡ã§å®çŸ©ãããŠããã®ã§ãgofmtããããæ¡åŒµããããšã«é©ããŸããã
@qrpnxz
ç§ã¯ããŸããŸããããã®goã³ãŒããèªãã§ããŸãã ãã®èšèªã®æãåªããŠããç¹ã®1ã€ã¯ãç¹å®ã®ã¹ã¿ã€ã«ã«åŸã£ãã»ãšãã©ã®ã³ãŒãã®äœ¿ããããã§ãïŒgofmtã«æè¬ïŒã
try(f())
ã§ã©ãããããã³ãŒãã®æãèªã¿ãããããŸããã
ããã¯ãã³ãŒãã®ã¹ã¿ã€ã«/ç·Žç¿ã«çžéããããããããã§try()
ã䜿çšãã¹ãã ã£ããã®ãããªãªã³ã¿ãŒãããããšãæå³ããŸãïŒãããç§ã¯å¥œãã§ã¯ãããŸããããããç§ãä»ã®äººã®ã³ã¡ã³ãã®ãã€ã³ãã§ãããã®ææ¡ã«ã€ããŠïŒã
客芳çã«ã¯if err != nil { return err }
ãããåªããŠããããã§ã¯ãªããå
¥åããã®ãå°ãªãã ãã§ãã
æåŸã«äžã€ã ãïŒ
ææ¡ãèªããšãããªãã劚ãããã®ã¯äœããªãããšãããããŸã
ãã®ãããªèšèã¯æ§ããŠããããŸããïŒ ãã¡ããç§ã¯ãã®ææ¡ãèªã¿ãŸããã ããŸããŸæšå€èªãã§ãä»æèããŠã³ã¡ã³ãããã®ã§ãããæå³ããããšã®çŽ°ããªç¹ã説æããŠããŸããã§ããã
ããã¯ä¿¡ããããªãã»ã©æµå¯Ÿçãªå£èª¿ã§ãã
@ cpuguy83
ç§ã®æªãCPUã®ç·ã ç§ã¯ãã®ããã«ãããæå³ããŸããã§ããã
ãŸãã try
ã䜿çšããã³ãŒãã¯ã䜿çšããªãã³ãŒããšã¯ããªãç°ãªã£ãŠèŠããããšãææããå¿
èŠããããšæããŸãããã®ããããã®ã³ãŒãã®è§£æã®ãšã¯ã¹ããªãšã³ã¹ã«åœ±é¿ãäžãããšæ³åã§ããŸããããã®éãã«å®å
šã«åæããããšã¯ã§ããŸããããã®å Žåã¯ãã£ãšæªãããšãæå³ããŸãããç§ãå人çã«å¥œããªã®ãšåãããã«ãããªããå人çã«ããã奜ãã§ã¯ãªãããšã¯ç解ããŠããŸãã Goã®å€ãã®ããšã¯ãã®ããã§ãã ãªã³ã¿ãŒãããªãã«äœãããããã«èšããã«ã€ããŠã¯ããŸã£ããå¥ã®åé¡ã ãšæããŸãã
確ãã«ããã¯å®¢èŠ³çã«è¯ãã¯ãããŸããã ç§ã¯ãããç§ã«ãšã£ãŠããèªã¿ãããããšãè¡šçŸããŠããŸããã ç§ã¯ããã泚ææ·±ãèšããŸããã
ç¹°ãè¿ããŸããããã®ããã«èãããŠãã¿ãŸããã ããã¯è°è«ã§ãããç§ã¯ããªãã«æµå¯Ÿããã€ããã¯ãããŸããã§ããã
https://github.com/golang/go/issues/32437#issuecomment -498908380
誰ãããªãã«è©ŠããŠãããã€ããã¯ãããŸããã
ããããããŠããããšãç¡èŠãããšãããã¯ãã¶ã€ã³ã«å¯Ÿããæ¹å€ãåŽäžããããã®ããªãæã«è² ããªãæ¹æ³ã ãšæããŸãã
確ãã«ãç§ã¯ããã䜿çšããå¿
èŠã¯ãããŸããã ããããç§ãã³ãŒããæžã人ã¯èª°ã§ãããã䜿çšããŠã try(try(try(to()).parse().this)).easily())
ã解èªããããšåŒ·å¶ããããšãã§ããŸãã ããã¯èšããããªãã®ã§ã
空ã®ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããã人ã¯èª°ãããŸãã{}ã
ãšã«ãããGoã¯åçŽãã«ã€ããŠããªãå³å¯ã§ãã gofmt
ã䜿çšãããšããã¹ãŠã®ã³ãŒããåãããã«èŠããŸãã 幞ããªéã¯æ®ãããŠãããé«äŸ¡ãŸãã¯é©ãã¹ããã®ã¯ãã¹ãŠæçœã§ãã ææ¡ãããŠããtry
ã¯ããããã180床å転ããŸãã ã·ã³ãã«ãïŒ=ç°¡æœã
å°ãªããšãtry
ã¯å·ŠèŸºå€ãæã€ããŒã¯ãŒãã§ããå¿
èŠããããŸãã
if err != nil { return err }
ããã_客芳çã«_åªããŠããããã§ã¯ãªããå ¥åããã®ãå°ãªãã ãã§ãã
2ã€ã®éã«1ã€ã®å®¢èŠ³çãªéãããããŸãïŒ try(Foo())
ã¯åŒã§ãã äžéšã®äººã«ãšã£ãŠã¯ããã®éãã¯æ¬ ç¹ã§ãïŒ try(strconv.Atoi(x))+try(strconv.Atoi(y))
ã®æ¹å€ïŒã ä»ã®äººã«ãšã£ãŠã¯ããã®éãã¯ã»ãšãã©åãçç±ã§è¯ãé¢ã§ãã ããã§ã客芳çã«è¯ããæªãããããŸããããéããæ·ç©ã®äžã§äžæãããã¹ãã§ã¯ãªããšç§ã¯æããŸãããããŠããããã¿ã€ãããã®ãã¡ããã©å°ãªãããšäž»åŒµããããšã¯ææ¡ã®æ£çŸ©ãè¡ããŸããã
@ elagergren-spideroakã¯ã try
ãäžæ¯ã§èŠãã®ãé¢åã§ã次ã®æ¯ã§ã¯æ瀺çã§ã¯ãªããšèšãã®ã¯é£ããã§ãã ããªãã¯1ã€ãéžã°ãªããã°ãªããŸããã
é¢æ°ã®åŒæ°ãæåã«äžæå€æ°ã«å ¥ããããã®ãèŠãã®ã¯äžè¬çã§ãã èŠãã®ããã£ãšäžè¬çã ãšæããŸã
this := try(to()).parse().this
that := try(this.easily())
ããªãã®äŸããã
try
äœãããªãã®ã¯å¹žããªéãªã®ã§ãæåŸ
ã©ããã«èŠããŸãã äžå¹žãªéã§ã¯ããããããã®ã¯æ»ãããšã ãã§ãã ãã®æ
å ±ãåéããã«ã¯ã try
ãããããšã確èªããã ãã§ååã§ãã é¢æ°ããæ»ãããšã«ã€ããŠãè²»çšããããããšã¯ãªãã®ã§ããã®èª¬æããã try
ã180ãå®è¡ããŠãããšã¯æããªã
@josharian https://github.com/golang/go/issues/32437#issuecomment -498941854ã§ã®ã³ã¡ã³ãã«é¢ããŠãããã§ã¯æ©æè©äŸ¡ãšã©ãŒã¯ãªããšæããŸãã
fmt.HandleErrorfïŒïŒerrãâ foobarïŒïŒ vâãerrïŒã延æããŸã
å€æŽãããŠããªãerr
HandleErrorf
æž¡ããã err
ãžã®ãã€ã³ã¿ãæž¡ãããŸãã err
ãnil
ã§ãããã©ããã確èªããŸãïŒãã€ã³ã¿ãŒã䜿çšïŒã ããã§ãªãå Žåã¯ãå€æŽãããŠããªãå€err
ã䜿çšããŠæååããã©ãŒãããããŸãã 次ã«ããã€ã³ã¿ã䜿çšããŠããã©ãŒãããããããšã©ãŒå€ã«err
ãèšå®ããŸãã
@Meroviusææ¡ã¯å®éã«ã¯åãªãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãã¯ããªã®ã§ã人ã ãèŠæ ããè¯ããªãããåé¡ãæãå°ãªããšæããã®ã«ãªãã§ãããã ããæããªãå Žåã¯ãç§ã«èª¬æããŠãã ããã ã ããç§ã¯å人çã«ãããæãã§ããŸãã ç§ã®èŠ³ç¹ããã¯ãããŒã¯ãŒããè¿œå ããªããŠãããè¿œå ã§ãã
@ ianlancetaylor ã @ josharianã¯æ£ãããšæããŸãã err
ã®ãå€æŽãããŠããªããå€ã¯ã defer
ãã¹ã¿ãã¯ã«ããã·ã¥ããããšãã®å€ã§ããã err
ã®ïŒããããæå³ãããïŒå€ã§ã¯ãããŸãããæ»ãåã«try
ã«ãã£ãŠèšå®ãããerr
ã
ç§ãtry
ã§æ±ããŠããããäžã€ã®åé¡ã¯ã人ã
ãããå€ãã®ããžãã¯ã1è¡ã«ãã³ãããã®ãéåžžã«ç°¡åã«ãªãããšã§ãã ããã¯ãä»ã®ã»ãšãã©ã®èšèªã§ã®ç§ã®å€§ããªåé¡ã§ãã1è¡ã«5ã€ã®åŒã®ããã«é
眮ããã®ãéåžžã«ç°¡åã§ãããããã䜿ããããªããšããããšã§ãã
this := try(to()).parse().this
that := try(this.easily())
^^ããã§ããªããšãã²ã©ãã§ãã æåã®è¡ã¯ãé ã®äžã§ãã¬ã³ãããã³ã°ãè¡ã£ãŠååŸã«ãžã£ã³ãããå¿
èŠããããŸãã å®éã«ã¯éåžžã«åçŽãª2è¡ç®ã§ãã...æ¬åœã«èªã¿ã«ããã§ãã
å
¥ãåé¢æ°ã¯èªã¿ã«ããã§ãã
parser, err := to()
if err != nil {
return err
}
this := parser.parse().this
that, err := this.easily()
if err != nil {
return err
}
^^ããã¯éåžžã«ç°¡åã§åªããIMOã§ãã ãšãŠãã·ã³ãã«ã§ã¯ãªã¢ã§ãã ã¯ããããã¯ãã£ãšå€ãã®ã³ãŒãè¡ã§ããç§ã¯æ°ã«ããŸããã ããã¯éåžžã«æçœã§ãã
@bcmills @josharianããããã¡ãããããããšãã ã ããããã¯
defer func() { fmt.HandleErrorf(&err, âfoobar: %vâ, err) }()
ããŸãè¯ããªãã ãã¶ãfmt.HandleErrorf
ã¯ãçµå±ã®ãšãããæåŸã®åŒæ°ãšããŠãšã©ãŒå€ãæé»çã«æž¡ãå¿
èŠããããŸãã
ãã®åé¡ã¯éåžžã«è¿ éã«å€ãã®ã³ã¡ã³ããåãåããŸããããããŠãããã®å€ãã¯ãã§ã«ãªãããã³ã¡ã³ããç¹°ãè¿ããŠããããã«ç§ã«ã¯æããŸãã ãã¡ããã³ã¡ã³ãããæ°è»œã«ã©ããããã§ã«è¿°ã¹ããã€ã³ããèšãæããå Žåã¯ããã€ã³ããç¹°ãè¿ãã®ã§ã¯ãªããGitHubã®çµµæåã䜿çšããŠè¡ãããšããå§ãããŸãã ããããšãã
@ianlancetaylor fmt.HandleErrorf
ããã©ãŒãããåŸã®æåã®åŒæ°ãšããŠerrãéä¿¡ãããšãå®è£
ãããé©åã«ãªãããŠãŒã¶ãŒã¯åžžã«%[1]v
ã§åç
§ã§ããããã«ãªããŸãã
@natefinch絶察ã«åæããŸãã
ãã³åã®ã¢ãããŒãã®æ¹ãå£ã«åãã®ã§ã¯ãªãã§ããããã
ããã¯ãã èããŠããã ãã®ææ¡ã§ã¯ãªãããšã«æ³šæããŠãã ãã...
this := to()?.parse().this
that := this.easily()?
çµå±ãããã¯ãã£ãšè¯ããšæããŸããïŒ !
ãŸãã¯ä»ã®äœãã䜿çšããããšãã§ããŸã...ïŒãããã§ããšã©ãŒåŠçã®åé¡ãããŸãä¿®æ£ã§ããŸããã
ãã¡ãããéããã®ããã«try()
ãæã£ãŠããŸããã...ä»ã®éã®ã¹ã¿ã€ã«ã§ãã
if err != nil { return err }
ããã_客芳çã«_åªããŠããããã§ã¯ãªããå ¥åããã®ãå°ãªãã ãã§ãã2ã€ã®éã«1ã€ã®å®¢èŠ³çãªéãããããŸãïŒ
try(Foo())
ã¯åŒã§ãã äžéšã®äººã«ãšã£ãŠã¯ããã®éãã¯æ¬ ç¹ã§ãïŒtry(strconv.Atoi(x))+try(strconv.Atoi(y))
ã®æ¹å€ïŒã ä»ã®äººã«ãšã£ãŠã¯ããã®éãã¯ã»ãšãã©åãçç±ã§è¯ãé¢ã§ãã ããã§ã客芳çã«è¯ããæªãããããŸããããéããæ·ç©ã®äžã§äžæãããã¹ãã§ã¯ãªããšç§ã¯æããŸãããããŠããããã¿ã€ãããã®ãã¡ããã©å°ãªãããšäž»åŒµããããšã¯ææ¡ã®æ£çŸ©ãè¡ããŸããã
ããããç§ããã®æ§æãæ°ã«å ¥ã£ãŠããæ倧ã®çç±ã®1ã€ã§ãã ããã«ããããã¹ãŠã®äžéçµæã«ååãä»ããããšãªãããã倧ããªåŒã®äžéšãšããŠãšã©ãŒãè¿ãé¢æ°ã䜿çšã§ããŸãã ååãä»ããã®ãç°¡åãªå ŽåããããŸãããç¹ã«æå³ã®ããååãåé·æ§ã®ãªãååãä»ããå¿ èŠããªãå ŽåããããŸãããã®å Žåã¯ãååããŸã£ããä»ããããããŸããã
@MrTravisB
ãŸãã«ç§ã®ãã€ã³ãã ãã®ææ¡ã¯ããšã©ãŒåŠçã®ãã倧ããªåé¡ã解決ããããã®ããŒã«ãæäŸããã®ã§ã¯ãªããåäžã®ãŠãŒã¹ã±ãŒã¹ã解決ããããšããŠããŸãã æ£ç¢ºã«ããªããææããããšãªããæ ¹æ¬çãªè³ªåã ãšæããŸãã
ããããŸãã«ããªãã®ãã€ã³ãã ãšç§ã¯å ·äœçã«äœãšèšããŸãããïŒ ç§ãã¡ãåæãããšæããªããããªãã¯ç§ã®äž»åŒµãæ ¹æ¬çã«èª€è§£ããŠããããã«ç§ã«ã¯æããŸãã
ç§ã®æèŠãšçµéšã§ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã¯å°æ°æŽŸã§ãããçç¥æ§æãä¿èšŒãããã®ã§ã¯ãããŸããã
GoãœãŒã¹ã«ã¯ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããæ¹æ³ããªãã£ããšããŠããç®±ããåºããŠtry
ã§åŠçã§ããã±ãŒã¹ãäœåããããŸãã ãã€ããŒãªå Žåã§ããããã¯äŸç¶ãšããŠäžè¬çãªèŠæ
ã®åå ã§ãã
ãŸãããšã©ãŒãåŠçããããã«deferã䜿çšããã¢ãããŒãã«ã¯ãèãããããã¹ãŠã®ãšã©ãŒãåãããã«åŠçããããšãåæãšããŠãããšããåé¡ããããŸãã 延æã¹ããŒãã¡ã³ãã¯ãã£ã³ã»ã«ã§ããŸããã
åæ§ã«ã+ã䜿çšããŠç®è¡ãåŠçããã¢ãããŒãã¯ãæžç®ããããªãããšãåæãšããŠãããããæžç®ããªãå Žåã¯æžç®ããŸããã èå³æ·±ã質åã¯ããããã¯å šäœã®ãšã©ãŒã³ã³ããã¹ããå°ãªããšãäžè¬çãªãã¿ãŒã³ãè¡šããŠãããã©ããã§ãã
fooïŒïŒãšfoo2ïŒïŒããè¿ãããå¯èœæ§ã®ãããšã©ãŒã«å¯ŸããŠç°ãªããšã©ãŒåŠçãå¿ èŠãªå Žåã¯ã©ããªããŸããïŒ
ç¹°ãè¿ããŸããã try
ã¯äœ¿çšããŸããã ããããã°ã try
ããäœãåŸãããŸããããäœã倱ãããšã¯ãããŸããã
@ cpuguy83
ãã³åã®ã¢ãããŒãã®æ¹ãå£ã«åãã®ã§ã¯ãªãã§ããããã
ææ¡ã¯ããã«å察ããè°è«ãæ瀺ããŸãã
ãã®æç¹ã§ã try{}catch{}
ã䜿çšããæ¹ãèªã¿ããããšæããŸãïŒupside_down_faceïŒ
defer
ã³ãŒããŒã±ãŒã¹ãåé¿ããããšã¯ãgodocã®ãããªãã®ã«ãšã£ãŠã²ã©ãã ãã§ãªããæãéèŠãªããšã«ããšã©ãŒãçºçããããããšã§ãã åé¡ãåé¿ããããã«ããã¹ãŠãå¥ã®func()
ã§ã©ããã§ãããã©ããã¯æ°ã«ããŸãããèŠããŠããå¿
èŠãããã®ã¯ããã ãã§ã¯ãªãããæªãç¿æ
£ããå©é·ãããšæããŸãã誰ãããªãã«è©ŠããŠãããã€ããã¯ãããŸããã
ãããè¯ã解決çã§ãããšããæå³ã§ã¯ãããŸãããçŸåšã®ã¢ã€ãã¢ã«ã¯èšèšäžã®æ¬ é¥ãããããšã匷調ãããšã©ãŒãçºçãã«ããæ¹æ³ã§å¯ŸåŠããããšãæ±ããŠããŸãã
try(try(try(to()).parse().this)).easily())
ã®ãããªäŸã¯éçŸå®çã ãšæããŸããããã¯ä»ã®é¢æ°ã§ãã§ã«å®è¡ã§ããŠããã®ã§ãã³ãŒããã¬ãã¥ãŒãã人ãã³ãŒããåå²ããããã«äŸé Œããã®ã¯å
¬å¹³ã ãšæããŸãããšã©ãŒãçºçããå¯èœæ§ã®ããå Žæã3ã€ãããåå Žæãåå¥ã«ã©ãããããå Žåã¯ã©ããªããŸããïŒ try()
ã¯ãããéåžžã«é£ããããŸããå®éã try()
ã¯ããã®é£ãããèãããšããã§ã«æãè¿ããšã©ãŒãæããšã©ãŸãããŠããŸããããããç§ã®èšãããããšã®äŸã§ãã
func before() error {
x, err := foo()
if err != nil {
wrap(err, "error on foo")
}
y, err := bar(x)
if err != nil {
wrapf(err, "error on bar with x=%v", x)
}
fmt.Println(y)
return nil
}
func after() (err error) {
defer fmt.HandleErrorf(&err, "something failed but I don't know where: %v", err)
x := try(foo())
y := try(bar(x))
fmt.Println(y)
return nil
}
ç¹°ãè¿ããŸããã
try
ã¯äœ¿çšããŸããã ããããã°ãtry
ããäœãåŸãããŸããããäœã倱ãããšã¯ãããŸããã
ãšã©ãŒãæçšãªã³ã³ããã¹ãã§ã©ããããããšã¯è¯ãç¿æ
£ã ãšããŸãããã try()
ã¯ã³ã³ããã¹ããè¿œå ããªããããæªãç¿æ
£ãšèŠãªãããŸãã ããã¯ã try()
ã誰ã䜿çšããããªãæ©èœã§ãããã»ãšãã©äœ¿çšãããªãããã«ååšããªãã£ãå¯èœæ§ãããæ©èœã«ãªãããšãæå³ããŸãã
ããŸããæ°ã«å ¥ããªãã®ãªãã䜿ããªãã§é»ã£ãŠããšèšãã®ã§ã¯ãªãïŒããããèªã¿æ¹ã§ãïŒãå€ãã®äººãæ¬ é¥ãèããŠããããšã«å¯ŸåŠããŠã¿ãã»ãããããšæããŸãããã¶ã€ã³ã§ã 代ããã«ãç§ãã¡ã®æžå¿µãããè¯ãæ¹æ³ã§åŠçãããããã«ãææ¡ãããèšèšããäœãå€æŽã§ãããã«ã€ããŠè©±ãåãããšãã§ããŸããïŒ
@boomlindeç§ãã¡ãåæããç¹ã¯ããã®ææ¡ã¯ãã€ããŒãªãŠãŒã¹ã±ãŒã¹ã解決ããããšããŠãããšããããšã§ããããå¿ èŠããªãå Žåã¯äœ¿çšããªãããšããäºå®ããã®ç¹ãä¿é²ããããã®äž»èŠãªè°è«ã§ãã @ elagergren-spideroakãè¿°ã¹ãããã«ãç§ãããã䜿ããããªããŠããä»ã®äººãç§ã«ããã䜿ããããããªãã®ã§ããã®è°è«ã¯ããŸããããŸããã ããªãã®è°è«ã®è«çã«ãã£ãŠãGoã¯ãŸãäžé ã¹ããŒãã¡ã³ããæã€ã¹ãã§ãã ãŸããäžé ã¹ããŒãã¡ã³ããæ°ã«å ¥ããªãå Žåã¯ã䜿çšããªãã§ãã ããã
å 責äºé -Goã«ã¯äžé ã¹ããŒãã¡ã³ããå¿ èŠã ãšæããŸãããèšèªæ©èœã«å¯ŸããGoã®ã¢ãããŒãã¯ãã³ãŒããèªã¿ã«ããããå¯èœæ§ã®ããæ©èœãå°å ¥ããªãããšã§ãã
å¥ã®ããšãç§ã«èµ·ãããŸãã try
ããããšãéçºè
ãäžæ³šæã«ãšã©ãŒãåŠçããããã«ãªããããããªããšããèãã«åºã¥ããŠãå€ãã®æ¹å€ããããŸãã ããããç§ã®æèŠã§ã¯ãããã¯ã©ã¡ãããšããã°ãçŸåšã®èšèªã«ããåœãŠã¯ãŸããŸãã ãšã©ãŒåŠçã®å®åæã¯ããããåé¿ããããã«ããã€ãã®ãšã©ãŒã飲ã¿èŸŒããç¡èŠããããšã奚å±ããã»ã©åä»ã§ãã ããšãã°ãç§ã¯ãã®ãããªããšãæ°åæžããŠããŸãïŒ
func exists(filename string) bool {
_, err := os.Stat(filename)
return err == nil
}
ãã®ã³ãŒãã¯ããã€ãã®èãããããšã©ãŒãé»ã£ãŠç¡èŠããŸããã if exists(...) { ... }
ãæžã蟌ããããã«ããããã§ãã try
ããã£ãå Žåããããããããæ°ã«ããã (bool, error)
ãè¿ãã ãã§ãã
ããã§ã¯æ··æ²ãšããŠããã®ã§ã catch
ãšãã2çªç®ã®çµã¿èŸŒã¿é¢æ°ãè¿œå ãããšããã¢ã€ãã¢ãæããããŸãããã®é¢æ°ã¯ããšã©ãŒãåãåããäžæžãããããšã©ãŒãè¿ãé¢æ°ãåãåãããã®åŸã®catch
ãšåŒã°ãããã³ãã©ãŒãäžæžãããŸãã äŸãã°ïŒ
func catch(handler func(err error) error) {
// .. impl ..
}
ããã§ããã®çµã¿èŸŒã¿é¢æ°ã¯ã次ã®ããã«try
ã«ãã£ãŠè¿ããã次ã®ãšã©ãŒãåŠçãããã¯ãã®ãããªé¢æ°ã«ããªââããŸãã
func wrapf(format string, ...values interface{}) func(err error) error {
// user defined
return func(err error) error {
return fmt.Errorf(format + ": %v", ...append(values, err))
}
}
func sample() {
catch(wrapf("something failed in foo"))
try(foo()) // "something failed in foo: <error>"
x := try(foo2()) // "something failed in foo: <error>"
// Subsequent calls for catch overwrite the handler
catch(wrapf("something failed in bar with x=%v", x))
try(bar(x)) // "something failed in bar with x=-1: <error>"
}
ããã¯ã defer
ãªãã§ãšã©ãŒãã©ããã§ããã®ã§äŸ¿å©ã§ããããã¯ãååä»ãã®æ»ãå€ã䜿çšããããå¥ã®é¢æ°ã§ã©ããããªãéãããšã©ãŒãçºçããããå¯èœæ§ããããŸãããŸãã defer
ãåããšã©ãŒãã³ãã©ãŒãè¿œå ããã®ã§äŸ¿å©ã§ãã 2ã€ãå¥ã®æ¹æ³ã§åŠçãããå Žåã§ãããã¹ãŠã®ãšã©ãŒã 次ã®ããã«ãé©åãšæãããæ¹æ³ã§äœ¿çšããããšãã§ããŸãã
func foo(a, b string) (int64, error) {
return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func withContext(a, b string) (int64, error) {
catch(func (err error) error {
return fmt.Errorf("can't parse a: %s, b: %s, err: %v", a, b, err)
})
return try(strconv.Atoi(a)) + try(strconv.Atoi(b))
}
func moreExplicitContext(a, b string) (int64, error) {
catch(func (err error) error {
return fmt.Errorf("can't parse a: %s, err: %v", a, err)
})
x := try(strconv.Atoi(a))
catch(func (err error) error {
return fmt.Errorf("can't parse b: %s, err: %v", b, err)
})
y := try(strconv.Atoi(b))
return x + y
}
func withHelperWrapf(a, b string) (int64, error) {
catch(wrapf("can't parse a: %s", a))
x := try(strconv.Atoi(a))
catch(wrapf("can't parse b: %s", b))
y := try(strconv.Atoi(b))
return x + y
}
func before(a, b string) (int64, error) {
x, err := strconv.Atoi(a)
if err != nil {
return 0, fmt.Errorf("can't parse a: %s, err: %v", a, err)
}
y, err := strconv.Atoi(b)
if err != nil {
return 0, fmt.Errorf("can't parse b: %s, err: %v", b, err)
}
return x + y
}
ãããŠããŸã æ··æ²ãšããæ°åã«ãªã£ãŠããŸãïŒå
±æããã®ã«åœ¹ç«ã¡ãŸãïŒ catch
ãæ°ã«å
¥ããªãå Žåã¯ãããã䜿çšããå¿
èŠã¯ãããŸããã
ããŠ...ç§ã¯ãããæåŸã®æã§ãããšããæå³ã§ã¯ãããŸããããããã¯è°è«ã«åœ¹ç«ããªãããã«æããŸããéåžžã«æ»æçãªIMOã
ããã§ãããã®ã«ãŒãã䜿çšããå Žåã¯ã代ããã«try{}catch(error err){}
ã䜿çšããããšãã§ããŸãïŒstuck_out_tongueïŒ
ïŒ27519-ïŒid / catchãšã©ãŒã¢ãã«ãåç §ããŠãã ãã
誰ãããªãã«è©ŠããŠãããã€ããã¯ãããŸããã
ããããããŠããããšãç¡èŠãããšãããã¯ãã¶ã€ã³ã«å¯Ÿããæ¹å€ãåŽäžããããã®ããªãæã«è² ããªãæ¹æ³ã ãšæããŸãã
ç³ãèš³ãããŸããããglibã¯ç§ã®æå³ã§ã¯ãããŸããã§ããã
ç§ãèšãããšããŠããã®ã¯ã try
ã¯100ïŒ
ã®è§£æ±ºçãæå³ãããã®ã§ã¯ãªããšããããšã§ãã try
ã§ã¯é©åã«åŠçãããªãããŸããŸãªãšã©ãŒåŠçãã©ãã€ã ããããŸãã ããšãã°ãcallsiteã«äŸåããã³ã³ããã¹ãããšã©ãŒã«è¿œå ããå¿
èŠãããå Žåã§ãã ãããã®ããè€éãªã±ãŒã¹ãåŠçããããã«ããã€ã§ãif err != nil {
ã®äœ¿çšã«ãã©ãŒã«ããã¯ã§ããŸãã
Xã®ããŸããŸãªã€ã³ã¹ã¿ã³ã¹ã«ã€ããŠã try
ãXãåŠçã§ããªãããšã¯ç¢ºãã«æå¹ãªè°è«ã§ããããããå€ãã®å Žåãã±ãŒã¹XãåŠçããããšã¯ãã¡ã«ããºã ãããè€éã«ããããšãæå³ããŸãã ããã«ã¯ãã¬ãŒããªãããããäžæ¹ã§XãåŠçããŸãããä»ã®ãã¹ãŠã®ã¡ã«ããºã ãè€éã«ããŸãã ç§ãã¡ãäœããããã¯ãXãã©ãã»ã©äžè¬çã§ããããããã³XãåŠçããããã«ã©ãã ãè€éã«ãªããã«ãã£ãŠç°ãªããŸãã
ã€ãŸããã誰ãããªãã«è©ŠããŠãããã€ããã¯ãªãããšããããšã¯ãåé¡ã®äŸã90ïŒ
ã§ã¯ãªã10ïŒ
ã«ãããšç§ãæãããšãæå³ããŸãã ãã®äž»åŒµã¯ç¢ºãã«è°è«ã®äœå°ããããåè«ãèããŠããããã§ãã ããããæçµçã«ã¯ã©ããã«ç·ãåŒãããããã try
ã¯ãã®ã±ãŒã¹ãåŠçããŸãããå€ãã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã䜿çšããå¿
èŠããããŸããããããªããããšèšãå¿
èŠããããŸãã
åé¡ã¯ããã®ç¹å®ã®ãšã©ãŒåŠçã®ã±ãŒã¹ãåŠçã§ããªãããšããããšã§ã¯ãªããããšã©ãŒãã©ããããªãããã«å§ããããšããããšã§ãã check-handle
ã®ã¢ã€ãã¢ã§ã¯ãreturnã¹ããŒãã¡ã³ããäœæããå¿
èŠããã£ãããããšã©ãŒã©ããã³ã°ãäœæããã®ã¯éåžžã«ç°¡åã§ããã
ãã®ææ¡ã§ã¯ã defer
ã®ååä»ããªã¿ãŒã³ã䜿çšããå¿
èŠããããŸãããããã¯çŽæçã§ã¯ãªããéåžžã«ããããŒãªããã§ãã
check-handle
ã®ã¢ã€ãã¢ã§ã¯ãreturnã¹ããŒãã¡ã³ããäœæããå¿ èŠããã£ãããããšã©ãŒã©ããã³ã°ãäœæããã®ã¯éåžžã«ç°¡åã§ããã
ããã¯çå®ã§ã¯ãããŸãããèšèšãã©ããã§ã¯ããšã©ãŒãè¿ããã¹ãŠã®é¢æ°ã«ã¯ããšã©ãŒãè¿ãã ãã®ããã©ã«ãã®ãã³ãã©ãŒããããŸãã
@Goodwineã®æ¬ ç¹ã«åºã¥ããŠã次ã®ãããªåäžã®ããªããžé¢æ°ãããå Žåã HandleErrorf
ã®ãããªåå¥ã®é¢æ°ã¯å®éã«ã¯å¿
èŠãããŸããã
func handler(err *error, handle func(error) error) {
// nil handle is treated as the identity
if *err != nil && handle != nil {
*err = handle(*err)
}
}
ããªãã奜ããªãã®ã䜿çšããŸã
defer handler(&err, func(err error) error {
if errors.Is(err, io.EOF) {
return nil
}
return fmt.Errorf("oops: %w", err)
})
handler
èªäœãtry
ã®ãããªã»ãããžãã¯ãã«ãã€ã³ã«ããããšãã§ããŸãã
ãããéæ³ã®å Žåãæåã®åŒæ°ãæé»çã«åãããšãã§ããŸãã error
ã®æ»ãå€ã«ååãä»ããªãé¢æ°ã§ã䜿çšã§ããããã«ããçŸåšã®ææ¡ã®äžå¹žãªåŽé¢ã®1ã€ãããã¯ã¢ãŠããããããå°ãªãããŸãããããããŠãšã©ãŒãçºçããããããšã©ãŒãçºçãããããªããŸãã ãã¡ãããããã§åã®äŸã倧å¹
ââã«æžãããšã¯ãããŸããã
defer handler(func(err error) error {
if errors.Is(err, io.EOF) {
return nil
}
return fmt.Errorf("oops: %w", err)
})
ãã®ããã«éæ³ã®å Žåã defer
ã®åŒæ°ä»¥å€ã®å Žæã§äœ¿çšãããšãã³ã³ãã€ã«æãšã©ãŒã«ãªãã¯ãã§ãã ããã«äžæ©é²ãã§æé»çã«å»¶æããããšãã§ããŸããã defer handler
éåžžã«ããŸãèªã¿åããŸãã
defer
ã䜿çšãããããnil以å€ã®ãšã©ãŒãè¿ããããã³ã«ã handle
funcãåŒã³åºãããšãã§ãã try
ããªããŠãã
defer handler(wrapErrWithPackageName)
äžçªäžã«fmt.Errorf("mypkg: %w", err)
ãã¹ãŠã
ããã«ãããå€ãcheck
/ handle
ã®ææ¡ãå€æ°æäŸãããŸãããã»ãšãã©ã®å Žåã err
ã«æ瀺çã«ååãä»ããå¿
èŠããªããªããèªç¶ã«ïŒãããŠæ瀺çã«ïŒå»¶æããŠæ©èœããŸãã try
ã®ããã«ãããã¯ïŒç§ãæ³åããïŒæ¯èŒçåçŽãªãã¯ãã§ãããå®å
šã«ããã³ããšã³ãã«å®è£
ããããšãã§ããŸãã
ããã¯çå®ã§ã¯ãããŸãããèšèšãã©ããã§ã¯ããšã©ãŒãè¿ããã¹ãŠã®é¢æ°ã«ã¯ããšã©ãŒãè¿ãã ãã®ããã©ã«ãã®ãã³ãã©ãŒããããŸãã
ç§ã®æªããããªãã¯æ£ããã§ãã
åé¡ã®äŸã¯90ïŒ ã§ã¯ãªã10ïŒ ã«ãããšæããŸãã ãã®äž»åŒµã¯ç¢ºãã«è°è«ã®äœå°ããããåè«ãèããŠããããã§ãã ããããæçµçã«ã¯ã©ããã«ç·ãåŒããããããè©ŠããŠã¿ãŠããã®ã±ãŒã¹ã¯åŠçãããŸãããå€ãã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã䜿çšããå¿ èŠããããŸããããããªããããšèšããªããã°ãªããŸããã
åæããŸãããç§ã®æèŠã§ã¯ããã®ç·ã¯ãæãè¿ãã§ã¯ãªããEOFãªã©ããã§ãã¯ãããšãã«æç»ããå¿ èŠããããŸãã ãããããšã©ãŒã«ã³ã³ããã¹ããå€ããã°ãããã¯ããåé¡ã«ã¯ãªããŸããã
try()
ã¯ããããã°ã«åœ¹ç«ã€ã³ã³ããã¹ãã§ãšã©ãŒãèªåã©ããã§ããŸããïŒ ããšãã°ã xerrors
ãerrors
ã«ãªã£ãå Žåããšã©ãŒã«ã¯try()
ãè¿œå ã§ããã¹ã¿ãã¯ãã¬ãŒã¹ã®ãããªãã®ãå¿
èŠã§ãã ãããããªãå€åããã§ååã§ãããð€
ç®æšãïŒhttps://github.com/golang/proposal/blob/master/design/32437-try-builtin.mdãèªãïŒã®å ŽåïŒ
ç§ã¯ããã«è§åºŠãä»ããŠãããã«ããæ°ååè¡ã®ã³ãŒããã¹ãŠã«å¯ŸããŠãå°ããªã¹ããããã®ã³ãŒã移è¡ãèš±å¯ãããšããææ¡ãåãå ¥ããŸãã
ææ¡ã®ä»£ããã«ïŒ
func printSum(a, b string) error {
defer fmt.HandleErrorf(&err, "sum %s %s: %v", a,b, err)
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x + y)
return nil
}
æã ã¯ã§ããïŒ
func printSum(a, b string) error {
var err ErrHandler{HandleFunc : twoStringsErr("printSum",a,b)}
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
return nil
}
ç§ãã¡ã¯äœãåŸãã§ããããïŒ
twoStringsErrã¯ãprintSumããŸãã¯ãšã©ãŒããã£ããã£ããæ¹æ³ãç¥ã£ãŠããäžè¬çãªãã³ãã©ãŒïŒãã®å Žåã¯2ã€ã®æååãã©ã¡ãŒã¿ãŒïŒã«ã€ã³ã©ã€ã³åã§ããŸã-ãããã£ãŠãå€ãã®é¢æ°ã§åãç¹°ãè¿ãfuncã·ã°ããã£ã䜿çšãããŠããå Žåã¯ããã³ãã©ãŒãããããæžãçŽãå¿
èŠã¯ãããŸããæé
åæ§ã«ãErrHandlerã¿ã€ãã次ã®ããã«æ¡åŒµã§ããŸãã
type ioErrHandler ErrHandler
func (i ErrHandler) Handle() ...{
}
ãŸã
type parseErrHandler ErrHandler
func (p parseErrHandler) Handle() ...{
}
ãŸã
type str2IntErrHandler ErrHandler
func (s str2IntErrHandler) Handle() ...{
}
ãããŠãããç§ã®ã³ãŒãå šäœã§äœ¿çšããŸãïŒ
func printSum(a, b string) error {
var pErr str2IntErrHandler
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
return nil
}
ãããã£ãŠãå®éã«å¿
èŠãªã®ã¯ãerr.Errorãnilã§ã¯ãªãããã«èšå®ãããŠãããšãã«ããªã¬ãŒãéçºããããšã§ãã
ãã®æ¹æ³ã䜿çšãããšã次ã®ããšãã§ããŸãã
func (s str2IntErrHandler) Handle() bool{
**return false**
}
ããã¯ãåŒã³åºãå ã®é¢æ°ã«ãæ»ã代ããã«ç¶è¡ããããã«æ瀺ããŸã
ãŸããåãé¢æ°ã§ç°ãªããšã©ãŒãã³ãã©ãŒã䜿çšããŸãã
func printSum(a, b string) error {
var pErr str2IntErrHandler
var oErr overflowError
x, err.Error := strconv.Atoi(a)
y,err.Error := strconv.Atoi(b)
fmt.Println("result:", x + y)
totalAsByte,oErr := sumBytes(x,y)
sunAsByte,oErr := subtractBytes(x,y)
return nil
}
ç
ããäžåºŠç®æšãè¶ ãã
x, err := strconv.Atoi(a)
ã«
x, err.Error := strconv.Atoi(a)
ãããŠå®éã«ã¯-èªã¿ãããã®åäžïŒIMOãåã³ïŒ
@guybrandããªãã¯ãã®å®æçãªããŒãïŒç§ã奜ãã§ãïŒã®ææ°ã®æ¯æè ã§ãã
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring-themesãåç §ããŠãã ãã
@guybrandããã¯ãŸã£ããå¥ã®ææ¡ã®ããã§ãã ããã@griesemerã®ææ¡ã®è°è«ã«éäžã§ããããã«ããããç¬èªã®åé¡ãšããŠæåºããå¿ èŠããããšæããŸãã
@natefinchã¯åæããŸãã ããã¯ãèªæžçšã«æé©åããã®ã§ã¯ãªããGoãæžããŠããéã®ãšã¯ã¹ããªãšã³ã¹ãæ¹åããããšãç®çãšããŠãããšæããŸãã IDEãã¯ããŸãã¯ã¹ããããã¯ããããèšèªã®æ©èœã«ãªãããšãªãåé¡ã解決ã§ããã®ã§ã¯ãªãããšæããŸãã
@Goodwine
ãšã©ãŒãæçšãªã³ã³ããã¹ãã§ã©ããããããšã¯è¯ãç¿æ £ã ãšããŸããã
try()
ã¯ã³ã³ããã¹ããè¿œå ããªããããæªãç¿æ £ãšèŠãªãããŸãã ããã¯ãtry()
ã誰ã䜿çšããããªãæ©èœã§ãããã»ãšãã©äœ¿çšãããªãããã«ååšããªãã£ãå¯èœæ§ãããæ©èœã«ãªãããšãæå³ããŸãã
ææ¡ã«èšèŒãããŠããããã«ïŒãããŠäŸã§ç€ºãããŠããããã«ïŒã try
ã¯åºæ¬çã«ã³ã³ããã¹ãã®è¿œå ã劚ãããã®ã§ã¯ãããŸããã ç§ã¯ãããææ¡ãããŠããæ¹æ³ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã¯ãããšå®å
šã«çŽäº€ããŠãããšæããŸãã ããã¯ãææ¡ã®FAQã§å
·äœçã«åãäžããããŠããŸãã
try
ã¯ãé¢æ°åŒã³åºãããã®ããŸããŸãªãšã©ãŒã«è¿œå ãããããŸããŸãªã³ã³ããã¹ããå€æ°ããå Žåã«ãåäžã®é¢æ°å
ã«ããå Žåã¯åœ¹ã«ç«ããªãããšãèªèããŠããŸãã ãã ãããšã©ãŒã«é¢æ°å
šäœã®ã³ã³ããã¹ããè¿œå ããããšã ããçããããšã§ã¯ãªãããã HandleErrorf
ã®äžè¬çãªæå³ã§ã®äœ¿çšç¯å²ãåºããšæããŸãã
ããŸããæ°ã«å ¥ããªãã®ãªãã䜿ããªãã§é»ã£ãŠããšèšãã®ã§ã¯ãªãïŒããããèªã¿æ¹ã§ãïŒãå€ãã®äººãæ¬ é¥ãèããŠããããšã«å¯ŸåŠããŠã¿ãã»ãããããšæããŸãããã¶ã€ã³ã§ã
ããããããèªãæ¹æ³ã§ãããªãã°ãç§ã¯è¬çœªããŸãã ç§ã®èšãããããšã¯ãæ°ã«å
¥ããªããã°ååšããªããµããããã¹ãã ãšããããšã§ã¯ãããŸããã try
ã圹ã«ç«ããªãå Žåãããããšã¯æããã§ããããã®ãããªå Žåã«ã¯äœ¿çšãã¹ãã§ã¯ãããŸããããã®ææ¡ã§ã¯ãKISSãšäžè¬çãªãŠãŒãã£ãªãã£ã®ãã©ã³ã¹ãåããŠãããšæããŸãã ãã®ç¹ã§äžæ確ã ãšã¯æããŸããã§ããã
ãããŸã§ã®å€ãã®ãã£ãŒãããã¯ã«æè¬ããŸãã ããã¯éåžžã«æçã§ãã
ãããããã£ãŒãããã¯ãããããç解ããããã®æåã®èŠçŽã§ã®ç§ã®è©Šã¿ã§ãã ç§ãèŠéãããã誀ã£ãŠäŒããããã人ã«ã¯ãäºåã«è¬çœªããŸãã ç§ã¯ããã®å
šäœçãªèŠç¹ãæ£ããç解ããããšãé¡ã£ãŠããŸãã
0ïŒè¯ãé¢ãšããŠã @ rasky ã @ adg ã @ eandre ã @ dpinelaãªã©ã¯ã try
ãæäŸããã³ãŒãã®åçŽåã«å¯ŸããŠå¹žçŠãæ瀺çã«è¡šçŸããŸããã
1ïŒæãéèŠãªæžå¿µã¯ã try
ãé©åãªãšã©ãŒåŠçã¹ã¿ã€ã«ãä¿é²ããã代ããã«ãè¿
éãªçµäºããä¿é²ããããšã§ããããã«æãããŸãã ïŒ@ agnivade ã@ peterbourgon ã@ politicianã@ a8m ã@ eandre ã @ prologic ã @ kungfusheep ã@ cpuguy ãããã³ä»ã®äººãããã«ã€ããŠæžå¿µãè¡šæããŠããŸããïŒ
2ïŒå€ãã®äººã¯ãçµã¿èŸŒã¿ã®ã¢ã€ãã¢ããããã«ä»å±ããé¢æ°æ§æãreturn
ãé ãããããããå«ããŸãã ããŒã¯ãŒãã䜿çšããæ¹ãè¯ãã§ãããã ïŒ@ sheerun ã@ Redundancy ã@ dolmenã@ komuw ã@ RobertGrantEllis ã@ elagergren -spideroakïŒã try
ãç°¡åã«èŠèœãšãããå¯èœæ§ããããŸãïŒ@peterbourgonïŒãç¹ã«ãä»»æã«ãã¹ããããŠããå¯èœæ§ã®ããåŒã«è¡šç€ºãããå¯èœæ§ãããããã§ãã @natefinchã¯ã try
ã«ãã£ãŠãã1è¡ã«å€§éã«ãã³ãããã®ãç°¡åããããããšãæžå¿µããŠããŸããããã¯ãGoã§ã¯éåžžé¿ããããšããŠããããšã§ãã ãŸãã try
ã匷調ããIDEãµããŒãã§ã¯äžååãªå ŽåããããŸãïŒ@dominikhïŒã try
ã¯ãèªç«ãããå¿
èŠããããŸãã
3ïŒäžéšã®äººã«ãšã£ãŠãæ瀺çãªif
ã¹ããŒãã¡ã³ãã®çŸç¶ã¯åé¡ã§ã¯ãªãã圌ãã¯ããã«æºè¶³ããŠããŸãïŒ@ bitfield ã@ marwan-at-workã@ natefinchïŒã ç©äºãè¡ãæ¹æ³ã¯1ã€ã ãã«ããããšããå§ãããŸãïŒ@gbbrïŒã æ瀺çãªif
ã¹ããŒãã¡ã³ãã¯ãæé»çãªreturn
ïŒ @ DavexPro ã @ hmage ã @ prologic ã@ natefinchïŒãããåªããŠããŸãã
åãããã«ã @ mattnã¯ããšã©ãŒçµæãtry
ã«ãæé»çã«ãã€ã³ãããããããšãæžå¿µããŠããŸããã€ãŸããæ¥ç¶ã¯ã³ãŒãã«æ瀺çã«è¡šç€ºãããŸããã
4ïŒ try
ã䜿çšãããšãã³ãŒãã®ãããã°ãé£ãããªããŸãã ããšãã°ããããã°ã¹ããŒãã¡ã³ããæ¿å
¥ã§ããããã«ããããã«ã try
åŒãif
ã¹ããŒãã¡ã³ãã«æžãçŽãå¿
èŠãããå ŽåããããŸãïŒ @ deanveloper ã @ typeless ã @ networkimprov ããã®ä»ïŒã
5ïŒååä»ããªã¿ãŒã³ïŒ @ buchanae ã@ adgïŒã®äœ¿çšã«ã€ããŠããã€ãã®æžå¿µããããŸãã
äœäººãã®äººã ãææ¡ãæ¹åãŸãã¯ä¿®æ£ããããã®ææ¡ãæäŸããŸããïŒ
6ïŒé©åãªãšã©ãŒåŠçãä¿é²ããããã«ããªãã·ã§ã³ã®ãšã©ãŒãã³ãã©ãŒïŒ@beoranïŒãŸãã¯try
ïŒ@ unexge ã @ a8m ã@ eandre ã@ gotwarlostïŒã«æäŸããããã©ãŒãããæååã®ã¢ã€ãã¢ãæ¡çšãã人ãããŸãã
7ïŒ @pierrecã¯ã gofmt
ãtry
åŒãé©åã«ãã©ãŒãããããŠãããèŠãããããããšãææ¡ããŸããã
ãŸãã¯ã gofmt
ã§if
ã¹ããŒãã¡ã³ãããã©ãŒãããããŠã1è¡ã®ãšã©ãŒããã§ãã¯ããããšã§æ¢åã®ã³ãŒããããã³ã³ãã¯ãã«ããããšãã§ããŸãïŒ@zeeboïŒã
8ïŒ@ marwan-at-workã¯ã try
ããšã©ãŒåŠçãif
ã¹ããŒãã¡ã³ãããtry
åŒã«åçŽã«ã·ãããããšäž»åŒµããŠããŸãã 代ããã«ãå®éã«åé¡ã解決ãããå ŽåãGoã¯ãšã©ãŒåŠçãçã«æé»çã«ããããšã§ãææãããå¿
èŠããããŸãã ç®æšã¯ãïŒé©åãªïŒãšã©ãŒåŠçãããç°¡åã«ããéçºè
ã®çç£æ§ãé«ããããšã§ãïŒ@cpuguyïŒã
9ïŒæåŸã«ã try
$ïŒ@ beoran ã@ HiImJC ã@ dolmenïŒãšããååãæ°ã«å
¥ããªã人ãã ?
ïŒ @ twinsted1919 ã@ leaxoy ããã®ä»ïŒãªã©ã®èšå·ã奜ã人ãããŸãã ã
ãã®ãã£ãŒãããã¯ã«é¢ããããã€ãã®ã³ã¡ã³ãïŒããã«å¿ããŠçªå·ãä»ããããŠããŸãïŒïŒ
0ïŒæ£ã®ãã£ãŒãããã¯ãããããšãïŒ :-)
1ïŒãã®æžå¿µã«ã€ããŠãã£ãšåŠã¶ã®ã¯è¯ãããšã§ãã if
ã¹ããŒãã¡ã³ãã䜿çšããŠãšã©ãŒããã¹ãããçŸåšã®ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã¯ãå¯èœãªéãæ瀺çã§ãã åå¥ã«ïŒ if
ããšã«ïŒãšã©ãŒã«è¿œå æ
å ±ãè¿œå ããã®ã¯éåžžã«ç°¡åã§ãã å€ãã®å Žåãé¢æ°ã§æ€åºããããã¹ãŠã®ãšã©ãŒãçµ±äžãããæ¹æ³ã§åŠçããããšã¯çã«ããªã£ãŠããŸããããã¯ã defer
ã§å®è¡ã§ããŸããããã¯ãã§ã«å¯èœã§ãã èšèªã§é©åãªãšã©ãŒåŠçãè¡ãããã®ãã¹ãŠã®ããŒã«ããã§ã«çšæãããŠãããšããäºå®ãšããã³ãã©ãŒæ§é ãdefer
ã«çŽäº€ããŠããªããšããåé¡ãåå ã§ããšã©ãŒãå¢ããããã ãã«æ°ããã¡ã«ããºã ãçç¥ããŸããã ã
2ïŒãã¡ãããçµã¿èŸŒã¿ã®ä»£ããã«ããŒã¯ãŒããŸãã¯ç¹å¥ãªæ§æã䜿çšããå¯èœæ§ããããŸãã æ°ããããŒã¯ãŒãã«ã¯äžäœäºææ§ã¯ãããŸããã æ°ããæŒç®åã¯ãããããããŸããããããã«ç®ç«ããªãããã§ãã 詳现ãªææ¡ã§ã¯ãããŸããŸãªé·æãšçæã«ã€ããŠè©³ãã説æããŠããŸãã ããããããããç§ãã¡ã¯ããã誀解ããŠããŸãã
3ïŒãã®ææ¡ã®çç±ã¯ããšã©ãŒåŠçïŒç¹ã«é¢é£ãããã€ã©ãŒãã¬ãŒãã³ãŒãïŒãGoã³ãã¥ããã£ã«ãã£ãŠGoã®éèŠãªåé¡ïŒãžã§ããªãã¯ã¹ã®æ¬ åŠã®æ¬¡ã«ïŒãšããŠèšåãããããã§ãã ãã®ææ¡ã¯ãå®åçãªæžå¿µã«çŽæ¥å¯ŸåŠããŸãã ããè€éãªã±ãŒã¹ã¯ããã§ã«æã£ãŠãããã®ã§ããé©åã«åŠçããããããæãåºæ¬çãªã±ãŒã¹ã解決ãã以äžã®ããšã¯ããŸããã ãããã£ãŠãããªãã®æ°ã®äººã
ãçŸç¶ã«æºè¶³ããŠããŸããããããããã ãã§ããããšãããç¥ã£ãŠããã try
ãªã©ã®ããåçåãããã¢ãããŒãã奜ãïŒããããïŒåããããå€ãã®äººã
ã®æŽŸé£å£ããããŸãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã
4ïŒãããã°ãã€ã³ãã¯æå¹ãªæžå¿µäºé
ã§ãã ãšã©ãŒã®æ€åºãšreturn
ã®éã«ã³ãŒããè¿œå ããå¿
èŠãããå Žåã try
åŒãif
ã¹ããŒãã¡ã³ãã«æžãçŽããªããã°ãªããªãã®ã¯ç
©ããããããããŸããã
5ïŒååä»ãã®æ»ãå€ïŒè©³çŽ°ãªããã¥ã¡ã³ãã§ã¯ãããã«ã€ããŠè©³ãã説æããŠããŸãã ããããã®ææ¡ã®äž»ãªé¢å¿äºã§ããå Žåãç§ãã¡ã¯è¯ãç¶æ³ã«ãããšæããŸãã
6ïŒ try
ãžã®ãªãã·ã§ã³ã®ãã³ãã©ãŒåŒæ°ïŒè©³çŽ°ãªããã¥ã¡ã³ãã§ã¯ãããã«ã€ããŠã説æããŠããŸãã èšèšã®å埩ã«é¢ããã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
7ïŒ gofmt
ã䜿çšããŠ$ try
åŒããã©ãŒãããããããããäœåã«èŠããããã«ããããšã¯ç¢ºãã«ãªãã·ã§ã³ã§ãã ãã ããåŒã§äœ¿çšãããšã try
ã®å©ç¹ã®äžéšã倱ãããŸãã
8ïŒãšã©ãŒãã¹ãïŒ try
ïŒã®èŠ³ç¹ããã§ã¯ãªãããšã©ãŒåŠçïŒ handle
ïŒã®èŠ³ç¹ããåé¡ãæ€èšããããšãæ€èšããŸããã å
·äœçã«ã¯ããšã©ãŒãã³ãã©ã®æŠå¿µã®ã¿ãå°å
¥ããããšãç°¡åã«æ€èšããŸããïŒæšå¹Žã®Gopherconã§æ瀺ãããå
ã®èšèšãã©ãããšåæ§ïŒã ãã³ãã©ãŒã宣èšãããŠããå ŽåïŒãããŠãã®å Žåã®ã¿ïŒãæåŸã®å€ãerror
åã§ããè€æ°å€ã®å²ãåœãŠã§ã¯ããã®å€ãå²ãåœãŠã«ãã®ãŸãŸæ®ãããšãã§ãããšèããããŠããŸããã ã³ã³ãã€ã©ãŒã¯ããããnilã§ãªããã©ãããæé»çã«ãã§ãã¯ããããã§ãªãå Žåã¯ãã³ãã©ãŒã«åå²ããŸãã ããã«ãããæ瀺çãªãšã©ãŒåŠçãå®å
šã«ãªããªãã代ããã«ãã³ãã©ãŒãäœæããããã«ä¿ãããŸãã ããã¯å®å
šã«æé»çã§ããããã極端ãªã¢ãããŒãã®ããã«èŠããŸããããã§ãã¯ãè¡ããããšããäºå®ã¯èŠããŸããã
9ïŒçŸæç¹ã§ã¯ãååãèªè»¢è»ã§æµããªãããšããå§ãããŸãã ä»ã®ãã¹ãŠã®æžå¿µã解決ããããååã埮調æŽããã®ã«é©ããææã§ãã
ããã¯ãæžå¿µãæå¹ã§ã¯ãªããšããããšã§ã¯ãããŸãããäžèšã®åçã¯ãåã«ç§ãã¡ã®çŸåšã®èããè¿°ã¹ãŠããã ãã§ãã ä»åŸã¯ãæ°ããæžå¿µäºé ïŒãŸãã¯ãããã®æžå¿µäºé ãè£ä»ããæ°ãã蚌æ ïŒã«ã€ããŠã³ã¡ã³ãããããšããå§ãããŸãããã§ã«è¿°ã¹ãããšãèšãæããŠãããã以äžã®æ å ±ã¯åŸãããŸããã
ãããŠæåŸã«ããã®åé¡ã«ã€ããŠã³ã¡ã³ãããŠãããã¹ãŠã®äººã詳现ãªããã¥ã¡ã³ããèªãã ããã§ã¯ãªãããã§ãã ãã§ã«èšãããããšãç¹°ãè¿ããªãããã«ãã³ã¡ã³ãããåã«ããããŠãã ããã ããããšãã
ããã¯ææ¡ã«å¯Ÿããã³ã¡ã³ãã§ã¯ãªããã¿ã€ããã¹ã®å ±åã§ãã å®å šãªææ¡ãå ¬éãããŠããä¿®æ£ãããªãã£ãã®ã§ãç§ã¯ããã«ã€ããŠèšåããããšæããŸããïŒ
func try(t1 T1, t1 T2, ⊠tn Tn, te error) (T1, T2, ⊠Tn)
ããå¿ èŠããããŸãïŒ
func try(t1 T1, t2 T2, ⊠tn Tn, te error) (T1, T2, ⊠Tn)
ã»ãšãã©ã®ãšã©ãŒãã§ãã¯ãæ¬åœã«å埩çã§ãããã©ããããŸãã¯ã»ãšãã©ã®å Žåãåãé¢æ°å
ã®è€æ°ã®ãã§ãã¯ãç°ãªãã³ã³ããã¹ãæ
å ±ãè¿œå ãããã©ãããå€æããããã«ããšã©ãŒãã§ãã¯ã¹ããŒãã¡ã³ãã®å
¬éãããŠããGoã³ãŒããåæãã䟡å€ããããŸããïŒ ãã®ææ¡ã¯åè
ã®å Žåã«ã¯éåžžã«çã«ããªã£ãŠããŸãããåŸè
ã®å Žåã«ã¯åœ¹ç«ã¡ãŸããã åŸè
ã®å Žåã人ã
ã¯if err != nil
ã䜿ãç¶ããããã³ã³ããã¹ãã®è¿œå ãããããã try()
ã䜿çšããŠãIMOãæ害ãšãªãé¢æ°ããšã«äžè¬çãªãšã©ãŒã³ã³ããã¹ããè¿œå ããããšã«ãªããŸãã ä»åŸã®ãšã©ãŒå€æ©èœã«ããããšã©ãŒãããå€ãã®æ
å ±ã§ã©ããããããšãå€ããªããšæããŸãã ããããç§ã¯ææ¡ã誀解ããŸããããAFAIUã¯ãåäžã®é¢æ°ããã®ãã¹ãŠã®ãšã©ãŒãæ£ç¢ºã«1ã€ã®æ¹æ³ã§ã©ããããå¿
èŠãããå Žåã«ã®ã¿ãã€ã©ãŒãã¬ãŒããæžããã®ã«åœ¹ç«ã¡ãé¢æ°ãå¥ã®æ¹æ³ã§ã©ããããå¿
èŠããã5ã€ã®ãšã©ãŒãåŠçããå Žåã¯åœ¹ã«ç«ã¡ãŸããã ãã®ãããªã±ãŒã¹ãå®éã«ã©ãã»ã©äžè¬çã§ãããã¯ããããŸãããïŒç§ã®ãããžã§ã¯ãã®ã»ãšãã©ã§ããªãäžè¬çã§ãïŒãããŸããŸãªãšã©ãŒãã©ããããããšãçã«ããªã£ãŠããå Žåã§ãã try()
ãé¢æ°ããšã«äžè¬çãªã©ãããŒã䜿çšããããã«ä¿ãå¯èœæ§ãããã®ã§ã¯ãªãããšå¿é
ããŠããŸãå¥ã®æ¹æ³ã§ã
å°ããªãµã³ãã«ã»ããã®ããŒã¿ã«è£æã¡ãããç°¡åãªã³ã¡ã³ãïŒ
éåžžGoã§ã®ãšã©ãŒåŠçã«é¢é£ããã¹ããŒãã¡ã³ãã®å Žåããã€ã©ãŒãã¬ãŒããæé€ããããã«ç¹å¥ã«èšèšããããtryãšåŒã°ããæ°ããçµã¿èŸŒã¿é¢æ°ãææ¡ããŸãã
ããããã®ææ¡ã«ãã£ãŠè§£æ±ºãããäž»èŠãªåé¡ã§ããå Žåããã®ããã€ã©ãŒãã¬ãŒããã¯ãåèšã§çŽ60k SLOCã®æ°åã®å ¬éãããŠãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãå šäœã§ãç§ã®ã³ãŒãã®çŽ1.4ïŒ ããå ããŠããªãããšãããããŸãã
ä»ã®èª°ããåæ§ã®çµ±èšãæã£ãŠãããã©ããç¥ãããã§ããïŒ
Goèªäœã®ãããªã¯ããã«å€§ããªã³ãŒãããŒã¹ã§ã¯ãåèšã§çŽ160äžSLOCã«ãªããŸããããã¯ã if err != nil
ã®ãããªè¡ãæã€ã³ãŒãããŒã¹ã®çŽ0.5ïŒ
ã«çžåœããŸãã
ããã¯ãGo 2ã§è§£æ±ºããã®ã«æ¬åœã«æã圱é¿åã®ããåé¡ã§ããïŒ
çããã®ã¢ã€ãã¢ããã£ãããšèŠãŠããã ããæ瀺çã«èããæäŸããŠãã ãã£ã@griesemerã«æè¬ããŸãã ãã®éçšã§ã³ãã¥ããã£ãè³ãåŸããŠãããšããèªèã«æ¬åœã«åœ¹ç«ã€ãšæããŸãã
- @pierrecã¯ãgofmtãtryåŒãé©åã«ãã©ãŒãããããŠãããèŠãããããããšãææ¡ããŸããã
ãŸãã¯ã1è¡ã®ãšã©ãŒããã§ãã¯ããifã¹ããŒãã¡ã³ãïŒ@zeeboïŒãgofmtã§ãã©ãŒãããã§ããããã«ããããšã§ãæ¢åã®ã³ãŒããããã³ã³ãã¯ãã«ããããšãã§ããŸãã
gofmt
ã䜿çšããŠ$try
åŒããã©ãŒãããããããããäœåã«èŠããããã«ããããšã¯ç¢ºãã«ãªãã·ã§ã³ã§ãã ãã ããåŒã§äœ¿çšãããšãtry
ã®å©ç¹ã®äžéšã倱ãããŸãã
ãããã¯ã try
gofmt
ãèŠæ±ããããšã«ã€ããŠã®è²Žéãªèãã§ãããç¹ã«gofmt
ã«ã€ããŠã if
ã¹ããŒãã¡ã³ãã®ãã§ãã¯ãèš±å¯ããããšã«ã€ããŠäœãèãããããã©ããèå³ããããŸãããšã©ãŒã¯1è¡ã§ãã ææ¡ã¯try
ã®ãã©ãŒãããã§ãŸãšããããŸããããããã¯å®å
šã«çŽäº€ãããã®ã ãšæããŸãã ããããšãã
@griesemerã¯ããã¹ãŠã®ã³ã¡ã³ããééãããã¹ãŠã§ã¯ãªãã«ããŠãã»ãšãã©ã®ãã£ãŒãããã¯ã«çããçŽ æŽãããäœæ¥ã«æè¬ããŸãð
ãã£ãŒãããã¯ã§åãäžããããªãã£ãããšã®1ã€ã¯ãGoæ§æãæŽæ°ããã®ã§ã¯ãªããGoèšèªã®ããŒã«/æ€æ»éšåã䜿çšããŠãšã©ãŒåŠçãšã¯ã¹ããªãšã³ã¹ãåäžããããšããã¢ã€ãã¢ã§ããã
ããšãã°ãæ°ããLSPïŒ gopls
ïŒããªãªãŒã¹ãããã®ã§ãé¢æ°ã®ã·ã°ããã£ãåæããéçºè
ã®ãšã©ãŒåŠçãã€ã©ãŒãã¬ãŒããé©åã«ã©ããã³ã°ããŠæ€èšŒããã®ã«æé©ãªå Žæã®ããã§ãã
@griesemerããã¯ããèããããŠããªãããšã¯ç¢ºãã§ãããç§ã¯ããªãã®ææ¡ãããã§å¿«é©ãªãã®ã«è¿ã¥ããããšããŸããïŒ https ïŒ//www.reddit.com/r/golang/comments/bwvyhe
@zeebo 1è¡ã§gofmt
圢åŒã®if err != nil { return ...., err }
ãäœæããã®ã¯ç°¡åã§ãã ããããããã®ç¹å®ã®çš®é¡ã®if
ãã¿ãŒã³ã®ã¿ã§ããããã¹ãŠã®ãçãã if
ã¹ããŒãã¡ã³ãã§ã¯ãªãã§ããããã
åãè¡ã«æ²¿ã£ãŠã try
ã¯ããžãã¹ããžãã¯ãšåãè¡ã«ããããã衚瀺ãããªããšããæžå¿µããããŸããã ããããã¹ãŠã®ãªãã·ã§ã³ããããŸãã
çŸåšã®ã¹ã¿ã€ã«ïŒ
a, b, c, ... err := BusinessLogic(...)
if err != nil {
return ..., err
}
1è¡if
ïŒ
a, b, c, ... err := BusinessLogic(...)
if err != nil { return ..., err }
å¥ã®è¡ã«try
ïŒïŒïŒïŒ
a, b, c, ... err := BusinessLogic(...)
try(err)
ææ¡ãããtry
ïŒ
a, b, c := try(BusinessLogic(...))
æåãšæåŸã®è¡ã¯ïŒç§ã«ã¯ïŒæãæ確ã«èŠããŸããç¹ã«ã try
ããããäœã§ããããèªèããããã«äœ¿çšãããå Žåã¯ãªãããã§ãã æåŸã®è¡ã§ã¯ããšã©ãŒãæ瀺çã«ãã§ãã¯ãããŸãããïŒéåžžã¯ïŒã¡ã€ã³ã¢ã¯ã·ã§ã³ã§ã¯ãªããããããã¯ã°ã©ãŠã³ãã§ããå°ããšã©ãŒãçºçããŸãã
@ marwan-at-workããŒã«ãããªãã®ããã«äœãããã®ãããªããäœãææ¡ããŠããã®ãããããŸããã ã©ãããããããšã©ãŒåŠçãé ãããšãææ¡ããŸããïŒ
@dpinela
@guybrandããã¯ãŸã£ããå¥ã®ææ¡ã®ããã§ãã ããã@griesemerã®ææ¡ã®è°è«ã«éäžã§ããããã«ããããç¬èªã®åé¡ãšããŠæåºããå¿ èŠããããšæããŸãã
IMOç§ã®ææ¡ã¯ãæ§æã®ã¿ãç°ãªããŸããã€ãŸãã次ã®ããã«ãªããŸãã
ãããã£ãŠãäž»ãªéãã¯ãå ã®é¢æ°åŒã³åºããtryïŒfuncïŒïŒïŒã§ã©ãããããã©ããã§ããããã¯ãåŒã³åºããjnzããããã«åžžã«æåŸã®å€æ°ãåæããããå®éã®æ»ãå€ã䜿çšããŠãããè¡ããŸãã
èŠãç®ã¯éããŸãããå®éã«ã¯æŠå¿µãéåžžã«äŒŒãŠããŸãã
äžæ¹ãéåžžã®è©Šã¿ãè¡ãå Žåã¯ãå€ãã®Cèšèªã®ãããªèšèªã§ãã£ããããŸããããã¯ãå®è£
ãèªã¿ããããªã©ã倧ããç°ãªããŸãã
ããããç§ã¯ææ¡ãæžãããšãçå£ã«èããŠããŸããã¢ã€ãã¢ã«æè¬ããŸãã
@griesemer
ããŒã«ãããªãã®ããã«äœãããã®ããããªããäœãææ¡ããŠããã®ãããããŸããã ã©ãããããããšã©ãŒåŠçãé ãããšãææ¡ããŸããïŒ
ãŸã£ããéã§ãgopls
ã¯ããªãã·ã§ã³ã§ãšã©ãŒåŠçã®å®åæãäœæã§ããããšããå§ãããŸãã
ããªããæåŸã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ïŒ
ãã®ææ¡ã®çç±ã¯ããšã©ãŒåŠçïŒç¹ã«é¢é£ãããã€ã©ãŒãã¬ãŒãã³ãŒãïŒãGoã³ãã¥ããã£ã«ãã£ãŠGoã®éèŠãªåé¡ãšããŠèšåãããããã§ãïŒãžã§ããªãã¯ã¹ã®æ¬ åŠã®æ¬¡ã«ïŒ
ãããã£ãŠãåé¡ã®æ žå¿ã¯ãããã°ã©ããŒãå€ãã®å®åã³ãŒããæžãããšã«ãªã£ãŠããŸãããšã§ãã ãããã£ãŠãåé¡ã¯èªãããšã§ã¯ãªããæžãããšã§ãã ãããã£ãŠãç§ã®ææ¡ã¯æ¬¡ã®ãšããã§ããé¢æ°ã®çœ²åãåæããé©åãªãšã©ãŒåŠçå¥ãé 眮ããããšã«ãããã³ã³ãã¥ãŒã¿ãŒïŒtooling / goplsïŒã«ããã°ã©ããŒã®ããã®æžã蟌ã¿ãè¡ãããŸãã
äŸãã°ïŒ
// user begins to write this function:
func openFile(path string) ([]byte, error) {
file, err := os.Open(path)
defer file.Close()
bts, err := ioutil.ReadAll(file)
return bts, nil
}
次ã«ããŠãŒã¶ãŒã¯ãããããã¡ã€ã«ãä¿åããã ãã§ããŒã«ãããªã¬ãŒãïŒgofmt / goimportsãéåžžæ©èœããæ¹æ³ãšåæ§ïŒã gopls
ã¯ãã®é¢æ°ã調ã¹ããã®æ»ã眲åãåæããã³ãŒãã次ã®ããã«æ¡åŒµããŸãã
// user has triggered the tool (by saving the file, or code action)
func openFile(path string) ([]byte, error) {
file, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("openFile: %w", err)
}
defer file.Close()
bts, err := ioutil.ReadAll(file)
if err != nil {
return nil, fmt.Errorf("openFile: %w", err)
}
return bts, nil
}
ãã®ããã«ããŠãäž¡æ¹ã®é·æã掻çšã§ããŸããçŸåšã®ãšã©ãŒåŠçã·ã¹ãã ã®å¯èªæ§/æ瀺æ§ãåŸãããããã°ã©ããŒã¯ãšã©ãŒåŠçã®å®åæãäœæããŸããã§ããã ããã«è¯ãããšã«ããŠãŒã¶ãŒã¯åŸã§ãšã©ãŒåŠçãããã¯ãå€æŽããŠå¥ã®åäœãè¡ãããšãã§ããŸãã gopls
ã¯ãããã¯ãååšããããšãç解ã§ãããããã¯ã¯å€æŽãããŸããã
ããŒã«ã¯ãæ©æã«æ»ãã®ã§ã¯ãªããé¢æ°ã®åŸåã§err
ãåŠçããã€ããã ã£ãããšãã©ã®ããã«ç¥ãã®ã§ããããã ãŸãã§ã¯ãããŸãããããã§ãç§ãæžããã³ãŒãã§ãã
ãããŸã§ã«æèµ·ãããããšãããããšããè©«ã³ç³ãäžããŸãããèšåãèŠã€ãããŸããã§ããã
try(DoSomething())
ã¯ç§ã«ã¯ããèªãŸããçã«ããªã£ãŠããŸããã³ãŒãã¯äœããè¡ãããšããŠããŸãã try(err)
ãOTOHã¯ãæå³çã«èšãã°ãå°ãæ°åãæªããªããŸããã©ã®ããã«ããŠãšã©ãŒãè©Šè¡ããŸããïŒ ç§ã®èãã§ã¯ããšã©ãŒã_ãã¹ã_ãŸãã¯_ãã§ãã¯_ããããšã¯ã§ããŸããã_è©Šè¡_ããããšã¯æ£ãããªãããã§ãã
äžè²«æ§ã®çç±ããã try(err)
ãèš±å¯ããããšãéèŠã§ããããšãç§ã¯ç解ããŠããŸãã try(DoSomething())
ãæ©èœããå Žåã¯å¥åŠã ãšæããŸããã err := DoSomething(); try(err)
ã¯æ©èœããŸããã§ããã ããã§ãã try(err)
ã¯ããŒãžäžã§å°ãããã¡ãªãèŠããŸãã ããã»ã©ç°¡åã«å¥åŠã«èŠããããã«ããããšãã§ããä»ã®çµã¿èŸŒã¿é¢æ°ã¯èããããŸããã
å ·äœçãªææ¡ã¯ãããŸããããããã§ããã®èŠ³å¯ãããããšæããŸããã
@griesemerããããšãã 確ãã«ãææ¡ã¯return
ã®ã¿ã察象ãšãããã®ã§ãããã1ã€ã®ã¹ããŒãã¡ã³ãã1è¡ã«ããã®ã¯è¯ãããšã ãšæããŸãã ããšãã°ããã¹ãã§ã¯ããã¹ãã©ã€ãã©ãªãå€æŽããã«ã次ã®ããšãã§ããŸãã
if err != nil { t.Fatal(err) }
æåãšæåŸã®è¡ã¯ïŒç§ã«ã¯ïŒæãæ確ã«èŠããŸããç¹ã«ãtryããããäœã§ããããèªèããããã«äœ¿çšãããå Žåã¯ãªãããã§ãã æåŸã®è¡ã§ã¯ããšã©ãŒãæ瀺çã«ãã§ãã¯ãããŸãããïŒéåžžã¯ïŒã¡ã€ã³ã¢ã¯ã·ã§ã³ã§ã¯ãªããããããã¯ã°ã©ãŠã³ãã§ããå°ããšã©ãŒãçºçããŸãã
æåŸã®è¡ã§ã¯ãã³ã¹ãã®äžéšãé ãããŠããŸãã ã³ãã¥ããã£ã声ã«åºããŠèšã£ãŠãããšã©ãŒã«æ³šéãä»ãããå Žåã¯ããã¹ããã©ã¯ãã£ã¹ãæãŸãããããæšå¥šããå¿
èŠããããŸããé¢æ°ã®ã·ã°ããã£ãå€æŽããŠåŒæ°ã«ååãä»ããåäžã®defer
ãé©çšãããããšãæåŸ
ããå¿
èŠããããŸããé¢æ°æ¬äœã®ãã¹ãŠã®åºå£ããã以å€ã®å Žåã try
ã«ã¯å€ããããŸããã ãããããã®å®¹æãã®ããã«åŠå®çã§ãããããŸãã
ãŸã èšãããŠããªããšæãããšãè¿œå ããå¿ èŠã¯ãããããŸããã
ãã¶ã€ã³ããã¥ã¡ã³ããããã®è³ªåã«çããæ¹æ³ãããããŸããã§ããã ãã®ã³ãŒãã¯äœãããŸããïŒ
func foo() (err error) {
src := try(getReader())
if src != nil {
n, err := src.Read(nil)
if err == io.EOF {
return nil
}
try(err)
println(n)
}
return nil
}
ç§ã®ç解ã¯ãããè±ç³ããã ãããšããããšã§ã
func foo() (err error) {
tsrc, te := getReader()
if err != nil {
err = te
return
}
src := tsrc
if src != nil {
n, err := src.Read(nil)
if err == io.EOF {
return nil
}
terr := err
if terr != nil {
err = terr
return
}
println(n)
}
return nil
}
err
ããã€ããããªã¿ãŒã³äžã«ã·ã£ããŠããããããã³ã³ãã€ã«ã«å€±æããŸãã ããã¯ã³ã³ãã€ã«ãããŸãããïŒ ãããããªããããã¯éåžžã«åŸ®åŠãªå€±æã§ãããèµ·ããããã«ãªãããã§ãã ããã§ãªãå Žåã¯ãç ç³ãããå€ãã®ããšãèµ·ãã£ãŠããŸãã
@ marwan-at-work
ããªããæåŸã®ã³ã¡ã³ãã§è¿°ã¹ãããã«ïŒ
ãã®ææ¡ã®çç±ã¯ããšã©ãŒåŠçïŒç¹ã«é¢é£ãããã€ã©ãŒãã¬ãŒãã³ãŒãïŒãGoã³ãã¥ããã£ã«ãã£ãŠGoã®éèŠãªåé¡ãšããŠèšåãããããã§ãïŒãžã§ããªãã¯ã¹ã®æ¬ åŠã®æ¬¡ã«ïŒ
ãããã£ãŠãåé¡ã®æ žå¿ã¯ãããã°ã©ããŒãå€ãã®å®åã³ãŒããæžãããšã«ãªã£ãŠããŸãããšã§ãã ãããã£ãŠãåé¡ã¯èªãããšã§ã¯ãªããæžãããšã§ãã
å®éã«ã¯éã ãšæããŸããç§ã«ãšã£ãŠãçŸåšã®ãšã©ãŒåŠçãã€ã©ãŒãã¬ãŒãã®æ倧ã®ç
©ãããã¯ãå
¥åããå¿
èŠããªãããšã§ã¯ãªããé¢æ°ã®ããããŒãã¹ãç»é¢å
šäœã«åçŽã«åæ£ãããŠç解ããã®ãé£ããããŠããããšã§ããäžç®ã ãã®å¹æã¯ãI / Oãå€ãã³ãŒãã§ç¹ã«é¡èã§ãããéåžžã2ã€ã®æäœããšã«ãã€ã©ãŒãã¬ãŒãã®ãããã¯ããããŸãã CopyFile
ã®åçŽãªããŒãžã§ã³ã§ããå®éã«ã¯5ã€ã®ã¹ãããïŒãªãŒãã³ãœãŒã¹ãã¯ããŒãºãœãŒã¹ã®å»¶æããªãŒãã³å®å
ãã³ããŒãœãŒã¹->å®å
ãã¯ããŒãºå®å
ïŒããå®è¡ããŸããããæ倧20è¡ããããŸãã
çŸåšã®æ§æã®ãã1ã€ã®åé¡ã¯ãåè¿°ããããã«ãããããããšã©ãŒãè¿ãå¯èœæ§ã®ããäžé£ã®æäœãããå ŽåãçŸåšã®æ§æã§ã¯ãå¿ èŠãªå Žåã§ãããã¹ãŠã®äžéçµæã«ååãä»ããå¿ èŠãããããšã§ããå¿åã®ãŸãŸã«ããŠãããŸãã ãããçºçãããšãããŸãæçã§ã¯ãããŸãããããããã®ååã解æããããã«è³ã®ãµã€ã¯ã«ãè²»ããå¿ èŠããããããèªã¿ããããæãªãããŸãã
å¥ã®è¡ã®try
ã奜ãã§ãã
ãããŠã handler
funcãåå¥ã«æå®ã§ããããšãé¡ã£ãŠããŸãã
func try(error, optional func(error)error)
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
try(err)
handle := func(err error) error {
tx.Rollback()
return err
}
var res int64
_, err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
try(err, handle)
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
try(err, handle)
return tx.Commit()
}
@zeebo ïŒç§ãæããäŸã¯1ïŒ1ã®ç¿»èš³ã§ãã æåã®ïŒåŸæ¥ã®if
ïŒã¯ãšã©ãŒãåŠçããªãã£ããããä»ã®ãšã©ãŒãåŠçããŸããã§ããã æåã«ãšã©ãŒãåŠçãããããé¢æ°ã§ãšã©ãŒããã§ãã¯ãããå¯äžã®å Žæã§ããå Žåãæåã®äŸïŒ if
ã䜿çšïŒãã³ãŒãã®èšè¿°ã®é©åãªéžæã§ããå¯èœæ§ããããŸãã è€æ°ã®ãšã©ãŒãã§ãã¯ããããããããã¹ãŠãåããšã©ãŒåŠçïŒã©ããã³ã°ïŒã䜿çšããŠããå Žåãããšãã°ããããã¯ãã¹ãŠçŸåšã®é¢æ°ã«é¢ããæ
å ±ãè¿œå ããããã defer
ã¹ããŒãã¡ã³ãã䜿çšããŠãã¹ãŠã®ãšã©ãŒã1ãæã§åŠçã§ããŸãã ãªãã·ã§ã³ã§ã if
ãtry
ã«æžãæããããšãã§ããŸãïŒãŸãã¯ãã®ãŸãŸã«ããŠãããŸãïŒã ãã§ãã¯ãããšã©ãŒãè€æ°ãããããããã¹ãŠããšã©ãŒãç°ãªãæ¹æ³ã§åŠçããå ŽåïŒããã¯ãé¢æ°ã®æžå¿µãåºãããŠåå²ããå¿
èŠãããå¯èœæ§ãããããšã瀺ããŠããå¯èœæ§ããããŸãïŒã if
ã䜿çšããã®ãè¡ãæ¹æ³ã ã¯ããåãããšãè¡ãæ¹æ³ã¯è€æ°ãããŸããæ£ããéžæã¯ãã³ãŒããšå人ã®å¥œã¿ã«ãã£ãŠç°ãªããŸãã Goã§ã¯ã1ã€ã®ããšãè¡ã1ã€ã®æ¹æ³ããç®æããŠåªåããŠããŸãããç¹ã«äžè¬çãªæ§æã§ã¯ããã¡ããããã¯ãã§ã«åœãŠã¯ãŸããŸããã ããšãã°ã if
- else
- if
ã·ãŒã±ã³ã¹ãé·ããªããããå Žåã¯ã switch
ã®æ¹ãé©åãªå ŽåããããŸãã å€æ°å®£èšvar x int
ã¯ã x := 0
ãªã©ãããæå³ãè¡šãå ŽåããããŸãïŒãã ãã誰ããããã«æºè¶³ããŠããããã§ã¯ãããŸããïŒã
ãæžãæããã«é¢ãã質åã«ã€ããŠïŒããããã³ã³ãã€ã«ãšã©ãŒã¯çºçããŸããã æžãæãã¯å
éšã§è¡ããïŒã³ãŒããã¿ãŒã³ã瀺åãããããå¹ççã§ããå¯èœæ§ããããŸãïŒãã³ã³ãã€ã©ãã·ã£ããŠãªã¿ãŒã³ã«ã€ããŠæå¥ãèšãå¿
èŠã¯ãªãããšã«æ³šæããŠãã ããã ããªãã®äŸã§ã¯ããã¹ããããã¹ã³ãŒãã§ããŒã«ã«ã®err
å€æ°ã宣èšããŸããã ãã¡ããã try
ã¯ãçµæã®err
å€æ°ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã æžãçŽãã¯ãè£ã§ãã®ããã«èŠãããããããŸããã
[ç·šé] PSïŒããè¯ãçãã¯æ¬¡ã®ããã«ãªããŸãïŒ try
ã¯è£žã®ãªã¿ãŒã³ã§ã¯ãããŸããïŒæžãçŽãã¯ãã®ããã«èŠããŸããïŒã çµå±ã®ãšããã nil
ãªãå Žåã«è¿ããããšã©ãŒãå«ãïŒãŸãã¯ããã§ããïŒåŒæ°ãæ瀺çã«try
ã«äžããŸãã ãã€ããããªã¿ãŒã³ã®ã·ã£ããŠãšã©ãŒã¯ããœãŒã¹ã®ãšã©ãŒã§ãïŒãœãŒã¹ã®åºã«ãªãå€æã§ã¯ãããŸãããã³ã³ãã€ã©ã¯ãšã©ãŒãå¿
èŠãšããŸããã
å æ¬çãªé¢æ°ã®æçµçãªæ»ãåãåãšã©ãŒã§ã¯ãªãå Žåããããã¯ã«ãªãå¯èœæ§ããããŸããïŒ
ãã«ãã€ã³ãããçšéã®åºããã®ã«ããŸãïŒïŒ32219ã®ç§ã®æžå¿µãæºãããªã©ïŒ
@pjebsããã¯æ€èšãããå察ãããŸããã 詳现ãªèšèšããã¥ã¡ã³ãïŒãã®ããŒãã«é¢ããåé¡ãæ瀺çã«åç §ããŠããŸãïŒããèªã¿ãã ããã
ãŸããtryïŒïŒã¯returnã¹ããŒãã¡ã³ããšããŠæ©èœããŸãããåŒãšããŠæ±ãããããšãææããããšæããŸãã ã¯ããtryã¯çµã¿èŸŒã¿ãã¯ãã§ãããã»ãšãã©ã®ãŠãŒã¶ãŒã¯é¢æ°åããã°ã©ãã³ã°ã®ããã«ããã䜿çšãããšæããŸãã
func doSomething() (error, error, error, error, error) {
...
}
try(try(try(try(try(doSomething)))))
èšèšã§ã¯ããšã©ãŒãè¿ã代ããã«panic
ã䜿çšããŠæ¢çŽ¢ãããšããŠããŸãã
ç§ã¯åŸ®åŠãªéãã匷調ããŠããŸãïŒ
å
æ¬çãªé¢æ°ãã¿ã€ãerror
ã®æçµçãªæ»ãåãæããªããã°ãªããªããšããå¶éãåãé€ãããšãé€ããŠãçŸåšã®ææ¡ãè¿°ã¹ãŠããããšãæ£ç¢ºã«å®è¡ããŠãã ããã
æçµçãªè¿åã¿ã€ããerror
ã§ãªãå Žå=>ãããã¯
try for packageã¬ãã«ã®å€æ°å®£èšã䜿çšããå Žå=>ãããã¯ïŒ MustXXX( )
èŠåã®å¿
èŠæ§ãæé€ããŸãïŒ
åäœãã¹ãã®å Žåãèšèªãå°ãå€æŽããŸãã
@mattn ãããªãã®æ°ã®äººããã®ãããªã³ãŒããæžãã®ã§ã¯ãªãããšç§ã¯åŒ·ãçã£ãŠããŸãã
@pjebs ããã®ã»ãã³ãã£ã¯ã¹ïŒçŸåšã®é¢æ°ã«ãšã©ãŒçµæããªãå Žåã¯ãããã¯ïŒã¯ãèšèšããã¥ã¡ã³ããhttps://github.com/golang/proposal/blob/master/design/32437-try-builtinã§èª¬æããŠãããã®ãšãŸã£ããåãã§ãã mdïŒdiscussionã
ããã«ããšã©ãŒçµæã®ããé¢æ°å ã ãã§ãªããtryãæçšãªãã®ã«ããããã«ãtryã®ã»ãã³ãã£ã¯ã¹ã¯ã³ã³ããã¹ãã«ãã£ãŠç°ãªããŸããtryãããã±ãŒãžã¬ãã«ã§äœ¿çšãããå ŽåããŸãã¯ãšã©ãŒçµæã®ãªãé¢æ°å ã§åŒã³åºãããå Žåããšã©ãŒãçºçãããšãããã¯ã«ãªããŸãã ïŒäœè«ã§ããããã®ããããã£ã®ããã«ããã«ãã€ã³ã¯ãã®ææ¡ã§è©Šãã®ã§ã¯ãªããå¿ é ãšåŒã°ããŠããŸãããïŒãã®ã³ã³ããã¹ãäŸåã®æ¹æ³ã§è©Šè¡ïŒãŸãã¯å¿ é ïŒããããšã¯èªç¶ã§ãããéåžžã«äŸ¿å©ã§ããããã«èŠããŸãããå€ãã®ãŠãŒã¶ãŒå®çŸ©ã®mustãã«ããŒé¢æ°ã¯ãããã±ãŒãžã¬ãã«ã®å€æ°åæååŒã§çŸåšäœ¿çšãããŠããŸãã ãŸãããã¹ãããã±ãŒãžãä»ããŠåäœãã¹ãã§tryã䜿çšããå¯èœæ§ãéãããŸãã
ãã ããtryã®ã³ã³ããã¹ãäŸåæ§ã¯åé¡ããããšèŠãªãããŠããŸãããããšãã°ããšã©ãŒçµæãã·ã°ããã£ã«è¿œå ãŸãã¯åé€ãããå ŽåãtryåŒã³åºããå«ãé¢æ°ã®åäœããµã€ã¬ã³ãã«å€æŽãããå¯èœæ§ããããŸãïŒãããã¯ã«ãªãå¯èœæ§ãããããã¯ã«ãªããªãããŸãã¯ãã®éïŒã ããã¯å±éºãããç©ä»¶ã®ããã§ããã æãããªè§£æ±ºçã¯ãtryã®æ©èœã2ã€ã®å¥ã ã®é¢æ°ã§ããmustãštryã«åå²ããããšã§ããïŒåé¡ïŒ31442ã§ææ¡ãããŠãããã®ãšéåžžã«äŒŒãŠããŸãïŒã ããããããã«ã¯2ã€ã®æ°ããçµã¿èŸŒã¿é¢æ°ãå¿ èŠã§ãããããåªãããšã©ãŒåŠçãµããŒãã®å·®ãè¿«ã£ãå¿ èŠæ§ã«çŽæ¥æ¥ç¶ããŠã¿ãŠãã ããã
@pjebsããã¯ã以åã®ææ¡ã§_æ£ç¢ºã«_æ€èšããããšã§ãïŒè©³çŽ°ãªããã¥ã¡ã³ããèšèšã®å埩ã«é¢ããã»ã¯ã·ã§ã³ã第4段èœãåç §ïŒã
ããã«ããšã©ãŒçµæã®ããé¢æ°å ã ãã§ãªããtryãæçšãªãã®ã«ããããã«ãtryã®ã»ãã³ãã£ã¯ã¹ã¯ã³ã³ããã¹ãã«ãã£ãŠç°ãªããŸããtryãããã±ãŒãžã¬ãã«ã§äœ¿çšãããå ŽåããŸãã¯ãšã©ãŒçµæã®ãªãé¢æ°å ã§åŒã³åºãããå Žåããšã©ãŒãçºçãããšãããã¯ã«ãªããŸãã ïŒäœè«ã§ããããã®ããããã£ã®ããã«ããã«ãã€ã³ã¯ãã®ææ¡ã§è©Šãã®ã§ã¯ãªããåŒã³åºãããå¿ èŠããããŸããïŒ
ïŒGo Teamã®å
éšïŒã³ã³ã»ã³ãµã¹ã¯ã try
ãã³ã³ããã¹ãã«äŸåãããã®ããã«ç°ãªãåäœãããããšã¯æ··ä¹±ãæãã ãããšãããã®ã§ããã ããšãã°ããšã©ãŒçµæãé¢æ°ã«è¿œå ããïŒãŸãã¯åé€ããïŒãšãé¢æ°ã®åäœããããã¯ãããããã¯ã«ãªããªãããã«ïŒãŸãã¯ãã®éã«ïŒãµã€ã¬ã³ãã«å€æŽãããå¯èœæ§ããããŸãã
@griesemeræžãçŽãã«ã€ããŠèª¬æããŠãããŠããããšãã ã³ã³ãã€ã«ããŠããã£ãã§ãã
äŸã¯ãšã©ãŒã«æ³šéãä»ããªãã£ã翻蚳ã§ãã£ãããšãç解ããŠããŸãã try
ã䜿çšãããšãäžè¬çãªç¶æ³ã§ãšã©ãŒã®é©åãªæ³šéãä»ããããšãé£ãããªãããšã©ãŒã®æ³šéã¯ã³ãã¥ããã£ã«ãšã£ãŠéåžžã«éèŠã§ãããšäž»åŒµããããšããŸããã ãããŸã§ã®ã³ã¡ã³ãã®å€§éšåã¯ã try
ã«ããè¯ãã¢ãããŒã·ã§ã³ãµããŒããè¿œå ããæ¹æ³ã暡玢ããŠããŸããã
ãšã©ãŒãå¥ã®æ¹æ³ã§åŠçããå¿ èŠãããããšã«ã€ããŠã¯ãé¢æ°ã®æžå¿µãåºãããããšã®å åã§ããããšã«åæããŸããã ã³ã¡ã³ããã䞻匵ãããå®éã®ã³ãŒãã®ããã€ãã®äŸã翻蚳ããå ã®ã³ã¡ã³ãã®äžéšã«ããããããããŠã³ã«é 眮ããŸãããäŸã¯https://github.com/golang/go/issues/32437#issuecommentã«ãããŸã- 499007288ç§ã¯äžè¬çãªã±ãŒã¹ããã瀺ããŠãããšæããŸãïŒ
func (c *Config) Build() error {
pkgPath, err := c.load()
if err != nil { return nil, errors.WithMessage(err, "load config dir") }
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err != nil { return nil, errors.WithMessage(err, "execute main template") }
buf, err := format.Source(b.Bytes())
if err != nil { return nil, errors.WithMessage(err, "format main template") }
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err != nil { return nil, errors.WithMessagef(err, "write file %s", target) }
// ...
}
ãã®é¢æ°ã®ç®çã¯ãäžéšã®ããŒã¿ã«å¯ŸããŠãã³ãã¬ãŒããå®è¡ããŠãã¡ã€ã«ã«ããããšã§ãã ç§ã¯ãããåå²ããå¿ èŠããããšã¯æããªãããããŠãããã®ãšã©ãŒã®ãã¹ãŠããããã延æããäœæãããç·ãã¡ããã©åŸããªãã°ããã¯æ®å¿µã ããã ããã¯éçºè ã«ãšã£ãŠã¯åé¡ãªããããããŸãããããŠãŒã¶ãŒã«ãšã£ãŠã¯ããŸã圹ã«ç«ã¡ãŸããã
defer wrap(&err, "message: %v", err)
ã®ãã°ãããã«åŸ®åŠã§ãçµéšè±å¯ãªGoããã°ã©ããŒã§ãããããããã©ã®ããã«ã€ãŸãããããšããããšãå°ãã·ã°ãã«ã ãšæããŸãã
ç§ã®è°è«ãèŠçŽãããšãåŒããŒã¹ã®ãšã©ãŒãã§ãã¯ããããšã©ãŒæ³šéã®æ¹ãéèŠã ãšæããŸããã¹ããŒãã¡ã³ãããŒã¹ã®ãšã©ãŒãã§ãã¯ã3è¡ã§ã¯ãªã1è¡ã«ããããšã§ãããªãã®ãã€ãºãªãã¯ã·ã§ã³ãåŸãããšãã§ããŸãã ããããšãã
@griesemerç³ãèš³ãããŸãããããããã¯ã«ã€ããŠèª¬æããŠããå¥ã®ã»ã¯ã·ã§ã³ãèªã¿ãŸããããå±éºã«ã€ããŠã®èª¬æã¯èŠåœãããŸããã§ããã
@zeeboãã®äŸãããããšãã ãã®å Žåã if
ã¹ããŒãã¡ã³ãã䜿çšããã®ãæ£ç¢ºã«æ£ããéžæã®ããã§ãã ãã ããèŠç¹ãèšãã°ãifãã¯ã³ã©ã€ããŒã«ãã©ãŒããããããšããããå°ãåçåãããå¯èœæ§ããããŸãã
try
ã®2çªç®ã®åŒæ°ãšããŠãã³ãã©ãŒã®ã¢ã€ãã¢ãããäžåºŠåãäžããããšæããŸããããã³ãã©ãŒåŒæ°ã¯_å¿
é _ã§ãããnilå¯èœã§ãã ããã«ããããšã©ãŒã®åŠçãäŸå€ã§ã¯ãªãããã©ã«ãã«ãªããŸãã æ¬åœã«ãšã©ãŒãå€æŽããã«æž¡ãããå Žåã¯ããã³ãã©ãŒã«nilå€ãæå®ããã ãã§ã try
ã¯å
ã®ææ¡ãšåãããã«åäœããŸãããnilåŒæ°ã¯èŠèŠçãªæããããšããŠæ©èœããŸãããšã©ãŒã¯åŠçãããŠããŸããã ã³ãŒãã¬ãã¥ãŒäžã«ãã£ãããããããªããŸãã
file := try(os.Open("my_file.txt"), nil)
ãã³ãã©ãŒãæäŸãããŠãããnilã®å Žåã¯ã©ããªããŸããïŒ ãããã¯ãè©Šããããšã©ãŒãã³ãã©ãŒããªããã®ãšããŠæ±ãå¿ èŠããããŸããïŒ
äžèšã®ããã«ã try
ã¯å
ã®ææ¡ã«åŸã£ãŠåäœããŸãã ãšã©ãŒãã³ãã©ããªããšãããããªããšã¯ãªãããŒãã®ãã³ãã©ã ãã§ãã
ãã³ãã©ãŒãnil以å€ã®ãšã©ãŒã§åŒã³åºãããnilã®çµæãè¿ããå Žåã¯ã©ããªããŸããïŒ ããã¯ããšã©ãŒãããã£ã³ã»ã«ããããããšãæå³ããŸããïŒ ãŸãã¯ãå²ãã§ããé¢æ°ã¯nilãšã©ãŒã§æ»ãå¿ èŠããããŸããïŒ
å²ã¿é¢æ°ã¯nilãšã©ãŒã§è¿ããããšæããŸãã try
ããnil以å€ã®ãšã©ãŒå€ãåãåã£ãåŸã§ãå®è¡ãç¶ç¶ã§ããå Žåã¯ãéåžžã«æ··ä¹±ããå¯èœæ§ããããŸãã ããã«ããããã³ãã©ãŒã¯ç¶æ³ã«ãã£ãŠã¯ãšã©ãŒããåŠçãã§ããããã«ãªããŸãã ãã®åäœã¯ãããšãã°ãgetãŸãã¯createãã¹ã¿ã€ã«ã®é¢æ°ã§åœ¹ç«ã€å¯èœæ§ããããŸãã
func getOrCreateObject(obj *object) error {
defaultObjectHandler := func(err error) error {
if err == ObjectDoesNotExistErr {
*obj = object{}
return nil
}
return fmt.Errorf("getting or creating object: %v", err)
}
*obj = try(db.getObject(), defaultObjectHandler)
}
ãªãã·ã§ã³ã®ãšã©ãŒãã³ãã©ãŒãèš±å¯ãããšãããã°ã©ããŒãé©åãªãšã©ãŒåŠçãå®å šã«ç¡èŠããããã«ãªããã©ãããæ確ã§ã¯ãããŸããã§ããã ãŸããã©ãã§ãé©åãªãšã©ãŒåŠçãè¡ãã®ã¯ç°¡åã§ãããè©Šè¡ã®1åã®çºçãèŠéããŸãã ãªã©ãªã©ã
ãããã®æžå¿µã¯äž¡æ¹ãšãããã³ãã©ãŒãå¿ é ã®ãŒãåå¯èœãªåŒæ°ã«ããããšã§è»œæžããããšæããŸãã ããã°ã©ããŒã¯ããšã©ãŒãåŠçããªããšããæèçã§æ確ãªæ±ºå®ãäžãå¿ èŠããããŸãã
ããŒãã¹ãšããŠããšã©ãŒãã³ãã©ãŒãèŠæ±ãããšãçããã¹ããããtry
ãçããªããããããããæããšã©ãŸãããããšãã§ãããšæããŸãã ããããã€ãã¹é¢ãšèŠã人ããããããããŸããããããã¯ã¡ãªããã ãšæããŸãã
@velovixç§ã¯ãã®ã¢ã€ãã¢ã倧奜ãã§ããããªããšã©ãŒãã³ãã©ãŒãå¿
èŠãªã®ã§ããïŒ ããã©ã«ãã§nil
ã«ããããšã¯ã§ããŸãããïŒ ãªããèŠèŠçãªæãããããå¿
èŠãªã®ã§ããïŒ
@griesemer @velovixã®ã¢ã€ãã¢ãæ¡çšããããã builtin
ã«ããšã©ãŒããããã¯ã«å€æããäºåå®çŸ©ãããé¢æ°ãå«ãŸããŠããŠãå
æ¬çãªé¢æ°ã«ãšã©ãŒã®æ»ãå€ããããšããèŠä»¶ãåé€ããå Žåã¯ã©ããªããŸããïŒ
å
æ¬çãªé¢æ°ããšã©ãŒãè¿ããªãå Žåããšã©ãŒãã³ãã©ãªãtry
ã䜿çšãããšãã³ã³ãã€ã«æãšã©ãŒãçºçããŸãã
ãšã©ãŒãã³ãã©ã䜿çšããŠãååä»ãã®è¿ããããšã©ãŒãå€æŽããäžéšã®defer
ã®ä»£ããã«ããšã©ãŒã®å Žæã§ããŸããŸãªã©ã€ãã©ãªãªã©ã䜿çšããŠãããã«è¿ããããšã©ãŒãã©ããããããšãã§ããŸãã
@pjebs
ãªããšã©ãŒãã³ãã©ãå¿ èŠãªã®ã§ããïŒ ããã©ã«ãã§ã¯nilã«ããããšã¯ã§ããŸãããïŒ ãªããèŠèŠçãªæãããããå¿ èŠãªã®ã§ããïŒ
ããã¯ã
try
ã®ææ¡ã¯ãçŸåšã®ãšãããããããããšã¯ããã»ã©åçŽã§ã¯ãªãããã人ã
ããšã©ãŒã«ã³ã³ããã¹ããæäŸããããšãæããšã©ãŸãããå¯èœæ§ããããŸãããããããã³ãã©ãŒããããšã³ã³ããã¹ãã®æäŸãç°¡åã«ãªãããã³ãã©ãŒãå¿ é ã®åŒæ°ã«ããããšã§ã¡ãã»ãŒãžãéä¿¡ãããŸããäžè¬çãªæšå¥šã±ãŒã¹ã¯ãåã«ã¹ã¿ãã¯ã«æž¡ãã®ã§ã¯ãªããäœããã®æ¹æ³ã§ãšã©ãŒãåŠçãŸãã¯ã³ã³ããã¹ãåããããšã§ãã ããã¯ãGoã³ãã¥ããã£ããã®äžè¬çãªæšå¥šäºé ãšäžèŽããŠããŸãã
ãªãã·ã§ã³ã®ãšã©ãŒãã³ãã©ãŒãèš±å¯ãããšãããã°ã©ããŒãé©åãªãšã©ãŒåŠçãå®å šã«ç¡èŠããããã«ãªããã©ãããæ確ã§ã¯ãããŸããã§ããã ãŸããã©ãã§ãé©åãªãšã©ãŒåŠçãè¡ãã®ã¯ç°¡åã§ãããè©Šè¡ã®1åã®çºçãèŠéããŸãã ãªã©ãªã©ã
æ瀺çãªnil
ãæž¡ãå¿
èŠããããšããšã©ãŒãé©åã«åŠçããããšãå¿ãã«ãããªããŸãã åŒæ°ãçç¥ããŠæé»çã«åŠçããã®ã§ã¯ãªãããšã©ãŒãåŠçããªãããšãæ瀺çã«æ±ºå®ããå¿
èŠããããŸãã
https://github.com/golang/go/issues/32437#issuecomment-498497603ã§ç°¡åã«èšåãããŠããæ¡ä»¶ä»ããªã¿ãŒã³ã«ã€ããŠããã«èããŸãã
ããã¿ããã§ãreturn if f, err := os.Open("/my/file/path"); err != nil
Goã®æ¢åã®if
ã®å€èŠ³ã«ããæºæ ããŸãã
return if
ã¹ããŒãã¡ã³ãã®ã«ãŒã«ãè¿œå ãããš
æåŸã®æ¡ä»¶åŒïŒ err != nil
ãªã©ïŒãååšããªãå Žåãreturn if
ã¹ããŒãã¡ã³ãã®å®£èšã®æåŸã®å€æ°ã¯ãã¿ã€ãerror
ã§ãã次ã«ãæåŸã®å€æ°ã®å€ããæé»ã®æ¡ä»¶ãšããŠnil
ãšèªåçã«æ¯èŒãããŸãã
次ã«ã return if
ã¹ããŒãã¡ã³ãã¯æ¬¡ã®ããã«çç¥ã§ããŸãã
return if f, err := os.Open("my/file/path")
ããã¯ã try
ãæäŸããä¿¡å·å¯Ÿéé³æ¯ã«éåžžã«è¿ããã®ã§ãã
return if
ãtry
ã«å€æŽãããšã次ã®ããã«ãªããŸãã
try f, err := os.Open("my/file/path")
ããããå°ãªããšãæ§æçã«ã¯ããã®ã¹ã¬ããã§ææ¡ãããŠããä»ã®try
ã®ããªãšãŒã·ã§ã³ãšåæ§ã«ãªããŸãã
å人çã«ã¯ããã®å Žåãé¢æ°ã®åºå£ç¹ãéåžžã«æ瀺çã«ãªãããã try
ãããreturn if
ã®æ¹ã奜ãã§ãã ããšãã°ããããã°ãããšãã倧ããªé¢æ°ã®ãã¹ãŠã®åºå£ç¹ãèå¥ããããã«ããšãã£ã¿ãŒå
ã§ããŒã¯ãŒãreturn
ã匷調衚瀺ããããšããããããŸãã
æ®å¿µãªããããããã°ãã°ãæ¿å
¥ãããšããäžäŸ¿ãã«ã€ããŠãååã«åœ¹ç«ã£ãŠããªãããã§ãã
return if
ã®body
ãããã¯ãèš±å¯ããªãéãã次ã®ããã«ãªããŸãã
ãªãªãžãã«ïŒ
return if f, err := os.Open("my/path")
ãããã°æïŒ
- return if f, err := os.Open("my/path")
+ return if f, err := os.Open("my/path") {
+ fmt.Printf("DEBUG: os.Open: %s\n", err)
+ }
return if
ã®ããã£ãããã¯ã®æå³ã¯æããã ãšæããŸãã defer
ã®åã«å®è¡ãããæ»ããŸãã
ããã¯èšã£ãŠããGoã®æ¢åã®ãšã©ãŒåŠçã¢ãããŒãã«äžæºã¯ãããŸããã
æ°ãããšã©ãŒåŠçã®è¿œå ãGoã®çŸåšã®è¯ãã«ã©ã®ããã«åœ±é¿ãããã«ã€ããŠãã£ãšå¿é
ããŠããŸãã
@velovix 2çªç®ã®åŒæ°ãšããŠæ瀺çãªãã³ãã©ãŒé¢æ°ã䜿çšããtry
ã®ã¢ã€ãã¢ãéåžžã«æ°ã«å
¥ããŸããã ããããèšèšããã¥ã¡ã³ãã«èšèŒãããŠããããã«ãæ確ãªçãããªã質åãå€ãããŸããã ããªãã¯ãããã®ããã€ãã«ããªãã«ãšã£ãŠåççãšæãããæ¹æ³ã§çããŸããã æ£è§£ã¯ãŸã£ããå¥ã®ãã®ã ãšä»ã®èª°ããèããŠããå¯èœæ§ãéåžžã«é«ãã§ãïŒãããŠããã¯GoããŒã å
ã§ã®ç§ãã¡ã®çµéšã§ããïŒã ããšãã°ããã³ãã©ãŒåŒæ°ã¯åžžã«æäŸããå¿
èŠããããããšã©ãŒã®åŠçãæ°ã«ããªãããšãæ瀺ããããã«nil
ã«ããããšãã§ãããšè¿°ã¹ãŠããŸãã é¢æ°å€ïŒ nil
ãªãã©ã«ã§ã¯ãªãïŒãæäŸãããã®é¢æ°å€ïŒå€æ°ã«æ ŒçŽãããŠããïŒãããŸããŸnilã®å Žåã¯ã©ããªããŸããïŒ æ瀺çãªnil
å€ãšåæ§ã«ãåŠçã¯å¿
èŠãããŸããã ããããããã¯ã³ãŒãã®ãã°ã§ãããšäž»åŒµãã人ããããããããŸããã ãŸãã¯ãnilå€ã®ãã³ãã©ãŒåŒæ°ãèš±å¯ããããšãã§ããŸãããé¢æ°ããšã©ãŒãåŠçããå Žåãšããã§ãªãå ŽåããããŸãããã³ãã©ãŒãåžžã«ååšããããã«èŠãããããã³ãŒãããã¯å¿
ãããæããã§ã¯ãããŸããã ã ãã1ã€ã®åŒæ°ã¯ãé¢æ°ããšã©ãŒãåŠçããããšãéåžžã«æ確ã«ãªãããããšã©ãŒãã³ãã©ãŒã®ãããã¬ãã«ã®å®£èšãè¡ãæ¹ããããšãããã®ã§ããã ãããã£ãŠã defer
ã ãããããã£ãšãããŸãã
ãã®æžå¿µã«ã€ããŠãã£ãšåŠã¶ã®ã¯è¯ãããšã§ãã ãšã©ãŒããã¹ãããããã«ifã¹ããŒãã¡ã³ãã䜿çšããçŸåšã®ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ã¯ãå¯èœãªéãæ瀺çã§ãã ãšã©ãŒã«åå¥ã«ïŒifããšã«ïŒè¿œå æ å ±ãè¿œå ããã®ã¯éåžžã«ç°¡åã§ãã å€ãã®å Žåãé¢æ°ã§æ€åºããããã¹ãŠã®ãšã©ãŒãåäžãªæ¹æ³ã§åŠçããããšã¯çã«ããªã£ãŠããŸããããã¯ã延æããããšã§å®è¡ã§ããŸããããã¯ããã§ã«å¯èœã§ãã èšèªã§é©åãªãšã©ãŒåŠçãè¡ãããã®ãã¹ãŠã®ããŒã«ããã§ã«çšæãããŠãããšããäºå®ãšããã³ãã©ãŒæ§é ã延æã«çŽäº€ããŠããªããšããåé¡ãåå ã§ããšã©ãŒãå¢ããããã ãã®æ°ããã¡ã«ããºã ãçç¥ããŸããã
@ griesemer -IIUCãããªãã¯ãcallsiteã«äŸåãããšã©ãŒã³ã³ããã¹ãã®å ŽåãçŸåšã®ifã¹ããŒãã¡ã³ãã§åé¡ãªããšèšã£ãŠããŸãã äžæ¹ããã®æ°ããtry
é¢æ°ã¯ã1ãæã§è€æ°ã®ãšã©ãŒãåŠçããå Žåã«åœ¹ç«ã¡ãŸãã
æžå¿µãããã®ã¯ã if err != nil { return err}
ãå®è¡ããã ãã§åé¡ãªãå ŽåããããŸãããéåžžã¯ãæ»ãåã«ãšã©ãŒãè£
食ããããšããå§ãããŸãã ãããŠããã®ææ¡ã¯åè
ã«å¯ŸåŠããŠããããã§ãããåŸè
ã«ã¯ããŸãå¹æããããŸããã ããã¯æ¬è³ªçã«ã人ã
ãã€ãŒãžãŒãªã¿ãŒã³ãã¿ãŒã³ã䜿çšããããšã奚å±ãããããšãæå³ããŸãã
@agnivadeæ£è§£ã§ãããã®ææ¡ã¯ããšã©ãŒã®è£
食ã«ã¯ãŸã£ãã圹ç«ã¡ãŸããïŒãã ãã defer
ã®äœ¿çšããå§ãããŸãïŒã ãã®çç±ã®1ã€ã¯ããã®ããã®èšèªã¡ã«ããºã ããã§ã«ååšããŠããããšã§ãã ç¹ã«åã
ã®ãšã©ãŒã«åºã¥ããŠãšã©ãŒè£
食ãå¿
èŠã«ãªããšããã«ãè£
食ã³ãŒãã®ãœãŒã¹ããã¹ãã®éãå¢ããããã if
ã®è² æ
ã軜æžãããŸãã ããã¯ãè£
食ãäžèŠãªå ŽåããŸãã¯è£
食ãåžžã«åãã§ããå Žåã§ããã€ã©ãŒãã¬ãŒããç®ã«èŠãã劚害ã«ãªããéèŠãªã³ãŒããæãªãå Žåã§ãã
人ã
ã¯ãã§ã«ç°¡åãªãªã¿ãŒã³ãã¿ãŒã³ã䜿çšããããšã奚å±ãããŠããŸãã try
ãŸãã¯try
ãªããæžãããšã¯ã»ãã®å°ãã§ãã èããŠã¿ããšã_ãšã©ãŒè£
食ãä¿é²ããå¯äžã®æ¹æ³ã¯ããããå¿
é ã«ããããšã§ã_ãã©ã®èšèªãµããŒããå©çšå¯èœã§ãã£ãŠãããšã©ãŒã®è£
食ã«ã¯ããå€ãã®äœæ¥ãå¿
èŠã«ãªãããã§ãã
ååŒãçããã1ã€ã®æ¹æ³ã¯ã try
ïŒãŸãã¯é¡äŒŒã®ã·ã§ãŒãã«ããè¡šèšïŒã®ãããªãã®ã ããèš±å¯ããããšã§ããæ瀺çãªïŒãããã空ã®ïŒãã³ãã©ãŒãã©ããã«æäŸãããŠããå ŽåïŒå
ã®ãã©ãããã¶ã€ã³ã«ã¯ãã®ãããªãã®ããªãã£ãããšã«æ³šæããŠãã ããïŒèŠä»¶ã®ããããïŒã
ãããŸã§è¡ããããã©ããããããŸããã ã©ã€ãã©ãªã®å éšãªã©ãå®å šã«çŽ°ããã³ãŒãã®å€ãã¯ãã©ãã§ããšã©ãŒãè£ é£Ÿããå¿ èŠããªãããšãèšãæããããŠãã ããã ããšãã°ããšã©ãŒãäŒæããŠãAPIãšã³ããªãã€ã³ããé¢ããçŽåã«è£ 食ããã®ã¯åé¡ãããŸããã ïŒå®éãããããã©ãã«ã§ã食ããšãè£ é£Ÿãéå°ãªãšã©ãŒãçºçããã ãã§ãå®éã®åå ãé ãããŠãããããéèŠãªãšã©ãŒãèŠã€ããã®ãé£ãããªããŸããé床ã«åé·ãªãã°èšé²ãšåæ§ã«ãå®éã«äœãèµ·ãã£ãŠããã®ãã確èªããã®ãé£ãããªããŸãïŒã
ãã£ããé¢æ°ãè¿œå ããããšãã§ãããšæããŸããããã¯çŽ æŽããããã¢ã«ãªãã®ã§ã次ã®ããã«ããŸãã
func a() int {
x := randInt()
// let's assume that this is what recruiters should "fix" for us
// or this happens in 3rd-party package.
if x % 1337 != 0 {
panic("not l33t enough")
}
return x
}
func b() error {
// if a() panics, then x = 0, err = error{"not l33t enough"}
x, err := catch(a())
if err != nil {
return err
}
sendSomewhereElse(x)
return nil
}
// which could be simplified even further
func c() error {
x := try(catch(a()))
sendSomewhereElse(x)
return nil
}
ãã®äŸã§ã¯ã catch()
ã¯recover()
ãããã¯ã«ãªãã return ..., panicValue
ãªããŸãã
ãã¡ãããé¢æ°ãããããšã©ãŒãè¿ããšããæãããªã³ãŒããŒã±ãŒã¹ããããŸãã ãã®å Žåããšã©ãŒå€ããã¹ã¹ã«ãŒããã ãã§äŸ¿å©ã ãšæããŸãã
ãããã£ãŠãåºæ¬çã«ã¯ãcatchïŒïŒã䜿çšããŠãå®éã«ãããã¯ãå埩ãããšã©ãŒã«å€ããããšãã§ããŸãã
ããã¯ç§ã«ã¯éåžžã«é¢çœãããã«èŠããŸãããªããªããGoã«ã¯å®éã«ã¯äŸå€ããªãããã§ããããã®å Žåãããªããã¡ããšããtryïŒïŒ-catchïŒïŒãã¿ãŒã³ããããJavaïŒ catch(Throwable)
ã¡ã€ã³ã®throws LiterallyAnything
ïŒã éåžžã®ãšã©ãŒã®ããã«ã誰ãã®ãããã¯ãç°¡åã«åŠçã§ããŸãã ç§ã¯çŸåšãçŸåšã®ãããžã§ã¯ãã§Goã«çŽ6mln以äžã®LoCãæã£ãŠããŸããããã«ãããå°ãªããšãç§ã«ãšã£ãŠã¯ç©äºãåçŽåããããšæããŸãã
@griesemerãã£ã¹ã«ãã·ã§ã³ã®èŠçŽãããããšãã
ããã«1ã€ã®ãã€ã³ããæ¬ ããŠããããšã«æ°ã¥ããŸããããžã§ããªãã¯ãã§ãããŸã§ãã®æ©èœãåŸ ã€ã¹ãã ãšäž»åŒµãã人ãããŸããããã«ããããã®åé¡ããããšã¬ã¬ã³ããªæ¹æ³ã§è§£æ±ºã§ããããã«ãªãããšãé¡ã£ãŠããŸãã
ããã«ã @ velovixã®ææ¡ãæ°ã«å ¥ã£ãŠããŸããããã«ãããä»æ§ã«èšèŒãããŠããããã€ãã®è³ªåãçºçããããšã¯ãããããã§ããã @ velovixããã§ã«è¡ã£ãããã«ããããã¯åççãªæ¹æ³ã§ç°¡åã«çãããããšæããŸãã
äŸãã°ïŒ
é¢æ°å€ïŒnilãªãã©ã«ã§ã¯ãªãïŒãæäŸãããã®é¢æ°å€ïŒå€æ°ã«æ ŒçŽãããŠããïŒãããŸããŸnilã§ããå Žåã¯ã©ããªããŸããïŒ =>ãšã©ãŒãæéãåŠçããªãã§ãã ããã ããã¯ããšã©ãŒåŠçãã³ã³ããã¹ãã«äŸåãããšã©ãŒåŠçãå¿ èŠãã©ããã«å¿ããŠãã³ãã©å€æ°ãèšå®ãããå Žåã«åœ¹ç«ã¡ãŸãã ããã¯ãã°ã§ã¯ãªããæ©èœã§ãã :)
ãã1ã€ã®åŒæ°ã¯ãé¢æ°ããšã©ãŒãåŠçããããšãéåžžã«æ確ã«ãªãããããšã©ãŒãã³ãã©ãŒã®ãããã¬ãã«ã®å®£èšãè¡ãæ¹ããããšãããã®ã§ããã =>ãããã£ãŠãé¢æ°ã®äžéšã«ãããšã©ãŒãã³ãã©ãŒãååä»ãã¯ããŒãžã£é¢æ°ãšããŠå®çŸ©ããããã䜿çšããŸããããã«ããããšã©ãŒãåŠçããå¿ èŠãããããšãéåžžã«æ確ã«ãªããŸãã ããã¯æ·±å»ãªåé¡ã§ã¯ãªããã¹ã¿ã€ã«èŠä»¶ã§ãã
ä»ã«ã©ã®ãããªæžå¿µããããŸãããïŒ ç§ã¯ããããã¹ãŠãåççãªæ¹æ³ã§åæ§ã«çããããããšãã§ãããšããªã確信ããŠããŸãã
æåŸã«ãããªããèšãããã«ããååŒãçããã1ã€ã®æ¹æ³ã¯ãæ瀺çãªïŒãããã空ã®ïŒãã³ãã©ãŒãã©ããã«æäŸãããŠããå Žåã«ã®ã¿ãtryïŒãŸãã¯é¡äŒŒã®ã·ã§ãŒãã«ããè¡šèšïŒã®ãããªãã®ãèš±å¯ããããšã§ããã ãã®ææ¡ãé²ããå Žåã¯ãé©åãªãæé»çãããæ瀺çããªãšã©ãŒåŠçãä¿é²ããããã«ãå®éã«ããããŸã§ããšãã¹ãã ãšæããŸãã
@griesemer
é¢æ°å€ïŒnilãªãã©ã«ã§ã¯ãªãïŒãæäŸãããã®é¢æ°å€ïŒå€æ°ã«æ ŒçŽãããŠããïŒãããŸããŸnilã§ããå Žåã¯ã©ããªããŸããïŒ æ瀺çãªnilå€ãšåæ§ã«ãåŠçã¯å¿ èŠãããŸããã ããããããã¯ã³ãŒãã®ãã°ã§ãããšäž»åŒµãã人ããããããããŸããã
çè«çã«ã¯ãããã¯æœåšçãªèœãšãç©Žã®ããã«èŠããŸããããã³ãã©ãŒã誀ã£ãŠãŒãã«ãªããšããåççãªç¶æ³ãæŠå¿µåããã®ã«èŠåŽããŠããŸãã ãã³ãã©ãŒã¯ãæãäžè¬çã«ã¯ãä»ã®å Žæã§å®çŸ©ããããŠãŒãã£ãªãã£é¢æ°ããããŸãã¯é¢æ°èªäœã§å®çŸ©ãããã¯ããŒãžã£ãŒãšããŠååŸããããšæããŸãã ãããã®ã©ã¡ãããäºæããã«ãŒãã«ãªãå¯èœæ§ã¯ãããŸããã çè«çã«ã¯ããã³ãã©ãŒé¢æ°ãä»ã®é¢æ°ãžã®åŒæ°ãšããŠæž¡ãããã·ããªãªãèããããŸãããç§ã®ç®ã«ã¯ãããã¯ããªãé ããã®ã®ããã«èŠããŸãã ãããããç§ãæ°ä»ããŠããªããã®ãããªãã¿ãŒã³ãããã§ãããã
ãã1ã€ã®åŒæ°ã¯ãé¢æ°ããšã©ãŒãåŠçããããšãéåžžã«æ確ã«ãªãããããšã©ãŒãã³ãã©ãŒã®ãããã¬ãã«ã®å®£èšãè¡ãæ¹ããããšãããã®ã§ããã ãããã£ãŠã
defer
ã
@beoranãè¿°ã¹ãããã«ããã³ãã©ãŒãé¢æ°ã®äžéšè¿ãã®ã¯ããŒãžã£ãŒãšããŠå®çŸ©ãããšãã¹ã¿ã€ã«ãéåžžã«äŒŒããã®ã«ãªããŸãããããã人ã
ããã³ãã©ãŒãæãäžè¬çã«äœ¿çšããããšãå人çã«æåŸ
ããæ¹æ³ã§ãã ãšã©ãŒãåŠçãããã¹ãŠã®é¢æ°ãdefer
ã䜿çšãããšããäºå®ã«ãã£ãŠåŸãããæå¿«ãã«ã¯æè¬ããŸãããé¢æ°ãé¢æ°ã®éäžã§ãšã©ãŒåŠçæŠç¥ãããããããå¿
èŠãããå Žåã¯ãäžæ確ã«ãªãå¯èœæ§ããããŸãã 次ã«ã2ã€ã®defer
ã確èªããèªè
ã¯ããããäºãã«ã©ã®ããã«çžäºäœçšãããã«ã€ããŠæšè«ããå¿
èŠããããŸãã ããã¯ããã³ãã©ãŒã®è°è«ãããæ確ã§äººéå·¥åŠçã§ãããšç§ãä¿¡ããç¶æ³ã§ãããããã¯_æ¯èŒç_äžè¬çãªã·ããªãªã«ãªããšæããŸãã
è§ãã£ããªãã§åäœãããããšã¯å¯èœã§ããïŒ
ã€ãŸãã次ã®ãããªãã®ã§ãã
a := try func(some)
@ Cyberââax-ãã§ã«äžã§è¿°ã¹ãããã«ãæçš¿ããåã«ãã¶ã€ã³ããã¥ã¡ã³ãã泚ææ·±ãèªãããšãéåžžã«éèŠã§ãã ããã¯ãã©ãã£ãã¯ã®å€ãåé¡ã§ãããããå€ãã®äººãç»é²ããŠããŸãã
ãã®ããã¥ã¡ã³ãã§ã¯ãæŒç®åãšé¢æ°ã«ã€ããŠè©³ãã説æããŠããŸãã
ç§ã¯ããã8æã®ããŒãžã§ã³ããããã£ãšå¥œãã§ãã
return
ããŒã¯ãŒããªãã®è¿åãšã¯å®å
šã«å察ã§ã¯ãªããåŠå®çãªãã£ãŒãããã¯ã®å€ãã¯ã2ã€ã®ãã€ã³ãã«èŠçŽã§ãããšæããŸãã
ããšãã°ã次ãåç §ããŠãã ããã
ããã2ã€ã®ç°è°ã«å¯Ÿããåè«ã¯ãããã次ã®ãšããã§ãã
try
ã䜿ãããã€ããã¯ãªãã/ 100ïŒ
ã®å Žåã«ã¯é©åã§ã¯ãªãç§ã¯1ã«ã€ããŠäœãèšãããšã¯ãããŸããïŒç§ã¯ããã«ã€ããŠåŒ·ãæããŠããŸããïŒã ãããã2ã«é¢ããŠã¯ã8æã®ææ¡ã«ã¯ãã®åé¡ããªãã£ãããšã«æ³šæããŸãããã»ãšãã©ã®å察ã®ææ¡ã«ããã®åé¡ã¯ãããŸããã
ç¹ã«ã tryf
ã®å察ææ¡ïŒãã®ã¹ã¬ããã§2åç¬ç«ããŠæçš¿ãããïŒãtry(X, handlefn)
ã®å察ææ¡ïŒèšèšã®å埩ã®äžéšã§ããïŒã«ããã®åé¡ã¯ãããŸããã§ããã
try
ã¯ãããèªäœããé¢é£ããã³ã³ããã¹ãã§ãšã©ãŒãè£
食ããããšãããåäžã®äžè¬çãªé¢æ°ããšã®ãšã©ãŒè£
食ã«åãã£ãŠäººã
ãæŒããããšããããšã䞻匵ããã®ã¯é£ãããšæããŸãã
ãããã®çç±ããããã®åé¡ã«åãçµã䟡å€ããããšæããŸããå¯èœãªè§£æ±ºçãææ¡ããããšæããŸãã
defer
ã®ãã©ã¡ãŒã¿ãŒã¯ãé¢æ°ãŸãã¯ã¡ãœããã®åŒã³åºãã®ã¿ã§ãã defer
ã«ãé¢æ°åãŸãã¯é¢æ°ãªãã©ã«ãå«ããããšãã§ããŸããdefer func(...) {...}
defer packageName.functionName
ãããã¯ãŸãã¯deferreturnããã®ã¿ã€ãã®é 延ã«ééãããšããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã«ãŒãå€ãæž¡ãé¢æ°ãåŒã³åºããŸãã
try
ã«è€æ°ã®ãã©ã¡ãŒã¿ãŒãå«ããããšãèš±å¯ãã
try
ãæ°ããã¿ã€ãã®é
延ã«ééãããšãæåã®ãã©ã¡ãŒã¿ãŒãšããŠãšã©ãŒå€ãžã®ãã€ã³ã¿ãŒãæž¡ãããã®åŸã«æåã®ãã©ã¡ãŒã¿ãŒãé€ããã¹ãŠã®try
èªèº«ã®ãã©ã¡ãŒã¿ãŒãæž¡ãé¢æ°ãåŒã³åºããŸãã
ããšãã°ã次ã®ããã«ãªããŸãã
func errorfn() error {
return errors.New("an error")
}
func f(fail bool) {
defer func(err *error, a, b, c int) {
fmt.Printf("a=%d b=%d c=%d\n", a, b, c)
}
if fail {
try(errorfn, 1, 2, 3)
}
}
次ã®ããšãèµ·ãããŸãã
f(false) // prints "a=0 b=0 c=0"
f(true) // prints "a=1 b=2 c=3"
@zeeboã«ããhttps://github.com/golang/go/issues/32437#issuecomment-499309304ã®ã³ãŒãã¯ã次ã®ããã«æžãçŽãããšãã§ããŸãã
func (c *Config) Build() error {
defer func(err *error, msg string, args ...interface{}) {
if *err == nil || msg == "" {
return
}
*err = errors.WithMessagef(err, msg, args...)
}
pkgPath := try(c.load(), "load config dir")
b := bytes.NewBuffer(nil)
try(templates.ExecuteTemplate(b, "main", c), "execute main template")
buf := try(format.Source(b.Bytes()), "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
// ...
}
ãããŠãErrorHandlefã次ã®ããã«å®çŸ©ããŸãã
func HandleErrorf(err *error, format string, args ...interface{}) {
if *err != nil && format != "" {
*err = fmt.Errorf(format + ": %v", append(args, *err)...)
}
}
fmt
ã¹ã¿ã€ã«ã®æååãã³ã¢èšèªã«åã蟌ãããšãªãã誰ããæ±ããtryf
ãç¡æã§æäŸããŸãã
defer
ã¯åŒæ°ãšããŠé¢æ°åŒãèš±å¯ããªãããããã®æ©èœã«ã¯äžäœäºææ§ããããŸãã æ°ããããŒã¯ãŒãã¯å°å
¥ãããŠããŸããã
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.mdã§æŠèª¬ãããŠãããã®ã«å ããŠããããå®è£
ããããã«è¡ãå¿
èŠã®ããå€æŽã¯æ¬¡ã®ãšããã§ãã
try
ã«æž¡ããããã©ã¡ãŒã¿ãŒãdefer
ã«æž¡ãããé¢æ°ã®ã·ã°ããã£ãšäžèŽããããšã確èªããŸãtry
ã®å®è£
ãå€æŽããŠãæ°ããçš®é¡ã®å»¶æã«ãã£ãŠå»¶æãããåŒã³åºãã«ééãããšãã«ããã®åŒæ°ã延æãããåŒã³åºãã®åŒæ°ã«ã³ããŒããŸããcheck/handle
ãã©ããèšèšã®è€éãã®åŸã§ãããã»ã©åçŽã§å®çšçãªææ¡ã®åå°ãèŠãŠãç§ã¯ããããé©ããŸããããããã«å¯ŸããŠå€ãã®åçºããã£ãããšã«å€±æããŸããã
確ãã«ãå€ãã®åçºã¯ãçŸåšã®åé·æ§ïŒå®å
šã«åççãªç«å ŽïŒã«éåžžã«æºè¶³ããŠãããããããããã軜æžããããã®ææ¡ãæ¬åœã«æè¿ããªã人ã
ããæ¥ãŠããŸãã æ®ãã®ç§ãã¡ã«ãšã£ãŠããã®ææ¡ã¯ãã·ã³ãã«ã§Goã«äŒŒãŠãããšããã¹ã€ãŒãã¹ãããã«åœãããšæããŸããããŸãå€ãã®ããšãããããšããã try
ã®å Žåã«åžžã«ãã©ãŒã«ããã¯ã§ããæ¢åã®ãšã©ãŒåŠçææ³ãšããŸã調åããŸãã
ããã€ãã®ç¹å®ã®ç¹ã«ã€ããŠïŒ
ãã®ææ¡ã§ç§ãå«ãã®ã¯ã defer
ã䜿çšãããšãã«ååä»ãã®ãšã©ãŒæ»ããã©ã¡ãŒã¿ãŒãå¿
èŠãªããšã ãã§ãããããã§ããä»ã®è§£æ±ºçãšã¯çžå®¹ããªããã®ã¯èããããŸãããèšèªã®æ®ãã®éšåãæ©èœããæ¹æ³ã ã§ããããææ¡ãæ¡æãããã°ããããåãå
¥ããªããã°ãªããªããšæããŸãã
try
ãããšã©ãŒå€ãè¿ããªãé¢æ°ã®ãã¹ãããã±ãŒãžã§ããŸãæ©èœããªãã®ã¯æ®å¿µã§ãã ããã«å¯Ÿããç§èªèº«ã®å¥œãŸãã解決çã¯ãnil以å€ã®ãšã©ãŒãçºçãããšãã«è¿ãããã®ã§ã¯ãªããåžžã«ãããã¯ã«ãªã2çªç®ã®çµã¿èŸŒã¿é¢æ°ïŒããããptry
ãŸãã¯must
ïŒãæã€ããšã§ããåè¿°ã®é¢æ°ïŒ main
ãå«ãïŒã§äœ¿çšãããŸãã ãã®ã¢ã€ãã¢ã¯çŸåšã®ææ¡ã®å埩ã§ã¯åŽäžãããŸããããç§ã¯ããããç·å¯ãªåŒã³ãããã§ãããšããå°è±¡ã圢æãããããåæ€èšã®å¯Ÿè±¡ãšãªãå¯èœæ§ããããŸãã
go try(f)
ãŸãã¯defer try(f)
ãè¡ã£ãŠããããšã«é ãæ©ãŸããããšã¯é£ããã®ã§ãå®å
šã«çŠæ¢ããã®ãæåã ãšæããŸãã
go fmt
ã1è¡ã®if
ã¹ããŒãã¡ã³ããæžãçŽããªãã£ãå Žåãæ¢åã®ãšã©ãŒåŠçææ³ã¯ããã»ã©åé·ã«èŠããªããšèãã人ãã¡ã«åæããŸãã å人çã«ã¯ããšã©ãŒåŠçã«é¢ä¿ãããã©ããã«é¢ä¿ãªããããã_any_åäžã¹ããŒãã¡ã³ãif
ã«å¯ŸããŠèš±å¯ããããšããåçŽãªã«ãŒã«ã奜ã¿ãŸãã å®éã宣èšãèš±å¯ãããŠããã®ãšåãè¡ã«æ¬æãé
眮ãããŠããåäžè¡é¢æ°ãäœæãããšãã«ããããçŸåšèš±å¯ãããŠããªãçç±ãç解ã§ããŸããã§ããã
ãšã©ãŒã食ãå Žå
func myfunc()( err error){
try(thing())
defer func(){
err = errors.Wrap(err,"more context")
}()
}
ããã¯ãæ¢åã®ãã©ãã€ã ãããããªãåé·ã§èŠçãæãããã§ãã¯/åŠçã»ã©ç°¡æœã§ã¯ãããŸããã ã©ããããªãtryïŒïŒããªã¢ã³ãã¯ããç°¡æœã§ããã人ã ãtryãçµã¿åãããŠäœ¿çšââããããšã«ãªããåçŽãªãšã©ãŒãè¿ãããããã«æããŸãã tryãšåçŽãªãšã©ãŒãªã¿ãŒã³ãçµã¿åããããšããã¢ã€ãã¢ã奜ããã©ããã¯ããããŸãããããšã©ãŒã®è£ 食ã§å®å šã«å£²ãåããŠããŸãïŒãããŠIs / Asã楜ãã¿ã«ããŠããŸãïŒã ããã¯æ§æçã«ã¯ãããã§ãããå®éã«äœ¿çšããããã©ããã¯ããããŸããã ãã§ãã¯/ãã³ãã«ã¯ãç§ããã£ãšåŸ¹åºçã«åãå ¥ããäœããæããŸããã
ç§ã¯ããã®åçŽããšã1ã€ã®ããšãããŸããããã¢ãããŒããæ¬åœã«å¥œãã§ãã ç§ã®GoAWKã€ã³ã¿ãŒããªã¿ãŒã§ã¯ãéåžžã«åœ¹ç«ã¡ãŸããåçŽåããŠæŽçã§ããçŽ100åã®if err != nil { return nil }
æ§é ããããããã¯ããªãå°ããªã³ãŒãããŒã¹ã«ãããŸãã
ããŒã¯ãŒãã§ã¯ãªãçµã¿èŸŒã¿ã«ãããšããææ¡ã®æ£åœæ§ãèªã¿ãŸããããçµå±ãããŒãµãŒã調æŽããå¿
èŠã¯ãããŸããã ããããã³ã³ãã€ã©ãŒãšããŒã«ã®äœæè
ã«ãšã£ãŠã¯æ¯èŒçå°ããªèŠçã§ã¯ãããŸããããäœåãªèŠªåãšããã¯é¢æ°ã®ããã«èŠããŸãããèªã¿ãããã®åé¡ã¯ãã¹ãŠGoã³ãŒããŒãšã³ãŒã-èªè
ã¯èããªããã°ãªããŸããã ç§ã®æèŠã§ã¯ãããããpanic()
ã¯ãããŒãå¶åŸ¡ããããšããè°è«ïŒèšãèš³ïŒ:-)ã¯ãããã«ããããŸããããªããªãããããã¯ãšå埩ã¯æ¬è³ªçã«äŸå€çã§ããã®ã«å¯Ÿãã try()
ã¯éåžžã®ãšã©ãŒåŠçãšå¶åŸ¡ãããŒã§ããã
ããããã®ãŸãŸè¡ããããšããŠããééããªããããããã§ãããç§ã®åŒ·ã奜ã¿ã¯ãéåžžã®å¶åŸ¡ãããŒãæ確ã«ããããšãã€ãŸãããŒã¯ãŒããä»ããŠè¡ãããšã§ãã
ç§ã¯ãã®ææ¡ã«è³æã§ãã ããã¯åã®ææ¡ã«ã€ããŠã®ç§ã®æ倧ã®äºçŽãé¿ããŸãïŒ defer
ã«é¢ããŠhandle
ã®éçŽäº€æ§ã
äžã§åŒ·èª¿ãããŠããªããšæã2ã€ã®åŽé¢ã«ã€ããŠèšåããããšæããŸãã
ãŸãããã®ææ¡ã§ã¯ãã³ã³ããã¹ãåºæã®ãšã©ãŒããã¹ãããšã©ãŒã«è¿œå ããã®ã¯ç°¡åã§ã¯ãããŸããããã¹ã¿ãã¯ãã¬ãŒã ã®ãšã©ãŒè¿œè·¡æ å ±ããšã©ãŒã«è¿œå ããã®ã¯ç°¡åã§ãïŒhttpsïŒ //play.golang.org/p / YL1MoqR08E6
第äºã«ã try
ã¯ã httpsïŒ//github.com/golang/go/issues/19642ã®æ ¹åºã«ããåé¡ã®ã»ãšãã©ã«å¯Ÿããééããªãå
¬æ£ãªè§£æ±ºçã§ãã ãã®åé¡ã®äŸããšããšã try
ã䜿çšããŠãæ¯åãã¹ãŠã®æ»ãå€ãæžãåºããªãããã«ããããšãã§ããŸãã ããã¯ãé·ãååãæã€å€ã«ããæ§é äœåãè¿ããšãã«ã圹ç«ã€å¯èœæ§ããããŸãã
func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
xx := int(x)
if f.NumGlyphs() <= xx {
try(ErrNotFound)
}
i := f.cached.locations[xx+0]
j := f.cached.locations[xx+1]
if j < i {
try(errInvalidGlyphDataLength)
}
if j-i > maxGlyphDataLength {
try(errUnsupportedGlyphDataLength)
}
buf, err = b.view(&f.src, int(i), int(j-i))
return buf, i, j - i, err
}
ç§ããã®ææ¡ã奜ãã§ãã
ãããŠããé¡ãããããŸãã
make
ã®ããã«ã try
ãå¯å€æ°ã®ãã©ã¡ãŒã¿ãŒãåãããšãèš±å¯ã§ããŸããïŒ
ãã®ããã«ãããã¯æ瀺çã§ãããªããããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãåŠçã§ãã1ã€ã®çµã¿èŸŒã¿ã§ãã ãã®å©ç¹ïŒ
ç¹°ãè¿ãã®if err !=nil { return ... err }
ã¯ç¢ºãã«éãåé³ã§ãããç§ã¯ããããšäžç·ã§ã
tryïŒïŒã®ææ¡ã¯èªã¿ããããéåžžã«äœããããäžæçã ãšæã人ã
ååä»ããªã¿ãŒã³ã®äœ¿çšã«ãåé¡ããããŸãã
ãã®çš®ã®æŽçãå¿
èŠãªå Žåã¯ãç³è¡£æ§æãšããŠtry(err)
ã䜿çšããŠã¿ãŸãããã
if err !=nil { return err }
ïŒ
file, err := os.Open("file.go")
try(err)
ããã«
file, err := os.Open("file.go")
if err != nil {
return err
}
ãŸããæ»ãå€ãè€æ°ããå Žåã try(err)
ã¯return t1, ... tn, err
ã«ãªãå¯èœæ§ããããŸã
ããã§ãt1ã... tnã¯ãä»ã®æ»ãå€ã®ãŒãå€ã§ãã
ãã®ææ¡ã«ãããååä»ãã®æ»ãå€ãäžèŠã«ãªãã次ã®ããã«ãªããŸãã
ç§ã®èŠè§£ã§ã¯ãç解ãããããèªã¿ããããªã£ãŠããŸãã
ããã«è¯ãããšã«ãç§ã¯æ¬¡ã®ããã«ãªããšæããŸãïŒ
file, try(err) := os.Open("file.go")
ãããã¯
file, err? := os.Open("file.go")
ãã®æåŸã¯äžäœäºææ§ããããŸãïŒïŒã¯çŸåšèå¥åã§ã¯èš±å¯ãããŠããŸããïŒã
ïŒãã®ææ¡ã¯https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring-themesã«é¢é£ããŠããŸããããããç¹°ãè¿ãã®ããŒãã®äŸã¯ãæ瀺çãªãã³ãã«ãé¢ããã®ã§ã¯ãªããŸã è°è«ãããŠãã段éã§ãã£ããããç°ãªã£ãŠããããã«èŠããŸãããã延æããŸããïŒ
ãã®æ éã§èå³æ·±ãææ¡ãããŠãããgoããŒã ã«æè¬ããŸãã
@rogpeppeã³ã¡ã³ãtry
ãã¹ã¿ãã¯ãã¬ãŒã ãèªåè¿œå ããå Žåãç§ã§ã¯ãªããã³ã³ããã¹ãã®è¿œå ãæããšã©ãŸãããŠã倧äžå€«ã§ãã
@ aarzilli-ããã§ãããªãã®ææ¡ã«ããã°ã tryf
ã«è¿œå ã®ãã©ã¡ãŒã¿ãŒãäžãããã³ã«deferå¥ã¯å¿
é ã§ããïŒ
ãããšã©ããªããŸãã
try(ioutil.WriteFile(target, buf, 0644), "write file %s", target)
ãšå»¶æé¢æ°ãæžããªãã®ã§ããïŒ
@agnivade
ïŒ...ïŒå»¶æé¢æ°ãèšè¿°ããªããšã©ããªããŸããïŒ
ã¿ã€ããã§ãã¯ãšã©ãŒã
ç§ã®æèŠã§ã¯ããã¹ãŠã®æ»ãå€ãæžãåºããªãããã«try
ã䜿çšããããšã¯ãå®éã«ã¯ããã«å¯Ÿããå¥ã®æ»æã§ãã
func (f *Font) viewGlyphData(b *Buffer, x GlyphIndex) (buf []byte, offset, length uint32, err error) {
xx := int(x)
if f.NumGlyphs() <= xx {
try(ErrNotFound)
}
//...
return nil, 0, 0, ErrNotFound
ãæžãåºããªããŠããããšããé¡æã¯å®å
šã«ç解ããŠããŸããããããå¥ã®æ¹æ³ã§è§£æ±ºããããšæããŸãã
try
ãšããèšèã¯ããè¿åããæå³ãããã®ã§ã¯ãããŸããã ãããŠããããããã§äœ¿çšãããŠããæ¹æ³ã§ãã try
ãerror
ã®å€ãçŽæ¥åãåããªãããã«ãææ¡ãå€æŽããããšãå®éã«æãã§ããŸãããªããªãããã®ãããªã³ãŒãã誰ãã«æžããŠã»ãããªãããã§ã^^ã èªã¿ééããŸãã ããªãããã®ã³ãŒããåå¿è
ã«èŠããå Žåã圌ãã¯ãã®è©Šã¿ãäœãããŠããã®ãèŠåœãã€ããªãã§ãããã
ããã©ã«ããšãšã©ãŒå€ãç°¡åã«è¿ãæ¹æ³ãå¿ èŠãªå Žåã¯ããããåå¥ã«è§£æ±ºããŸãããã å€åå¥ã®ãã«ãã€ã³ã®ãããª
return default(ErrNotFound)
å°ãªããšããããã¯ããçš®ã®ããžãã¯ã§èªã¿åãããŸãã
ããããä»ã®åé¡ã解決ããããã«try
ãæªçšããªãããã«ããŸãããã
@natefinchå
ã®ææ¡ã®ããã«try
ãã«ãã€ã³ã®ååãcheck
ã®å Žåã check(err)
ã«ãªããããªãèªã¿ããããªããŸãã
ããã¯ããŠããã try(err)
ãæžãããšãæ¬åœã«èåŸ
ã§ãããã©ããã¯ããããŸããã ããã¯ãããã«å®çŸ©ããå€ããŸãã ããããäžæ¹ã§ãããã¯åæ³ã§ããããšãæå³ããŸãã
a, b := try(1, f(), err)
try
ã«é¢ããç§ã®äž»ãªåé¡ã¯ãå®éã«ã¯1ã¬ãã«ããäžãããªãpanic
ã§ãããšããããšã ãšæããŸã...ãããã¯ãšã¯ç°ãªããã¹ããŒãã¡ã³ãã§ã¯ãªãåŒã§ãããããé衚瀺ã«ã§ããŸãããã¯ã©ããã®ã¹ããŒãã¡ã³ãã®éäžã«ãããŸãã ããã¯ã»ãšãã©ãããã¯ãããæªããªããŸãã
@natefinchããã¬ãã«ã«äžãã£ãŠããä»ã®ããšããããããã¯ã®ããã«æŠå¿µåãããšãããªãåä»ã«æããŸãã ããããç§ã¯ãããå¥ã®æ¹æ³ã§æŠå¿µåããŠããŸãã Goã§ãšã©ãŒãè¿ãé¢æ°ã¯ãå¹æçã«çµæãè¿ããŸãtry
ã¯ãçµæã解åãã error != nil
ã®å Žåã¯ããšã©ãŒçµæããè¿ããã error == nil
ã®å Žåã¯çµæã®Téšåã解åãããŠãŒãã£ãªãã£ã§ãã
ãã¡ãããGoã«ã¯å®éã«ã¯çµæãªããžã§ã¯ãã¯ãããŸããããäºå®äžåããã¿ãŒã³ã§ããã try
ã¯ãã®ãã¿ãŒã³ã®èªç¶ãªææåã®ããã§ãã ãã®åé¡ã®è§£æ±ºçã¯ããšã©ãŒåŠçã®ããã€ãã®åŽé¢ãææåããå¿
èŠããããšç§ã¯ä¿¡ããŠããã try
ããããåŒãåããããšã¯ç§ã«ã¯åççã§ããããã«æãããŸãã ç§èªèº«ãšä»ã®äººã¯ãæ¢åã®Goãšã©ãŒåŠçãã¿ãŒã³ã«ããããé©åããããã«try
ã®æ©èœãå°ãæ¡åŒµããããšãææ¡ããŠããŸãããåºæ¬çãªæŠå¿µã¯åããŸãŸã§ãã
@ugorjiææ¡ããtry(f, bool)
ããªã¢ã³ãã¯ãïŒ32219ã®must
ã®ããã«èãããŸãã
@ugorjiææ¡ãã
try(f, bool)
ããªã¢ã³ãã¯ãïŒ32219ã®must
ã®ããã«èãããŸãã
ã¯ããããã§ãã 3ã€ã®ã±ãŒã¹ãã¹ãŠãåäžã®çµã¿èŸŒã¿é¢æ°ã§åŠçã§ãããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ããšã¬ã¬ã³ãã«æºããããšãã§ãããšæããŸããã
try()
ã¯ãã§ã«éæ³ã®ããã§ããããšã©ãŒã®æ»ãå€ãèªèããŠããã®ã§ãnullaryïŒãŒãåŒæ°ïŒåœ¢åŒã§åŒã³åºããããšãã«ãã®å€ãžã®ãã€ã³ã¿ãŒãè¿ãããã«æ¡åŒµã§ããŸããïŒ ããã«ãããååä»ãã®è¿åãäžèŠã«ãªããdeferã¹ããŒãã¡ã³ãã§ãšã©ãŒãçºçãããšäºæ³ãããå ŽæãèŠèŠçã«é¢é£ä»ããã®ã«åœ¹ç«ã€ãšæããŸãã äŸãã°ïŒ
func foo() error {
defer fmt.HandleErrorf(try(), "important foo context info")
try(bar())
try(baz())
try(etc())
}
@ugorji
try(f, bool)
ã®ããŒã«å€ã¯ãèªã¿ã«ãããèŠéãããããšæããŸãã ç§ã¯ããªãã®ææ¡ã奜ãã§ããããããã¯ã®å ŽåããŠãŒã¶ãŒã3çªç®ã®ç®æ¡æžããããã³ãã©ãŒå
ã«ãããæžãããšãçç¥ã§ãããšæããŸãïŒäŸïŒ try(f(), func(err error) { panic('at the disco'); })
ïŒãããã«ãããé衚瀺ã®try(f(), true)
ããããŠãŒã¶ãŒã«ãšã£ãŠããæ確ã«ãªããŸã
@ugorji
try(f, bool)
ã®ããŒã«å€ã¯ãèªã¿ã«ãããèŠéãããããšæããŸãã ç§ã¯ããªãã®ææ¡ã奜ãã§ããããããã¯ã®å ŽåããŠãŒã¶ãŒã3çªç®ã®ç®æ¡æžããããã³ãã©ãŒå ã«ãããæžãããšãçç¥ã§ãããšæããŸãïŒäŸïŒtry(f(), func(err error) { panic('at the disco'); })
ïŒãããã«ãããé衚瀺ã®try(f(), true)
ããããŠãŒã¶ãŒã«ãšã£ãŠããæ確ã«ãªããŸã
ããã«èããŠã¿ããšãç§ã¯ããªãã®ç«å Žãšããªãã®æšè«ã«åæããåŸåããããŸãããããŠããã¯ãŸã ã¯ã³ã©ã€ããŒãšããŠãšã¬ã¬ã³ãã«èŠããŸãã
@ patrick-nytã¯ã httpsïŒ //github.com/golang/go/issues/32437#issuecomment -499533464ã§ãnilãã¹ããããªã¬ãŒãã_assignmentæ§æ_ã®ãã1ã€ã®ææ¡è ã§ãã
ãã®æŠå¿µã¯ããã§ãã¯/ãã³ãã«ææ¡ã«å¯Ÿãã13ã®åå¥ã®å¿çã«è¡šç€ºãããŸã
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback#recurring -themes
f, ?return := os.Open(...)
f, ?panic := os.Open(...)
ãªãã§ïŒ Go 1ã®ããã«èªã¿åãããã®ã«å¯Ÿãã try()
ãšcheck
ã¯ããã§ã¯ãããŸããã
try
ã«å¯Ÿãã1ã€ã®ç°è°ã¯ããããåŒã§ãããšããããšã®ããã§ãã 代ããã«ãnilã§ãªãå Žåã¯returnãæå³ããåé
postfixã¹ããŒãã¡ã³ã?
ããããšããŸãã ãããæšæºã®ã³ãŒããµã³ãã«ã§ãïŒææ¡ãããé
延ããã±ãŒãžãè¿œå ããããšä»®å®ããŸãïŒïŒ
func CopyFile(src, dst string) error {
var err error // Don't need a named return because err is explicitly named
defer deferred.Annotate(&err, "copy %s %s", src, dst)
r, err := os.Open(src)
err?
defer deferred.AnnotatedExec(&err, r.Close)
w, err := os.Create(dst)
err?
defer deferred.AnnotatedExec(&err, r.Close)
defer deferred.Cond(&err, func(){ os.Remove(dst) })
_, err = io.Copy(w, r)
return err
}
pgStoreã®äŸïŒ
func (p *pgStore) DoWork() error {
tx, err := p.handle.Begin()
err?
defer deferred.Cond(&err, func(){ tx.Rollback() })
var res int64
err = tx.QueryRow(`INSERT INTO table (...) RETURNING c1`, ...).Scan(&res)
// tricky bit: this would not change the value of err
// but the deferred.Cond would still be triggered by err being set before
deferred.Format(err, "insert table")?
_, err = tx.Exec(`INSERT INTO table2 (...) VALUES ($1)`, res)
deferred.Format(err, "insert table2")?
return tx.Commit()
}
ç§ã¯@jargvããããã奜ãã§ãïŒ
tryïŒïŒã¯ãã§ã«éæ³ã®ããã§ããããšã©ãŒã®æ»ãå€ãèªèããŠããã®ã§ãnullaryïŒãŒãåŒæ°ïŒåœ¢åŒã§åŒã³åºããããšãã«ãã®å€ãžã®ãã€ã³ã¿ãŒãè¿ãããã«æ¡åŒµã§ããŸããïŒ ããã«ãããååä»ãè¿åãäžèŠã«ãªããŸã
ããããåŒæ°ã®æ°ã«åºã¥ããŠååtry
ããªãŒããŒããŒããã代ããã«ã reterr
ãªã©ã®å¥ã®éæ³ãçµã¿èŸŒãŸããŠããå¯èœæ§ããããšæããŸãã
ç§ã¯ããã€ãã®éåžžã«é »ç¹ã«äœ¿çšãããããã±ãŒãžã«ã€ããŠç°¡åã«èª¬æãããšã©ãŒåŠçã«ãèŠãããããæžãåã«ããèããããŠããã¯ãã®goã³ãŒããæ¢ããææ¡ãããtryïŒïŒãäœãããããç解ããããšããŸããã
çŸåšãç§ãææ¡ã誀解ããªãéãããããã®å€ãïŒããšãã°ãè¶
åºæ¬çãªãšã©ãŒåŠçã§ã¯ãªãïŒã¯ããŸãåŸãããªããããå€ãããšã©ãŒåŠçã¹ã¿ã€ã«ãç¶æããå¿
èŠããããŸãã
net / http / request.goããã®äŸïŒ
func (r *Request) write(w io.Writer, usingProxy bool, extraHeaders Header, waitForContinue func() bool) (err error) {
`
trace := httptrace.ContextClientTrace(r.Context())
if trace != nil && trace.WroteRequest != nil {
defer func() {
trace.WroteRequest(httptrace.WroteRequestInfo{
Err: err,
})
}()
}
// Find the target host. Prefer the Host: header, but if that
// is not given, use the host from the request URL.
//
// Clean the host, in case it arrives with unexpected stuff in it.
host := cleanHost(r.Host)
if host == "" {
if r.URL == nil {
return errMissingHost
}
host = cleanHost(r.URL.Host)
}
// According to RFC 6874, an HTTP client, proxy, or other
// intermediary must remove any IPv6 zone identifier attached
// to an outgoing URI.
host = removeZone(host)
ruri := r.URL.RequestURI()
if usingProxy && r.URL.Scheme != "" && r.URL.Opaque == "" {
ruri = r.URL.Scheme + "://" + host + ruri
} else if r.Method == "CONNECT" && r.URL.Path == "" {
// CONNECT requests normally give just the host and port, not a full URL.
ruri = host
if r.URL.Opaque != "" {
ruri = r.URL.Opaque
}
}
if stringContainsCTLByte(ruri) {
return errors.New("net/http: can't write control character in Request.URL")
}
// TODO: validate r.Method too? At least it's less likely to
// come from an attacker (more likely to be a constant in
// code).
// Wrap the writer in a bufio Writer if it's not already buffered.
// Don't always call NewWriter, as that forces a bytes.Buffer
// and other small bufio Writers to have a minimum 4k buffer
// size.
var bw *bufio.Writer
if _, ok := w.(io.ByteWriter); !ok {
bw = bufio.NewWriter(w)
w = bw
}
_, err = fmt.Fprintf(w, "%s %s HTTP/1.1\r\n", valueOrDefault(r.Method, "GET"), ruri)
if err != nil {
return err
}
// Header lines
_, err = fmt.Fprintf(w, "Host: %s\r\n", host)
if err != nil {
return err
}
if trace != nil && trace.WroteHeaderField != nil {
trace.WroteHeaderField("Host", []string{host})
}
// Use the defaultUserAgent unless the Header contains one, which
// may be blank to not send the header.
userAgent := defaultUserAgent
if r.Header.has("User-Agent") {
userAgent = r.Header.Get("User-Agent")
}
if userAgent != "" {
_, err = fmt.Fprintf(w, "User-Agent: %s\r\n", userAgent)
if err != nil {
return err
}
if trace != nil && trace.WroteHeaderField != nil {
trace.WroteHeaderField("User-Agent", []string{userAgent})
}
}
// Process Body,ContentLength,Close,Trailer
tw, err := newTransferWriter(r)
if err != nil {
return err
}
err = tw.writeHeader(w, trace)
if err != nil {
return err
}
err = r.Header.writeSubset(w, reqWriteExcludeHeader, trace)
if err != nil {
return err
}
if extraHeaders != nil {
err = extraHeaders.write(w, trace)
if err != nil {
return err
}
}
_, err = io.WriteString(w, "\r\n")
if err != nil {
return err
}
if trace != nil && trace.WroteHeaders != nil {
trace.WroteHeaders()
}
// Flush and wait for 100-continue if expected.
if waitForContinue != nil {
if bw, ok := w.(*bufio.Writer); ok {
err = bw.Flush()
if err != nil {
return err
}
}
if trace != nil && trace.Wait100Continue != nil {
trace.Wait100Continue()
}
if !waitForContinue() {
r.closeBody()
return nil
}
}
if bw, ok := w.(*bufio.Writer); ok && tw.FlushHeaders {
if err := bw.Flush(); err != nil {
return err
}
}
// Write body and trailer
err = tw.writeBody(w)
if err != nil {
if tw.bodyReadError == err {
err = requestBodyReadError{err}
}
return err
}
if bw != nil {
return bw.Flush()
}
return nil
}
`
ãŸãã¯ãpprof / profile /profile_test.goãªã©ã®åŸ¹åºçãªãã¹ãã§äœ¿çšãããŸãã
`
func checkAggregationïŒprof * Profileã* aggTestïŒãšã©ãŒ{
//è¡ã®ãµã³ãã«ã®ç·æ°ãä¿æãããŠããããšã確èªããŸãã
åèšïŒ= int64ïŒ0ïŒ
samples := make(map[string]bool)
for _, sample := range prof.Sample {
tb := locationHash(sample)
samples[tb] = true
total += sample.Value[0]
}
if total != totalSamples {
return fmt.Errorf("sample total %d, want %d", total, totalSamples)
}
// Check the number of unique sample locations
if a.rows != len(samples) {
return fmt.Errorf("number of samples %d, want %d", len(samples), a.rows)
}
// Check that all mappings have the right detail flags.
for _, m := range prof.Mapping {
if m.HasFunctions != a.function {
return fmt.Errorf("unexpected mapping.HasFunctions %v, want %v", m.HasFunctions, a.function)
}
if m.HasFilenames != a.fileline {
return fmt.Errorf("unexpected mapping.HasFilenames %v, want %v", m.HasFilenames, a.fileline)
}
if m.HasLineNumbers != a.fileline {
return fmt.Errorf("unexpected mapping.HasLineNumbers %v, want %v", m.HasLineNumbers, a.fileline)
}
if m.HasInlineFrames != a.inlineFrame {
return fmt.Errorf("unexpected mapping.HasInlineFrames %v, want %v", m.HasInlineFrames, a.inlineFrame)
}
}
// Check that aggregation has removed finer resolution data.
for _, l := range prof.Location {
if !a.inlineFrame && len(l.Line) > 1 {
return fmt.Errorf("found %d lines on location %d, want 1", len(l.Line), l.ID)
}
for _, ln := range l.Line {
if !a.fileline && (ln.Function.Filename != "" || ln.Line != 0) {
return fmt.Errorf("found line %s:%d on location %d, want :0",
ln.Function.Filename, ln.Line, l.ID)
}
if !a.function && (ln.Function.Name != "") {
return fmt.Errorf(`found file %s location %d, want ""`,
ln.Function.Name, l.ID)
}
}
}
return nil
}
`
ãããã¯ç§ãèããããšãã§ãã2ã€ã®äŸã§ããããããè¯ããšã©ãŒåŠçãªãã·ã§ã³ã欲ããããšèšãã§ãããã
誰ããtryïŒïŒã䜿çšããŠããããã©ã®ããã«æ¹åããããã瀺ãããšãã§ããŸããïŒ
ç§ã¯äž»ã«ãã®ææ¡ã«è³æã§ãã
å€ãã®ã³ã¡ã³ãæçš¿è ãšå ±æãããŠããç§ã®äž»ãªé¢å¿äºã¯ãååä»ãã®çµæãã©ã¡ãŒã¿ãŒã«é¢ãããã®ã§ãã çŸåšã®ææ¡ã¯ç¢ºãã«ååä»ãçµæãã©ã¡ãŒã¿ã®ããå€ãã®äœ¿çšã奚å±ããŠãããããã¯ééãã ãšæããŸãã ææ¡ãè¿°ã¹ãŠããããã«ãããã¯åã«ã¹ã¿ã€ã«ã®åé¡ã§ã¯ãªããšæããŸããååä»ãã®çµæã¯èšèªã®åŸ®åŠãªç¹åŸŽã§ãããå€ãã®å Žåãã³ãŒãããã°ãèµ·ãããããããäžæçã«ãªããŸãã Goã³ãŒãã®èªã¿åããšæžã蟌ã¿ãçŽ8幎éè¡ã£ãåŸãç§ã¯å®éã«ã¯2ã€ã®ç®çã§ååä»ãçµæãã©ã¡ãŒã¿ãŒã®ã¿ã䜿çšããŸãã
error
ïŒã®æäœãã®åé¡ãæ°ããæ¹åããæ»æããããã«ãããã¯ãèšèšããã¥ã¡ã³ããŸãã¯ãã®åé¡ã®ã³ã¡ã³ãã¹ã¬ããã§èª¬æãããŠãããã®ãšå¯æ¥ã«äžèŽãããšã¯æããªãã¢ã€ãã¢ã§ãã ãããããšã©ãŒãã£ãââã¡ãŒããšåŒã³ãŸãããã
æé»ã®ãšã©ãŒãã©ã¡ãŒã¿ã䜿çšããŠé¢æ°ãåŒã³åºãããã«deferã䜿çšã§ããããã«ããŸãã
ã ããããªããæ©èœãæã£ãŠãããªã
func f(err error, t1 T1, t2 T2, ..., tn Tn) error
次ã«ãæåŸã®çµæãã©ã¡ãŒã¿ãŒã®åãerror
ã§ããé¢æ°g
$ïŒã€ãŸãã try
ã䜿çšãããé¢æ°ïŒã§ã f
ãåŒã³åºããŸãã次ã®ããã«å»¶æãããå ŽåããããŸãã
func g() (R0, R0, ..., error) {
defer f(t0, t1, ..., tn) // err is implicit
}
error-deferã®ã»ãã³ãã£ã¯ã¹ã¯æ¬¡ã®ãšããã§ãã
f
ãžã®é
延åŒã³åºãã¯ã f
ã®æåã®å
¥åãã©ã¡ãŒã¿ãŒãšããŠg
ã®æåŸã®çµæãã©ã¡ãŒã¿ãŒã䜿çšããŠåŒã³åºãããŸããf
ã¯ããã®ãšã©ãŒãnilã§ãªãå Žåã«ã®ã¿åŒã³åºãããŸãf
ã®çµæã¯ã g
ã®æåŸã®çµæãã©ã¡ãŒã¿ãŒã«å²ãåœãŠãããŸãããããã£ãŠãå€ããšã©ãŒåŠçèšèšããã¥ã¡ã³ãã®äŸã䜿çšããŠãerror-deferã䜿çšããŠè©ŠããŠã¿ããšã次ã®ããšãã§ããŸãã
func printSum(a, b string) error {
defer func(err error) error {
return fmt.Errorf("printSum(%q + %q): %v", a, b, err)
}()
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x+y)
return nil
}
HandleErrorfã®åäœã¯æ¬¡ã®ãšããã§ãã
func printSum(a, b string) error {
defer handleErrorf("printSum(%q + %q)", a, b)
x := try(strconv.Atoi(a))
y := try(strconv.Atoi(b))
fmt.Println("result:", x+y)
return nil
}
func handleErrorf(err error, format string, args ...interface{}) error {
return fmt.Errorf(format+": %v", append(args, err)...)
}
解決ããå¿ èŠããã1ã€ã®ã³ãŒããŒã±ãŒã¹ã¯ã䜿çšããŠãã延æã®åœ¢åŒããããŸããªå Žåã®åŠçââæ¹æ³ã§ãã ããã¯ã次ã®ãããªã·ã°ããã£ãæã€ïŒéåžžã«çããïŒé¢æ°ã§ã®ã¿çºçãããšæããŸãã
func(error, ...error) error
ãã®ã±ãŒã¹ã¯ãšã©ãŒé 延ã®ãªãæ¹æ³ã§åŠçããããšèšãã®ã劥åœãªããã§ãïŒããã«ããäžäœäºææ§ãç¶æãããŸãïŒã
ãã®æ°æ¥éãã®ã¢ã€ãã¢ã«ã€ããŠèãããšãå°ãéæ³ã®ããã§ãããååä»ãã®çµæãã©ã¡ãŒã¿ãŒãåé¿ããããšã¯ããã®å©ç¹ãšããŠå€§ããªå©ç¹ã§ãã try
ã¯ããšã©ãŒæäœã®ããã®defer
ã®äœ¿çšãä¿é²ããããã defer
ããã®ç®çã«ããé©ãããã®ã«æ¡åŒµã§ããããšã¯çã«ããªã£ãŠããŸãã ãŸãã try
ãšãšã©ãŒãã£ãââã¡ãŒã®éã«ã¯äžå®ã®å¯Ÿç§°æ§ããããŸãã
æåŸã«ããšã©ãŒãã£ãââã¡ãŒã¯ããšã©ãŒãªã¿ãŒã³ãæäœããããã®ååä»ãçµæãã©ã¡ãŒã¿ãŒã®äœ¿çšã«åã£ãŠä»£ãããããè©Šè¡ããªããŠãä»æ¥ã¯äŸ¿å©ã§ãã ããšãã°ãå®éã®ã³ãŒãã®ç·šéããŒãžã§ã³ã¯æ¬¡ã®ãšããã§ãã
// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) (_ []*File, err error) {
files := make([]*file, len(keys))
defer func() {
if err != nil {
// Return any successfully retrieved files.
for _, f := range files {
if f != nil {
c.put(f)
}
}
}
}()
// ...
}
ãšã©ãŒãã£ãââã¡ãŒã䜿çšãããšãããã¯æ¬¡ã®ããã«ãªããŸãã
// GetMulti retrieves multiple files through the cache at once and returns its
// results as a slice parallel to the input.
func (c *FileCache) GetMulti(keys []string) ([]*File, error) {
files := make([]*file, len(keys))
defer func(err error) error {
// Return any successfully retrieved files.
for _, f := range files {
if f != nil {
c.put(f)
}
}
return err
}()
// ...
}
@beoranãžã§ããªãã¯ãåŸ ã€ã¹ãã ãšããããªãã®ã³ã¡ã³ãã«ã€ããŠã ãžã§ããªãã¯ã¹ã¯ããã§ã¯åœ¹ã«ç«ã¡ãŸãã-FAQãèªãã§ãã ããã
@velovixã®2ã€ã®åŒæ°try
ã®ããã©ã«ãã®åäœã«é¢ããææ¡ã«ã€ããŠïŒåã«è¿°ã¹ãããã«ãæããã«åççãªéžæãäœã§ãããã«ã€ããŠã®ããªãã®èãã¯ãä»ã®èª°ãã®æªå€¢ã§ãã
æ瀺çãªãšã©ãŒãã³ãã©ã䜿çšããtry
ã¯ãçŸåšã®æå°ã®try
ãããåªããŠãããšããå¹
åºãã³ã³ã»ã³ãµã¹ãåŸããããããã®è°è«ãç¶ããããšããå§ãããŸãã ãã®æç¹ã§ããã®ãããªèšèšã®çŽ°ããç¹ã«ã€ããŠè°è«ããããšã¯çã«ããªã£ãŠããŸãã
ïŒç§ã¯ãã³ãã©ãŒãæã€ã®ã奜ãã§ããããã¯ä»¥åã®ææ¡ã®1ã€ã§ãã try
ããã®ãŸãŸæ¡çšããå Žåã§ãããã³ãã©ãŒãåæ¹ã«é
眮ããŠtry
ã«ç§»è¡ã§ããŸãã -äºææ§ã®ããæ¹æ³-å°ãªããšããã³ãã©ãŒããªãã·ã§ã³ã®å Žåããã ããäžåºŠã«1ã¹ããããã€å®è¡ããŸããããïŒ
@aarzilliãææ¡ããããšãããããŸãã
ãšã©ãŒã®è£ 食ããªãã·ã§ã³ã§ããéãã人ã ã¯ãããè¡ããªãããšã«åŸåããŸãïŒçµå±ã®ãšãããããã¯äœåãªäœæ¥ã§ãïŒã ãã¡ãã®ç§ã®ã³ã¡ã³ããåç §ããŠãã ããã
ãããã£ãŠãææ¡ãããtry
_discourages_ã®äººã
ããšã©ãŒã食ãããšãæããšã©ãŸããããšã¯æããŸããïŒäžèšã®çç±ã§if
ã䜿çšããŠãããã§ã«èœèããŠããŸãïŒã try
ã¯ããã_奚å±_ããªããšããããšã§ãã
ïŒããã奚å±ãã1ã€ã®æ¹æ³ã¯ããããtry
ã«çµã³ä»ããããšã§ãããšã©ãŒãè£
食ããããæ瀺çã«ãªããã¢ãŠãããå Žåã«ã®ã¿ã try
ã䜿çšã§ããŸããïŒ
ããããããªãã®ææ¡ã«æ»ã£ãŠãã ãããããªãã¯ããã§ãã£ãšããããã®æ©æ¢°ãå°å
¥ããŠãããšæããŸãã defer
ã®ã»ãã³ãã£ã¯ã¹ãå€æŽããŠã try
ã§ããé©åã«æ©èœãããããšã¯ããããã®defer
ã®å€æŽãããäžè¬çãªæ¹æ³ã§æçã§ãªãéããæ€èšãããããšã§ã¯ãããŸããã ãŸããããªãã®ææ¡ã¯defer
ãtry
ãšçµã³ä»ããŠããããããããã®ã¡ã«ããºã ã®çŽäº€æ§ãäœããªããŸãã é¿ããããã®ã
ãããããã£ãšéèŠãªããšã¯ã try
ã䜿çšã§ããããã«ããããã ãã«ãå
šå¡ã«defer
ã匷å¶çã«èšè¿°ãããããšã¯æããªãããšã§ãã ãããããããè¡ããã«ãç§ãã¡ã¯æ£æ¹ã«æ»ããŸãã人ã
ã¯ãšã©ãŒãè£
食ããªãããšã«åŸåããŸãã
ïŒç§ã¯ãã³ãã©ãŒãæã£ãŠããã®ã奜ãã§ããããã¯ç§ãã¡ã®ä»¥åã®ææ¡ã®1ã€ã§ãããããŠããã®ãŸãŸtryãæ¡çšããå Žåã§ããå°ãªããšããã³ãã©ãŒããªãã·ã§ã³ã§ãããäžåºŠã«1ã¹ããããã€å®è¡ããŸããããïŒ
確ãã«ãããããå€æ®µéã®ã¢ãããŒããé²ãã¹ãéã§ãã å°æ¥ããªãã·ã§ã³ã®ãã³ãã©ãŒåŒæ°ãè¿œå ãããšã errcheck
ããŒã«ãšåã粟ç¥ã§ãæªåŠçã®try
ãã©ã€ã¿ãŒã«èŠåããããŒã«ãäœæã§ããŸãã ãšã«ãããç§ã¯ããªãã®ãã£ãŒãããã¯ã«æè¬ããŸãïŒ
@alanfoããªãã®æ£ã®ãã£ãŒãããã¯ãããããšãã
ããªããæèµ·ãããã€ã³ãã«ã€ããŠïŒ
1ïŒ try
ã®å¯äžã®åé¡ãã defer
ãä»ããŠãšã©ãŒãè£
食ã§ããããã«ããšã©ãŒãªã¿ãŒã³ã«ååãä»ããå¿
èŠããããšããäºå®ã§ããå Žåãç§ãã¡ã¯è¯ããšæããŸãã çµæã«ååãä»ããããšãå®éã®åé¡ã§ããããšãå€æããå Žåã¯ãããã«å¯ŸåŠã§ããŸãã ç§ãèããããšãã§ããåçŽãªã¡ã«ããºã ã¯ããšã©ãŒçµæã®ãšã€ãªã¢ã¹ã§ããäºåã«å®£èšãããå€æ°ã§ãïŒææ°ã®try
ãããªã¬ãŒãããšã©ãŒãä¿æããŠãããšèããŠãã ããïŒã ããè¯ãã¢ã€ãã¢ããããããããŸããã çµæã«ååãä»ãããšããã¡ã«ããºã ãèšèªã«ãã§ã«ååšããããããããææ¡ããŸããã§ããã
2ïŒ try
ãšãã¹ãïŒããã«å¯ŸåŠããŠæ©èœãããããšãã§ããŸãã 詳现ãªããã¥ã¡ã³ããåç
§ããŠãã ããã
3ïŒããã¯è©³çŽ°ãªããã¥ã¡ã³ãã§æ瀺çã«æ±ãããŠããŸãã
4ïŒç¢ºèªæžã¿ã
@benhoytããªãã®æ£ã®ãã£ãŒãããã¯ãããããšãã
ãã®ææ¡ã«å¯Ÿããäž»ãªè°è«ãtry
ãçµã¿èŸŒã¿ã§ãããšããäºå®ã§ããå Žåãç§ãã¡ã¯çŽ æŽãããå Žæã«ããŸãã çµã¿èŸŒã¿ã䜿çšããããšã¯ãäžäœäºææ§ã®åé¡ã«å¯Ÿããå®çšçãªè§£æ±ºçã«ãããŸããïŒããŒãµãŒãããŒã«ãªã©ã«äœåãªäœæ¥ãçºçããããšã¯ãããŸããããããã¯äž»ãªçç±ã§ã¯ãªããåãªãåªããå¯æ¬¡çãªå©ç¹ã§ãïŒã æ¬åŒ§ãæžããªããã°ãªããªãããšã«ã¯ããã€ãã®å©ç¹ããããŸããããã«ã€ããŠã¯ãèšèšããã¥ã¡ã³ãïŒææ¡ãããèšèšã®ããããã£ã«é¢ããã»ã¯ã·ã§ã³ïŒã§è©³ãã説æãããŠããŸãã
ãšã¯ããããã«ãã€ã³ã䜿çšããããšãã·ã§ãŒããããŒã§ããå Žåã¯ã try
ããŒã¯ãŒããæ€èšããå¿
èŠããããŸãã ããŒã¯ãŒããæ¢åã®èå¥åãšç«¶åããå¯èœæ§ããããããæ¢åã®ã³ãŒããšã®äžäœäºææ§ã¯ãããŸããã
ïŒå®å
šãæãããã«ãäžäœäºææ§ã®ãã?
ãªã©ã®æŒç®åã®ãªãã·ã§ã³ããããŸãããã ããGoãªã©ã®èšèªã®æè¯ã®éžæãšã¯èšããŸãããããããç¹°ãè¿ãã«ãªããŸããã try
ãçŸå³ããããããã«å¿
èŠãªã®ã¯ããã ããªãããããããããæ€èšããå¿
èŠããããŸããïŒ
@ugorjiããªãã®æ£ã®ãã£ãŒãããã¯ãããããšãã
try
ãæ¡åŒµããŠãè¿œå ã®åŒæ°ãåãããšãã§ããŸãã ç§ãã¡ã®å¥œã¿ã¯ãã·ã°ããã£func (error) error
ãæã€é¢æ°ã®ã¿ãåãããšã§ãã ãããã¯ã«é¥ãããå Žåã¯ã1è¡ã®ãã«ããŒé¢æ°ãç°¡åã«æäŸã§ããŸãã
func doPanic(err error) error { panic(err) }
try
ã®ãã¶ã€ã³ãã·ã³ãã«ã«ä¿ã€æ¹ãè¯ãã§ãããã
@ patrick-nytããªããææ¡ããŠããããšïŒ
file, err := os.Open("file.go")
try(err)
çŸåšã®ææ¡ã§å¯èœã«ãªããŸãã
@ dpinela ã @ ugorji must
ãštry
ã®ããŒãã«é¢ããèšèšããã¥ã¡ã³ãããèªã¿ãã ããã try
ã¯ã§ããã ãã·ã³ãã«ã«ä¿ã€ããšããå§ãããŸãã must
ã¯åæååŒã®äžè¬çãªããã¿ãŒã³ãã§ãããããããä¿®æ£ãããç·æ¥ã®å¿
èŠã¯ãããŸããã
@jargvãææ¡ããããšãããããŸãã ããã¯èå³æ·±ãã¢ã€ãã¢ã§ãïŒãã®ããŒãã«é¢ããç§ã®ã³ã¡ã³ããåç §ããŠãã ããïŒã èŠçŽããïŒ
try(x)
ã¯ææ¡ã©ããã«åäœããŸãtry()
ã¯ããšã©ãŒçµæãæã*error
$ãè¿ããŸãããã¯ãååãä»ããããšãªãçµæãåŸãå¥ã®æ¹æ³ã§ãã
@cespare @jargvã«ããææ¡ã¯ãããªããææ¡ããŠãããã®ãããã¯ããã«åçŽã«èŠããŸãã çµæãšã©ãŒãžã®ã¢ã¯ã»ã¹ã®åãåé¡ã解決ããŸãã ã©ãæããŸããïŒ
https://github.com/golang/go/issues/32437#issuecomment -499320588ã«ãããšïŒ
func doPanicïŒerr errorïŒerror {panicïŒerrïŒ}
ãã®æ©èœã¯ããªãäžè¬çã ãšæããŸãã ããã¯ããã«ãã€ã³ãïŒãŸãã¯æšæºããã±ãŒãžã®ä»ã®å Žæãããšãã°errors
ïŒã§äºåå®çŸ©ã§ããŸããïŒ
å®è£
ããã®ã«åå匷åãªãžã§ããªãã¯ãæåŸ
ããŠããªãã®ã¯æ®å¿µã§ã
è©ŠããŠã¿ãŠãã ãããç§ã¯å®éã«ããããããšãå¯èœã«ãªãããšãæãã§ããã§ãããã
ã¯ãããã®ææ¡ã¯æåã®ã¹ãããã«ãªãå¯èœæ§ããããŸããã
ããã¯ä»ã®èªåèªèº«ã§ãã
確ãã«ããã®åé¡ã¯ãããã詳现ãªä»£æ¿æ¡ã«çŠç¹ãåœãŠãããŠããŸãã
ããããããã¯å€ãã®åå è
ãå®å
šã«æºè¶³ããŠããªãããšã瀺ããŠããŸã
ããã æ¬ ããŠããããã«èŠããã®ã¯ããã®ææ¡ã«ã€ããŠã®å¹
åºãã³ã³ã»ã³ãµã¹ã§ã...
Op vr 7junã 2019 01:04 schreef [email protected] ïŒ
AsperïŒ32437ïŒã³ã¡ã³ãïŒ
https://github.com/golang/go/issues/32437#issuecomment-499320588 ïŒfunc doPanicïŒerr errorïŒerror {panicïŒerrïŒ}
ãã®æ©èœã¯ããªãäžè¬çã ãšæããŸãã ããã¯äºåå®çŸ©ã§ããŸãã
ããã«ãã€ã³ãã§ïŒâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAARM6OOOLLYO5ZCE6VVL2TPZGJWRA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2Z
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AAARM6K5AOR2DES4QDTNLSTPZGJWRANCNFSM4HTGCZ7Q
ã
@pjebs ãç§ã¯åçã®é¢æ°ãäœååãæžããŠããŸããã ç§ã¯éåžžããããorDieããŸãã¯ãcheckããšåŒã³ãŸãã ãšãŠãã·ã³ãã«ãªã®ã§ãæšæºã©ã€ãã©ãªã®äžéšã«ããå¿ èŠã¯ãããŸããã ããã«ãããŸããŸãªäººã ããçµäºåã«ãã®ã³ã°ãªã©ãå¿ èŠãšããå ŽåããããŸãã
@beoranããããããžã§ããªãã¯ã¹ãšãšã©ãŒåŠçã®éã®é¢ä¿ãæ¡åŒµããããšãã§ããŸãã ç§ããããã«ã€ããŠèãããšãããããã¯2ã€ã®ç°ãªããã®ã®ããã«èŠããŸãã ãžã§ããªãã¯ã¹ã¯ãèšèªã«é¢ãããã¹ãŠã®åé¡ã«å¯ŸåŠã§ãããã¹ãŠãç¶²çŸ ããŠããããã§ã¯ãããŸããã ããã¯ãè€æ°ã®ã¿ã€ããæäœã§ããåäžã®é¢æ°ãäœæããæ©èœã§ãã
ãã®ç¹å®ã®ãšã©ãŒåŠçã®ææ¡ã¯ãç¶æ³ã«ãã£ãŠã¯ãããŒå¶åŸ¡ãå€æŽããäºåã«å®£èšãããé¢æ°try
ãå°å
¥ããããšã«ããããã€ã©ãŒãã¬ãŒããåæžããããšããŸãã ãžã§ããªãã¯ã¯å¶åŸ¡ã®æµããå€ããããšã¯ãããŸããã ã ããç§ã¯æ¬åœã«é¢ä¿ãèŠãŠããŸããã
ããã«å¯Ÿããç§ã®æåã®åå¿ã¯ðã§ãããé¢æ°å
ã§ãšã©ãŒãçºçããããããã€ãã®åŒã³åºããåŠçãããšã defer
ãšã©ãŒãã³ãã«ãæ··ä¹±ããããšãæ³åããŠããŸããã ææ¡å
šäœãèªãã åŸãç§ã¯â€ïžãšðãžã®åå¿ãå転ãããŸãããããã¯ãæ¯èŒçäœãè€éãã§ãŸã éæã§ããããšãåŠã³ãŸããã
@carlmjohnsonã¯ããããã¯ç°¡åã§ãã...
ç§ã¯åçã®é¢æ°ãäœååãæžããŠããŸããã
äºåã«å®£èšãããé¢æ°ã®å©ç¹ã¯æ¬¡ã®ãšããã§ãã
@griesemerå ã®tryããããŒã¶ã«ã®ãšã©ãŒãã³ãã©ããªã¢ã³ãã§ã¯ããšã©ãŒãè¿ãããã®å æ¬çãªé¢æ°ã®èŠä»¶ã¯äžèŠã«ãªããŸããã
ç§ãæåã«ããã«ã€ããŠå°ãããšããerr =>ãããã¯ãææ¡ã¯ãããèæ
®ããããããã¯å±éºããããšèããïŒæ£åœãªçç±ã§ïŒãšææãããŸããã ããããå
æ¬çãªé¢æ°ããšã©ãŒãè¿ããªãã·ããªãªã§ãšã©ãŒãã³ãã©ãŒãªãã§try()
ã䜿çšããå Žåãã³ã³ãã€ã«æãšã©ãŒã«ããããšã§ãææ¡ã§èª¬æãããŠããæžå¿µã軜æžãããŸãã
@pjebså
ã®èšèšã§ã¯ããšã©ãŒãè¿ãããã®å
æ¬çãªé¢æ°ã®èŠä»¶ã¯å¿
èŠãããŸããã§ããããšã©ãŒãã³ãã©ãæäŸãããŠããå Žåã ããããããã¯try
ã®ãã1ã€ã®è€éãã§ãã ã·ã³ãã«ã«ä¿ã€æ¹ã_ã¯ããã«_è¯ãã§ãã 代ããã«ãå¥ã®must
é¢æ°ã䜿çšããæ¹ãæ確ã§ãããã®é¢æ°ã¯ããšã©ãŒãçºçãããšåžžã«ãããã¯ã«ãªããŸãïŒãã ãããã以å€ã®å Žåã¯try
ã®ããã«ãªããŸãïŒã ããããã°ãã³ãŒãã§äœãèµ·ãããã¯æããã§ãããã³ã³ããã¹ãã調ã¹ãå¿
èŠã¯ãããŸããã
ãã®ãããªmust
ãæã€ããšã®äž»ãªé
åã¯ãåäœãã¹ãã§äœ¿çšã§ããããšã§ãã ç¹ã«ã testing
ããã±ãŒãžãã must
ã«ãã£ãŠåŒãèµ·ãããããããã¯ããå埩ãããã¹ãã®å€±æãšããŠé©åã«å ±åããããã«é©åã«èª¿æŽãããŠããå Žåã ãããã TestXxx(t *testing.T) error
ã®åœ¢åŒã®ãã¹ãé¢æ°ãåãå
¥ããããã«ãã¹ãããã±ãŒãžã調æŽã§ããã®ã«ããªãããã«å¥ã®æ°ããèšèªã¡ã«ããºã ãè¿œå ããã®ã§ããããã çµå±ã®ãšããéåžžã«èªç¶ã«èŠãããšã©ãŒãè¿ãããå ŽåïŒããããæåãããããè¡ãå¿
èŠããããŸãïŒã try
ã¯åé¡ãªãæ©èœããŸãã ããŒã«ã«ãã¹ãã«ã¯ããå°ãäœæ¥ãå¿
èŠã§ãããããããå®è¡å¯èœã§ãã
must
ã®ä»ã®æ¯èŒçäžè¬çãªäœ¿çšæ³ã¯ãã°ããŒãã«åæååŒïŒ must(regexp.Compile...
ãªã©ïŒã§ãã ããããããæã£ãŠããŠè¯ãã£ãããšã¯ãããããã¯å¿
ãããæ°ããèšèªæ©èœã«å¿
èŠãªã¬ãã«ã«ãããäžããããã§ã¯ãããŸããã
@griesemer must
ãtry
ïŒ$ãšæŒ ç¶ãšé¢é£ããŠããŠã try
ã®å®è£
ã«åããå¢ããããããšãèãããšã must
ãæ€èšããã®ã¯è¯ãããšã ãšæããŸããããåæã«
ãã®ã©ãŠã³ãã§è°è«ãããªãå Žåãå°ãªããšã3幎以äžïŒãŸãã¯ãããããããŸã§ïŒãå®è£ /çå£ã«æ€èšãããªãå¯èœæ§ããããŸãã è°è«ã®éè€ã¯ãæåããè°è«ãå§ããŠè°è«ããªãµã€ã¯ã«ãããããè¯ãã§ãããã
å€ãã®äººãã must
ãtry
éåžžã«ããŸãè£å®ããŠãããšè¿°ã¹ãŠããŸãã
@pjebsçŸåšãã try
ãå®è£
ãããå¢ãããããããã«ã¯èŠããŸãã...-ãããŠãããã2æ¥åã«æçš¿ããã°ããã§ãã äœã決ãŸã£ãŠããªãã ããã«å°ãæéãäžããŸãããã
must
ãtry
ãšããŸã調åããŠããããšã¯ç§ãã¡ãéããŸããããããã¯èšèªã®äžéšã«ããããšãšåãã§ã¯ãããŸããã ç§ãã¡ã¯ãããåºãã°ã«ãŒãã®äººã
ãšãã®ç©ºéãæ¢çŽ¢ãå§ããã°ããã§ãã äœãè³æãå察ãã¯ãŸã ããããŸããã ããããšãã
ãã¹ãŠã®ã³ã¡ã³ããšè©³çŽ°ãªèšèšããã¥ã¡ã³ããäœæéãèªãã åŸãç§ã¯ãã®ææ¡ã«èªåã®æèŠãè¿œå ããããšæããŸããã
以åã®ãã€ã³ããèšãæããã ãã§ãªãããã£ã¹ã«ãã·ã§ã³ã«æ°ããã³ã¡ã³ããè¿œå ãããšãã@ianlancetaylorã®ãªã¯ãšã¹ããå°éããããã«æåãå°œãããŸãã ãããã以åã®ã³ã¡ã³ããããããåç §ããã«æ°ããã³ã¡ã³ããäœæããããšã¯ã§ããªããšæããŸãã
defer
ã®æçœã§ããããããæ§è³ªããèŠæãã¹ããã®ãšããŠéè² è·ã«ããããšã奜ãã defer closeFile(f)
ãšæžããšãäœãèµ·ãã£ãŠããã®ãããããŠãã®çç±ã¯ããããããããããŸãã åŒã³åºãããé¢æ°ã®æåŸã«ã panic()
ãšrecover()
ã«defer
ã䜿çšããããšã¯ããŸãæçœã§ã¯ãããŸããããç§ã¯ããã䜿çšããããšã¯ãã£ãã«ãªããä»ã®ã³ãŒããèªãã§ãããšãã«ã»ãšãã©è¡šç€ºãããŸããã
defer
ããªãŒããŒããŒãããŠãšã©ãŒãåŠçããããã®ã¹ããŒã¯ãæçœã§æ··ä¹±ãæããã®ã§ã¯ãããŸããã ãªãããŒã¯ãŒãdefer
ïŒ defer
ã¯ã_ "å€ååŸã§" _ã®ä»£ããã«_ "åŸã§è¡ã" _ãæå³ããŸãããïŒ "_
ãŸããGoããŒã ãdefer
ã®ããã©ãŒãã³ã¹ã«ã€ããŠèšåããŠããæžå¿µããããŸãã ãããèãããšã defer
ã_ "ããããã¹" _ã³ãŒããããŒã§èæ
®ãããŠããããšã¯äºéã«æ®å¿µãªããšã®ããã§ãã
@prologicãè¿°ã¹ãããã«ããã®try()
ã®ææ¡ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã䜿çšããã³ãŒãã®å€§éšåãåæãšããŠããŸããããããšãGoãšã©ãŒåŠçã«ã€ããŠäžæºãèšã£ãŠãã人ããªã ããè©Šã¿ã«åºã¥ããŠããŸããïŒ
ãã¹ãŠã®ãã¡ã€ã«ã培åºçã«ç¢ºèªããŠã¡ã¢ãåãããšãªããã³ãŒãããŒã¹ããçµ±èšæ å ±ãæäŸããæ¹æ³ãç¥ã£ãŠããã°ããã£ãã®ã§ããã @prologicãã©ããã£ãŠã§ããã®ãã¯ããããŸãããã圌ã¯åãã§ããŸããã
ããããéžè©±çã«ã try()
ãç§ã®ãŠãŒã¹ã±ãŒã¹ã®5ïŒ
ã«å¯Ÿå¿ãã1ïŒ
æªæºã«å¯Ÿå¿ãããšæãããå Žåã¯é©ããŸãã ä»ã®äººã倧ããç°ãªãçµæãããããããšã確ãã«ç¥ã£ãŠããŸããïŒ æšæºã©ã€ãã©ãªã®ãµãã»ãããååŸããŠããããã©ã®ããã«é©çšããããã確èªããããšããŸãããïŒ
ãããå®éã®ã³ãŒãã®å€§èŠæš¡ãªãã£ãã¯ã«é©åã§ãããšããæ¢ç¥ã®çµ±èšããªãã®ã§ãç§ãå°ããªããã°ãªããªãã®ã¯ãæ°ããæŠå¿µãåŠã¶ããšã誰ããå¿ èŠãšããèšèªãžã®ãã®æ°ããè€éãªå€æŽã¯ãæ¬åœã«é åçãªæ°ã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããã®ã§ããïŒ
ããã¯ä»ã®äººãã³ã¡ã³ãããŠããããšã®å®å
šãªç¹°ãè¿ãã§ãããåºæ¬çã«try()
ãæäŸãããã®ã¯ãå€ãã®ç¹ã§ã以äžãidomaticã³ãŒããšããŠåçŽã«åãå
¥ããããšã«é¡äŒŒããŠããŸããããã¯ãã©ã®ã³ãŒãã«ã決ããŠå
¥ã蟌ãŸãªãã³ãŒãã§ãã -éçºè
ã®è¹ãå°éããïŒ
f, _ := os.Open(filename)
ç§ã¯èªåã®ã³ãŒãã§ããè¯ããªãããšãã§ããããšãç¥ã£ãŠããŸãããç§ãã¡ã®å€ãã¯éåžžã«äŸ¿å©ãªããã±ãŒãžãå ¬éããŠããä»ã®Goéçºè ã®å€§éšåã«äŸåããŠããããšãç¥ã£ãŠããŸããã_ "Other People's CodeïŒtmïŒ" _ã§èŠããã®ãããšã©ãŒåŠçã®ãã¹ããã©ã¯ãã£ã¹ã¯ããã°ãã°ç¡èŠãããŸãã
çå£ã«ãéçºè ããšã©ãŒãç¡èŠããããããå ç¢ã§ãªãããã±ãŒãžã§GitHubãæ±æã§ããããã«ãããã®ã§ããããã
try()
ãå®è£
ã§ããŸããææ¡ã誀解ããªãéãïŒããããããããŸããïŒããŠãŒã¶ãŒã©ã³ãã«å®è£
ãããGoPlaygroundã®try()
ã§ãããæ»ãå€ã¯1ã€ã ãã§ãæåŸ
ãããã¿ã€ãã®ä»£ããã«ã€ã³ã¿ãŒãã§ã€ã¹ãè¿ãããŸãã
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
defer func() {
r := recover()
if r != nil && strings.HasPrefix(r.(string),"TRY:") {
fmt.Printf("Ouch! %s",strings.TrimPrefix(r.(string),"TRY: "))
}
}()
n := try(badjuju()).(int)
fmt.Printf("Just chillin %dx!",n)
}
func badjuju() (int,error) {
return 10, errors.New("this is a really bad error")
}
func try(args ...interface{}) interface{} {
err,ok := args[1].(error)
if ok && err != nil {
panic(fmt.Sprintf("TRY: %s",err.Error()))
}
return args[0]
}
ãããã£ãŠããŠãŒã¶ãŒã¯ãè¿ãå¿
èŠã®ããæ»ãå€ã®æ°ã«å¿ããŠã try2()
ã try3()
ãªã©ãè¿œå ã§ããŸãã
ãã ããGoã¯ãæ瀺çãªåã¢ãµãŒã·ã§ã³ãå¿
èŠãªå Žåã§ãã try()
ãå¿
èŠãšãããŠãŒã¶ãŒãç¬èªã®ãµããŒããããŒã«ã§ããããã«ããããã«ã1ã€ã®åçŽãª_ããŠãããŒãµã«ãª_èšèªæ©èœã®ã¿ãå¿
èŠãšããŸãã Go func
ã«_ïŒå®å
šãªäžäœäºææ§ïŒ_æ©èœãè¿œå ããŠãããŸããŸãªæ°ã®æ»ãå€ãè¿ããŸããäŸïŒ
func try(args ...interface{}) ...interface{} {
err,ok := args[1].(error)
if ok && err != nil {
panic(fmt.Sprintf("TRY: %s",err.Error()))
}
return args[0:len(args)-2]
}
ãããŠãæåã«ãžã§ããªãã¯ã¹ã«å¯ŸåŠããå Žåãåã¢ãµãŒã·ã§ã³ã¯å¿ èŠãããŸãã_ïŒãžã§ããªãã¯ã¹ã®æ··ä¹±ããã»ãã³ãã£ã¯ã¹ãšæ§æãµã©ããè¿œå ããã®ã§ã¯ãªãããžã§ããªãã¯ã¹ã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããããã®çµã¿èŸŒã¿ãè¿œå ããããšã«ãã£ãŠããžã§ããªãã¯ã¹ã®ãŠãŒã¹ã±ãŒã¹ãåæžããå¿ èŠããããšæããŸããJavaetãalãããïŒ_
ææ¡ã®ã³ãŒãã調ã¹ãŠã¿ããšããã®æ¯ãèãã¯èªæã§ã¯ãªããæšè«ããã®ãããé£ããããšãããããŸããã
try()
ãåŒãã©ããããŠããã®ãèŠããšããšã©ãŒãè¿ãããå Žåã¯ã©ããªããŸããïŒ
ãšã©ãŒã¯ç¡èŠãããŸããïŒ ãŸãã¯ãæåãŸãã¯ææ°ã®defer
ã«ãžã£ã³ãããŸãããã®å Žåãã¯ããŒãžã£å
ã«err
ãšããååã®å€æ°ãèªåçã«èšå®ããŸããããããšããã©ã¡ãŒã¿_ïŒIãã©ã¡ãŒã¿ã衚瀺ãããŸãããïŒïŒ_ã ãŸããèªåãšã©ãŒåã§ãªãå Žåãã©ã®ããã«ååãä»ããã®ã§ããïŒ ãããŠãããã¯ãè¡çªãé¿ããããã«ãé¢æ°ã§èªåã®err
å€æ°ã宣èšã§ããªãããšãæå³ããŸããïŒ
ãããŠãããã¯ãã¹ãŠã®defer
ãåŒã³åºããŸããïŒ éé ã§ããããããšãéåžžé ã§ããïŒ
ãããšããã¯ããŒãžã£ãšãšã©ãŒãè¿ãããfunc
ã®äž¡æ¹ããè¿ãããŸããïŒ _ïŒããã§ãããæ瀺ããèšèãèªãã§ããªãã£ãããç§ãèããããšã®ãªãäœããïŒ_
ææ¡ãšãããŸã§ã®ãã¹ãŠã®ã³ã¡ã³ããèªãã åŸãç§ã¯ãŸã æ£çŽã«äžèšã®è³ªåã«å¯Ÿããçããç¥ããŸããã ããã¯ãæ¯æè ã_ "ãã£ããã³ãªããã·ã£ã¹" _ã§ãããšäž»åŒµããèšèªã«è¿œå ãããçš®é¡ã®æ©èœã§ããïŒ
defer
ã䜿çšãããšãéçºè
ã«äžããããã³ã³ãããŒã«ã¯_ïŒææ°ïŒïŒ_ defer
ã«åå²ããããšã ãã§ããããã«èŠããŸãã ããããäºçŽ°ãªfunc
ãè¶
ããã¡ãœããã䜿ã£ãç§ã®çµéšã§ã¯ãéåžžã¯ãããããè€éã§ãã
å€ãã®å Žåã func
å
ããŸãã¯package
å
šäœã§ãšã©ãŒåŠçã®åŽé¢ãå
±æãããšäŸ¿å©ã§ããã1ã€ä»¥äžã®ä»ã®ããã±ãŒãžéã§ããå
·äœçãªåŠçãå
±æããããšãã§ããŸãã
ããšãã°ãå¥ã®func
å
ããerror()
ãè¿ã5ã€ã®func
åŒã³åºããåŒã³åºãããšãã§ããŸãã ãããã«A()
ã B()
ã C()
ã D()
ãããã³E()
ã®ã©ãã«ãä»ããŸãããã ç¬èªã®ãšã©ãŒåŠçãè¡ãã«ã¯C()
ãå¿
èŠãªå ŽåããããŸãããšã©ãŒåŠçãå
±æããã«ã¯ã A()
ã B()
ã D()
ãããã³E()
ãå¿
èŠã§ãã B()
ãšE()
ã¯ãç¹å®ã®åŠçãè¡ããŸãã
ããããç§ã¯ãã®ææ¡ã§ãããå¯èœã«ãªããšã¯æããŸããã å°ãªããšãç°¡åã§ã¯ãããŸããã
ãã ããç®èãªããšã«ãGoã«ã¯ãã§ã«ãå°æ°ã®ãŠãŒã¹ã±ãŒã¹ã«éå®ããå¿
èŠã®ãªãé«ã¬ãã«ã®æè»æ§ãå¯èœã«ããèšèªæ©èœããããŸãã func
ãšã¯ããŒãžã£ãŒã ã ããç§ã®ä¿®èŸçãªè³ªåã¯ïŒ
_ ããããã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããããã«æ¢åã®èšèªã«ããããªæ¡åŒµãè¿œå ããã ãã§ãæ°ããçµã¿èŸŒã¿é¢æ°ãè¿œå ããããçŽããããã»ãã³ãã£ã¯ã¹ãåãå ¥ããå¿ èŠããªãã®ã¯ãªãã§ããïŒã _
代æ¿æ¡ãšããŠããã®ææ¡ã®æ€èšäžã«æãã€ããææ¡ãããã®ãã¹ãŠã®æ¬ ç¹ãèæ ®ããªããæåºããäºå®ã§ãããããããã¯ä¿®èŸçãªè³ªåã§ãã
ããããç§ã¯éžè±ããŸããããã¯åŸã§æ¥ãã§ãããããããŠãã®ã³ã¡ã³ãã¯çŸåšã®ææ¡ãåèãããå¿ èŠãããçç±ã«ã€ããŠã§ãã
break
ã«å¯Ÿããè¡šæããããµããŒãã®æ¬ åŠã»ãšãã©ã®äººããšã©ãŒåŠçã«ã¢ãŒãªãŒãªã¿ãŒã³ã䜿çšãããããããã¯å·Šç¿ŒæããåºãŠããããã«æãããããããŸãããã return
ã®åã«ã»ãšãã©ãŸãã¯ãã¹ãŠã®é¢æ°ãã©ãããããšã©ãŒåŠçã«ã¯break
ã䜿çšããããšãæãŸããããšãããããŸããreturn
ã
ç§ã¯ãã°ããã®éãã®ã¢ãããŒãã䜿çšããŠããããªãã¡ã¯ã¿ãªã³ã°ã ããç·©åãããšããå©ç¹ã«ãããåæã®return
ããã奜ãŸããã§ãããåäžã®åºå£ç¹ãæ©èœã®ã»ã¯ã·ã§ã³ãæ©æã«çµäºããæ©èœãªã©ãä»ã«ãããã€ãã®å©ç¹ããããŸããã¯ãªãŒã³ã¢ãããå®è¡ã§ãã_ïŒããããããã°ã©ã ãããŒã®èŠ³ç¹ããæšè«ããã®ãé£ããdefer
ããã£ãã«äœ¿çšããªãçç±ã§ããïŒ_
ã¢ãŒãªãŒãªã¿ãŒã³ã®ä»£ããã«break
ã䜿çšããã«ã¯ã for range "1" {...}
ã«ãŒãã䜿çšããŠããã¬ãŒã¯ã_ããçµäºããããã®ãããã¯ãäœæããŸãïŒå®éã«ã¯ãå®æ°ã®ã¿ãå«ãonly
ãšããããã±ãŒãžãäœæããŸãOnce
ãšåŒã°ããå€ã¯"1"
ïŒïŒ_
func (me *Config) WriteFile() (err error) {
for range only.Once {
var j []byte
j, err = json.MarshalIndent(me, "", " ")
if err != nil {
err = fmt.Errorf("unable to marshal config; %s",
err.Error(),
)
break
}
err = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
if err != nil {
err = fmt.Errorf("unable to make directory'%s'; %s",
me.GetDir(),
err.Error(),
)
break
}
err = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
if err != nil {
err = fmt.Errorf("unable to write to config file '%s'; %s",
me.GetFilepath(),
err.Error(),
)
break
}
}
return err
}
è¿ãå°æ¥ããã®ãã¿ãŒã³ã«ã€ããŠè©³çŽ°ã«ããã°ãæžããæ©æã®è¿åãããããŸãæ©èœããããšãããã£ãããã€ãã®çç±ã«ã€ããŠè©±ãåãäºå®ã§ãã
ããããç§ã¯éžè±ããŸãã ããã§åãäžããçç±ã¯ãGoããšã©ãŒåŠçãå®è£
ããå¿
èŠãããããã§ãããã®ãšã©ãŒåŠçã§ã¯ãåæã®return
ãæ³å®ãããšã©ãŒåŠçã«break
ã䜿çšããããšãç¡èŠããŸãã
err == nil
ã¯åé¡ããããŸãäœè«ãšããŠãGoã§ã®æ
£çšçãªãšã©ãŒåŠçã«ã€ããŠæããæžå¿µãæèµ·ããããšæããŸãã ç§ã¯ããšã©ãŒãçºçãããšãã«ãšã©ãŒãåŠçãããšããGoã®å²åŠãšãäŸå€åŠçã䜿çšãããšããå²åŠã倧ãã«ä¿¡ããŠããŸããããšã©ãŒããªãããšã瀺ãããã«nil
ã䜿çšãããšãåé¡ãçºçããªãããšã瀺ããŸãã APIå¿çã§äœ¿çšããã«ãŒãã³ã§ããããšã©ãŒãçºçãããšãã«nil以å€ã®å€ãè¿ãã ãã§ã¯ãããŸããã
ãããã£ãŠãGo 2ã®å ŽåãGoãæ°ããçµã¿èŸŒã¿åã®status
ãš3ã€ã®çµã¿èŸŒã¿é¢æ°iserror()
ã iswarning()
ã issuccess()
ãè¿œå ããããšãæ€èšããŠã»ãããšæããŸãã status
ã¯error
ãå®è£
ã§ããŸãâå€ãã®äžäœäºææ§ãèæ
®ãã issuccess()
ã«æž¡ãããnil
å€ã¯true
$ãè¿ããŸãâãããstatus
ã«ã¯ããšã©ãŒã¬ãã«ã®è¿œå ã®å
éšç¶æ
ãããããããšã©ãŒã¬ãã«ã®ãã¹ãã¯ãåžžã«çµã¿èŸŒã¿é¢æ°ã®1ã€ã§å®è¡ãããçæ³çã«ã¯nil
ãã§ãã¯ã§ã¯å®è¡ãããŸããã ããã«ããã代ããã«æ¬¡ã®ãããªã¢ãããŒããå¯èœã«ãªããŸãã
func (me *Config) WriteFile() (sts status) {
for range only.Once {
var j []byte
j, sts = json.MarshalIndent(me, "", " ")
if iserror(sts) {
sts.AddMessage("unable to marshal config")
break
}
sts = me.MaybeMakeDir(me.GetDir(), os.ModePerm)
if iserror(sts) {
sts.AddMessage("unable to make directory'%s'", me.GetDir())
break
}
sts = ioutil.WriteFile(string(me.GetFilepath()), j, os.ModePerm)
if iserror(sts) {
sts.AddMessage("unable to write to config file '%s'",
me.GetFilepath(),
)
break
}
sts = fmt.Status("config file written")
}
return sts
}
ç§ã¯ãã§ã«ããšã©ãŒåŠçã®ããã«äžèšãšåæ§ã®ãã¬ããŒã¿ã¬ãã«ã®çŸåšå éšäœ¿çšããã±ãŒãžã§ãŠãŒã¶ãŒã©ã³ãã¢ãããŒãã䜿çšããŠããŸãã ççŽã«èšã£ãŠããã®ã¢ãããŒãã䜿çšãããšãã¯ãæ £çšçãªGoãšã©ãŒåŠçã«åŸãããšãããšãããããã³ãŒããæ§é åããæ¹æ³ã«ã€ããŠèããæéãå€§å¹ ã«ççž®ãããŸããã
ãã®ã¢ãããŒãã«æ
£çšçãªGoã³ãŒããé²åãããå¯èœæ§ããããšæãããå Žåã¯ããã®try()
ææ¡ãæ€èšããå Žåãå«ãããšã©ãŒåŠçãå®è£
ããéã«ãããèæ
®ã«å
¥ããŠãã ããã
GoããŒã ããã®éèŠãªåçã®1ã€ã¯ã_ãç¹°ãè¿ãã«ãªããŸããããã®ææ¡ã¯ãã¹ãŠã®ãšã©ãŒåŠçç¶æ³ã解決ããããšãããã®ã§ã¯ãããŸãããã_
ãããŠãããã¯ã¬ããã³ã¹ã®èŠ³ç¹ãããããããæãåä»ãªæžå¿µã§ãã
ãã®æ°ããè€éãªèšèªã®å€æŽã«ããã誰ããæ°ããæŠå¿µãåŠã¶å¿ èŠããããæ¬åœã«å€ãã®ãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ã§ããã§ããããã
ãããŠãã³ã¢ããŒã ã®åãæ£åœåã¡ã³ããŒãã³ãã¥ããã£ããã®å€æ°ã®æ©èœèŠæ±ãæåŠããã®ã§ã¯ãªãã§ããããïŒ ä»¥äžã¯ãçŽ2幎åã«æåºãããæ©èœãªã¯ãšã¹ããžã®å žåçãªå¿çã§GoããŒã ã®ã¡ã³ããŒãè¡ã£ãã³ã¡ã³ãããã®çŽæ¥ã®åŒçšã§ã_ïŒãã®è°è«ã¯ã§ããªãã¯ããªã®ã§ãç§ã¯äººãç¹å®ã®æ©èœãªã¯ãšã¹ãã«ååãä»ããŠããŸãã人ã ã代ããã«èšèªã«ã€ããŠïŒïŒ_
_ "æ°ããèšèªæ©èœã«ã¯èª¬åŸåã®ãããŠãŒã¹ã±ãŒã¹ãå¿ èŠã§ãããã¹ãŠã®èšèªæ©èœã圹ç«ã€ãã誰ãææ¡ããŸãããåé¡ã¯ãèšèªãè€éã«ãããã¹ãŠã®äººã«æ°ããæŠå¿µãåŠã¶ããšãèŠæ±ããã®ã«åå圹ç«ã€ãã©ããã§ãã説åŸåã®ãã䜿çšæ³ã¯äœã§ãããããã§ã®äºäŸïŒäººã ã¯ããããã©ã®ããã«äœ¿çšããŸããïŒããšãã°ã人ã ã¯...ã§ããããšãæåŸ ããŸããïŒãããããªããã©ã®ããã«ãããè¡ããŸããïŒãã®ææ¡ã¯ããªãã«èš±å¯ãã以äžã®ããšãããŸãã...ïŒ "_
âGoããŒã ã®ã³ã¢ã¡ã³ããŒ
ççŽã«èšã£ãŠãç§ããããã®åå¿ãèŠããšããç§ã¯2ã€ã®ææ ã®ãã¡ã®1ã€ãæããŸããïŒ
ããããã©ã¡ãã®å Žåã§ããç§ã®æ°æã¡ã¯ç¡é¢ä¿ã§ããã Goãèšèªã§ããçç±ã®äžéšã¯ãç§ãã¡ã®å€ããéçºããããšãéžæããçç±ã®äžéšã¯ãèšèªã®çŽç²ããå«åŠ¬æ·±ãå®ãããã§ããããšãç解ããåæããŸãã
ãããŠãããããã®ææ¡ãç§ãæ©ãŸããŠããçç±ã§ãããªããªããGoã³ã¢ããŒã ã¯ãGoã³ãã¥ããã£ããããŸã§èš±å®¹ã§ããªããããªé£è§£ãªæ©èœãç¬æçã«æãã§ãã人ãšåãã¬ãã«ã§ãã®ææ¡ãæãäžããŠããããã ããã§ãã
_ïŒãããŠãããŒã ãã¡ãã»ã³ãžã£ãŒãæã£ãŠãããããGoãç§ãã¡å šå¡ã«ãšã£ãŠæé«ã§ããç¶ããããšãæãã§ãã誰ãããã®å»ºèšçãªæ¹å€ãšããŠåãåããªãããšãå¿ããé¡ã£ãŠããŸããã³ã¢ããŒã ãïŒ_
説åŸåã®ããäžé£ã®å®éã®ãŠãŒã¹ã±ãŒã¹ãã³ãã¥ããã£ã§çæããããã¹ãŠã®æ©èœææ¡ã®åºæºã§ããå Žåãããã¯_ãã¹ãŠã®_æ©èœææ¡ã®åºæºã§ãããã¹ãã§ã¯ãããŸãããïŒ
ãããããã€ãã§ã«ããŒãããŸãããã try()
ãšäžé
æŒç®åã®ç¶ç¶çãªèŠæ±ãæ¯èŒããããšæããŸãã çŽ18ãæåã®å¥ã®GoããŒã ã¡ã³ããŒã®ã³ã¡ã³ãããã®åŒçšïŒ
_ "ã倧èŠæš¡ãªããã°ã©ãã³ã°ãïŒé·æéã«ããã倧èŠæš¡ãªããŒã ã«ãã倧èŠæš¡ãªã³ãŒãããŒã¹ïŒã®å Žåãã³ãŒãã¯èšè¿°ããããããã¯ããã«é »ç¹ã«èªã¿åããããããæžã蟌ã¿å¯èœæ§ã§ã¯ãªããå¯èªæ§ãæé©åããŸãã" _
äžé
æŒç®åãè¿œå ããªãçç±ã®1ã€ã¯ããã¹ããããŠãããšèªã¿ã«ããããŸãã¯èª€èªããããããšã§ãã ããã§ãã try(try(try(to()).parse().this)).easily())
ã®ãããªãã¹ããããtry()
ã¹ããŒãã¡ã³ãã«ã€ããŠãåãããšãèšããŸãã
äžé
æŒç®åã«å察ããè¿œå ã®çç±ã¯ããããã_ "åŒ" _ã§ããããã¹ããããåŒãè€éããå¢ãå¯èœæ§ããããšããåŒæ°ãããããšã§ãã ãããã try()
ããã¹ãå¯èœãªåŒãäœæããŸãããïŒ
ããã§èª°ãã_ã[ãã¹ããããtry()
s]ã®ãããªäŸã¯éçŸå®çã ãšæããŸãã_ãšèšããŸããããã®ã¹ããŒãã¡ã³ãã¯ç°è°ãå±ããããŸããã§ããã
ããããéçºè
ãtry()
ããã¹ãããªããšããä»®å®ã人ã
ãåãå
¥ããå Žåã人ã
ã_ãæ·±ããã¹ããããäžé
æŒç®åã¯éçŸå®çã ãšæãããšèšããšãã«ããªãåãéããäžé
æŒç®åã«äžããããªãã®ã§ããïŒ
ãã®ç¹ã®çµè«ãšããŠãäžé
æŒç®åã«å¯Ÿããè°è«ãæ¬åœã«æå¹ã§ããå Žåããããããã®try()
ææ¡ã«å¯Ÿããæå¹ãªè°è«ãšèŠãªãããã¹ãã ãšæããŸãã
ãããæžããŠããæç¹ã§ã 58%
ã®å察祚ã¯42%
ã®è³æ祚ã«ãªã£ãŠããŸãã ããã ãã§ãããããã®åé¡ã«ã€ããŠã®èšç»ã«æ»ãæãæ¥ããšããææ¡ãååã«åå²ããŠããããšã瀺ãã®ã«ååã§ãããšæããŸãã
PSããããã£ãšåè«ã§èšããšãç§ãã¡ã¯ãšãŒãã®èšãæããããç¥æµã«åŸãã¹ãã ãšæããŸãïŒ
_ "
try()
ã¯ãããŸãããdo()
ã®ã¿ã§ãã" _
@ianlancetaylor
@beoranããããããžã§ããªãã¯ã¹ãšãšã©ãŒåŠçã®éã®é¢ä¿ãæ¡åŒµããããšãã§ããŸãã
@beoranã«ã€ããŠã¯è©±ããŠããŸããããæ°ååã®ç§ã®ã³ã¡ã³ãã§ã¯ããžã§ããªãã¯ã¹_ïŒããã³å¯å€ååŒæ°ã®æ»ããã©ã¡ãŒã¿ãŒïŒ_ãããã°ãç¬èªã®try()
ãäœæã§ããããšãããããŸãã
ãã ããããã§ãžã§ããªãã¯ã«ã€ããŠäžã§è¿°ã¹ãããšãç¹°ãè¿ããŸãã
_ "ãžã§ããªãã¯ã¹ã®ãŠãŒã¹ã±ãŒã¹ã¯ãJavaãªã©ã®ãžã§ããªãã¯ã¹ã®çŽããããã»ãã³ãã£ã¯ã¹ãšæ§æãµã©ããè¿œå ããã®ã§ã¯ãªãããžã§ããªãã¯ã¹ã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããããã®çµã¿èŸŒã¿ãè¿œå ããããšã«ãã£ãŠåæžããå¿ èŠããããšæããŸããïŒ" _
@ianlancetaylor
ããªãã®è³ªåã«å¯Ÿããçããå®åŒåããããšãããšããç§ã¯Goã«try
é¢æ°ããã®ãŸãŸå®è£
ããããšããŸããããå¬ããããšã«ãå®éã«ã¯éåžžã«ãã䌌ããã®ããšãã¥ã¬ãŒãããããšããã§ã«å¯èœã§ãã
func try(v interface{}, err error) interface{} {
if err != nil {
panic(err)
}
return v
}
䜿çšæ¹æ³ã¯ãã¡ããã芧ãã ããïŒhttpsïŒ //play.golang.org/p/Kq9Q0hZHlXL
ãã®ã¢ãããŒãã®æ¬ ç¹ã¯æ¬¡ã®ãšããã§ãã
try
ã䜿çšãããšãé©åãªãšã©ãŒåŠçãå®è¡ããå Žåã«é
延ãã³ãã©ãŒãå¿
èŠã«ãªããŸãã ã§ããããããã¯æ·±å»ãªãã€ãã¹é¢ã§ã¯ãªããšæããŸãã Goã«äœããã®super(arg1, ..., argn)
ãçµã¿èŸŒãŸããŠãããšãåŒã³åºãã¹ã¿ãã¯ã®1ã¬ãã«äžã®åŒã³åºãå
ã®åŒã³åºãå
ããæå®ãããåŒæ°arg1ã... argnã§è¿ãããäžçš®ã®ã¹ãŒããŒãªã¿ãŒã³ãçºçããå Žåã¯ããã«è¯ãã§ããããããªãããããããªããtry
ã¯ãåäžã®çµæãšãšã©ãŒãè¿ãé¢æ°ã§ã®ã¿æ©èœããŸããååã«åŒ·åãªãžã§ããªãã¯ã¯ãåé¡2ãš3ã解決ã§ãã1ã€ã ããæ®ããŠã super()
ãè¿œå ããããšã§è§£æ±ºã§ããŸãã ãããã®2ã€ã®æ©èœã䜿çšãããšã次ã®ããã«ãªããŸãã
func (T ... interface{})try(T, err error) super {
if err != nil {
super(err)
}
super(T...)
}
ãããŠã延æãããæå©ã¯ããå¿ èŠãããŸããã ãã®å©ç¹ã¯ããžã§ããªãã¯ãGoã«è¿œå ãããŠããªãå Žåã§ãå©çšã§ããŸãã
å®éãsuperïŒïŒãã«ãã€ã³ã®ãã®ã¢ã€ãã¢ã¯éåžžã«åŒ·åã§èå³æ·±ãã®ã§ãåå¥ã«ææ¡ãæçš¿ãããããããŸããã
@beoranå¥ã®ææ¡ã§äŒŒããããªããšã«ã€ããŠè©±ãããã£ãã®ã§å«ããªãã£ãã¹ãŒããŒéšåãé€ããŠããŠãŒã¶ãŒã©ã³ãã§ã®try()
ã®å®è£
ã«é¢ããŠããŸã£ããåãå¶çŽã«ç¬ç«ããŠå°éããããšã確èªããŠãã ããã :-)
ç§ã¯ãã®ææ¡ã奜ãã§ããã defer try(...)
ãšgo try(...)
ãèš±å¯ãããŠããªãããšãæ瀺çã«æå®ããªããã°ãªããªãã£ããšããäºå®ãããäœããæ£ãããªããšæããŸãããçŽäº€æ§ã¯åªããèšèšã¬ã€ãã§ãã ããã«èªãã§ã次ã®ãããªãã®ãèŠãããšã«ã€ããŠ
x = try(foo(...))
y = try(bar(...))
try
ã¯ã³ã³ããã¹ãã§ããå¿
èŠãããã®ã§ã¯ãªãããšæããŸãïŒ æ€èšïŒ
try (
x = foo(...)
y = bar(...)
)
ããã§ã foo()
ãšbar()
ã¯2ã€ã®å€ãè¿ãã2çªç®ã¯error
ã§ãã ã»ãã³ãã£ã¯ã¹ãè©Šãããšã¯ãç¡èŠãããã®ã§ã¯ãªããè¿ããããšã©ãŒå€ãçç¥ãããïŒã¬ã·ãŒããŒãªãïŒ try
ãããã¯å
ã®åŒã³åºãã«ã®ã¿é¢ä¿ããŸãïŒã¬ã·ãŒããŒã¯_
ã§ãïŒã foo
ãšbar
ã®åŒã³åºãã®éã«ãããšã©ãŒãåŠçããããšãã§ããŸãã
æŠèŠïŒ
aïŒ go
ãšdefer
ã®try
ãèš±å¯ããªããšããåé¡ã¯ãæ§æã«ãã£ãŠè§£æ¶ãããŸãã
bïŒè€æ°ã®æ©èœã®ãšã©ãŒåŠçãé€å€ããããšãã§ããŸãã
cïŒãã®éæ³ã®æ§è³ªã¯ãé¢æ°åŒã³åºããšããŠãããç¹å¥ãªæ§æãšããŠããããè¡šçŸãããŸãã
tryãã³ã³ããã¹ãã§ããå Žåãç¹ã«åé¿ããããšããŠããtry / catchãããã¯ãäœæããŸããïŒãããŠæ£åœãªçç±ã§ïŒ
ãã£ããã¯ãããŸããã çŸåšã®ææ¡ãæã£ãŠãããšããšãŸã£ããåãã³ãŒããçæãããŸã
x = try(foo(...))
y = try(bar(...))
ããã¯åãªãç°ãªãæ§æã§ãããã»ãã³ãã£ã¯ã¹ã§ã¯ãããŸããã
`` ``
ããã«ã¯ãŸã ããã€ãã®æ¬ ç¹ããããŸãããç§ã¯ããã«ã€ããŠç§ããã¹ãã§ã¯ãªãã£ãããã€ãã®ä»®å®ããããšæããŸãã
fooãŸãã¯barããšã©ãŒãè¿ããªãå Žåãããããtryã³ã³ããã¹ãã«ãé 眮ã§ããŸããïŒ ããã§ãªãå Žåã¯ããšã©ãŒé¢æ°ãšéãšã©ãŒé¢æ°ãåãæ¿ããã®ã¯ã¡ãã£ãšéãããã§ããå¯èœãªå Žåã¯ãå€ãèšèªã®tryãããã¯ã®åé¡ã«ãã©ãŒã«ããã¯ããŸãã
2ã€ç®ã¯ãéåžžã keyword ( ... )
æ§æã¯ãåè¡ã«ããŒã¯ãŒãã®ãã¬ãã£ãã¯ã¹ãä»ããããšãæå³ããŸãã ãããã£ãŠãimportãvarãconstãªã©ã®å ŽåïŒåè¡ã¯ããŒã¯ãŒãã§å§ãŸããŸãã ãã®èŠåã«äŸå€ãèšããããšã¯è¯ã決æã§ã¯ãªãããã§ã
é¢æ°ã䜿çšãã代ããã«ãç¹å¥ãªèå¥åã䜿çšããæ¹ãæ £çšçã§ããããïŒ
å€ãç¡èŠãã空çœã®èå¥å_
ããã§ã«ãããŸãã
#
ã®ãããªãã®ã䜿çšã§ããŸããããã¯ããšã©ãŒåã®æåŸã®æ»ãå€ãæã€é¢æ°ã§ã®ã¿äœ¿çšã§ããŸãã
func foo() (error) {
f, # := os.Open()
defer f.Close()
_, # = f.WriteString("foo")
return nil
}
ãšã©ãŒã#
ã«å²ãåœãŠããããšãé¢æ°ã¯ãšã©ãŒãåä¿¡ãããšããã«æ»ããŸãã ä»ã®å€æ°ã«é¢ããŠã¯ããããã®å€ã¯æ¬¡ã®ããã«ãªããŸãã
@deanveloper ã try
ãããã¯ã®ã»ãã³ãã£ã¯ã¹ã¯ããšã©ãŒå€ãè¿ãããšã©ãŒå€ãå²ãåœãŠãããŠããªãé¢æ°ã«ã®ã¿é¢ä¿ããŸãã ãããã£ãŠãçŸåšã®ææ¡ã®æåŸã®äŸã¯ã次ã®ããã«æžãããšãã§ããŸãã
try(x = foo(...))
try(y = bar(...))
äž¡æ¹ã®ã¹ããŒãã¡ã³ããåããããã¯å
ã«é
眮ããããšã¯ãç¹°ãè¿ãããimport
ã const
ãããã³var
ã¹ããŒãã¡ã³ãã«å¯ŸããŠè¡ãããšãšäŒŒãŠããŸãã
ä»ããªããæã£ãŠãããªããäŸãã°
try(
x = foo(...))
go zee(...)
defer fum()
y = bar(...)
)
ããã¯æžãã®ãšåãã§ã
try(x = foo(...))
go zee(...)
defer fum()
try(y = bar(...))
1ã€ã®tryãããã¯ã§ããããã¹ãŠãé€å€ãããšãããžãŒç¶æ
ãå°ãªããªããŸãã
æ€èš
try(x = foo())
fooïŒïŒããšã©ãŒå€ãè¿ããªãå Žåãããã¯æ¬¡ã®ããã«ãªããŸãã
x = foo()
æ€èš
try(f, _ := os.open(filename))
è¿ããããšã©ãŒå€ã¯ç¡èŠããããããããã¯
f, _ := os.open(filename)
æ€èš
try(f, err := os.open(filename))
è¿ããããšã©ãŒå€ã¯ç¡èŠãããªããããããã¯æ¬¡ã®ããã«ãªããŸãã
f, err := os.open(filename)
if err != nil {
return ..., err
}
çŸåšææ¡ã§æå®ãããŠãããšããã
ãŸãããã¹ããããè©Šè¡ãããŸãæŽçããŸãïŒ
äžèšã®ä»£æ¿æ¡ãžã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
try()
ãšåããŠãŒã¹ã±ãŒã¹ã«å¯ŸåŠããããã«ã2ã€ã®å°ãããæ±çšèšèªæ©èœãè¿œå ããå¿
èŠããããŸã
func
/ closureãåŒã³åºãæ©èœãbreak
ã continue
ããŸãã¯return
ãå®è¡ããæ©èœããã®2ã€ã®æ©èœã䜿çšãããšããããã¯_ãéæ³ã_ã§ã¯ãªããªãããããã䜿çšãããšãç解ãããããç§ãã¡ãããç¥ã£ãŠããæ £çšçãªGoã³ãŒããšããäžèŽããGoã³ãŒããçæããããšæããŸãã
ç§ã¯ææ¡ãèªã¿ãŸããããããŠãè©Šã¿ãã©ãã«è¡ãã®ãæ¬åœã«å¥œãã§ãã
è©Šè¡ãã©ãã»ã©æ®åããããèãããšããããããããã©ã«ãã®åäœã«ããããšã§ãåŠçã容æã«ãªãã®ã§ã¯ãªãããšæããŸãã
ããããæ€èšããŠãã ããã ããã¯æå¹ã§ãïŒ
v := m[key]
ããã¯æ¬¡ã®ãšããã§ãã
v, ok := m[key]
tryãææ¡ããã®ãšãŸã£ããåãæ¹æ³ã§ãšã©ãŒãåŠçããçµã¿èŸŒã¿ãåé€ãããšã©ããªããŸããã ãããã£ãŠã次ã®ããã«å§ããå ŽåïŒ
v, err := fn()
æžã代ããã«ïŒ
v := try(fn())
代ããã«æ¬¡ã®ããã«æžãããšãã§ããŸãã
v := fn()
errå€ããã£ããã£ãããªãå ŽåãtryãšãŸã£ããåãããã«åŠçãããŸãã æ
£ããã®ã«å°ãæéãããããŸããã v, ok := m[key]
ãšv, ok := x.(string)
ã«éåžžã«äŒŒãŠããããã«æããŸãã åºæ¬çã«ãæªåŠçã®ãšã©ãŒãçºçãããšãé¢æ°ãè¿ããããšã©ãŒå€ãèšå®ãããŸãã
èšèšããã¥ã¡ã³ãã®çµè«ãšå®è£ èŠä»¶ã«æ»ãã«ã¯ïŒ
â¢èšèªæ§æã¯ä¿æãããæ°ããããŒã¯ãŒãã¯å°å
¥ãããŸãã
â¢ããã¯tryã®ãããªæ§æç³è¡£ã§ããç¶ããããŸãããã°èª¬æãç°¡åã§ãã
â¢æ°ããæ§æã¯å¿
èŠãããŸãã
â¢å®å
šãªäžäœäºææ§ãå¿
èŠã§ãã
äž»ãªéãã¯ãçµã¿èŸŒã¿ãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãããªã¬ãŒããã®ã§ã¯ãªããerrãã£ãŒã«ãããªããããããã¯tryãšã»ãŒåãå®è£ èŠä»¶ã«ãªããšæããŸãã
ãããã£ãŠãææ¡ã®CopyFile
ã®äŸãšdefer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
ã䜿çšãããšã次ã®ããã«ãªããŸãã
func CopyFile(src, dst string) (err error) {
defer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
r := os.Open(src)
defer r.Close()
w := os.Create(dst)
defer func() {
err := w.Close()
if err != nil {
os.Remove(dst) // only if a âtryâ fails
}
}()
io.Copy(w, r)
w.Close()
return nil
}
@savakiç§ã¯ããã奜ãã§ãGoãããã©ã«ãã§åžžã«ãšã©ãŒãåŠçããããšã§ãšã©ãŒåŠçãå転ãããããã°ã©ããŒã«ããããªãã¿ã€ãã³ã°ãæå®ãããïŒãšã©ãŒãå€æ°ã«ãã£ããã£ããããšã«ãã£ãŠïŒããã«ããããã«äœãå¿
èŠããèããŠããŸããããèå¥åã䜿çšãããšããã¹ãŠã®ãªã¿ãŒã³ãã€ã³ãã確èªã§ããªããããã³ãŒãã远跡ããã®ãé£ãããªããŸãã ãšã©ãŒãå¥ã®æ¹æ³ã§è¿ãå¯èœæ§ã®ããé¢æ°ã«ååãä»ããããã®èŠåã§ããå¯èœæ§ããããŸãïŒãããªãã¯èå¥åã®å€§æååãªã©ïŒã é¢æ°ããšã©ãŒãè¿ããå Žåã¯ãåžžã«?
ã§çµããå¿
èŠããããŸãã ããããã°ãGoã¯åžžã«æé»çã«ãšã©ãŒãåŠçããtryãšåãããã«åŒã³åºãå
ã®é¢æ°ã«èªåçã«è¿ãããšãã§ããŸãã ããã¯ãtryã®ä»£ããã«?
èå¥åã䜿çšããããšãææ¡ããããã€ãã®ææ¡ãšéåžžã«äŒŒãŠããŸãããéèŠãªéãã¯ãããã§?
ãé¢æ°åã®äžéšã§ãããè¿œå ã®èå¥åã§ã¯ãªãããšã§ãã å®éãæåŸã®æ»ãå€ãšããŠerror
ãè¿ããé¢æ°ã¯ãæ¥å°ŸèŸ?
ããªããšãã³ã³ãã€ã«ããã§ããŸããã ãã¡ãã?
ã¯ä»»æã§ãããæå³ãããæ確ã«ããä»ã®ãã®ã«çœ®ãæããããšãã§ããŸãã operation?()
ã¯try(someFunc())
ãã©ããããã®ãšåãã§ããã ?
ã¯é¢æ°åã®äžéšã§ãããé¢æ°ã倧æåãšåãããã«ãšã©ãŒãè¿ãããšãã§ããããšã瀺ãããšãå¯äžã®ç®çã§ããå€æ°ã®æåã®æåã
ããã¯è¡šé¢çã«ã¯try
ã?
ã«çœ®ãæããããšãæ±ããä»ã®ææ¡ãšéåžžã«äŒŒãŠããŸãããéèŠãªéãã¯ããšã©ãŒåŠçãæé»çïŒèªåïŒã«ãã代ããã«ç¡èŠïŒãŸãã¯ã©ããã³ã°ïŒãšã©ãŒãæ瀺çã«ããããšã§ãããšã«ããäžçš®ã®ãã¹ããã©ã¯ãã£ã¹ã ãã¡ãããããã«é¢ããæãæçœãªåé¡ã¯ãäžäœäºææ§ããªãããšã§ãããããã«å€ãã®åé¡ããããšç¢ºä¿¡ããŠããŸãã
ããã¯èšã£ãŠããGoãããã©ã«ã/æé»ã®ã±ãŒã¹ãèªååããŠåŠçäžã«ãšã©ãŒãçºçãããããã°ã©ããŒã«åŠçãç¡èŠ/ãªãŒããŒã©ã€ãããããã®è¿œå ã®ã³ãŒããå°ãèšè¿°ãããæ¹æ³ãç¥ããããšæããŸãã ç§ãèãã課é¡ã¯ããã®å Žåããã¹ãŠã®ãªã¿ãŒã³ãã€ã³ããæ確ã«ããæ¹æ³ã§ããããããªããšãããã°ã©ã ã®ãããŒã§ã¯æ確ã«ãªããªãããããšã©ãŒã¯ã©ãããã§ãçºçããå¯èœæ§ããããšããæå³ã§ãäŸå€ã®ããã«ãªããŸãã èŠèŠçãªã€ã³ãžã±ãŒã¿ã§ãšã©ãŒãæé»çã«ããããšã¯ã try
ãå®è£
ããŠerrcheck
ãã³ã³ãã€ã©ã®å€±æã«ããããšãšåãã§ãããšèšããŸãã
å€ãé¢æ°ã®ãã³ã¬ãŒã¿ã䜿çšããŠC ++äŸå€ã®ãããªããšãè¡ãããšãã§ããŸããïŒ
func some_old_test() (int, error){
return 0, errors.New("err1")
}
func some_new_test() (int){
if true {
return 1
}
throw errors.New("err2")
}
func throw_res(int, e error) int {
if e != nil {
throw e
}
return int
}
func main() {
fmt.Println("Hello, playground")
try{
i := throw_res(some_old_test())
fmt.Println("i=", i + some_new_test())
} catch(err io.Error) {
return err
} catch(err error) {
fmt.Println("unknown err", err)
}
}
@owaisã»ãã³ãã£ã¯ã¹ã¯tryãšãŸã£ããåãã ãšæã£ãŠããã®ã§ãå°ãªããšãerrã¿ã€ãã宣èšããå¿ èŠããããŸãã ãããã£ãŠã次ã®ããã«å§ããå ŽåïŒ
func foo() error {
_, err := fn()
if err != nil {
return err
}
return nil
}
ç§ãtryã®ææ¡ãç解ããŠããå Žåã¯ããããè¡ãã ãã§ãã
func foo() error {
_ := fn()
return nil
}
ã³ã³ãã€ã«ãããŸããã çŽ æŽãããç¹å žã®1ã€ã¯ãã³ã³ãã€ã«ã«äœãæ¬ ããŠãããããŠãŒã¶ãŒã«äŒããæ©äŒãäžããããšã§ãã æé»ã®ãšã©ãŒåŠçã䜿çšããã«ã¯ããšã©ãŒæ»ãã¿ã€ãã«errãšããååãä»ããå¿ èŠããããšããå¹æããããŸãã
ããã§ããŸãããã§ãããïŒ
func foo() (err error) {
_ := fn()
return nil
}
å€æ°ã«å²ãåœãŠãããŠããªããšã©ãŒã®å ŽåãåŠçããªãã®ã¯ãªãã§ããã
if errïŒ= nilã®å Žåã®æé»ã®æ»ãå€ãã³ã³ãã€ã©ãŒã¯ãå¿
èŠã«å¿ããŠããã°ã©ããŒãã¢ã¯ã»ã¹ã§ããªãå Žåã«ãæ»ãå€ã®ããŒã«ã«å€æ°åãçæã§ããŸãã
å人çã«ã¯ãã³ãŒãã®å¯èªæ§ã®èŠ³ç¹ããããã®ç¹å®ã®ã±ãŒã¹ã¯å«ãã§ã
f := os.Open("foo.txt")
æ瀺çãªãªã¿ãŒã³ã奜ã¿ãã³ãŒãã¯æžããããã³ãã©ãããå€ãèªãŸããŸã
f := os.Open("foo.txt") else return
èå³æ·±ãããšã«ãäž¡æ¹ã®ãã©ãŒã ãåãå ¥ããŠãgofmtã«elseãªã¿ãŒã³ãèªåçã«è¿œå ãããããšãã§ããŸãã
ã³ã³ããã¹ãã®è¿œå ãå€æ°ã®ããŒã«ã«åœåã ã³ã³ããã¹ããè¿œå ãããã®ã§ãreturnã¯æ瀺çã«ãªããŸãã
f := os.Open("foo.txt") else err {
return errors.Wrap(err, "some context")
}
è€æ°ã®æ»ãå€ãæã€ã³ã³ããã¹ãã®è¿œå
f := os.Open("foo.txt") else err {
return i, j, errors.Wrap(err, "some context")
}
ãã¹ããããé¢æ°ã§ã¯ãå€éšé¢æ°ããã¹ãŠã®çµæãåãé åºã§åŠçããå¿
èŠããããŸã
æçµãšã©ãŒãå·®ãåŒããã
bits := ioutil.ReadAll(os.Open("foo")) else err {
// either error ends up here.
return i, j, errors.Wrap(err, "some context")
}
é¢æ°ã«ãšã©ãŒã®æ»ãå€ããªããããã³ã³ãã€ã©ãã³ã³ãã€ã«ãæåŠããŸã
func foo(s string) int {
i := strconv.Atoi(s) // cannot implicitly return error due to missing error return value for foo.
return i * 2
}
ãšã©ãŒã¯æ瀺çã«ç¡èŠããããããåé¡ãªãã³ã³ãã€ã«ãããŸãã
func foo(s string) int {
i, _ := strconv.Atoi(s)
return i * 2
}
ã³ã³ãã€ã©ã¯å¹žãã§ãã å²ãåœãŠãæ¥å°ŸèŸãçºçããªããããçŸåšã®ããã«ãšã©ãŒã¯ç¡èŠãããŸãã
func foo() error {
return errors.New("whoops")
}
func bar() {
foo()
}
ã«ãŒãå ã§ç¶è¡ã䜿çšã§ããŸãã
for _, s := range []string{"1","2","3","4","5","6"} {
i := strconv.Atoi(s) else continue
}
ç·šéïŒ ;
ãelse
ã«çœ®ãæããŸãã
@savakiç§ã¯ããªãã®å ã®ã³ã¡ã³ããç解ãããšæããŸããããã©ã«ãã§ãšã©ãŒãåŠçããGoã®ã¢ã€ãã¢ã¯å¥œãã§ãããæ§æã®å€æŽãè¿œå ããªããšå®è¡å¯èœã§ã¯ãªããšæããŸãããããããšãçŸåšã®ææ¡ãšéåžžã«ãã䌌ããã®ã«ãªããŸãã
ããªããææ¡ããããšã®æ倧ã®æ¬ ç¹ã¯ãçŸåšã®if err != nil {return err}
ããã®ææ¡ã§å°å
¥ãããtryé¢æ°ãšã¯ç°ãªããé¢æ°ãæ»ãããšãã§ãããã¹ãŠã®ãã€ã³ããå
¬éããªãããšã§ãã å
éšã§ã¯ãŸã£ããåãããã«æ©èœããŸãããèŠèŠçã«ã¯ã³ãŒãã¯éåžžã«ç°ãªã£ãŠèŠããŸãã ã³ãŒããèªã¿åããšãã«ãã©ã®é¢æ°åŒã³åºãããšã©ãŒãè¿ãå¯èœæ§ãããããç¥ãæ¹æ³ã¯ãããŸããã ããã¯ãäŸå€IMOãããæªãçµéšã«ãªãã§ãããã
ã³ã³ãã€ã©ããšã©ãŒãè¿ãå¯èœæ§ã®ããé¢æ°ã«ã»ãã³ãã£ãã¯èŠåã匷å¶ããå Žåããšã©ãŒåŠçãæé»çã«è¡ãããå¯èœæ§ããããŸãã 圌ãã¯ç¹å®ã®ãã¬ãŒãºãæåã§éå§ãŸãã¯çµäºããå¿ èŠãããããã«ã ããã¯ãã¹ãŠã®ãªã¿ãŒã³ãã€ã³ããéåžžã«æçœã«ããæåã®ãšã©ãŒåŠçãããåªããŠãããšæããŸãããç¡èŠãããŠãããšã©ãŒãèŠã€ãããšãã«è² è·ãå«ã¶ãªã³ããã§ãã¯ããã§ã«ããããšãèãããšãã©ãã»ã©åªããŠãããã¯ããããŸããã å¯èœæ§ã®ãããšã©ãŒãè¿ãå¯èœæ§ããããã©ããã«å¿ããŠãã³ã³ãã€ã©ãŒãé¢æ°ã«ç¹å®ã®æ¹æ³ã§ååãä»ããããšãã§ãããã©ããã確èªããããšã¯éåžžã«èå³æ·±ãã§ãããã
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã¯ããšã©ãŒçµæãã©ã¡ãŒã¿ãŒã«ååãä»ããå¿ èŠãããããšã§ããããã«ãããAPIã®å質ãäœäžããå¯èœæ§ããããŸãïŒãã ãããã®ããŒãã«é¢ããFAQãåç §ããŠãã ããïŒã ãã®ã¹ã¿ã€ã«ã確ç«ãããã°ãç§ãã¡ã¯ããã«æ £ããã ãããšä¿¡ããŠããŸãã
ãã®ãããªãã®ã以åã«ææ¡ããããã©ããã¯ããããŸãããããããŸãã¯ææ¡ã§èŠã€ããããšãã§ããŸããã çŸåšã®é¢æ°ã®ãšã©ãŒæ»ãå€ãžã®ãã€ã³ã¿ãè¿ãå¥ã®çµã¿èŸŒã¿é¢æ°ãæ€èšããŸãããïŒ
äŸãã°ïŒ
func example() error {
var err *error = funcerror() // always return a non-nil pointer
fmt.Print(*err) // always nil if the return parameters are not named and not in a defer
defer func() {
err := funcerror()
fmt.Print(*err) // "x"
}
return errors.New("x")
}
func exampleNamed() (err error) {
funcErr := funcerror()
fmt.Print(*funcErr) // "nil"
err = errors.New("x")
fmt.Print(*funcErr) // "x", named return parameter is reflected even before return is called
*funcErr = errors.New("y")
fmt.Print(err) // "y", unfortunate side effect?
defer func() {
funcErr := funcerror()
fmt.Print(*funcErr) // "z"
fmt.Print(err) // "z"
}
return errors.New("z")
}
tryã§ã®äœ¿çšæ³ïŒ
func CopyFile(src, dst string) (error) {
defer func() {
err := funcerror()
if *err != nil {
*err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}()
// one liner alternative
// defer fmt.HandleErrorf(funcerror(), "copy %s %s", src, dst)
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
defer func() {
w.Close()
err := funcerror()
if *err != nil {
os.Remove(dst) // only if a âtryâ fails
}
}()
try(io.Copy(w, r))
try(w.Close())
return nil
}
ãããã¯ãfuncerrorïŒååã¯é²è¡äžã®äœæ¥ã§ãïŒDïŒã¯ãdeferå ã§åŒã³åºãããªãå Žåãnilãè¿ãå¯èœæ§ããããŸãã
ãã1ã€ã®æ¹æ³ã¯ãfuncerrorããErrorerãã€ã³ã¿ãŒãã§ãŒã¹ãè¿ããŠèªã¿åãå°çšã«ããããšã§ãã
type interface Errorer() {
Error() error
}
@savakiç§ã¯å®éã try()
ãçç¥ããŠãããããåã¢ãµãŒã·ã§ã³ããã¹ããããããªãã®ã«ãããšããããªãã®ææ¡ã奜ãã§ãã ããã¯ã¯ããã«æããŸã_ "Go-likeã" _
ãã ãããŸã 1ã€ã®æçœãªåé¡ããããŸããããã¯ããã®ã¢ãããŒãã䜿çšãããã¹ãŠã®ãšã©ãŒãreturn
ãããªã¬ãŒããé¢æ°ãçµäºããããšãåæãšããŠãããšããããšã§ãã çŸåšã®for
ããbreak
ãçºè¡ããããçŸåšã®for
ã«å¯ŸããŠcontinue
ãçºè¡ããããšã¯æ³å®ãããŠããŸããã
åæã®return
ã¯ãã¡ã¹ãå€ãã®å Žåããè¯ãéžæã§ããå Žåã倧ãã³ããŒã§ãã
ãããã£ãŠã break
ãšcontinue
ã¯æå¹ãªãšã©ãŒåŠçæŠç¥ãšããŠèš±å¯ãããã¹ãã§ãããçŸåšãããªãã®ææ¡ã¯return
ã®ã¿ãæ³å®ããŠããŸããã try()
ã¯ãããæ³å®ããŠãããããšã©ãŒãåŒã³åºããŠããŸãããèªäœãreturn
ã®ã¿ãå®è¡ã§ãã break
ãŸãã¯continue
ã¯å®è¡ã§ããªããã³ãã©ãŒã
savakiã®ããã«èŠããŸãããç§ã¯äŒŒããããªèããæã£ãŠããŸãããå¿ èŠã«å¿ããŠããšã©ãŒãåŠçããããã®ãããã¯ã»ãã³ãã£ã¯ã¹ãè¿œå ããŸããã ããšãã°ãcomtextãè¿œå ããããç絡ããããã«ãŒãã®å Žåãªã©
@mikeschinkelã¯ç§ã®æ¡åŒµæ©èœãåç §ããŠãã ããã圌ãšç§ã¯åæ§ã®ã¢ã€ãã¢ãæã£ãŠããŸããç§ã¯ãªãã·ã§ã³ã®ãããã¯ã¹ããŒãã¡ã³ãã§ãããæ¡åŒµããŸãã
@ james-ããŒã¬ã³ã¹
@mikesckinkelã¯ç§ã®æ¡åŒµæ©èœãåç §ããŠãã ããã圌ãšç§ã¯åæ§ã®ã¢ã€ãã¢ãæã£ãŠããŸããç§ã¯ãªãã·ã§ã³ã®ãããã¯ã¹ããŒãã¡ã³ãã§ãããæ¡åŒµããŸãã
ããªãã®äŸãåãïŒ
f := os.Open("foo.txt"); err {
return errors.Wrap(err, "some context")
}
ããã¯ãä»æ¥ç§ãã¡ãè¡ã£ãŠããããšãšæ¯èŒãããŸãã
f,err := os.Open("foo.txt");
if err != nil {
return errors.Wrap(err, "some context")
}
ç§ã«ã¯ééããªã奜ãŸããã§ãã ããã€ãã®åé¡ãããããšãé€ããŠïŒ
err
ã¯_ "éæ³ã®ããã«" _宣èšãããŠããããã§ãã éæ³ã¯æå°éã«æããã¹ãã§ãããïŒ ããã§ããã宣èšããŸãããïŒf, err := os.Open("foo.txt"); err {
return errors.Wrap(err, "some context")
}
nil
å€ãfalse
ãšããŠè§£éããããã€ã³ã¿ãŒå€ãtrue
ãšããŠè§£éããªããããããã§ãæ©èœããŸããããããã£ãŠã次ã®ããã«ããå¿
èŠããããŸããf, err := os.Open("foo.txt"); err != nil {
return errors.Wrap(err, "some context")
}
ãããŠããããæ©èœããããšã§ã1è¡ã«åããããå€ãã®äœæ¥ãšå€ãã®æ§æãããããã«æãå§ããã®ã§ãæ確ã«ããããã«å€ãæ¹æ³ãç¶ç¶ããå¯èœæ§ããããŸãã
ããããGoã2ã€ã®ãã«ãã€ã³ãè¿œå ããå Žåã¯ã©ããªãã§ããããã iserror()
ãšerror()
ïŒ æ¬¡ã«ããããè¡ãããšãã§ããŸãããããã¯ç§ã«ãšã£ãŠããã»ã©æªãã¯ãããŸããã
f := os.Open("foo.txt"); iserror() {
return errors.Wrap(error(), "some context")
}
ãŸãã¯ããè¯ã_ïŒã®ãããªãã®ïŒïŒ_
f := os.Open("foo.txt"); iserror() {
return error().Extend("some context")
}
ããªããä»ã®äººã¯ã©ãæããŸããïŒ
äœè«ã§ããããŠãŒã¶ãŒåã®ã¹ãã«ã確èªããŠãã ããã ãšã«ãã泚æãæã£ãŠããªãã£ãããããªãã®èšåã¯éç¥ãããªãã£ãã ãã...
@mikeschinkelã¯ç§ã®é»è©±ã«ãã£ãååã«ã€ããŠç³ãèš³ãããŸããããgithubã¯èªåææ¡ããŠããŸããã§ããã
ãšã©ãŒã¯ãéæ³ã®ããã«ã宣èšãããŠããããã§ãã éæ³ã¯æå°éã«æããã¹ãã§ãããïŒ ããã§ããã宣èšããŸãããïŒ
ãŸãããªã¿ãŒã³ãèªåçã«æ¿å ¥ãããšããã¢ã€ãã¢å šäœã¯éæ³ã§ãã ããã¯ããã®ææ¡å šäœã§èµ·ãã£ãŠããæãéæ³ã®ãããªããšã§ã¯ãããŸããã ããã«ããšã©ãŒã宣èšããããšäž»åŒµããŸãã ã¹ã³ãŒããããã¯ã®ã³ã³ããã¹ãå ã®æåŸã§ãifã¹ããŒãã¡ã³ãã䜿çšããŠéåžžååŸãããã¹ãŠã®åªããæ©èœãç¶æããªããã芪ã¹ã³ãŒããæ±æããªãããã«ããŸãã
ç§ã¯äžè¬çã«ããšã©ãŒããã±ãŒãžãžã®ä»åŸã®è¿œå ã«ããgoã®ãšã©ãŒåŠçã«ããªãæºè¶³ããŠããŸãã ãã®ææ¡ã«ã¯ãéåžžã«åœ¹ç«ã€ãã®ã¯äœããããŸããã ç§ãã¡ããããããããšæ±ºå¿ããŠãããªããç§ã¯ãŽã©ã³ã«æãèªç¶ãªãã£ããæãæäŸããããšããŠããŸãã
_ããªã¿ãŒã³ãèªåçã«æ¿å ¥ãããšããã¢ã€ãã¢å šäœã¯éæ³ã®ãããªãã®ã§ããã_
ããã«ããç§ããã¯äœã®è°è«ããããŸããã
_ãããã¯ããã®ææ¡å šäœã§èµ·ãã£ãŠããæãéæ³ã®ãããªããšã§ã¯ãããŸãããã_
ç§ã¯_ããã¹ãŠã®éæ³ã¯åé¡ãããããšäž»åŒµããããšããŠãããšæããŸãã
_ "ããã«ããšã©ãŒã宣èšããããšäž»åŒµããŸããã¹ã³ãŒããããã¯ã®ã³ã³ããã¹ãå ã®æåŸã«..." _
ããã§ãç§ããããerr2
ãšåŒã³ããã®ãªãããããããŸãããã§ããããïŒ
f := os.Open("foo.txt"); err2 {
return errors.Wrap(err, "some context")
}
ãããã£ãŠãã»ãã³ãã³ã®åŸã®err
/ err2
ã®ç¹æ®ãªã±ãŒã¹ã®åŠçãææ¡ããŠãããšæããŸããã€ãŸãã nil
nil
ã¯ãªããšæ³å®ãããŸããå°å³ããã§ãã¯ãããšãã®ããã«bool
$ã®ä»£ããã«nil
ïŒ
if _,ok := m[a]; !ok {
print("there is no 'a' in 'm'")
}
ç§ã¯äžè¬çã«ããšã©ãŒããã±ãŒãžãžã®ä»åŸã®è¿œå ã«ããgoã®ãšã©ãŒåŠçã«ããªãæºè¶³ããŠããŸãã
break
ããã³continue
_ïŒãã ãã return
ã¯ãªãïŒãšçµã¿åããããšããšã©ãŒåŠçã«ãæºè¶³ããŠããŸãã
çŸç¶ã§ã¯ããã®try()
ã®ææ¡ã¯ã圹ç«ã€ãšãããããæ害ã§ãããšèããŠãããææ¡ããããšããã«ãã®å®è£
以å€ã®äœç©ãèŠãããããŸããã #jmtcwã
@beoran @mikeschinkel以åããã®ããŒãžã§ã³ã®try
ã¯ãå¶åŸ¡ãããŒãå€æŽãããããããžã§ããªãã¯ã䜿çšããŠå®è£
ã§ããªãããšãææ¡ããŸããã ç§ãæ£ããèªãã§ãããªããããªãã¯äž¡æ¹ãšãããžã§ããªãã¯ã䜿çšããŠpanic
ãåŒã³åºãããšã«ããã try
ãå®è£
ã§ããããšã瀺åããŠããŸãã ãããããã®ããŒãžã§ã³ã®try
ãéåžžã«æ瀺çã«panic
ã¯ãããŸããã ãããã£ãŠããžã§ããªãã¯ã䜿çšããŠãã®ããŒãžã§ã³ã®try
ãå®è£
ããããšã¯ã§ããŸããã
ã¯ãããžã§ããªãã¯ïŒhttps://go.googlesource.com/proposal/+/master/design/go2draft-contracts.mdã®ãã¶ã€ã³ãã©ããã«ãããã®ãããã¯ããã«åŒ·åãªãžã§ããªãã¯ã®ããŒãžã§ã³ïŒã䜿çšããŠé¢æ°ãäœæã§ããŸãããšã©ãŒã§ãããã¯ã«ãªããŸãã ãããããšã©ãŒã§ãããã¯ã«ãªãããšã¯ãGoããã°ã©ããŒãä»æ¥æžããŠãããããªãšã©ãŒåŠçã§ã¯ãªããç§ã«ã¯è¯ãèãã§ã¯ãªãããã§ãã
@mikeschinkelã®ç¹å¥ãªåŠçã§ã¯ããšã©ãŒãçºçããå Žåã«ã®ã¿ãããã¯ãå®è¡ãããŸãã
`` `
fïŒ= os.OpenïŒ 'foo'ïŒ; err {return err} //ããã§ã¯ãerrã¯åžžã«énilã«ãªããŸãã
@ianlancetaylor
_ "ã¯ãããžã§ããªãã¯ã¹ã䜿çšã§ããŸã...ãããããšã©ãŒã§ãããã¯ã«ãªãããšã¯ãGoããã°ã©ããŒãä»æ¥æžããŠãããããªãšã©ãŒåŠçã§ã¯ãªããç§ã«ã¯è¯ãèãã§ã¯ãªãããã§ãã" _
ç§ã¯å®éã«ããã«ã€ããŠããªãã«åŒ·ãåæããŸããããã§ããªãã¯ç§ã®ã³ã¡ã³ãã®æå³ã誀解ããããã§ãã ç§ã¯ãGoããŒã ãpanic()
ã䜿çšãããšã©ãŒåŠçãå®è£
ããããšããŸã£ãã瀺åããŠããŸããã§ããâãã¡ããããã§ã¯ãããŸããã
代ããã«ãç§ã¯ä»ã®åé¡ã«é¢ããéå»ã®ã³ã¡ã³ãã®å€ãããå®éã«ããªãã®å
å°ã«åŸãããšãè©Šã¿ã代ããã«ãŠãŒã¶ãŒã©ã³ãã§å¯èœã§ããããã絶察ã«å¿
èŠã§ã¯ãªãGoãžã®å€æŽãé¿ããããšãææ¡ããŸããã ãããã£ãŠã_if_ãžã§ããªãã¯ã¹ã¯ã panic()
ã掻çšããããšã§ã try()
ãå®éã«èªåã§å®è£
ã§ããããã«ããããšãã_then_ã®äººã
ã«åããããŸããã ããã¯ãããŒã ãGoã«è¿œå ããŠææžåããå¿
èŠã®ããæ©èœã1ã€å°ãªããªããŸãã
ç§ãããŠããªãã£ãããšããããŠããããããã¯æ確ã§ã¯ãªãã£ãã®ã§ããã人ã
ãå®éã«panic()
ã䜿çšããŠ$ïŒ try()
ïŒ$ãå®è£
ããããšãæå±ããŠããŸããããžã§ããªãã¯ã
ããã¯æ確ã§ããïŒ
ç§ã«ãšã£ãŠpanic
ãšåŒã¶ã®ã¯ããããã©ã®ããã«è¡ããããšããŠãã try
ã®ãã®ææ¡ãšã¯ãŸã£ããç°ãªããŸãã ã§ããããç§ã¯ããªããèšã£ãŠããããšãç解ããŠãããšæããŸãããããããåçã§ããããšã«åæããŸããã ãããã¯ã«ãªãããŒãžã§ã³ã®try
ãå®è£
ããã®ã«åå匷åãªãžã§ããªãã¯ããã£ããšããŠãããã®ææ¡ã§æ瀺ãããããŒãžã§ã³ã®try
ã«å¯Ÿããåççãªæ¬²æ±ã¯ãŸã ãããšæããŸãã
@ianlancetaylor確èªæžã¿ã ç¹°ãè¿ãã«ãªããŸããã try()
ãè¿œå ããæ¹æ³ãèŠã€ããã®ã§ã¯ãªããè¿œå ããå¿
èŠããªãçç±ãæ¢ããŠããŸããã äžã§è¿°ã¹ãããã«ãããã§ææ¡ãããŠããtry()
ã䜿çšãããããããšã©ãŒåŠçã«æ°ãããã®ã¯ãããŸããã
ç§ã¯å人çã«ãçŽç²ã«èŠèŠçãªåŽé¢ã«åºã¥ããŠãããããã以åã®check
ã®ææ¡ã奜ãã§ããã check
ã¯ãã®try()
ãšåããã¯ãŒãæã£ãŠããŸãããã bar(check foo())
ã¯bar(try(foo()))
ãããèªã¿ããããªã£ãŠããŸãïŒæ¬åŒ§ãæ°ããã®ã«1ç§å¿
èŠã§ããïŒïŒã
ããã«éèŠãªããšã«ã handle
/ check
ã«ã€ããŠã®ç§ã®äž»ãªäžæºã¯ãåã
ã®å°åæãããŸããŸãªæ¹æ³ã§æãè¿ãããšãã§ããªããšããããšã§ããããããŠä»ããã®try()
ã®ææ¡ã«ãåãæ¬ é¥ããããŸããããªãããŒãªãã£ãã«äœ¿çšãããªãåå¿è
ãåŒã³åºãé-延æãšååä»ããªã¿ãŒã³ã®çŽããããæ©èœã ãããŠãå°ãªããšãhandle
ã§ã¯ãã¹ã³ãŒãã䜿çšããŠãã³ãã«ãããã¯ãå®çŸ©ãããªãã·ã§ã³ããããŸãããã defer
ã§ãããã¯äžå¯èœã§ãã
ç§ã«é¢ããéãããã®ææ¡ã¯ãããããç¹ã§ä»¥åã®handle
/ check
ã®ææ¡ã«è² ããŠããŸãã
ãšã©ãŒåŠçã«defersã䜿çšããå Žåã®ãã1ã€ã®æžå¿µäºé ããããŸãã
try
ã¯ãé¢æ°ããã®å¶åŸ¡ããã/æå³ãããçµäºã§ãã é¢æ°ããã®å¶åŸ¡ãããŠããªã/æå³ããªãçµäºãå«ãã延æã¯åžžã«å®è¡ãããŸãã ãã®äžäžèŽã¯æ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸãã ãããæ¶ç©ºã®ã·ããªãªã§ãã
func someHTTPHandlerGuts() (err error) {
defer func() {
recordMetric("db call failed")
return fmt.HandleErrorf("db unavailable: %v", err)
}()
data := try(makeDBCall)
// some code that panics due to a bug
return nil
}
net / httpããããã¯ããå埩ããããšãæãåºããŠãã ããããããŠããããã¯ã®åšãã®æ¬çªç°å¢ã®åé¡ããããã°ããããšãæ³åããŠãã ããã ã€ã³ã¹ãã«ã¡ã³ããŒã·ã§ã³ãèŠããšã recordMetric
åŒã³åºããããdbåŒã³åºãã®å€±æãæ¥å¢ããŠããããšãããããŸãã ããã¯ã次ã®è¡ã®ãããã¯ã§ããæ¬åœã®åé¡ãèŠãé ãå¯èœæ§ããããŸãã
ãããå®éã«ã©ãã»ã©æ·±å»ãªæžå¿µã§ãããã¯ããããŸããããïŒæ²ããããšã«ïŒå»¶æããšã©ãŒåŠçã®çæ³çãªã¡ã«ããºã ã§ã¯ãªããšèãããã1ã€ã®çç±ã§ãã
æèµ·ãããæžå¿µã®ããã€ãã«åœ¹ç«ã€å¯èœæ§ã®ããå€æŽã次ã«ç€ºããŸãã return
$ã§ã¯ãªãgoto
ã®ããã«try
ãæ±ããŸãã èããŠãã ããã :)
try
ã¯ã代ããã«æ¬¡ã®æ§æç³è¡£ã«ãªããŸãã
t1, ⊠tn, te := f() // t1, ⊠tn, te are local (invisible) temporaries
if te != nil {
err = te // assign te to the error result parameter
goto error // goto "error" label
}
x1, ⊠xn = t1, ⊠tn // assignment only if there was no error
å©ç¹ïŒ
defer
ã¯å¿
èŠãããŸããã ïŒãã ããååä»ãã®è¿åã¯åŒãç¶ãå¿
èŠã§ããïŒerror:
ã©ãã«ã®ååšã¯ãé¢æ°ã®ã©ããã«try
ãããããšãèŠèŠçã«ç€ºããŠããŸããããã¯ãé¢æ°ãšããŠã®ãã³ãã©ãŒã®åé¡ãåé¿ãããã³ãã©ãŒãè¿œå ããããã®ã¡ã«ããºã ãæäŸããŸãããã³ãã©ãŒãšããŠã©ãã«ã䜿çšããŸãã try(fn(), wrap)
ã¯ã goto error
$ã§ã¯ãªãgoto wrap
ã«ãªããŸãã ã³ã³ãã€ã©ã¯ã wrap:
ãé¢æ°ã«ååšããããšã確èªã§ããŸãã ãã³ãã©ãŒããããšãããã°ã«ã圹ç«ã€ããšã«æ³šæããŠãã ããããã³ãã©ãŒãè¿œå /å€æŽããŠããããã°ãã¹ãæäŸã§ããŸãã
ãµã³ãã«ã³ãŒãïŒ
func CopyFile(src, dst string) (err error) {
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a âtryâ fails
}
}()
try(io.Copy(w, r), copyfail)
try(w.Close())
return nil
error:
return fmt.Errorf("copy %s %s: %v", src, dst, err)
copyfail:
recordMetric("copy failure") // count incidents of this failure
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
ä»ã®ã³ã¡ã³ãïŒ
try
ã®ã¿ãŒã²ãããšããŠäœ¿çšãããã©ãã«ã®åã«ãçµäºã¹ããŒãã¡ã³ããä»ããå¿
èŠãããå ŽåããããŸãã å®éã«ã¯ãããã¯é¢æ°ã®æåŸã«ãããã匷å¶ããããã€ãã®ã¹ãã²ããã£ã³ãŒããé²ãããšãã§ããŸãã äžæ¹ã§ãããã¯ããã€ãã®åççã§æçšãªäœ¿çšã劚ãããããããŸãããtry
ã䜿çšããŠã«ãŒããäœæã§ããŸãã ããã¯ãçããªããããªãããšããæå°ã«è©²åœãããšæããŸãããããããããŸãããã¯ã¬ãžããïŒãã®ã¢ã€ãã¢ã®å€åœ¢ã¯ãæšå¹ŽGopherConã§@griesemerãçŽæ¥ææ¡ãããã®ã ãšæããŸãã
@josharian panic
ãšã®çžäºäœçšã«ã€ããŠèããããšã¯ããã§éèŠã§ãããããªãããããæèµ·ããŠãããŠããããã§ãããããªãã®äŸã¯ç§ã«ã¯å¥åŠã«æããŸãã 次ã®ã³ãŒãã§ã¯ãdeferãåžžã«"db call failed"
ã¡ããªãã¯ãèšé²ããããšã¯ç§ã«ã¯æå³ããããŸããã someHTTPHandlerGuts
ãæåãã nil
ãè¿ãå Žåãããã¯èª€ã£ãã¡ããªãã¯ã«ãªããŸãã defer
ã¯ããšã©ãŒããããã¯ã®å Žåã ãã§ãªãããã¹ãŠã®çµäºã®å Žåã«å®è¡ãããããããããã¯ããªããŠãã³ãŒãã¯ééã£ãŠããããã«èŠããŸãã
func someHTTPHandlerGuts() (err error) {
defer func() {
recordMetric("db call failed")
return fmt.HandleErrorf("db unavailable: %v", err)
}()
data := try(makeDBCall)
// some code that panics due to a bug
return nil
}
@josharianã¯ããããã¯å€ããå°ãªããæšå¹Žèª¬æããããŒãžã§ã³ã§ãïŒãã ãã try
check
ã䜿çšããŸããïŒã error
ã©ãã«ã«å°éããããé¢æ°æ¬äœã®æ®ãã®éšåã«ãæ»ããããšãã§ããªãããšãéèŠã ãšæããŸãã ããã«ããã goto
ãããçšåºŠãæ§é åããããŠããããšãä¿èšŒãããŸãïŒã¹ãã²ããã£ã³ãŒãã¯äœ¿çšã§ããŸããïŒã æèµ·ãããæžå¿µã®1ã€ã¯ããšã©ãŒãã³ãã©ãŒïŒ error:
ïŒã©ãã«ãåžžã«é¢æ°ã®æåŸã«æ¥ãããšã§ããïŒããã§ãªãå Žåã¯ããªãããã®æ¹æ³ã§ãžã£ã³ãããå¿
èŠããããŸãïŒã å人çã«ã¯ãïŒæåŸã«ïŒéªéã«ãªããªããšã©ãŒåŠçã³ãŒãã奜ãã§ãããä»ã®äººã¯ãããæåããèŠããã¯ãã ãšæããŸããã
@mikeshenkelã«ãŒãããæ»ãã®ã¯ããã€ãã¹ã§ã¯ãªããã©ã¹ã ãšæããŸãã ç§ã®æšæž¬ã§ã¯ãéçºè ã¯ã«ãŒãã®å 容ãåŠçããããã«å¥ã®é¢æ°ã䜿çšããããçŸåšã®ããã«errãæ瀺çã«äœ¿çšããããã«ä¿ãããŸãã ãããã¯äž¡æ¹ãšãç§ã«ã¯è¯ãçµæã®ããã«æããŸãã
ç§ã®POVããã¯ããã®tryæ§æã¯ã䜿çšããå¿ èŠããªããšæããŠããã®ãšåãããã«ããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãåŠçããå¿ èŠããããšã¯æããŠããŸããã
VãokïŒ= m [key]
å°å³ããã®èªã¿åãããã®ãã©ãŒã
handle
/ check
ããããŒã¶ã«ãç°¡ç¥åããã圢åŒã§åŸ©æŽ»ãããããšã«ãããgotoã©ãã«ããã³ãã©ãŒãé¢æ°ã®æåŸã«åŒ·å¶ããããšãåé¿ã§ããŸãã handle err { ... }
æ§æã䜿çšãããããã³ãã©ãŒããã§ãŒã³ãããªãã£ãå Žåã¯ã©ããªããŸããã代ããã«ãæåŸã®1ã€ã ãã䜿çšãããŸãã ããã¯ããã®ææ¡ã倧å¹
ã«ç°¡çŽ åããåŠçã䜿çšå Žæã«è¿ã¥ããããšãé€ããŠãgotoã®ã¢ã€ãã¢ãšéåžžã«ãã䌌ãŠããŸãã
func CopyFile(src, dst string) (err error) {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a âcheckâ fails
}
}()
{
// handlers are scoped, after this scope the original handle is used again.
// as an alternative, we could have repeated the first handle after the io.Copy,
// or come up with a syntax to name the handlers, though that's often not useful.
handle err {
recordMetric("copy failure") // count incidents of this failure
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
check io.Copy(w, r)
}
check w.Close()
return nil
}
ããŒãã¹ãšããŠãããã«ã¯ããã³ãã©ãŒããã§ãŒã³ãããããã®å°æ¥ã®ãã¹ããããŸããããã¯ãæ¢åã®ãã¹ãŠã®çšéã«å©çãããããã§ãã
@josharian @griesemerååä»ããã³ãã©ãŒïŒãã§ãã¯/ãã³ãã«ãžã®å€ãã®å¿çãèŠæ±ãããŸãããå®æçãªããŒããåç
§ïŒãå°å
¥ããå Žåã try(f(), err)
ãããæãŸããæ§æãªãã·ã§ã³ããããŸãã
try.err f()
try?err f()
try#err f()
?err f() // because 'try' is redundant
?return f() // no handler
?panic f() // no handler
(?err f()).method()
f?err() // lead with function name, instead of error handling
f?err().method()
file, ?err := os.Open(...) // many check/handle responses also requested this style
Goã«ã€ããŠç§ãæãæ°ã«å
¥ã£ãŠããããšã®1ã€ã¯ããã®æ§æãæ¯èŒçå¥èªç¹ããªãã倧ããªåé¡ãªãã«å€§å£°ã§èªã¿äžããããšãã§ããããšã§ãã Goã$#@!perl
ã«ãªãã®ã¯æ¬åœã«å«ãã ã
ç§ã«ãšã£ãŠãçµã¿èŸŒã¿é¢æ°ããè©Šããããšãšãã§ãŒã³ãæå¹ã«ããããšã«ã¯ã2ã€ã®åé¡ããããŸãã
ãã£ããªãã§ã¹ããŒãã¡ã³ãã«ããããšæããŸãã ææ¡ã®äŸã§ã¯è€æ°è¡ãå¿ èŠã«ãªããŸãããèªã¿ããããªããŸãïŒã€ãŸããåã ã®ãè©Šè¡ãã€ã³ã¹ã¿ã³ã¹ãèŠéãã«ãããªããŸãïŒã ã¯ããããã¯å€éšããŒãµãŒãå£ããŸãããç§ã¯äžè²«æ§ãç¶æããããšã奜ã¿ãŸãã
äžé æŒç®åã¯å¥ã®å Žæã§ãããäœãããªããããå€ãã®ããŒã¹ãããŒã¯ãå¿ èŠã§ãããåæã«èªã¿ããã/ä¿å®æ§ãåäžããŸãã ãã®ããå¶éããã圢åŒã§ãè©Šè¡ããè¿œå ãããšãè¡šçŸåãšèªã¿ããããIMOã®ãã©ã³ã¹ãæ¹åãããŸãã
FWIWã panic
ã¯å¶åŸ¡ãããŒã«åœ±é¿ãäžãã芪åé¢ä¿ããããŸããã go
ãšdefer
ããããŒã«åœ±é¿ãäžãã圱é¿ãäžããŸããã try
ã¯defer
ã«äŒŒãŠãããšæãåŸåããããŸããããã¯ãç°åžžãªãããŒæäœã§ãããã¯ã³ã©ã€ããŒãæããšã©ãŸããããã®ã§ã try (try os.Open(file)).Read(buf)
ãå®è¡ãã«ããããããšã¯è¯ãããšã§ãããšã«ãããã§ãäœã§ãã ã©ã¡ãã§ãæ§ããŸããã
誰ããæçµçãªãšã©ãŒæ»ãå€æ°ã®æé»ã®ååãå«ãã ãããšããææ¡ïŒ $err
ã try()
IMOãããåªããŠããŸãã :-)
@griesemer
_ "å人çã«ã¯ãïŒæåŸã«ïŒéªéã«ãªããªããšã©ãŒåŠçã³ãŒãã奜ãã§ã" _
+1ïŒ
ãšã©ãŒãçºçããåã«å®è£ ããããšã©ãŒåŠçã¯ããšã©ãŒãçºçããåŸã«å®è£ ããããšã©ãŒåŠçãããæšè«ãã¯ããã«é£ããããšãããããŸããã 粟ç¥çã«æ»ã£ãŠããžãã¯ãããŒã«åŸãããã«åŒ·å¶ããå¿ èŠãããã®ã¯ã1980幎ã«GOTOã§BasicãæžããŠãããããªæ°ãããŸãã
ããäžåºŠäŸãšããŠCopyFile()
ã䜿çšããŠããšã©ãŒãåŠçããããã«å¥ã®æœåšçãªæ¹æ³ãææ¡ããŸãããã
func CopyFile(src, dst string) (err error) {
r := os.Open(src)
defer r.Close()
w := os.Create(dst)
defer w.Close()
io.Copy(w, r)
w.Close()
for err := error {
switch err.Source() {
case w.Close:
os.Remove(dst) // only if a âtryâ fails
fallthrough
case os.Open, os.Create, io.Copy:
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
default:
err = fmt.Errorf("an unexpected error occurred")
}
}
return err
}
å¿ èŠãªèšèªã®å€æŽã¯æ¬¡ã®ãšããã§ãã
for range{}
ãšåæ§ã«ã for error{}
æ§é ãèš±å¯ããŸããããšã©ãŒæã«ã®ã¿å
¥åããã1åã ãå®è¡ãããŸãã
<object>.Error() string
ãå®è£
ããæ»ãå€ã®ãã£ããã£ãçç¥ã§ããŸãããåãfunc
å
ã«for error{}
æ§é ãååšããå Žåã«éããŸãã
func
ãæåŸã®æ»ãå€ã§_ "error" _ãè¿ãããšãã«ãããã°ã©ã å¶åŸ¡ãããŒãfor error{}
æ§é ã®æåã®è¡ã«ãžã£ã³ããããŸãã
_ "error" _ Goãè¿ãå Žåã <error>.Source()
ã§ååŸã§ããã¯ãã®ãšã©ãŒãè¿ããé¢æ°ãžã®åç
§ãå²ãåœãŠãŸãã
çŸåšã_ "error" _ã¯ã Error() string
ãå®è£
ãããªããžã§ã¯ããšããŠå®çŸ©ãããŠããããã¡ããnil
ã§ã¯ãããŸããã
ãã ããRESTful APIã®æåçµæã«å¿
èŠãªå€ãè¿ãããšãã§ããããã«ãæåããå Žåã§ããšã©ãŒãæ¡åŒµããå¿
èŠãããããšããããããŸãã ãããã£ãŠãGoããŒã ã¯ã err!=nil
ã_ "ãšã©ãŒ" _ãæå³ãããšèªåçã«æ³å®ããªãã§ãã ããã代ããã«ããšã©ãŒãªããžã§ã¯ããIsError()
ãå®è£
ããŠãããã©ãããããã³IsError()
ãtrue
ãè¿ããã©ããã確èªããŠãã ããã nil
以å€ã®å€ã_ "ãšã©ãŒ" _ã§ãããšæ³å®ããåã«
_ïŒç§ã¯å¿
ãããæšæºã©ã€ãã©ãªã®ã³ãŒãã«ã€ããŠè©±ããŠããããã§ã¯ãããŸããããäž»ã«å¶åŸ¡ãããŒãéžæããŠ_ "ãšã©ãŒ" _ã§åå²ããå Žåã err!=nil
ã ããèŠããšãç§ãã¡ã®å
容ã¯éåžžã«å¶éãããŸããé¢æ°ã®æ»ãå€ã«é¢ããŠå®è¡ã§ããŸããïŒ_
ãšããã§ã誰ãã_ "ãšã©ãŒ" _ãåãæ¹æ³ã§ãã¹ãã§ããããã«ããã«ã¯ãæ°ããçµã¿èŸŒã¿ã®iserror()
é¢æ°ãè¿œå ããããšã§ããããæãç°¡åã«å®è¡ã§ããŸãã
type ErrorIser interface {
IsError() bool
}
func iserror(err error) bool {
if err == nil {
return false
}
if _,ok := err.(ErrorIser); !ok {
return true
}
return err.IsError()
}
func
åŒã³åºãããã®æåŸã®_ "error" _ã®éãã£ããã£ãèš±å¯ãããšãåŸã§ãªãã¡ã¯ã¿ãªã³ã°ããŠãæåã¯ãšã©ãŒãè¿ãå¿
èŠããªãã£ãfunc
ããã®ãšã©ãŒãè¿ãããšãã§ããããšã«æ³šæããŠãã ããã ãŸãããã®åœ¢åŒã®ãšã©ãŒå埩ã䜿çšãã func
ãåŒã³åºãæ¢åã®ã³ãŒããå£ãããšãªãããã®ãªãã¡ã¯ã¿ãªã³ã°ãå¯èœã«ãªããŸãã
ç§ã«ãšã£ãŠã_ãåçŽæ§ãåŒã³åºãããã«ãšã©ãŒãè¿ããããšã©ãŒåŠçãæŸæ£ããå¿ èŠããããŸããïŒããšãã決å®ã¯ãGoã³ãŒããæžããšãã®ç§ã®æ倧ã®æ©ã¿ã®çš®ã®1ã€ã§ãã äžèšã®_ "ãšã©ãŒ" _ã®éãã£ããã£ãèš±å¯ãããšããã®é£åã¯ã»ãšãã©ãªããªããŸãã
ç§ã¯å®éã«ãã®ã¢ã€ãã¢ãGoãã©ã³ã¹ã¬ãŒã¿ãšããŠçŽå幎åã«å®è£ ããããšããŸããã ãã®æ©èœãGoçµã¿èŸŒã¿ãšããŠè¿œå ããå¿ èŠããããã©ããã«ã€ããŠã¯åŒ·ãæèŠã¯ãããŸããããçµéšãå ±æãããŠãã ããïŒæçšãã©ããã¯ããããŸãããïŒã
https://github.com/rhysd/trygo
æ¡åŒµèšèªã®TryGoãåŒã³åºããTryGo toGoãã©ã³ã¹ã¬ãŒã¿ãå®è£ ããŸããã
翻蚳è ãšäžç·ã«ãã³ãŒã
func CreateFileInSubdir(subdir, filename string, content []byte) error {
cwd := try(os.Getwd())
try(os.Mkdir(filepath.Join(cwd, subdir)))
p := filepath.Join(cwd, subdir, filename)
f := try(os.Create(p))
defer f.Close()
try(f.Write(content))
fmt.Println("Created:", p)
return nil
}
ã«ç¿»èš³ããããšãã§ããŸã
func CreateFileInSubdir(subdir, filename string, content []byte) error {
cwd, _err0 := os.Getwd()
if _err0 != nil {
return _err0
}
if _err1 := os.Mkdir(filepath.Join(cwd, subdir)); _err1 != nil {
return _err1
}
p := filepath.Join(cwd, subdir, filename)
f, _err2 := os.Create(p)
if _err2 != nil {
return _err2
}
defer f.Close()
if _, _err3 := f.Write(content); _err3 != nil {
return _err3
}
fmt.Println("Created:", p)
return nil
}
èšèªã®å¶éã®ããããžã§ããªãã¯try()
åŒã³åºããå®è£
ã§ããŸããã§ããã ã«å¶éãããŠããŸã
ããããç§ã¯ç§ã®å°ããªãããžã§ã¯ãã§ãããè©Šãããšãã§ããŸããã ç§ã®çµéšã¯
try()
ç¹æ®é¢æ°ã®äž¡æ¹ã«ãã£ãŠæ±ºå®ããããããå®éã«ã¯err
䜿çšã§ããŸããã ãšãŠãæ··ä¹±ãããããªtry()
é¢æ°ã«ã¯ãäžèšã®ãã©ããã³ã°ãšã©ãŒãæ©èœããããŸããã§ããã_ããããã¯äž¡æ¹ãšãç§ã«ã¯è¯ãçµæã®ããã§ããã_
ããã§åæããªãããšã«åæããå¿ èŠããããŸãã
_ "ãã®tryæ§æïŒããå¿ èŠã¯ãããŸããïŒã¯ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãåŠçããŸã" _
ãã®ããŒã ã¯ããããæãåä»ã§ãã å°ãªããšããGoããŒã /ã³ãã¥ããã£ããåºãé©çšã§ããªãéå»ã®å€æŽã«å¯ŸããŠã©ãã»ã©æµæåãããããèãããšã
ããã§ãã®æ£åœåãèªãããªããåºãé©çšã§ããªãã£ãããã«åŽäžãããéå»ã®ææ¡ãåæ€èšã§ããªãã®ã¯ãªãã§ããïŒ
ãããŠãéžæãããšããžã±ãŒã¹ã«ã®ã¿åœ¹ç«ã€Goã®å€æŽã«ã€ããŠè°è«ã§ããããã«ãªããŸãããïŒ
ç§ã®æšæž¬ã§ã¯ããã®å äŸãèšå®ããŠããé·æçã«ã¯è¯ãçµæã¯åŸãããŸãã...
_ "@ mikeshenkel" _
PSã¹ãã«ãã¹ã®ãããæåã¯ã¡ãã»ãŒãžã衚瀺ãããŸããã§ããã _ïŒããã¯ç§ãæãããŸããããŠãŒã¶ãŒåã®ã€ã¥ããééããŠãéç¥ãããŸãã...ïŒ_
try
ãããŒã¯ãŒãã§ã¯ãªãçµã¿èŸŒã¿ã«ããåæ©ä»ããšãªãäžäœäºææ§ãžã®åãçµã¿ã«æè¬ããŸãããå¶åŸ¡ãããŒãå€æŽã§ããé »ç¹ã«äœ¿çšãããé¢æ°ïŒ panic
ãšrecover
ã¯éåžžã«ãŸãã§ãïŒãç§ã¯çåã«æããŸããïŒãªãŒãã³ãœãŒã¹ã³ãŒãããŒã¹ã®èå¥åãšããŠtry
ã®é »åºŠã®å€§èŠæš¡ãªåæãè¡ã£ã人ã¯ããŸããïŒ ç§ã¯å¥œå¥å¿æºçã§æççã ã£ãã®ã§ã次ã®é
ç®ã«ã€ããŠäºå調æ»ãè¡ããŸããã
ãããã®ãªããžããªã«ååšããGoã®11,108,770ã®éèŠãªè¡å
šäœã§ãèå¥åãšããŠäœ¿çšãããŠããtry
ã®ã€ã³ã¹ã¿ã³ã¹ã¯63åãããããŸããã§ããã ãã¡ããããããã®ã³ãŒãããŒã¹ïŒå€§ãããåºã䜿çšãããŠãããããèªäœãéèŠã§ãïŒã¯ãGoã³ãŒãã®ããäžéšã«ããããããã«ããã©ã€ããŒãã³ãŒãããŒã¹ãçŽæ¥åæããæ¹æ³ã¯ãããŸãããã確ãã«ããã§ããèå³æ·±ãçµæã§ãã
ããã«ã try
ã¯ãä»ã®ããŒã¯ãŒããšåæ§ã«å°æåã§ãããããããã±ãŒãžã®ãããªãã¯APIã§èŠã€ããããšã¯ã§ããŸããã ããŒã¯ãŒãã®è¿œå ã¯ãããã±ãŒãžã®å
éšã«ã®ã¿åœ±é¿ããŸãã
ããã¯ãã¹ãŠãããŒã¯ãŒããšããŠtry
ã®æ©æµãåãããç§ãããã¯ã¹ã«æå
¥ãããã£ãããã€ãã®ã¢ã€ãã¢ã®åºæã§ãã
以äžã®æ§é ãææ¡ããŸãã
1ïŒãã³ãã©ãŒãªã
// The existing proposal, but as a keyword rather than builtin. When an error is
// "caught", the function returns all zero values plus the error. Nothing
// particularly new here.
func doSomething() (int, error) {
try SomeFunc()
a, b := try AnotherFunc()
// ...
return 123, nil
}
2ïŒãã³ãã©ãŒ
ãšã©ãŒãã³ãã©ãŒã¯ãé¢æ°ã§ã¯ãªãã€ã³ã©ã€ã³åãç®çãšããåçŽãªã³ãŒããããã¯ã§ããããšã«æ³šæããŠãã ããã ããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
func doSomething() (int, error) {
// Inline error handler
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
handler logAndContinue err {
log.Errorf("non-critical error: %v", err)
}
handler annotateAndReturn err {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d := try SomeFunc() else logAndContinue
e, f := try OtherFunc() else annotateAndReturn
// ...
return 123, nil
}
ææ¡ãããå¶éïŒ
try
ã®ã¿å¯èœã§ãã try err
ãããŸãããtry
ãæå®ã§ããŸãã try
ã®ã³ã³ããã¹ãã«åºã¥ãåäœã«å€æŽã¯ãããŸããã ãããã¯ã«ãªãããšã¯ãããŸããïŒã¹ã¬ããã®ååã§èª¬æããããã«ïŒãå©ç¹ïŒ
try
/ else
æ§æã¯ãæ¢åã®ãè€åifãã«ç°¡åã«è±ç³ããããšãã§ããŸããgo
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
go
if a, b, err := SomeFunc(); err != nil {
return 0, errors.Wrap(err, "error in doSomething:")
}
check
/ handle
ã®ããã®ãšã©ãŒåŠçãã¬ãŒã ã¯ãŒã¯ã¯ããã€ã«ã¢ãŠãã«ã®ã¿é©ããŠããããšããæ¹å€ãåé¿ããŸãã ãŸããããã³ãã©ãŒãã§ãŒã³ãã®æ¹å€ãåé¿ããŸãã ãããã®ãã³ãã©ãŒã®1ã€ã«ä»»æã®ã³ãŒããé
眮ããããšãã§ããä»ã®å¶åŸ¡ãããŒã¯æ瀺ãããŸãããsuper return
ãæå³ããããã«ããã³ãã©ãŒå
ã§return
ããã€ãžã£ãã¯ããå¿
èŠã¯ãããŸããã ããŒã¯ãŒãã®ä¹ã£åãã¯éåžžã«æ··ä¹±ããŸãã return
åã«return
ãæå³ãã super return
ã¯å®éã«ã¯å¿
èŠãããŸãããdefer
ã¯ããšã©ãŒåŠçã¡ã«ããºã ãšããŠæå
ãåœãŠãå¿
èŠã¯ãããŸããã ããã¯ãäž»ã«è³æºãªã©ãã¯ãªãŒã³ã¢ããããæ¹æ³ãšããŠèãç¶ããããšãã§ããŸããif err != nil
ãããã¯ãšéåžžã«ãã䌌ãŠããŸããgo vet
ãã§ãã¯ãäœæããã®ã¯éåžžã«ç°¡åã§ãããããã®ã¢ã€ãã¢ãä»ã®ææ¡ãšéåžžã«é¡äŒŒããŠããå Žåã¯ãè©«ã³ããŸãâç§ã¯ããããã¹ãŠã«é ããã«ã€ããŠããããã«åªããŸããããããªãã®ããšãéããå¯èœæ§ããããŸãã
@brynbellomyããŒã¯ãŒãåæãããããšã-ããã¯éåžžã«åœ¹ç«ã€æ
å ±ã§ãã ããŒã¯ãŒããšããŠã®try
ã¯åé¡ãªãããã§ãã ïŒAPIã¯åœ±é¿ãåããªããšãã£ããã£ãŠããŸãããããã¯äºå®ã§ããã try
ã¯ãã©ã¡ãŒã¿ãŒåãªã©ãšããŠè¡šç€ºãããå¯èœæ§ããããããããã¥ã¡ã³ããå€æŽããå¿
èŠããããããããŸããããã ãããããã®ããã±ãŒãžã®ã¯ã©ã€ã¢ã³ãã«ã¯åœ±é¿ããªãããšã«åæããŸããïŒ
ããªãã®ææ¡ã«ã€ããŠïŒååä»ããã³ãã©ãŒããªããŠãåé¡ãããŸãããïŒ ïŒããã«ãããé»åã倱ãããšãªãææ¡ãç°¡çŽ åãããŸããã€ã³ã©ã€ã³ãã³ãã©ãŒããããŒã«ã«é¢æ°ãåŒã³åºãã ãã§æžã¿ãŸããïŒ
ããªãã®ææ¡ã«ã€ããŠïŒååä»ããã³ãã©ãŒããªããŠãåé¡ãããŸãããïŒ ïŒããã«ãããé»åã倱ãããšãªãææ¡ãç°¡çŽ åãããŸããã€ã³ã©ã€ã³ãã³ãã©ãŒããããŒã«ã«é¢æ°ãåŒã³åºãã ãã§æžã¿ãŸããïŒ
@griesemer確ãã«âç§ã¯ããããå«ããããšã«ã€ããŠããªãçã¬ããæãã§ããã 確ãã«ãã£ãšãŽãŒã€ãã·ã¥ãªãã
äžæ¹ã人ã
ã¯return
ã®ã¯ã³ã©ã€ããŒãå«ãã¯ã³ã©ã€ããŒãšã©ãŒåŠçãå®è¡ããæ©èœãæãã§ããããã§ãã å
žåçãªã±ãŒã¹ã¯ãã°ã§ã次ã«return
ã§ãã else
å¥ã§ããŒã«ã«é¢æ°ã«ã·ã§ã«ã¢ãŠããããšãããããããã倱ãããŸãã
a, b := try SomeFunc() else err {
someLocalFunc(err)
return 0, err
}
ïŒãã ããifãåæãããããããã奜ãïŒ
ãã ããã¹ã¬ããã§åè¿°ããåçŽãªgofmt
ã®èª¿æŽãå®è£
ããããšã§ããšã©ãŒã³ã³ããã¹ããè¿œå ããã¯ã³ã©ã€ããŒãªã¿ãŒã³ãååŸã§ããŸãã
a, b := try SomeFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }
äžèšã®ææ¡ã§æ°ããããŒã¯ãŒãã¯å¿ èŠã§ããïŒ ãªãã ãã§ããïŒ
SomeFunc() else return
a, b := SomeOtherFunc() else err { return 0, errors.Wrap(err, "bad stuff!") }
@griesemerãã³ãã©ãŒãããŒãã«ã«æ»ã£ãå Žåã¯ãtry / handleãŸãã¯try / _label_ã®è°è«ã®ããã«æ°ããåé¡ãäœæããããšããå§ãããŸãã ãã®ææ¡ã§ã¯ç¹ã«ãã³ãã©ãŒãçç¥ãããŠããããã³ãã©ãŒãå®çŸ©ããŠåŒã³åºãæ¹æ³ã¯ç¡æ°ã«ãããŸãã
ãã³ãã©ãŒãææ¡ãã人ã¯ãæåã«ãã§ãã¯/ãã³ãã«ãã£ãŒãããã¯ãŠã£ããèªãå¿
èŠããããŸãã ããªãã倢èŠãŠãããã®ã¯äœã§ãããã«ãã§ã«èª¬æãããŠããå¯èœæ§ãé«ãã§ã:-)
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback
@smonkewitzãããããã®ããŒãžã§ã³ã§ã¯ãå²ãåœãŠã¹ããŒãã¡ã³ãã«ãã€ã³ããããŠãããããæ°ããããŒã¯ãŒãã¯å¿ èŠãããŸãããããã¯ããããŸã§ããŸããŸãªæ§æç³è¡£æ§æã§äœåºŠãèšåãããŠããŸããã
https://github.com/golang/go/issues/32437#issuecomment -499808741
https://github.com/golang/go/issues/32437#issuecomment -499852124
https://github.com/golang/go/issues/32437#issuecomment -500095505
@ianlancetaylorã¯ããã®ç¹å®ã®ãšã©ãŒåŠçã®ãã¬ãŒããŒãgoããŒã ã«ãã£ãŠãŸã æ€èšãããŠããŸããïŒ ææ¡ãããçµã¿èŸŒã¿ã®è©Šè¡ã»ã©å®è£ ã¯ç°¡åã§ã¯ãããŸããããããæ £çšçãªæããããŸãã ãäžå¿ èŠãªå£°æãããããªãããã
@deanveloperãšä»ã®æ°äººãèšã£ãããšãç¹°ãè¿ããããšæããŸãããç§èªèº«ã®åŒ·èª¿ããããŸãã https://github.com/golang/go/issues/32437#issuecomment -498939499 @ deanveloperã§æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
try
ã¯æ¡ä»¶ä»ãã®æ»ãå€ã§ãã å¶åŸ¡ãããŒãšãªã¿ãŒã³ã¯ã©ã¡ããGoã®ããã¹ã¿ã«ã§ä¿æãããŸãã é¢æ°å ã®ãã¹ãŠã®å¶åŸ¡ãããŒã¯ã€ã³ãã³ãããããã¹ãŠã®æ»ãå€ã¯return
ã§å§ãŸããŸãã ãããã®æŠå¿µã®äž¡æ¹ãæ··ãåãããŠãèŠéããããé¢æ°åŒã³åºãã«ãããšãå°ãæ°åãæªããªããŸãã
ããã«ããã®ææ¡ã§ã¯ã try
ã¯å€ãè¿ãé¢æ°ã§ããããããã倧ããªåŒã®äžéšãšããŠäœ¿çšã§ããŸãã
panic
ã¯ãå¶åŸ¡ãããŒãå€æŽããçµã¿èŸŒã¿é¢æ°ã®å
äŸããã§ã«èšå®ããŠãããšäž»åŒµãã人ãããŸããã panic
ã¯ã次ã®2ã€ã®çç±ã§æ ¹æ¬çã«ç°ãªããšæããŸãã
äžæ¹ãè©ŠããŠã¿ãŠãã ããïŒ
ãããã®çç±ããã try
ã¯ãå°ãé¢ãããæãã§ã¯ãªããã³ãŒãã®å¯èªæ§ãæ ¹æ¬çã«æãªããšæããŸãã
ä»æ¥ãåããŠGoã³ãŒãã«ééãããšããããããã°ããã¹ããã³ã°ããŠãå¯èœãªåºå£ç¹ãšå¶åŸ¡ãããŒç¹ãèŠã€ããããšãã§ããŸãã ããã¯Goã³ãŒãã®éåžžã«äŸ¡å€ã®ããããããã£ã ãšæããŸãã try
ã䜿çšãããšããã®ããããã£ããªãã³ãŒããæžãã®ãç°¡åã«ãªããããŸãã
ã³ãŒãã®å¯èªæ§ãéèŠããGoéçºè
ã¯ããããã®å¯èªæ§ã®èœãšãç©Žãåé¿ããtry
ã®äœ¿çšæ³ã®ã€ãã£ãªã ã«åæããå¯èœæ§ãé«ãããšãèªããŸãã ã³ãŒãã®å¯èªæ§ã¯å€ãã®Goéçºè
ã«ãšã£ãŠã³ã¢ããªã¥ãŒã§ããããã«æãããã®ã§ããããªãããšãé¡ã£ãŠããŸãã ãããã try
ãæ¢åã®ã³ãŒãã€ãã£ãªã ã«ååãªäŸ¡å€ãè¿œå ããŠã誰ããåŠç¿ã§ããããã«èšèªã«æ°ããæŠå¿µãè¿œå ãããšããéã¿ãæã¡ããããèªã¿ããããæãªãå¯èœæ§ãããããšã¯ç§ã«ã¯æããã§ã¯ãããŸããã
`` ``
if itïŒ= "broke" {
dontFixïŒitïŒ
}
@ChrisHinesèŠç¹ïŒãã®ã¹ã¬ããã®ä»ã®å Žæã«ãšã³ãŒãããŸãïŒã«ãå¥ã®å¶éãè¿œå ããŸãããïŒ
try
ã¹ããŒãã¡ã³ãïŒãã³ãã©ãŒããªãå Žåã§ãïŒã¯ãç¬èªã®è¡ã§çºçããå¿
èŠããããŸããããã§ããèŠèŠçãªãã€ãºã倧å¹
ã«æžããããšã§ã¡ãªãããåŸãããŸãã 次ã«ã return
ã§ã¢ãããŒã·ã§ã³ãä»ãããããªã¿ãŒã³ãšã try
ã§ã¢ãããŒã·ã§ã³ãä»ããããæ¡ä»¶ä»ããªã¿ãŒã³ãä¿èšŒããããããã®ããŒã¯ãŒãã¯åžžã«è¡ã®å
é ïŒãŸãã¯ææªã®å Žåãå€æ°ã®å²ãåœãŠã®çŽåŸïŒã«ãªããŸãã
ãããã£ãŠããã®ã¿ã€ãã®ãã³ã»ã³ã¹ã¯ãããŸããã
try EmitEvent(try (try DecodeMsg(m)).SaveToDB())
ãããããïŒ
dm := try DecodeMsg(m)
um := try dm.SaveToDB()
try EmitEvent(um)
ããã¯ãŸã ãããããæ確ã«æããŸãïŒ
dm, err := DecodeMsg(m)
if err != nil {
return nil, err
}
um, err := dm.SaveToDB()
if err != nil {
return nil, err
}
err = EmitEvent(um)
if err != nil {
return nil, err
}
ãã®èšèšã§ç§ãæ°ã«å
¥ã£ãŠããããšã®1ã€ã¯ããšã©ãŒãçºçããå¯èœæ§ãããããšãéç¥ããã«ããšã©ãŒãé»ã£ãŠç¡èŠããããšã¯äžå¯èœã§ãããšããããšã§ãã çŸåšã x, _ := SomeFunc()
ïŒç¡èŠãããæ»ãå€ãšã¯äœã§ããïŒãšã©ãŒïŒäœãä»ã®ãã®ã§ããïŒïŒã衚瀺ãããããšããããŸãããæ確ã«æ³šéãä»ããå¿
èŠããããŸãã
x := try SomeFunc() else err {}
ææ¡ãæ¯æããååã®æ皿以æ¥ã @ jagv ïŒãã©ã¡ãŒã¿ãŒãªãã®try
ã¯*error
$ãè¿ãïŒãš@josharian ïŒã©ãã«ä»ããšã©ãŒãã³ãã©ãŒïŒã«ãã£ãŠæçš¿ããã2ã€ã®ã¢ã€ãã¢ãèŠãŠããŸããããããã«å€æŽããããã©ãŒã ã¯ãææ¡ã倧å¹
ã«åŒ·åããŸãã
ãããã®ã¢ã€ãã¢ãç§ãæã£ãŠããå¥ã®ã¢ã€ãã¢ãšçµã¿åããããšã try
ã®4ã€ã®ããŒãžã§ã³ããããŸãïŒ
defer
ã¹ããŒãã¡ã³ãã§ä¿®é£Ÿã§ããŸããããã¯éåžžã defer
ãããç°¡åã§é«éãªã®ã§ããšã©ãŒãè£
食ããïŒãŸãã¯ããŒã«ã«ã§åŠçããŠããnilãè¿ãïŒããã®ããè¯ãæ¹æ³ã§ããããã«æãããŸãã ãããæ°ã«å
¥ããªãã£ã人ã¯èª°ã§ãïŒ2ã䜿ãããšãã§ããŸãã
ãšã©ãŒåŠçã©ãã«/ã³ãŒããé¢æ°ã®çµããè¿ãã«é 眮ããé¢æ°æ¬äœã®æ®ãã®éšåã«æ»ããªãããã«ããããšããå§ãããŸãã ãã ããã³ã³ãã€ã©ã匷å¶ããå¿ èŠã¯ãªããšæããŸããããã¯ãã³ã³ãã€ã©ãæçšã§ããå Žåãããããããã®å Žåã匷å¶ãé£ããå Žåãããããã§ãã
ãããã£ãŠãéåžžã®ã©ãã«ãšgoto
ã®åäœã¯ãïŒ @ josharianãèšã£ãããã«ïŒãµããžã§ã¯ããæåã«ä¿®æ£ãããïŒ26058ã«é©çšããŸããããšã«ããä¿®æ£ããå¿
èŠããããšæããŸãã
ã©ãã«ã®ååãpanic
ã«ããããšã¯ã§ããŸãããããã¯ãïŒ4ãšç«¶åããããã§ãã
panic
ã«ãªããŸãã ãããã£ãŠããããç¹å®ã®é¢æ°ã§äœ¿çšãããtry
ã®å¯äžã®ããŒãžã§ã³ã§ããå ŽåãERPã¯å¿
èŠãããŸããããããè¿œå ããã®ã§ããã¹ãããã±ãŒãžã¯ãçµã¿èŸŒã¿ã®å€æŽããã®ä»ã®å€æŽãå¿ èŠãšããã«ãçŸåšãšåãããã«æ©èœããŸãã ãã ããä»ã®_èŽåœçãª_ã·ããªãªã§ã圹ç«ã€å ŽåããããŸãã
ããã¯ããšã©ãŒãã³ãã©ãŒã«åå²ããŠãããã¯ã«é¥ã代ããã«ãERPãå¿
èŠã«ãªãããã try
ã®å¥ã®ããŒãžã§ã³ã§ããå¿
èŠããããŸãã
æåã®ææ¡ã«å¯Ÿããæã匷åãªã¿ã€ãã®åå¿ã®1ã€ã¯ãé¢æ°ãæ»ãå Žæã®éåžžã®ãããŒã®å®¹æãªå¯èŠæ§ã倱ãããšã«é¢ããæžå¿µã§ããã
ããšãã°ã @ deanveloperã¯ã httpsïŒ //github.com/golang/go/issues/32437#issuecomment -498932961ã§ãã®æžå¿µãéåžžã«ããè¡šçŸããŸãããããã¯ãããã§æãè³æãããã³ã¡ã³ãã ãšæããŸãã
@dominikhã¯https://github.com/golang/go/issues/32437#issuecomment-499067357ã«æžã蟌ã¿ãŸããïŒ
gofmtãããã³ãŒãã§ã¯ãreturnã¯åžžã«/ ^ \ t * return /ãšäžèŽããŸããããã¯ãæ¯æŽãªãã§ç®ã§ç¢ºèªããã®ã¯éåžžã«ç°¡åãªãã¿ãŒã³ã§ãã äžæ¹ãtryã¯ã³ãŒãå ã®ã©ãã§ãçºçããå¯èœæ§ããããé¢æ°åŒã³åºãã®å¥¥æ·±ãã«ä»»æã«ãã¹ããããŸãã ã©ããªã«å€ãã®ãã¬ãŒãã³ã°ãè¡ã£ãŠããããŒã«ã®æ¯æŽãªãã«ãé¢æ°å ã®ãã¹ãŠã®å¶åŸ¡ãããŒãããã«èŠã€ããããšãã§ããŸãã
ãããå©ããããã«ã @ brynbellomyã¯æšæ¥ææ¡ããŸããïŒ
ãã¹ãŠã®tryã¹ããŒãã¡ã³ãïŒãã³ãã©ãŒããªãå Žåã§ãïŒã¯ãç¬èªã®è¡ã§çºçããå¿ èŠããããŸãã
ããã«èšãã°ãå²ãåœãŠã®å Žåã§ãã try
ãè¡ã®å
é ã§ããå¿
èŠããããŸãã
ãããã£ãŠã次ã®ããã«ãªããŸãã
try dm := DecodeMsg(m)
try um := dm.SaveToDB()
try EmitEvent(um)
以äžã§ã¯ãªãïŒ @brynbellomyã®äŸããïŒïŒ
dm, err := DecodeMsg(m)
if err != nil {
return nil, err
}
um, err := dm.SaveToDB()
if err != nil {
return nil, err
}
err = EmitEvent(um)
if err != nil {
return nil, err
}
ããã¯ãç·šéè ãIDEã®æ¯æŽããªããŠãããã€ã©ãŒãã¬ãŒããæžãããªãããããªãã®éã®å¯èŠæ§ãç¶æããããã§ãã
ããã¯ãååä»ãçµæãã©ã¡ãŒã¿ãŒã«äŸåããçŸåšææ¡ãããŠãã延æããŒã¹ã®ã¢ãããŒãã§æ©èœããããéåžžã®ãã³ãã©ãŒé¢æ°ãæå®ããŠæ©èœããå¯èœæ§ããããŸãã ïŒååä»ãã®æ»ãå€ãå¿ èŠãšããã«ãã³ãã©ãŒé¢æ°ãæå®ããããšã¯ãååä»ãã®æ»ãå€ãå¿ èŠãšãããããç§ã«ã¯è¯ãããã«æããŸãããããã¯å¥ã®ãã€ã³ãã§ãïŒã
ææ¡ã«ã¯æ¬¡ã®äŸãå«ãŸããŠããŸãã
info := try(try(os.Open(file)).Stat()) // proposed try built-in
代ããã«æ¬¡ã®ããã«ãªããŸãã
try f := os.Open(file)
try info := f.Stat()
ããã¯ãææ¡ãããæ§æã»ã©çãã¯ãªãã«ããŠããä»æ¥èª°ããæžããããããªããã®ãšæ¯èŒããŠããã€ã©ãŒãã¬ãŒãã®åæžã§ãã ããããããã¯ååã«çãã§ãããïŒ
@ elagergren-spideroakã¯ãã®äŸãæäŸããŸããïŒ
try(try(try(to()).parse().this)).easily())
ç§ã¯ããããã¹ããããªparensãæã£ãŠãããšæããŸããããã¯ããããæå³çãªãã€ã³ããŸãã¯åŸ®åŠãªãŠãŒã¢ã¢ã®ãããã§ããããã§ãã®äŸã2 try
ãŸãã¯3 try
ãæã€ããšãæå³ããŠãããã©ããã¯ããããŸããã ãããã«ãããããããtry
ã§å§ãŸã2ã3è¡ã«åæ£ããå¿
èŠãããã§ãããã
@thepudds ãããã¯ç§ã以åã®ã³ã¡ã³ãã§åŸãŠãããã®ã§ãã äžãããããã®ãé€ããŠ
try f := os.Open(file)
try info := f.Stat()
æãããªããšã¯ã try
ããè€æ°ã®æãæ¬åŒ§ã§å²ãããšãã§ããtryãããã¯ãšèããããšã§ãã ãããã£ãŠãäžèšã¯
try (
f := os.Open(file)
into := f.Stat()
)
ã³ã³ãã€ã©ãããã«å¯ŸåŠããæ¹æ³ãç¥ã£ãŠããå Žåãåãããšããã¹ãã«ãæ©èœããŸãã ã ããä»ãäžèšã¯
try info := os.Open(file).Stat()
é¢æ°ã®ã·ã°ããã£ãããã³ã³ãã€ã©ã¯Openããšã©ãŒå€ãè¿ãå¯èœæ§ãããããšãèªèããŠãããtryãããã¯ã«ããããããšã©ãŒåŠçãçæããŠããããã©ã€ããªæ»ãå€ã«å¯ŸããŠStatïŒïŒãåŒã³åºãå¿ èŠããããŸãã
次ã«ããšã©ãŒå€ãçæãããŠããªãããããŒã«ã«ã§åŠçãããã¹ããŒãã¡ã³ããèš±å¯ããŸãã ã ããããªãã¯ä»èšãããšãã§ããŸã
try (
f := os.Open(file)
debug("f: %v\n", f) // debug returns nothing
into := f.Stat()
)
ããã«ãããtryãããã¯ãåé 眮ããã«ã³ãŒããé²åãããããšãã§ããŸãã ããããããã€ãã®å¥åŠãªçç±ã§ããšã©ãŒåŠçã¯æ瀺çã«èª¬æããå¿ èŠããããšäººã ã¯èããŠããããã§ãã 圌ãã¯æ¬²ãã
try(try(try(to()).parse()).this)).easily())
ç§ã¯å®å šã«å æ°ã§ãã
try to().parse().this().easily()
ã©ã¡ãã®å Žåã§ãããŸã£ããåããšã©ãŒãã§ãã¯ã³ãŒããçæã§ããŸãã ç§ã®èŠè§£ã§ã¯ãå¿
èŠã«å¿ããŠãã€ã§ããšã©ãŒåŠççšã®ç¹å¥ãªã³ãŒããæžãããšãã§ããŸãã try
ïŒãŸãã¯ä»»æã®åŒã³åºãæ¹ïŒã¯ãããã©ã«ãã®ãšã©ãŒåŠçïŒåŒã³åºãå
ã«ãã³ãããããšïŒãåçŽã«æŽçããŸãã
ãã1ã€ã®å©ç¹ã¯ãã³ã³ãã€ã©ãŒãããã©ã«ãã®ãšã©ãŒåŠçãçæããå Žåãäžèšã®4ã€ã®æ©èœã®ã©ãã倱æããããç¥ãããšãã§ããããã«ãããã«èå¥æ å ±ãè¿œå ã§ããããšã§ãã
try
ãä»ã®åŒã®äžã«çŸããããã°ã©ã ã®èªã¿ãããã«ã€ããŠå°ãå¿é
ããŸããã ããã§ãæšæºã©ã€ãã©ãªã§grep "return .*err$"
ãå®è¡ãããããã¯ãã©ã³ãã ã«èªã¿å§ããŸããã 7214件ã®çµæããããŸãããç§ã¯æ°çŸä»¶ããèªãã§ããŸããã
æåã«æ³šæãã¹ãããšã¯ã try
ãé©çšãããå Žåããããã®ãããã¯ã®ã»ãšãã©ãã¹ãŠãããå°ãèªã¿ããããªãããšã§ãã
2ã€ç®ã¯ããããã®ãã¡10åã®1æªæºã®ããå°æ°ããå¥ã®åŒã®äžã«try
ãå
¥ããããšã§ãã å
žåçãªã±ãŒã¹ã¯ã x := try(...)
ãŸãã¯^try(...)$
ã®åœ¢åŒã®ã¹ããŒãã¡ã³ãã§ãã
try
ãå¥ã®åŒã®äžã«è¡šç€ºãããããã€ãã®äŸã次ã«ç€ºããŸãã
ããã¹ã/ãã³ââãã¬ãŒã
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
lessOrEqual, err := le(arg1, arg2)
if err != nil {
return false, err
}
return !lessOrEqual, nil
}
ã«ãªããŸãïŒ
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
return !try(le(arg1, arg2)), nil
}
ããã¹ã/ãã³ââãã¬ãŒã
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
index, err := prepareArg(index, v.Type().Key())
if err != nil {
return reflect.Value{}, err
}
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
ã«ãªããŸã
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
if x := v.MapIndex(try(prepareArg(index, v.Type().Key()))); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
ïŒããã¯ç§ãèŠãäžã§æãçãããäŸã§ãïŒ
æ£èŠè¡šçŸ/æ§æïŒ
regexp/syntax/parse.go
func Parse(s string, flags Flags) (*Regexp, error) {
...
if c, t, err = nextRune(t); err != nil {
return nil, err
}
p.literal(c)
...
}
ã«ãªããŸã
func Parse(s string, flags Flags) (*Regexp, error) {
...
c, t = try(nextRune(t))
p.literal(c)
...
}
ããã¯å¥ã®åŒã®äžã§è©ŠããŠã¿ãäŸã§ã¯ãããŸããããèªã¿ããããåäžãããããã«åŒã³åºããããšæããŸãã ããã§ã c
ãšt
ã®å€ãifã¹ããŒãã¡ã³ãã®ç¯å²ãè¶
ããŠååšããŠããããšã確èªããã®ã¯ã¯ããã«ç°¡åã§ãã
ããã/ http
net / http / request.goïŒreadRequest
mimeHeader, err := tp.ReadMIMEHeader()
if err != nil {
return nil, err
}
req.Header = Header(mimeHeader)
ã«ãªããŸãïŒ
req.Header = Header(try(tp.ReadMIMEHeader())
ããŒã¿ããŒã¹/ SQL
if driverCtx, ok := driveri.(driver.DriverContext); ok {
connector, err := driverCtx.OpenConnector(dataSourceName)
if err != nil {
return nil, err
}
return OpenDB(connector), nil
}
ã«ãªããŸã
if driverCtx, ok := driveri.(driver.DriverContext); ok {
return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
}
ããŒã¿ããŒã¹/ SQL
si, err := ctxDriverPrepare(ctx, dc.ci, query)
if err != nil {
return nil, err
}
ds := &driverStmt{Locker: dc, si: si}
ã«ãªããŸã
ds := &driverStmt{
Locker: dc,
si: try(ctxDriverPrepare(ctx, dc.ci, query)),
}
ããã/ http
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
cc, err := p.t.dialclientconn(addr, singleuse)
if err != nil {
return nil, err
}
return cc, nil
}
ã«ãªããŸã
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
return try(p.t.dialclientconn(addr, singleuse))
}
ããã/ http
func (f *http2Framer) endWrite() error {
...
n, err := f.w.Write(f.wbuf)
if err == nil && n != len(f.wbuf) {
err = io.ErrShortWrite
}
return err
}
ã«ãªããŸã
func (f *http2Framer) endWrite() error {
...
if try(f.w.Write(f.wbuf) != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
ïŒããã¯ç§ãæ¬åœã«å¥œãã§ããïŒ
ããã/ http
if f, err := fr.ReadFrame(); err != nil {
return nil, err
} else {
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
ã«ãªããŸã
hc = try(fr.ReadFrame()).(*http2ContinuationFrame)// guaranteed by checkFrameOrder
}
ïŒãŸãããã§ããïŒ
ãããïŒ
if ctrlFn != nil {
c, err := newRawConn(fd)
if err != nil {
return err
}
if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
return err
}
}
ã«ãªããŸã
if ctrlFn != nil {
try(ctrlFn(fd.ctrlNetwork(), laddr.String(), try(newRawConn(fd))))
}
å€åããã¯å€ãããŸãããããŠä»£ããã«ããã¯ããããã¹ãã§ãïŒ
if ctrlFn != nil {
c := try(newRawConn(fd))
try(ctrlFn(fd.ctrlNetwork(), laddr.String(), c))
}
å
šäœãšããŠãç§ãèªãã æšæºã©ã€ãã©ãªã³ãŒãã«å¯Ÿããtry
ã®å¹æãéåžžã«æ¥œããã§ããŸãã
æåŸã®ãã€ã³ãïŒææ¡ã®ããã€ãã®äŸãè¶
ããŠã³ãŒããèªãããã«try
ãé©çšãããã®ãèŠãã®ã¯ãåçºçã§ããã try
ã䜿çšããããã«ã³ãŒããèªåçã«å€æããããŒã«ãäœæããããšãæ€èšãã䟡å€ããããšæããŸãïŒããã°ã©ã ã®ã»ãã³ãã£ã¯ã¹ã¯å€æŽãããŸããïŒã githubã§äººæ°ã®ããããã±ãŒãžã«å¯ŸããŠçæãããdiffã®ãµã³ãã«ãèªãã§ãæšæºã©ã€ãã©ãªã§èŠã€ãããã®ãç¶æããããã©ããã確èªããã®ã¯èå³æ·±ãããšã§ãã ãã®ãããªããã°ã©ã ã®åºåã¯ãææ¡ã®å¹æã«ã€ããŠã®è¿œå ã®æŽå¯ãæäŸããå¯èœæ§ããããŸãã
@crawshawãããããŠãããŠããããšãããããå®éã«åããŠããã®ãèŠãã®ã¯çŽ æŽãããã£ãã ãããããããå®éã«åäœããŠããã®ãèŠããšããããŸã§åŽäžããŠããã€ã³ã©ã€ã³ãšã©ãŒåŠçã«å¯Ÿããè°è«ãããçå£ã«åãæ¢ããããšãã§ããŸããã
ããã¯ã try
ãã¹ããŒãã¡ã³ãã«ãããšãã@thepuddsã®èå³æ·±ãææ¡ã«éåžžã«è¿ãããããã®æ§æã䜿çšããŠãã¹ãŠã®äŸãæžãçŽããåŒtry
ãŸãã¯çŸç¶ç¶æãäœåãªè¡ãããŸãå¿
èŠãšããªãïŒ
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
try lessOrEqual := le(arg1, arg2)
return !lessOrEqual, nil
}
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
try index := prepareArg(index, v.Type().Key())
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
func Parse(s string, flags Flags) (*Regexp, error) {
...
try c, t = nextRune(t)
p.literal(c)
...
}
try mimeHeader := tp.ReadMIMEHeader()
req.Header = Header(mimeHeader)
if driverCtx, ok := driveri.(driver.DriverContext); ok {
try connector := driverCtx.OpenConnector(dataSourceName)
return OpenDB(connector), nil
}
ããã¯ãåŒã䜿çšããæ¹ãééããªãåªããŠããŸãtry
ç·šéããå¿
èŠã®ãããã£ãŒã«ããè€æ°ããå Žåã¯ã try
ã§ãããããã§ããã®ãã¬ãŒããªãã®ãã©ã³ã¹ãåªå
ããŸã
try si := ctxDriverPrepare(ctx, dc.ci, query)
ds := &driverStmt{Locker: dc, si: si}
ããã¯åºæ¬çã«ããã®ææªã®ã±ãŒã¹ã§ãããåââé¡ãªãããã«èŠããŸãã
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
try cc := p.t.dialclientconn(addr, singleuse)
return cc, nil
}
ç§ã¯if try
ãåæ³ã§ãããåæ³ã§ãããã«ã€ããŠèªåèªèº«ã§è°è«ããŸãããããªãåæ³ã§ããå¿
èŠããªãã®ãã«ã€ããŠåççãªèª¬æãæãä»ãããšãã§ãããããã§éåžžã«ããŸãæ©èœããŸãã
func (f *http2Framer) endWrite() error {
...
if try n := f.w.Write(f.wbuf); n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
try f := fr.ReadFrame()
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
if ctrlFn != nil {
try c := newRawConn(fd)
try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
}
@crawshawã®äŸãã¹ãã£ã³ãããšãå¶åŸ¡ãããŒãèšèšã«ããã«æ³šæãæãã®ã«ååãªã»ã©æå·åãããŠããªãããšããããããšç¢ºä¿¡ã§ããŸãã å°ãã§ãè€éããé¢é£ä»ãããšãèªã¿ã«ãããªãã倱æãããããªããŸãã ãªãã·ã§ã³ãæ€èšãããŠããã®ãèŠãŠããããã§ããããã®ãããªä¿è·ãããèšèªã§ã®å¶åŸ¡ãããŒãè€éã«ããããšã¯ãéåžžã«æ§æ Œãæªãããã§ãã
func (f *http2Framer) endWrite() error {
...
if try(f.w.Write(f.wbuf) != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
ãŸãã try
ã¯äœããè©Šè¡ãããŠããŸããã ããã¯ãä¿è·ãªã¬ãŒãã§ãã ææ¡ã®åºæ¬ã»ãã³ãã£ã¯ã¹ããªãã®å Žåãçµæã®ã³ãŒãã«ãåé¡ãããã®ã¯é©ãã§ã¯ãããŸããã
func (f *http2Framer) endWrite() error {
...
relay n := f.w.Write(f.wbuf)
return checkShortWrite(n, len(f.wbuf))
}
ã¹ããŒãã¡ã³ããè©ŠããŠã¿ãå Žåã¯ããã©ã°ã䜿çšããŠãã©ã®æ»ãå€ãšã©ã®ã¢ã¯ã·ã§ã³ã瀺ãããšãã§ããŸãã
try c, @ := newRawConn(fd) // return
try c, <strong i="6">@panic</strong> := newRawConn(fd) // panic
try c, <strong i="7">@hname</strong> := newRawConn(fd) // invoke named handler
try c, <strong i="8">@_</strong> := newRawConn(fd) // ignore, or invoke "ignored" handler if defined
å°ãªããšããããã¯ãšç¡èŠã¢ã¯ã·ã§ã³ã«ã¯ããµãåŒæ§æãå¿ èŠã§ãïŒRussã¯ãããèŠä»¶ã§ãããšè¿°ã¹ãŠããŸãïŒã
ãŸãã @ crawshawããçŽ200ã®å®éã®äŸãèŠãŠãäžèšã®åœŒã®ææ ®æ·±ãèšäºã«æéãå²ããŠãããããšã«ææãéããŸãã
次ã«ã @ jimmyfrasche ã http2Framer
ã®äŸã«é¢ããããã§ã®åçã«ã€ããŠïŒ
ç§ã¯
if try
ãåæ³ã§ãããåæ³ã§ãããã«ã€ããŠèªåèªèº«ã§è°è«ããŸãããããªãåæ³ã§ããå¿ èŠããªãã®ãã«ã€ããŠåççãªèª¬æãæãä»ãããšãã§ãããããã§éåžžã«ããŸãæ©èœããŸãã`` `
funcïŒf * http2FramerïŒendWriteïŒïŒãšã©ãŒ{
..ã
nãè©ŠããŠã¿ãå ŽåïŒ= fwWriteïŒf.wbufïŒ; nïŒ= lenïŒf.wbufïŒ{
io.ErrShortWriteãè¿ããŸã
}
nilãè¿ã
}
At least under what I was suggesting above in https://github.com/golang/go/issues/32437#issuecomment-500213884, under that proposal variation I would suggest `if try` is not allowed.
That `http2Framer` example could instead be:
funcïŒf * http2FramerïŒendWriteïŒïŒãšã©ãŒ{
..ã
nãè©ŠããŠãã ããïŒ= fwWriteïŒf.wbufïŒ
nïŒ= lenïŒf.wbufïŒ{ã®å Žå
io.ErrShortWriteãè¿ããŸã
}
nilãè¿ã
}
``
That is one line longer, but hopefully still "light on the page". Personally, I think that (arguably) reads more cleanly, but more importantly it is easier to see the
try`ã
@deanveloperã¯äžèšã®https://github.com/golang/go/issues/32437#issuecomment-49892961ã«æžã蟌ã¿ãŸããã
é¢æ°ããæ»ãããšã¯ãç¥èãªãããšã ã£ãããã§ã
ãã®ç¹å®ã®http2Framer
ã®äŸã¯ãæçµçã«ã¯å¯èœãªéãçãã¯ãªããŸããã ãã ãã try
ãè¡ã®æåã®ãã®ã§ãªããã°ãªããªãå Žåã¯ãé¢æ°ããã®åŸ©åž°ããããç¥èãªããã®ã«ããŸãã
@crawshawã¯èšåããŸããïŒ
2ã€ç®ã¯ããããã®ãã¡10åã®1æªæºã®ããå°æ°ããå¥ã®åŒã®äžã«è©ŠããŠã¿ããšããããšã§ãã å žåçãªã±ãŒã¹ã¯ãxïŒ= tryïŒ...ïŒãŸãã¯^ tryïŒ...ïŒ$ã®åœ¢åŒã®ã¹ããŒãã¡ã³ãã§ãã
ç¹ã«ã$ïŒ try
try
ãè¡ã®æåã®ãã®ã§ããå¿
èŠããããŸããïŒ
@jimmyfrasche
@crawshawãããããŠãããŠããããšãããããå®éã«åããŠããã®ãèŠãã®ã¯çŽ æŽãããã£ãã ãããããããå®éã«åäœããŠããã®ãèŠããšããããŸã§åŽäžããŠããã€ã³ã©ã€ã³ãšã©ãŒåŠçã«å¯Ÿããè°è«ãããçå£ã«åãæ¢ããããšãã§ããŸããã
ããã¯ã
try
ãã¹ããŒãã¡ã³ãã«ãããšãã@thepuddsã®èå³æ·±ãææ¡ã«éåžžã«è¿ãããããã®æ§æã䜿çšããŠãã¹ãŠã®äŸãæžãçŽããåŒtry
ãŸãã¯çŸç¶ç¶æãäœåãªè¡ãããŸãå¿ èŠãšããªãïŒfunc gt(arg1, arg2 reflect.Value) (bool, error) { // > is the inverse of <=. try lessOrEqual := le(arg1, arg2) return !lessOrEqual, nil }
æåã®äŸã¯ãç§ãåŒtry
ã匷ã奜ãçç±ããã瀺ããŠããŸãã ããªãã®ããŒãžã§ã³ã§ã¯ã le
ã®åŒã³åºãã®çµæãå€æ°ã«å
¥ããå¿
èŠããããŸããããã®å€æ°ã«ã¯ã le
ãšããçšèªããŸã æå³ããŠããªããšããæå³ã¯ãããŸããã ãããã£ãŠãæå³ããªãïŒ x
ã®ããã«ïŒãŸãã¯åé·ãªïŒ lessOrEqual
ã®ããã«ïŒååãä»ããããšã¯ã§ããŸããã åŒtry
ã䜿çšãããšãäžéå€æ°ã¯å¿
èŠãªãããããã®åé¡ã¯çºçããŸããã
å¿åã®ãŸãŸã«ããŠããã»ããããååãçºæããããã«ã粟ç¥çãªåªåãè²»ããå¿ èŠã¯ãããŸããã
try
ïŒããŒã¯ãŒãïŒãè¡ã®å
é ã«ç§»åãããæåŸã®ããã€ãã®æçš¿ã®èåŸã§ãµããŒããæäŸã§ããããšãããããæããŸãã return
ãšåãèŠèŠç©ºéãå
±æããå¿
èŠããããŸãã
ReïŒ @jimmyfrascheãè€åif
ã¹ããŒãã¡ã³ãå
ã§try
ãèš±å¯ãããšããææ¡ã¯ãããã€ãã®çç±ãããããã§å€ãã®äººãé¿ããããšããŠããããšãšãŸã£ããåãã§ãã
try
åŒãå®éã«æåã«è©äŸ¡ãããé¢æ°ãè¿ãããå¯èœæ§ããããŸããã if
ã®åŸã«è¡šç€ºãããŸããtry
ãå®éã«åŠçãããŠããªãããšããããã«ãããªããŸãïŒãŸã£ããç°ãªãåé¡ãåŠçããŠããå Žåã§ãïŒtry
ãåŠçããããã«äººã
ãä¿ãããšã奜ãããããã«ç°ãªãè§åºŠãããã®ç¶æ³ã«ã¢ãããŒãããããšãã§ããŸãã try
/ else
æ§æã«åŸç¶ã®æ¡ä»¶ãå«ããããšãèš±å¯ããã®ã¯ã©ãã§ããïŒããã¯ã err
ãšn
ã®äž¡æ¹ãè¿ãå€ãã®I / Oé¢æ°ã§äžè¬çãªãã¿ãŒã³ã§ãã
func (f *http2Framer) endWrite() error {
// ...
try n := f.w.Write(f.wbuf) else err {
return errors.Wrap(err, "error writing:")
} else if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
.Write
ã«ãã£ãŠè¿ããããšã©ãŒãåŠçããªãå Žåã§ãã .Write
ããšã©ãŒã«ãªãå¯èœæ§ããããšããæ確ãªæ³šéããããŸãïŒ@thepuddsãææããŠããããã«ïŒã
func (f *http2Framer) endWrite() error {
// ...
try n := f.w.Write(f.wbuf)
if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
2çªç®ã®@davedã®å¿çã ç§ã®æèŠã§ã¯ã @ crawshawã匷調衚瀺ããåäŸã¯ã try
ã®çµæãšããŠãæ確ã§ãªããªãããšã©ãŒãçºçãããããªããŸããã
try
ïŒããŒã¯ãŒãïŒãè¡ã®å é ã«ç§»åãããæåŸã®ããã€ãã®æçš¿ã®èåŸã§ãµããŒããæäŸã§ããããšãããããæããŸããreturn
ãšåãèŠèŠç©ºéãå ±æããå¿ èŠããããŸãã
ãã®ç¹ã§2ã€ã®ãªãã·ã§ã³ãããã1ã€ãéžæãããå°æ¥ã®æœåšçãªæ©èœã®åäŸãšãªããšä»®å®ãããšã次ã®ããã«ãªããŸãã
A.ïŒ
try f := os.Open(filepath) else err {
return errors.Wrap(err, "can't open")
}
B.ïŒ
f := try os.Open(filepath) else err {
return errors.Wrap(err, "can't open")
}
2ã€ã®ãã¡ã©ã¡ãããå°æ¥ã®æ°ããããŒã¯ãŒãã®äœ¿çšã«å¯ŸããŠããæè»æ§ãæäŸããŸããïŒ _ïŒç§ã¯ã³ã³ãã€ã©ãŒãæžããšããããŒã¯ã¢ãŒãããã¹ã¿ãŒããŠããªãã®ã§ãããã«å¯Ÿããçãã¯ããããŸãããïŒ_ããã¢ãããŒãã¯å¥ã®ã¢ãããŒããããå¶éããããŸããïŒ
@davecheney @daved @crawshaw
ç§ã¯ããã«ã€ããŠDavesã«åæããåŸåããããŸãã @ crawshawã®äŸã§ã¯ãä»ã®å€ãã®ããšãè¡ãããŠããè¡ã®å¥¥æ·±ãã«åã蟌ãŸããtry
ã¹ããŒãã¡ã³ãããããããããŸãã åºå£ç¹ãèŠã€ããã®ã¯æ¬åœã«é£ããã ããã«ãããã€ãã®äŸã§ã¯ã try
ã®ãã¬ã³ãããªãã²ã©ãä¹±éã«ãªã£ãŠããããã§ãã
ãã®ããã«å€æãããäžé£ã®stdlibã³ãŒããèŠããšéåžžã«äŸ¿å©ãªã®ã§ãåãäŸãåãäžããŸããããããå¶éã®å³ãã代æ¿æ¡ã«åŸã£ãŠæžãçŽããŸããã
try
try
try
ã¯è¡ã®å
é ã«ããå¿
èŠããããŸãããŸãããã°ãããã¯ç§ãã¡ãæ¯èŒããã®ã«åœ¹ç«ã€ã§ãããã å人çã«ã¯ããããã®äŸã¯å
ã®äŸãããã¯ããã«ç°¡æœã«èŠããŸãããå¶åŸ¡ãããŒãææ§ã«ããããšã¯ãããŸããã try
ã¯ã䜿çšãããŠããå Žæãªãã©ãã§ãéåžžã«ç®ç«ã¡ãŸãã
ããã¹ã/ãã³ââãã¬ãŒã
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
lessOrEqual, err := le(arg1, arg2)
if err != nil {
return false, err
}
return !lessOrEqual, nil
}
ã«ãªããŸãïŒ
func gt(arg1, arg2 reflect.Value) (bool, error) {
// > is the inverse of <=.
try lessOrEqual := le(arg1, arg2)
return !lessOrEqual, nil
}
ããã¹ã/ãã³ââãã¬ãŒã
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
index, err := prepareArg(index, v.Type().Key())
if err != nil {
return reflect.Value{}, err
}
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
ã«ãªããŸã
func index(item reflect.Value, indices ...reflect.Value) (reflect.Value, error) {
...
switch v.Kind() {
case reflect.Map:
try index := prepareArg(index, v.Type().Key())
if x := v.MapIndex(index); x.IsValid() {
v = x
} else {
v = reflect.Zero(v.Type().Elem())
}
...
}
}
æ£èŠè¡šçŸ/æ§æïŒ
regexp/syntax/parse.go
func Parse(s string, flags Flags) (*Regexp, error) {
...
if c, t, err = nextRune(t); err != nil {
return nil, err
}
p.literal(c)
...
}
ã«ãªããŸã
func Parse(s string, flags Flags) (*Regexp, error) {
...
try c, t = nextRune(t)
p.literal(c)
...
}
ããã/ http
net / http / request.goïŒreadRequest
mimeHeader, err := tp.ReadMIMEHeader()
if err != nil {
return nil, err
}
req.Header = Header(mimeHeader)
ã«ãªããŸãïŒ
try mimeHeader := tp.ReadMIMEHeader()
req.Header = Header(mimeHeader)
ããŒã¿ããŒã¹/ SQL
if driverCtx, ok := driveri.(driver.DriverContext); ok {
connector, err := driverCtx.OpenConnector(dataSourceName)
if err != nil {
return nil, err
}
return OpenDB(connector), nil
}
ã«ãªããŸã
if driverCtx, ok := driveri.(driver.DriverContext); ok {
try connector := driverCtx.OpenConnector(dataSourceName)
return OpenDB(connector), nil
}
ããŒã¿ããŒã¹/ SQL
si, err := ctxDriverPrepare(ctx, dc.ci, query)
if err != nil {
return nil, err
}
ds := &driverStmt{Locker: dc, si: si}
ã«ãªããŸã
try si := ctxDriverPrepare(ctx, dc.ci, query)
ds := &driverStmt{Locker: dc, si: si}
ããã/ http
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
cc, err := p.t.dialclientconn(addr, singleuse)
if err != nil {
return nil, err
}
return cc, nil
}
ã«ãªããŸã
if http2isconnectioncloserequest(req) && dialonmiss {
// it gets its own connection.
http2tracegetconn(req, addr)
const singleuse = true
try cc := p.t.dialclientconn(addr, singleuse)
return cc, nil
}
ããã/ http
ããã¯å®éã«ã¯è¡ãç¯çŽããŸãããã if err == nil
ã¯æ¯èŒççããæ§é ã§ãããããã¯ããã«æ確ã§ãã
func (f *http2Framer) endWrite() error {
...
n, err := f.w.Write(f.wbuf)
if err == nil && n != len(f.wbuf) {
err = io.ErrShortWrite
}
return err
}
ã«ãªããŸã
func (f *http2Framer) endWrite() error {
...
try n := f.w.Write(f.wbuf)
if n != len(f.wbuf) {
return io.ErrShortWrite
}
return nil
}
ããã/ http
if f, err := fr.ReadFrame(); err != nil {
return nil, err
} else {
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
ã«ãªããŸã
try f := fr.ReadFrame()
hc = f.(*http2ContinuationFrame) // guaranteed by checkFrameOrder
}
ãããïŒ
if ctrlFn != nil {
c, err := newRawConn(fd)
if err != nil {
return err
}
if err := ctrlFn(fd.ctrlNetwork(), laddr.String(), c); err != nil {
return err
}
}
ã«ãªããŸã
if ctrlFn != nil {
try c := newRawConn(fd)
try ctrlFn(fd.ctrlNetwork(), laddr.String(), c)
}
@ james-lawrence https://github.com/golang/go/issues/32437#issuecomment -500116099ãžã®è¿ä¿¡ïŒãªãã·ã§ã³ã®, err
ãçå£ã«æ€èšãããŠãããããªã¢ã€ãã¢ã¯æãåºããŸããã å人çã«ã¯æªãèãã ãšæããŸããé¢æ°ãå€æŽãããŠæ«å°Ÿã®error
ãã©ã¡ãŒã¿ãŒãè¿œå ãããå Žåãæ¢åã®ã³ãŒãã¯ã³ã³ãã€ã«ãç¶è¡ããŸãããåäœã倧ããç°ãªãããã§ãã
ãšã©ãŒã®åŠçã«deferã䜿çšããããšã¯éåžžã«çã«ããªã£ãŠããŸããããšã©ãŒã«ååãä»ããå¿
èŠããããæ°ããçš®é¡ã®if err != nil
ãã€ã©ãŒãã¬ãŒããå¿
èŠã«ãªããŸãã
å€éšãã³ãã©ãŒã¯ãããè¡ãå¿ èŠããããŸãïŒ
func handler(err *error) {
if *err != nil {
*err = handle(*err)
}
}
ã®ããã«äœ¿çšãããŸã
defer handler(&err)
å€éšãã³ãã©ãŒãäœæããå¿ èŠãããã®ã¯1åã ãã§ãããå€ãã®ãšã©ãŒåŠçé¢æ°ã«ã¯2ã€ã®ããŒãžã§ã³ãå¿ èŠã§ãã1ã€ã¯å»¶æããããã®ãã®ã§ããã1ã€ã¯éåžžã®æ¹æ³ã§äœ¿çšããããã®ãã®ã§ãã
å éšãã³ãã©ãŒã¯ãããè¡ãå¿ èŠããããŸãïŒ
defer func() {
if err != nil {
err = handle(err)
}
}()
ã©ã¡ãã®å Žåããã¢ã¯ã»ã¹ããã«ã¯ãå€éšé¢æ°ã®ãšã©ãŒã«ååãä»ããå¿ èŠããããŸãã
ã¹ã¬ããã§åè¿°ããããã«ãããã¯åäžã®é¢æ°ã«æœè±¡åã§ããŸãã
func catch(err *error, handle func(error) error) {
if *err != nil && handle != nil {
*err = handle(*err)
}
}
ããã¯ã nil
ãã³ãã©ãŒé¢æ°ã®ãããŸããã«å¯Ÿãã@griesemerã®æžå¿µã«åãããã®ã§ããã err
ã«ååãä»ããå¿
èŠãããããšã«å ããŠãç¬èªã®defer
ãšfunc(err error) error
ã®å®åæããããŸããå€åŽã®é¢æ°ã®err
ã
try
ãããŒã¯ãŒããšããŠäœ¿çšãããå Žåã¯ã以äžã§èª¬æããããã«ã catch
ããŒã¯ãŒãã䜿çšããããšãæå³ããããŸãã
æ§æçã«ã¯ã handle
ã®ããã«ãªããŸãã
catch err {
return handleThe(err)
}
æå³çã«ã¯ãäžèšã®å éšãã³ãã©ãŒã³ãŒãã®ç ç³ã«ãªããŸãã
defer func() {
if err != nil {
err = handleThe(err)
}
}()
ããäžæè°ãªãããååãä»ããããŠããªããŠããå€éšé¢æ°ã®ãšã©ãŒãååŸããå¯èœæ§ããããŸãã ïŒ catch
$ã®åŸã®$ err
$ã¯ã catch
ãããã¯ã®ãã©ã¡ãŒã¿ãŒåã«äŒŒãŠããŸãïŒã
catch
ã«ã¯ã try
ãšåãå¶éããããã©ã¡ããããã«äŸåããç ç³ã§ãããããæçµçãªãšã©ãŒãè¿ãããé¢æ°å
ã«ããå¿
èŠããããŸãã
ããã¯ãå
ã®handle
ã®ææ¡ã»ã©åŒ·åã§ã¯ãããŸãããããšã©ãŒãåŠçããããã«ãšã©ãŒã«ååãä»ããå¿
èŠããªããªããå
éšãã³ãã©ãŒã«ã€ããŠäžèšã§èª¬æããæ°ãããã€ã©ãŒãã¬ãŒããåé€ãããŸããå€éšãã³ãã©ãŒçšã«åå¥ã®ããŒãžã§ã³ã®é¢æ°ãå¿
èŠã§ãã
è€éãªãšã©ãŒåŠçã§ã¯ã try
ã䜿çšããªãå Žåãšåãããã«ã catch
ã䜿çšããªãå¿
èŠãããå ŽåããããŸãã
ãããã¯äž¡æ¹ãšãç ç³ãªã®ã§ã catch
ãtry
$ãšäžç·ã«äœ¿çšããå¿
èŠã¯ãããŸããã catch
ãã³ãã©ãŒã¯ãé¢æ°ãnil
以å€ã®ãšã©ãŒãè¿ããã³ã«å®è¡ãããŸããããã«ãããããšãã°ãããã€ãã®ã¯ã€ãã¯ãã°ãä¿æã§ããŸãã
catch err {
log.Print(err)
return err
}
ãŸãã¯ãè¿ããããã¹ãŠã®ãšã©ãŒãã©ããããã ãã§ãã
catch err {
return fmt.Errorf("foo: %w", err)
}
@ianlancetaylor
_ "é¢æ°ãå€æŽãããŠæ«å°Ÿã®
error
ãã©ã¡ãŒã¿ãè¿œå ãããå Žåãæ¢åã®ã³ãŒãã¯ã³ã³ãã€ã«ãç¶è¡ããŸãããåäœã倧ããç°ãªããããããã¯æªãèãã ãšæããŸãã" _
ããã¯ããããæ£ããèŠæ¹ã§ããã¢ããã¹ããªãŒã ã³ãŒããšããŠã³ã¹ããªãŒã ã³ãŒãã®äž¡æ¹ãå¶åŸ¡ã§ããå Žåã¯ããšã©ãŒãè¿ãããã«é¢æ°ã·ã°ããã£ãå€æŽããå¿ èŠãããå Žåã¯ãããããããšãã§ããŸãã
ãããã誰ããèªåã®ããã±ãŒãžã®ã¢ããã¹ããªãŒã ãŸãã¯ããŠã³ã¹ããªãŒã ãå¶åŸ¡ããªãå Žåã¯ã©ããªãããæ€èšããŠãã ããã ãŸãããšã©ãŒãè¿œå ãããå¯èœæ§ã®ãããŠãŒã¹ã±ãŒã¹ãæ€èšãããšã©ãŒãè¿œå ããå¿ èŠãããããããŠã³ã¹ããªãŒã ã³ãŒãã匷å¶çã«å€æŽã§ããªãå Žåã¯ã©ããªããŸããïŒ
誰ãã眲åãå€æŽããŠæ»ãå€ãè¿œå ããäŸãèããŠã¿ãŠãã ããã ç§ã«ãšã£ãŠã圌ãã¯éåžžã_ããšã©ãŒãçºçããããšã«æ°ã¥ããªãã£ãã_ãŸãã¯_ããšã©ãŒãçºçããªãå¯èœæ§ããããããæ æ°ã«æããŠåªåããããªãããšããã«ããŽãªã«åé¡ãããŸãã _
ã©ã¡ãã®å Žåãããšã©ãŒãåŠçããå¿ èŠãããããšãæããã«ãªãããããšã©ãŒãªã¿ãŒã³ãè¿œå ããå ŽåããããŸãã ãã®å Žåãèªåã®ããã±ãŒãžã䜿çšããŠããä»ã®éçºè ãšã®äºææ§ãå£ããããªãããã«çœ²åãå€æŽã§ããªãå Žåã¯ã©ãããã°ããã§ããïŒ ç§ã®æšæž¬ã§ã¯ããšã©ãŒãçºçããæéã®å€§éšåãšããšã©ãŒãè¿ããªãfuncãåŒã³åºããã³ãŒãã¯ãéåžžã«ç°ãªãåäœãããŸãã
å®éãç§ã¯åŸè ããã£ãã«è¡ããŸããããåè ãé »ç¹ã«è¡ããŸãã ãããããµãŒãããŒãã£ã®ããã±ãŒãžã¯ãããã¹ãå Žæã§ã®ãšã©ãŒã®ãã£ããã£ãç¡èŠããããšããããããŸããããã¯ãGoLandãã©ã°ã§ã³ãŒãã衚瀺ãããšããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãæãããªã¬ã³ãžè²ã«ãªãããã§ãã ãã䜿çšããããã±ãŒãžã«ãšã©ãŒåŠçãè¿œå ããããã«ãã«ãªã¯ãšã¹ããéä¿¡ã§ããããã«ããããšæããŸãããã³ãŒãã®çœ²åãå£ããŠããŸããããã»ãšãã©ã®å Žåã¯åãå ¥ããŸããã
é¢æ°ã«ãã£ãŠè¿ããããšã©ãŒãè¿œå ããäžäœäºææ§ã®ããæ¹æ³ãæäŸããªãããšã«ãããã³ãŒããé åžãããŠãŒã¶ãŒã®ããã«ç©äºãå£ããªãããã«æ°ãé ãéçºè ã¯ãå¿ èŠã«å¿ããŠãšã©ãŒåŠçãå«ããããã«ããã±ãŒãžãé²åãããããšãã§ããªããªããŸãã
ãã¶ããã³ãŒããç°ãªãåäœããããšããåé¡ãèããã®ã§ã¯ãªãããšã©ãŒãç©æ¥µçã«ãã£ããã£ããŠããªãã¡ãœããã®æ¬ ç¹ãæå°éã«æããæ¹æ³ã«é¢ãããšã³ãžãã¢ãªã³ã°äžã®èª²é¡ãšããŠåé¡ãèŠãã®ã§ã¯ãªãã§ããããã ããã¯ããåºããããé·æçãªäŸ¡å€ãæã€ã§ãããã
ããšãã°ããšã©ãŒãç¡èŠã§ããããã«ãªãåã«èšå®ããå¿ èŠãããããã±ãŒãžãšã©ãŒãã³ãã©ãŒãè¿œå ããããšãæ€èšããŠãã ããã
ççŽã«èšã£ãŠãéåžžã®æ»ãå€ã«å ããŠãšã©ãŒãè¿ããšããGoã®ã€ãã£ãªã ã¯ããã®åªããé©æ°ã®1ã€ã§ããã ããããç©äºãæ¹åãããšãã«ããããããšã§ãããä»ã®åŒ±ç¹ãæããã«ããããšããããããŸããGoã®ãšã©ãŒåŠçã¯ååã«é©æ°ããŠããªãã£ããšç§ã¯äž»åŒµããŸãã
ç§ãã¡Gophersã¯äŸå€ãã¹ããŒããã®ã§ã¯ãªããšã©ãŒãè¿ãããšã«æ²¡é ããŠããã®ã§ãç§ãæã£ãŠãã質åã¯_ããªããã¹ãŠã®é¢æ°ãããšã©ãŒãè¿ãã¹ãã§ã¯ãªãã®ã§ããïŒãããã䜿ã£ãŠã³ãŒãã£ã³ã°ããããã䟿å©ã§ãã ãããã£ãŠããšã©ãŒåŠçããéããããšãã§ãããšèããå Žåã¯ããšã©ãŒåŠçãçç¥ããŸãã ããããç§ãã¡ã¯ãã°ãã°ééã£ãŠãããšæããŸãã
ãããã£ãŠãå®éã«ã¯ãã³ãŒãããšã¬ã¬ã³ãã§èªã¿ãããããæ¹æ³ãç解ã§ããã°ãæ»ãå€ãšãšã©ãŒã¯å®éã«ã¯å¥ã ã«åŠçããå¿ èŠãããã _every_é¢æ°ã«ã¯éå»ã®é¢æ°ã·ã°ããã£ã«é¢ä¿ãªããšã©ãŒãè¿ãæ©èœãå¿ èŠã§ãããšäž»åŒµããŸãã ãŸããæ¢åã®ã³ãŒãã§ãšã©ãŒãçæããã³ãŒããé©åã«åŠçã§ããããã«ããããšã¯ã䟡å€ã®ããåãçµã¿ã§ãã
å®è¡å¯èœãªæ§æãæ³åã§ããªãã£ããããäœãææ¡ããŠããŸããããæ£çŽã«èšããšããã®ã¹ã¬ããã®ãã¹ãŠãGoã®ãšã©ãŒåŠçã«é¢é£ããŠããããã§ã¯ãªãããšã©ãŒåŠçãšããã°ã©ã ããžãã¯ã¯å¥åŠãªä»²éãªã®ã§ãçæ³çã«ã¯ãšã©ãŒã¯äœããã®æ¹æ³ã§åž¯åå€ã§åŠçããã®ãæåã§ããããïŒ
ããŒã¯ãŒããšããŠã®try
ã¯ã確ãã«èªã¿ãããïŒé¢æ°åŒã³åºããšæ¯èŒããŠïŒã«åœ¹ç«ã¡ãããã»ã©è€éã§ã¯ãªãããã§ãã @brynbellomy @crawshawäŸãæžãããã«æéãå²ããŠããã ããããããšãããããŸãã
ç§ã®äžè¬çãªèãã¯ã try
ã¯ããããã ãšæããŸãã ããã¯è§£æ±ºããŸãïŒé¢æ°ãåŒã³åºããå€æ°ãå²ãåœãŠããšã©ãŒããã§ãã¯ããååšããå Žåã¯ãšã©ãŒãè¿ããŸãã 代ããã«ã¹ã³ãŒããåãåããæ¡ä»¶ä»ãã®æ»ãå€ã®ã¿ã解決ããããšãææ¡ããŸãïŒãæåŸã®åŒæ°ãnilã§ãªãå Žåã¯æ»ãå€ãã
ããã¯ããããæ°ããã¢ã€ãã¢ã§ã¯ãããŸãã...ãããããšã©ãŒãã£ãŒãããã¯ãŠã£ãã§ææ¡ããã£ãšèªãã åŸãç§ã¯ãããèŠã€ããããŸããã§ããïŒãããããã«ãªããšããæå³ã§ã¯ãããŸããïŒ
æ¡ä»¶ä»ããªã¿ãŒã³ã«é¢ããããææ¡
æç²ïŒ
err, thing := newThing(name)
refuse nil, err
ãŠã£ãã«ãã代æ¿æ¡ãã®äžã«è¿œå ããŸãã
äœãããªãããšãéåžžã«åççãªéžæè¢ã®ããã§ãã
@alexhornbakeã¯ãå°ãéãã¢ã€ãã¢ãç§ã«äžããŠãããŸãã
assert(nil, err)
assert(len(a), len(b))
assert(true, condition)
assert(expected, given)
ãã®ããã«ããšã©ãŒãã§ãã¯ã ãã§ãªããå€ãã®çš®é¡ã®è«çãšã©ãŒã«ãé©çšãããŸãã
æå®ããããã®ã¯ãšã©ãŒã«ã©ãããããŠè¿ãããŸãã
@alexhornbake
try
ãå®éã«è©Šè¡ããŠããªãããã«ã refuse
ã¯å®éã«ã¯ãæåŠãããŠããŸããã ããã§ã®äžè¬çãªç®çã¯ãæç·ã®å€ã®1ã€ãæ¡ä»¶ãæºããããšãã«ãããªããããããä¿è·ãªã¬ãŒãïŒ relay
ã¯çããæ£ç¢ºã§ã return
ã«é é»æ³ïŒãèšå®ããããšã§ãã ïŒã€ãŸããnil以å€ã®ãšã©ãŒã§ãïŒã ããã¯äžçš®ã®ãµãŒããããã¬ãŒã«ãŒã§ãããèšèšãé¢çœããªãã±ãŒã¹ã«éå®ãããŠããŠãæãã¶ãäžãã£ãŠãããã€ã©ãŒãã¬ãŒãã®äžéšãåçŽã«æžããããšãã§ããã°ãä»å 䟡å€ãåŸããããšæããŸãã ãªã¢ãŒãã§è€éãªãã®ã¯ãã¹ãŠããã¬ãŒã³ãªGoã³ãŒãã«äŸåããå¿
èŠããããŸãã
ãŸããcranshawãæšæºã©ã€ãã©ãªã調ã¹ãŠäœæ¥ããããšã称è³ããŸãããçµè«ã¯å€§ããç°ãªããŸã...ãããã®ã³ãŒãã¹ããããã®ã»ãšãã©ãã¹ãŠãèªã¿ã«ãããªãã誀解ããããããªããšæããŸãã
req.Header = Header(try(tp.ReadMIMEHeader())
ããããšã©ãŒã«ãªãå¯èœæ§ãããããšãç§ã¯ãã°ãã°èŠéããŸãã ç°¡åã«èªããšããããããŸãããããããŒãReadMimeHeaderã®ããããŒã«èšå®ããŠãã ããããšè¡šç€ºãããŸãã
if driverCtx, ok := driveri.(driver.DriverContext); ok {
return OpenDB(try(driverCtx.OpenConnector(dataSourceName))), nil
}
ãããç§ã®ç®ã¯ã¡ããã©ãã®OpenDBè¡ã解æããããšããŠäº€å·®ããŸãã ããã«ã¯éåžžã«å€ãã®å¯åºŠããããŸã...ããã¯ããã¹ãããããã¹ãŠã®é¢æ°åŒã³åºããæ±ãã倧ããªåé¡ã瀺ããŠããŸããã€ãŸããå åŽããèªã¿åããªããã°ãªãããæãå åŽã®éšåãã©ãã«ããããææ¡ããããã«é ã®äžã§è§£æããå¿ èŠããããŸãã ã
ãŸããããã¯åãè¡ã®2ã€ã®ç°ãªãå Žæããæ»ãå¯èœæ§ãããããšã«æ³šæããŠãã ããããããã°ããŸãããã®è¡ãããšã©ãŒãè¿ããããšè¡šç€ºãããŸãã誰ããæåã«è¡ãããšã¯ãå®éã«OpenConnectorã倱æããŠããã®ã«ïŒãŸãã¯ãã®éã®å ŽåïŒãOpenDBããã®å¥åŠãªãšã©ãŒã§å€±æããŠããçç±ãç解ããŠãã ããã
ds := &driverStmt{
Locker: dc,
si: try(ctxDriverPrepare(ctx, dc.ci, query)),
}
ããã¯ã以åã¯äžå¯èœã ã£ãã³ãŒãã倱æããå¯èœæ§ãããå Žæã§ãã try
ããªããšãæ§é äœãªãã©ã«ã®æ§ç¯ã¯å€±æããŸããã ç§ã®ç®ã¯ãOKãdriverStmtãæ§ç¯ããŠããŸã...å
ã«é²ã¿ãŸã..ãã®ããã«ããããã£ãšèŠãŸããèŠéããããã®ã§ãå®éã«ã¯ãé¢æ°ããšã©ãŒã«ãªãå¯èœæ§ããããŸãã 以åã«å¯èœã ã£ãå¯äžã®æ¹æ³ã¯ãctxDriverPrepareããããã¯ã«ãªã£ãå Žåã§ã...ãããŠã1ãïŒåºæ¬çã«ã¯çºçããªãã¯ãã§ããã2ãïŒçºçããå Žåã¯ãäœãã倧å¹
ã«ééã£ãŠããããšãæå³ããŸãã
ããŒã¯ãŒããšã¹ããŒãã¡ã³ããè©ŠããŠã¿ããšãããã«é¢ããç§ã®åé¡ã®å€ããä¿®æ£ãããŸãã ç§ã¯ãããäžäœäºææ§ããªãããšãç¥ã£ãŠããŸãããããã®ããæªãããŒãžã§ã³ã䜿çšããããšãäžäœäºææ§ã®åé¡ã®è§£æ±ºçã§ãããšã¯æããŸããã
@davedãã©ããŒãããã©ããããããŸããã ååãå«ãã§ããããããšãã¢ã€ãã¢ãå«ãã§ããïŒ
ãšã«ãããç§ã¯ä»£ããã«ãããããã«æçš¿ããŸãã...æ£åœãªé¢å¿ãããå Žåã¯ãè°è«ã®ããã«æ°ããåé¡ãéãããšãã§ããŸãããã®ã¹ã¬ãããæ±æããããªãïŒå€åé ãããŸããïŒïŒå ã®ã¢ã€ãã¢ã®èŠªæãäž/äžã«ãããšç§ãã¡ã®æèŠ...ãã¡ãããå¥ã®ååãåãå ¥ããŸãã éèŠãªã®ã¯ãå²ãåœãŠãåŠçããããšããªãæ¡ä»¶ä»ããªã¿ãŒã³ãã§ãã
@jimmyfrascheã«ãããã£ããã®ææ¡ã¯å¥œãã§ãããå¥ã®æ¹æ³ãææ¡ããããšæããŸãã
go
handler fmt.HandleErrorf("copy %s %s", src, dst)
ãšåçã«ãªããŸãïŒ
go
defer func(){
if(err != nil){
fmt.HandleErrorf(&err,"copy %s %s", src, dst)
}
}()
ããã§ãerrã¯ãã¿ã€ããšã©ãŒã®ããæåŸã®ååã®æ»ãå€ã§ãã ãã ããæ»ãå€ã«ååãä»ããããŠããªãå Žåã¯ããã³ãã©ãŒã䜿çšããããšãã§ããŸãã ããäžè¬çãªã±ãŒã¹ãèš±å¯ãããŸãã
go
handler func(err *error){ *err = fmt.Errorf("foo: %w", *err) }() `
ååä»ãã®æ»ãå€ïŒcatchã¯è§£æ±ºããŸããïŒã䜿çšããéã®äž»ãªåé¡ã¯ãerrãäžèŠã§ãããšããããšã§ãã fmt.HandleErrorf
ã®ãããªãã³ãã©ãŒãžã®åŒã³åºãã延æããå Žåããšã©ãŒã®æ»ãå€ãžã®ãã€ã³ã¿ãŒãé€ããŠãåççãªæåã®åŒæ°ã¯ãããŸããããªããŠãŒã¶ãŒã«ééããç¯ããªãã·ã§ã³ãäžããã®ã§ããããã
catchãšæ¯èŒãããšãäž»ãªéãã¯ããã³ãã©ãŒã䜿çšãããšãäºåå®çŸ©ããããã³ãã©ãŒãåŒã³åºãã®ãå°ãç°¡åã«ãªããŸãããããããé©åã«å®çŸ©ããããã®åé·æ§ãå¢ããŸãã ãããçæ³çãã©ããã¯ããããŸããããåœåã®ææ¡ã«æ²¿ã£ãŠãããšæããŸãã
@yiyus catch
ãç§ãå®çŸ©ããããã«ã catch
ãå«ãé¢æ°ã§err
ãšããååãä»ããå¿
èŠã¯ãããŸããã
catch err {
ã§ã¯ã err
ã¯ã catch
ãããã¯å
ã®ãšã©ãŒã®ååã§ãã ããã¯ãé¢æ°ã®ãã©ã¡ãŒã¿ãŒåã®ãããªãã®ã§ãã
ããã§ãéåžžã®fmt.Errorf
ã䜿çšã§ããããã fmt.HandleErrorf
ã®ãããªãã®ã¯å¿
èŠãããŸããã
func f() error {
catch err {
return fmt.Errorf("foo: %w", err)
}
return errors.New("bar")
}
ããã¯ã foo: bar
ãšããŠåºåããããšã©ãŒãè¿ããŸãã
ç§ã¯ãã®ã¢ãããŒãã奜ãã§ã¯ãããŸãããçç±ã¯æ¬¡ã®ãšããã§ãã
try()
é¢æ°åŒã³åºãã¯ã芪é¢æ°ã®ã³ãŒãå®è¡ãäžæããŸããreturn
ããŒã¯ãŒãã¯ãããŸããããã³ãŒãã¯å®éã«æ»ããŸãããã³ãã©ãŒãå®è¡ããæ¹æ³ã¯ããããææ¡ãããŠããŸããã2ã€ã®éèŠãªèŠä»¶ãèŠéããŠããããšããããããšæããŸãã
倧å¹
ã«ç°ãªãã if x, err := thingie(); err != nil { handle(err) }
ãããåªããŠããå¿
èŠããããŸãã try x := thingie else err { handle(err) }
ã«æ²¿ã£ãææ¡ã¯ããã®åºæºãæºãããŠããªããšæããŸãã if
ãšã ãèšã£ãŠã¿ãŸãããïŒ
defer
ã®æ¢åã®æ©èœãšçŽäº€ããŠããå¿
èŠããããŸãã ã€ãŸãããã³ãã«ãšå»¶æãçžäºäœçšãããšãã«å¥åŠãªã³ãŒããŒã±ãŒã¹ãäœæããããšãªããææ¡ãããåŠçã¡ã«ããºã ãããèªäœã§å¿
èŠã§ããããšã¯æããã§ããã»ã©ãååã«ç°ãªã£ãŠããå¿
èŠããããŸãã
try
/ handleã®ä»£æ¿ã¡ã«ããºã ã«ã€ããŠèª¬æããã®ã§ããããã®desiderataãèŠããŠãããŠãã ããã
@carlmjohnsonç§ã¯ããªãã®ãã€ã³ã2ã«é¢ãã@jimmyfrascheã®catch
ã®ã¢ã€ãã¢ã奜ãã§ã-ããã¯2è¡ãç¯çŽãããšã©ãŒã®æ»ãå€ã«ååãä»ããå¿
èŠããªããããšãã§ããdefer
ã®åãªãæ§æç³è¡£ã§ããŸãããŸã è¡ã£ãŠããªãå Žåã¯ãä»ã®ãã¹ãŠã®ååãä»ããå¿
èŠããããŸãïŒã defer
ã§ããããã defer
ãšã®çŽäº€æ§ã®åé¡ã¯çºçããŸããã
@ubombiãèšã£ãããšããšã³ãŒãââãŸãïŒ
tryïŒïŒé¢æ°åŒã³åºãã¯ã芪é¢æ°ã®ã³ãŒãå®è¡ãäžæããŸãã; returnããŒã¯ãŒãã¯ãããŸããããã³ãŒãã¯å®éã«æ»ããŸãã
Rubyã§ã¯ãprocsãšlambdasã¯try
ãè¡ãããšã®äŸã§ã... procã¯ãreturnã¹ããŒãã¡ã³ãããããã¯èªäœããã§ã¯ãªãåŒã³åºãå
ããè¿ãã³ãŒãã®ãããã¯ã§ãã
ããã¯ãŸãã«try
ãè¡ãããšã§ã...ããã¯äºåå®çŸ©ãããRubyããã·ãŒãžã£ã§ãã
ãã®ã«ãŒãã«è¡ãå Žåã¯ã proc functions
ãå°å
¥ããããšã§ãå®éã«ãŠãŒã¶ãŒã«ç¬èªã®try
é¢æ°ãå®çŸ©ãããããšãã§ãããšæããŸãã
$ïŒ$ 4 $ïŒ$ã®æ¹ãèªã¿ãããã®ã§ãç§ã¯ãŸã if err != nil
ã奜ã¿ãŸããããŠãŒã¶ãŒãç¬èªã®ããã·ãŒãžã£ãå®çŸ©ããå Žåã try
ã®æ¹ãæçã ãšæããŸãã
proc try(err *error, msg string) {
if *err != nil {
*err = fmt.Errorf("%v: %w", msg, *err)
return
}
}
ãããŠãããªãã¯ãããåŒã¶ããšãã§ããŸãïŒ
func someFunc() (string, error) {
err := doSomething()
try(&err, "someFunc failed")
}
ããã§ã®å©ç¹ã¯ãç¬èªã®çšèªã§ãšã©ãŒåŠçãå®çŸ©ã§ããããšã§ãã ãŸãã proc
å
¬éãéå
¬éããŸãã¯å
éšã«ããããšãã§ããŸãã
ãŸããå
ã®Go2ããããŒã¶ã«ã®handle {}
å¥ãããåªããŠããŸããããã¯ãåé¢æ°ã§ã¯ãªããã³ãŒãããŒã¹å
šäœã«å¯ŸããŠ1åã ãå®çŸ©ã§ããããã§ãã
èªã¿ãããã«é¢ããèæ
®äºé
ã®1ã€ã¯ãfuncïŒïŒãšprocïŒïŒãfunc()
ãproc!()
ãªã©ã®ç°ãªãæ¹æ³ã§åŒã³åºãããå¯èœæ§ããããããããã°ã©ããŒã¯procåŒã³åºããå®éã«é¢æ°ãåŒã³åºããŸãã
@ marwan-at-workãããªãã®äŸã§ã¯try(err, "someFunc failed")
ãtry(&err, "someFunc failed")
ã«ãã¹ãã§ã¯ãããŸãããïŒ
@dpinelaèšæ£ããŠããã ãããããšãããããŸããã³ãŒããæŽæ°ããŸãã:)
ããã§ãªãŒããŒã©ã€ãããããšããŠããäžè¬çãªæ¹æ³ã¯ãäŸå€ãšããŠãå€ãã®èšèªã§ã®æšæºã¹ã¿ãã¯ã®å·»ãæ»ãã瀺åããŠããããšã§ãïŒãããã£ãŠããtryããšããåèªãéžæãããŸãã...ïŒã
ãããããã¬ãŒã¹å
ã®2ã€ã®ã¬ãã«ã«ãžã£ã³ãããã¯ããé¢æ°ïŒ... tryïŒïŒãŸãã¯ãã®ä»ïŒã®ã¿ãèš±å¯ã§ããå Žåã¯ã
try := handler(err error) { //which corelates with - try := func(err error)
if err !=nil{
//do what ever you want to do when there's an error... log/print etc
return2 //2 levels
}
}
ãããŠæ¬¡ã®ãããªã³ãŒã
fïŒ= tryïŒos.OpenïŒfilenameïŒïŒ
ææ¡ãã¢ããã€ã¹ãããšããã«å®è¡ã§ããŸããããã®é¢æ°ïŒãŸãã¯å®éã«ã¯ããã³ãã©ãŒé¢æ°ãïŒãšããŠãéçºè
ã¯é¢æ°ã®æ©èœãããŸããŸãªå Žåã®ãšã©ãŒã®ãã©ãŒãããæ¹æ³ãããããå Žæã§åæ§ã®ãã³ãã©ãŒã䜿çšããæ¹æ³ããã詳现ã«å¶åŸ¡ã§ããŸããæ¯åfmt.ErrorfïŒ "error open fileïŒ
s ...."ïŒãäœæãã代ããã«ãos.OpenãåŠçããã³ãŒãïŒããšãã°ïŒã
ããã«ããããtryããå®çŸ©ãããŠããªããã®ããã«ãšã©ãŒåŠçã匷å¶ãããŸããããã¯ã³ã³ãã€ã«æã®ãšã©ãŒã§ãã
@guybrandãã®ãããª2ã¬ãã«ã®ãªã¿ãŒã³return2
ïŒãŸãã¯äžè¬çãªæŠå¿µãSmalltalkã§åŒã°ãããéããŒã«ã«ãªã¿ãŒã³ãïŒãæã€ããšã¯ãåªããæ±çšã¡ã«ããºã ã§ãïŒïŒ32473ã®@mikeschinkelã«ãã£ãŠãææ¡ãããŠããŸãïŒ ã ããããããªãã®ææ¡ã«ã¯ãŸã try
ãå¿
èŠãªããã§ãã®ã§ã return2
ã®çç±ã¯ããããŸãã- try
ã¯return
ãå®è¡ã§ããŸãtry
ãããŒã«ã«ã«æžã蟌ãããšãã§ããã°ãã£ãšèå³æ·±ãã§ãããããããã¯ä»»æã®çœ²åã§ã¯äžå¯èœã§ãã
@griesemer
_ "ãããã£ãŠã
return2
ã®çç±ã¯ããããŸãã-try
ã¯return
ãå®è¡ã§ããŸãã" _
çç±ã®1ã€ã¯ãïŒ32473 _ïŒåç
§ã«æè¬ïŒ_ã§ææããããã«ã return
ã«å ããŠã break
ãšcontinue
ã®è€æ°ã®ã¬ãã«ãèš±å¯ããããšã§ãã
ãã¹ãŠã®æ°ããã³ã¡ã³ããããããšãããããŸããã è°è«ã«é ããã«ã€ããŠãããåºç¯ãªãã£ãŒãããã¯ãæžãããšã¯ãããªãã®æéã®æè³ã§ãã ãããŠããã«è¯ãããšã«ãæã«ã¯æ ç±çãªè°è«ã«ãããããããããã¯ãããŸã§ã®ãšããããªãåžæ°çãªã¹ã¬ããã§ããã ããããšãïŒ
ããã«ãã1ã€ã®ç°¡åãªèŠçŽããããŸãããä»åã¯ããå°ãåçž®ãããŠããŸãã ç§ãèšåããªãã£ããå¿ããããŸãã¯èª€è§£ãã人ã ã«è¬çœªããŸãã ãã®æç¹ã§ãããã€ãã®ãã倧ããªããŒããåºçŸããŠãããšæããŸãã
1ïŒäžè¬ã«ã try
æ©èœã«çµã¿èŸŒã¿ã䜿çšããããšã¯ãæªãéžæã§ãããšæãããŸããå¶åŸ¡ãããŒã«åœ±é¿ãäžããããšãèãããšãå°ãªããšã_ããŒã¯ãŒãã«ããå¿
èŠããããŸãïŒ @carloslenz "ã¯ãæ¬åŒ§"ïŒ; try
ã¯ãåŒãšããŠã¯è¯ãèãã§ã¯ãªãããã§ããèªã¿ããããæãªãïŒ @ ChrisHines ã@ jimmyfrascheïŒãã return
ãªãã®ãªã¿ãŒã³ãã§ãã @brynbellomyã¯ãèå¥åãšããŠäœ¿çšãããtry
ã®å®éã®åæãè¡ããŸããã ããŒã»ã³ããŒãžçã«ã¯éåžžã«å°ãªãããã«èŠããã®ã§ãããŸãã«ãå€ãã®ã³ãŒãã«åœ±é¿ãäžããããšãªããããŒã¯ãŒãã«ãŒãã«é²ãããšãã§ãããããããŸããã
2ïŒ @crawshawã¯ãstdã©ã€ãã©ãªããæ°çŸã®ãŠãŒã¹ã±ãŒã¹ãåæããã®ã«å°ãæéãããããææ¡ãããtry
ã¯ã»ãšãã©åžžã«èªã¿ããããæ¹åãããšããçµè«ã«éããŸããã @jimmyfrascheã¯å察ã®çµè«ã«éããŸããã
3ïŒãã1ã€ã®ããŒãã¯ããšã©ãŒè£
食ã«defer
ã䜿çšããããšã¯çæ³çã§ã¯ãªããšããããšã§ãã @josharianã¯ã defer
åžžã«é¢æ°ã®æ»ãæã«å®è¡ãããããšãææããŠããŸããããšã©ãŒè£
食ã®ããã«ããã«ããå Žåã¯ããšã©ãŒãçºçããå Žåã«ã®ã¿ããã£ãæ°ã«ããŸããããã¯æ··ä¹±ã®åå ãšãªãå¯èœæ§ããããŸãã
4ïŒå€ãã®äººãææ¡ãæ¹åããããã®ææ¡ãæžããŸããã @ zeebo ã@ patrick-nytã¯ã1è¡ã«åçŽãªif
ã¹ããŒãã¡ã³ãããã©ãŒãããããgofmt
ãæ¯æããŠããŸãïŒãããŠçŸç¶ã«æºè¶³ããŠããŸãïŒã @jargvã¯ã try()
ïŒåŒæ°ãªãïŒãçŸåšãä¿çäžãã®ãšã©ãŒãžã®ãã€ã³ã¿ãŒãè¿ãå¯èœæ§ãããããšã瀺åããŸãããããã«ããã defer
ã§ã¢ã¯ã»ã¹ã§ããããã«ããšã©ãŒçµæã«ååãä»ããå¿
èŠããªããªããŸãã @masteradaã¯ã代ããã«errorfunc()
ã䜿çšããããšãææ¡ããŸããã @velovixã¯ã2çªç®ã®åŒæ°ããšã©ãŒãã³ãã©ãŒã«ãªã2ã€ã®åŒæ°try
ã®ã¢ã€ãã¢ã埩掻ãããŸããã
@ klaidliadon ã @ networkimprovã¯ã try
f, # := os.Open()
ã®ãããªç¹å¥ãªã代å
¥æŒç®åããæ¯æããŠããŸãã @networkimprovã¯ããã®ãããªã¢ãããŒãã調æ»ããããå
æ¬çãªä»£æ¿æ¡ãæåºããŸããïŒåé¡ïŒ32500ãåç
§ïŒã @mikeschinkelã¯ããšã©ãŒåºæã®try
ã§ã¯ãªãããšã©ãŒåŠçã«ã䜿çšã§ãã2ã€ã®æ°ããæ±çšèšèªæ©èœãå°å
¥ããããšãææ¡ãã代æ¿æ¡ãæåºããŸããïŒåé¡ïŒ32473ãåç
§ïŒã @josharianã¯ãæšå¹ŽGopherConã§è©±ãåã£ãå¯èœæ§ã埩掻ãããŸããããã®å Žåã try
ã¯ãšã©ãŒæã«è¿ãããŸãããã代ããã«ïŒ goto
ã䜿çšããŠïŒ error
ãšããååã®ã©ãã«ã«ãžã£ã³ãããŸãïŒãŸãã¯ã try
ã¯ã¿ãŒã²ããã©ãã«ã®ååããšãå ŽåããããŸãïŒã
5ïŒããŒã¯ãŒããšããŠtry
ãããŒãã«ã2ã€ã®èããæµ®ãã³äžãã£ãŠããŸããã @brynbellomyã¯ã代ããã«ãã³ãã©ãŒãæå®ããå¯èœæ§ã®ããããŒãžã§ã³ãææ¡ããŸããã
a, b := try f()
a, b := try f() else err { /* handle error */ }
@thepuddsã¯ããã«äžæ©é²ãã§ãè¡ã®å
é ã«try
ãææ¡ãã try
ã«return
ãšåãå¯èŠæ§ãäžããŸãã
try a, b := f()
ãããã¯äž¡æ¹ãšãdefer
ã§æ©èœããå¯èœæ§ããããŸãã
@griesemer
@ mikeschinkel ïŒ32473ãžã®åç §ãããããšããããã¯å€ãã®å ±éç¹ãæã£ãŠããŸãã
ããã«ãããã
ããããããªãã®ææ¡ã«ã¯ãŸã è©ŠããŠã¿ãå¿ èŠãããããã§ã
ç§ã®ææ¡ã¯ãäºçŽãããããã«ãã€ã³/ããŒã¯ãŒã/åŒãã§ã¯ãªããä»»æã®ããã³ãã©ãŒã§å®è£ ã§ããŸããããtryïŒïŒãã¯æªãèãã§ã¯ãªããšæããŸãïŒãããã£ãŠãå察祚ãæããŸããã§ããïŒã ããããåºãããããã«-ããã¯ããå€ãã®å©ç¹ã瀺ãã§ããããå€ãã®äººã¯ãäžåºŠè¡ã2.0ãå°å ¥ãããããšæåŸ ããŠããŸãã
ããã¯ãååã®èŠçŽã§å ±åãããæ··åãã€ããã®åå ã§ããããšæããŸãããtryïŒïŒã¯ãšã©ãŒåŠçãæ¹åããŸãããã§ã¯ãããŸããã確ãã«ããGo3.0ãä»ã®äž»èŠãªãšã©ãŒã解決ããã®ãåŸ ã£ãŠããŸããèŠçãåŠçãããäžèšã®äººã ã¯ãé·ãããããã«èŠããŸã:)
ç§ã¯ããšã©ãŒåŠçã®èŠçãã«ã€ããŠèª¿æ»ãè¡ã£ãŠããŸãïŒãããŠãèŠçã®ããã€ãã¯åã«ãç§ã¯è¯ãç¿æ £ã䜿ããªããã§ãããšæãããŸããã人ã ïŒäž»ã«ä»ã®èšèªããæ¥ãŠããïŒããããããšããæ³åããŠããªãã£ããã®ããããŸã-ã¯ãŒã«ããWTFãžïŒã
ããã«ããã€ãã®èå³æ·±ãçµæãå ±æã§ããããšãé¡ã£ãŠããŸãã
æåŸã«-çŽ æŽãããä»äºãšå¿èã«æè¬ããŸãïŒ
çŸåšææ¡ãããŠããæ§æã®é·ããšçŸåšå©çšå¯èœãªæ§æã®é·ããåçŽã«èŠããšããšã©ãŒãåŠçãããè£ é£Ÿãããããã«ãšã©ãŒãè¿ãå¿ èŠãããå Žåããæã䟿å©ãªå Žåã§ãã ãããŸã§ã®ç§ã®ãæ°ã«å ¥ãã®æ§æã®äŸïŒ
try a, b := f() else err { return fmt.Errorf("Decorated: %s", err); }
if a,b, err :=f; err != nil { return fmt.Errorf("Decorated: %s", err); }
try a, b := f()
if a,b, err :=f; err != nil { return err; }
ã§ããããç§ã以åèããŠãããã®ãšã¯ç°ãªããå°ãªããšãè£ é£Ÿ/åŠçããããšã©ãŒã®å Žåã¯ãgofmtãå€æŽããã ãã§ååãããããŸããã ãšã©ãŒã±ãŒã¹ãæž¡ãã ãã§ããããã®éåžžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ã®æ§æç³è¡£æ§æãšããŠã¯ãtryã®ãããªãã®ãäŸç¶ãšããŠæãŸããå ŽåããããŸãã
try else
ã«é¢ããŠã¯ãæåã®ã³ã¡ã³ãã®fmt.HandleErrorf
ïŒç·šéïŒå
¥åãnilã®å Žåã¯nilãè¿ããšä»®å®ããŠããŸãïŒã®ãããªæ¡ä»¶ä»ããšã©ãŒé¢æ°ã¯æ£åžžã«æ©èœãããšæããŸãã®ã§ã else
ãè¿œå ããŸãäžèŠã§ãã
a, b, err := doSomething()
try fmt.HandleErrorf(&err, "Decorated "...)
ããã«ããä»ã®å€ãã®äººãšåæ§ã«ãç§ã¯try
ãåŒã§ã¯ãªãã¹ããŒãã¡ã³ãã«ããããšã奜ã¿ãŸããããã¯äž»ã«ãå¶åŸ¡ãããŒãå€æŽããåŒãGoã«ãšã£ãŠå®å
šã«ç°è³ªã§ããããã§ãã ãŸããããã¯åŒã§ã¯ãªããããè¡ã®å
é ã«é
眮ããå¿
èŠããããŸãã
ååãé©åã§ãªãããšã«ã@davedã«åæããŸãã çµå±ã®ãšãããããã§éæããããšããŠããã®ã¯ä¿è·ãããå²ãåœãŠã§ããSwiftã®ããã«guard
ã䜿çšããŠã else
å¥ããªãã·ã§ã³ã«ããŠã¿ãŸãããïŒ äœãã®ãããªãã®
GuardStmt = "guard" ( Assignment | ShortVarDecl | Expression ) [ "else" Identifier Block ] .
ããã§ã Identifier
ã¯ã次ã®Block
ã«ãã€ã³ããããŠãããšã©ãŒå€æ°åã§ãã else
å¥ããªãå Žåã¯ãçŸåšã®é¢æ°ããæ»ãã ãã§ãïŒå¿
èŠã«å¿ããŠãdeferãã³ãã©ãŒã䜿çšããŠãšã©ãŒãè£
食ããŸãïŒã
else
å¥ã¯ãéåžžã®å²ãåœãŠã®åŸã«if err != nil
ãç¶ãæ§æç³è¡£æ§æã§ãããããæåã¯å¥œãã§ã¯ãããŸããã§ããããããã€ãã®äŸã瀺ããåŸã¯ã guard
ã䜿çšããã®ãçã«ããªã£ãŠããŸãã
ç·šéïŒ catch
ã®ãããªãã®ã䜿çšããŠãäœããã®æ¹æ³ã§ããŸããŸãªãšã©ãŒãã³ãã©ãŒãæå®ããããšãææ¡ãã人ãããŸãã ç§ã¯else
ãæå³è«çã«åãããã«å®è¡å¯èœã§ãããããã¯ãã§ã«ãã®èšèªã«ãããšæããŸãã
ç§ã¯try-elseã¹ããŒãã¡ã³ãã奜ãã§ããããã®æ§æã¯ã©ãã§ããïŒ
a, b, (err) := func() else { return err }
åŒtry
- else
ã¯äžé
æŒç®åã§ãã
a, b := try f() else err { ... }
fmt.Println(try g() else err { ... })`
ã¹ããŒãã¡ã³ãtry
- else
ã¯if
ã¹ããŒãã¡ã³ãã§ãã
try a, b := f() else err { ... }
// (modulo scope of err) same as
a, b, err := f()
if err != nil { ... }
ãªãã·ã§ã³ã®ãã³ãã©ãŒãåããçµã¿èŸŒã¿ã®try
ã¯ããã«ããŒé¢æ°ïŒäžèšïŒã䜿çšãããã try
ã䜿çšããªãã§å®çŸã§ããŸãïŒå³ã«ã¯ç€ºãããŠããŸããããã©ã®ããã«èŠãããã¯èª°ããç¥ã£ãŠããŸãïŒã
a, b := try(f(), decorate)
// same as
a, b := try(g())
// where g is
func g() (whatever, error) {
x, err := f()
if err != nil {
try(decorate(err))
}
return x, nil
}
3ã€ãã¹ãŠãå®åæãåæžãããšã©ãŒã®ç¯å²ãæããã®ã«åœ¹ç«ã¡ãŸãã
çµã¿èŸŒã¿ã®try
ã§æãç¯çŽã§ããŸãããèšèšããã¥ã¡ã³ãã«èšèŒãããŠããåé¡ããããŸãã
ã¹ããŒãã¡ã³ãtry
- else
ã®å Žåã try
if
ã䜿çšãããããå©ç¹ããããŸãã ãããããã®å©ç¹ã¯ãããããã§ãããããç§ã¯ããã奜ãã§ããããããæ£åœåãããã®ãèŠãã®ã«èŠåŽããŠããŸãã
3ã€ãã¹ãŠããåã ã®ãšã©ãŒã«å¯ŸããŠç¹å¥ãªãšã©ãŒåŠçãå¿ èŠã«ãªãã®ãäžè¬çã§ããããšãåæãšããŠããŸãã
ãã¹ãŠã®ãšã©ãŒãå¹³çã«åŠçããã«ã¯ã defer
䜿çšããŸãã åããšã©ãŒåŠçãåelse
ãããã¯ã§å®è¡ãããŠããå Žåãå°ãç¹°ãè¿ããŸãã
func printSum(a, b string) error {
try x := strconv.Atoi(a) else err {
return fmt.Errorf("printSum: %w", err)
}
try y := strconv.Atoi(b) else err {
return fmt.Errorf("printSum: %w", err)
}
fmt.Println("result:", x + y)
return nil
}
ç¹å®ã®ãšã©ãŒãç¹å¥ãªåŠçãå¿
èŠãšããå Žåãããããšãç§ã¯ç¢ºãã«ç¥ã£ãŠããŸãã ãããã¯ç§ã®èšæ¶ã«çªãåºãŠããã€ã³ã¹ã¿ã³ã¹ã§ãã ããããããã100åã«1åããçºçããªãå Žåã¯ã try
ãåçŽã«ä¿ã¡ããã®ãããªç¶æ³ã§ã¯try
ã䜿çšããªãæ¹ãããã®ã§ã¯ãªãã§ããããã äžæ¹ã10åã«1åã®ããã§ããã°ã else
/ handlerãè¿œå ããæ¹ãåççãšæãããŸãã
else
try
$ãšelse
/ handlerããã®try
ã®å®éã®ååžã確èªããã®ã¯èå³æ·±ãããšã§ãããåéããã®ã¯ç°¡åãªããŒã¿ã§ã¯ãããŸããã
@jimmyfrascheã®æè¿ã®ã³ã¡ã³ããæ¡åŒµããããšæããŸãã
ãã®ææ¡ã®ç®çã¯ãå®åæãæžããããšã§ã
a, b, err := f()
if err != nil {
return nil, err
}
ãã®ã³ãŒãã¯èªã¿ãããã§ãã ãã€ã©ãŒãã¬ãŒããå€§å¹ ã«åæžã§ããå Žåã«ã®ã¿ãèšèªãæ¡åŒµãã䟡å€ããããŸãã ç§ã次ã®ãããªãã®ãèŠããšã
try a, b := f() else err { return nil, err }
ããŸãç¯çŽããŠããªããšæããã«ã¯ããããŸããã 3è¡ç¯çŽã§ããŸããããã¯è¯ãããšã§ãããç§ã®èšç®ã§ã¯56æåãã46æåã«åæžããŠããŸãã ããã»ã©å€ãã¯ãããŸããã ãšæ¯èŒãã
a, b := try(f())
ããã¯56æåãã18æåã«åæžãããã¯ããã«å€§å¹
ã«åæžãããŸãã try
ã¹ããŒãã¡ã³ãã¯å¶åŸ¡ãããŒã®æœåšçãªå€æŽãããæ確ã«ããŸãããå
šäœãšããŠãã¹ããŒãã¡ã³ããããèªã¿ããããªããšã¯æããŸããã ãã©ã¹é¢ãšããŠã¯ã try
ã¹ããŒãã¡ã³ãã䜿çšãããšããšã©ãŒã«æ³šéãä»ããã®ãç°¡åã«ãªããŸãã
ãšã«ãããç§ã®ãã€ã³ãã¯ãäœããå€æŽããå Žåã¯ããã€ã©ãŒãã¬ãŒããå€§å¹ ã«åæžããããå€§å¹ ã«èªã¿ãããããå¿ èŠããããšããããšã§ãã åŸè ã¯ããªãé£ããã®ã§ãå€æŽã¯åè ã§å®éã«æ©èœããå¿ èŠããããŸãã ãã€ã©ãŒãã¬ãŒãããããã«æžå°ããã ãã®å Žåãç§ã®æèŠã§ã¯ãããè¡ã䟡å€ã¯ãããŸããã
ä»ã®äººãšåãããã«ãäŸãæããŠããã@crawshawã«æè¬ããŸãã
ãããã®äŸãèªããšãã¯ã try
é¢æ°ã«ããå¶åŸ¡ã®æµããæ°ã«ããªããšããèãæ¹ãæ¡çšããããšããå§ãããŸãã ããããééã£ãŠãããšæããŸããããã®å¶åŸ¡ã®æµãã¯ãèšèªãç¥ã£ãŠãã人ã
ã«ãšã£ãŠããã«ç¬¬äºã®æ§è³ªã«ãªããšæããŸãã éåžžã®å Žåããšã©ãŒã®å Žåã«äœãèµ·ãããã«ã€ããŠå¿é
ããã®ããããã ãã ãšæããŸãã ãã§ã«if err != nil { return err }
ãã°ã¬ãŒãžã³ã°ããŠããã®ãšåãããã«ã try
ãã°ã¬ãŒãžã³ã°ããªãããããã®äŸãèªãã§ã¿ãŠãã ããã
ããã§ãã¹ãŠãèªãã åŸãããã«çèãããšãè¿œå ãã䟡å€ã®ããã¹ããŒãã¡ã³ããšããŠãè©ŠããŠã¿ãããšãã§ãããã©ããã¯ããããŸããã
ãã®çç±ã¯ããã€ã©ãŒãã¬ãŒãã³ãŒãã®åŠçãšã©ãŒãæžããããšã®ããã§ãã ç§èŠã§ã¯ãã³ãŒãããæŽçãããŸãããå®éã«ã¯è€éããåãé€ãããšã¯ã§ããŸããã ããã¯ãã ãããèŠãé ããŸãã ããã«ã¯ååãªçç±ããªãããã§ãã å€åº
ãã®ååã¯ãã®æ©èœãåæ ããŠããŸããã æãåçŽãªåœ¢åŒã§ã¯ããé¢æ°ããšã©ãŒãè¿ãå Žåã¯ãåŒã³åºãå ãããšã©ãŒãè¿ãããšããããšã§ãããããã¯é·ãããŸã:-)å°ãªããšãå¥ã®ååãå¿ èŠã§ãã
tryã®æé»ã®ãšã©ãŒåŸ©åž°ã«ãããGoã¯ãã¶ãã¶äŸå€åŠçã«æ»ã£ãŠããããã«æããŸãã ã€ãŸããAããã©ã€ã¬ãŒãã«ãããBããã©ã€ã¬ãŒãã§CãåŒã³åºããCããã©ã€ã¬ãŒãã§DãåŒã³åºããå ŽåãDãäºå®äžãšã©ãŒãè¿ããå ŽåãéããŒã«ã«gotoãçºçããŸãã ããã¯ããŸãã«ããéæ³ãã®ããã«æããŸãã
ããã§ãç§ã¯ãã£ãšè¯ãæ¹æ³ãå¯èœãããããªããšä¿¡ããŠããŸãã ä»ããè©Šããéžæãããšããã®ãªãã·ã§ã³ãéããããŸãã
@ianlancetaylor
ãä»ã®æ¹æ³ã§è©Šããææ¡ãæ£ããç解ããŠããå Žåã else
ãããã¯ã¯ãªãã·ã§ã³ã§ããããŠãŒã¶ãŒæäŸã®åŠççšã«äºçŽãããŠããããã§ãã ããªãã®äŸã§ã¯ã try a, b := f() else err { return nil, err }
else
å¥ã¯å®éã«ã¯åé·ã§ãããåŒå
šäœã¯åçŽã«try a, b := f()
ãšæžãããšãã§ããŸãã
@ianlancetaylorã«åæããŸãã
èªã¿ããããšå®åæã¯2ã€ã®äž»èŠãªæžå¿µäºé
ã§ããããããã
go 2.0ãšã©ãŒåŠçïŒä»ã®éèŠãªæžå¿µäºé
ãè¿œå ã§ããŸããïŒ
ãŸãããã®çŸåš
a, b, err := f()
if err != nil {
return nil, err
}
éåžžã«èªã¿ãããã§ãã
ãããŠç§ã¯ä¿¡ããŠããã®ã§
if a, b, err := f(); err != nil {
return nil, err
}
ã»ãŒåããããèªã¿ãããã§ããããã®ç¯å²ã¯ãåé¡ãã§ããããããã
ifErr a, b, err := f() {
return nil, err
}
ããã ãã§ã; errïŒ= niléšåã§ãããã¹ã³ãŒããäœæããªãããŸãã¯
åæ§ã«
aãbãerrãè©ŠããŠãã ããïŒ= fïŒïŒ{
nilãè¿ãããšã©ãŒ
}
äœåãª2è¡ãä¿æããŸãããããã§ãèªã¿åãå¯èœã§ãã
2019幎6æ11æ¥ç«ææ¥ã20ïŒ19 Dmitriy Matrenichevã notifications @ github.com
æžããŸããïŒ
@ianlancetaylor https://github.com/ianlancetaylor
ãelseãè©Šããææ¡ãæ£ããç解ããŠããã°ãelseããããã¯ããŠããããã§ã
ãªãã·ã§ã³ã§ããããŠãŒã¶ãŒæäŸã®åŠççšã«äºçŽãããŠããŸãã ããªãã®äŸã§ã¯
try aãbïŒ= fïŒïŒelse err {return nilãerr} elseå¥ã¯å®éã«ã¯
åé·ã§ãããåŒå šäœã¯åã«try aãbïŒ=ã®ããã«æžãããšãã§ããŸãã
fïŒïŒâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4XPURMASWKZKOBPBVDPZ7NALA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOOR
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ABNEY4SAFK4M5NLABF3NZO3PZ7NALANCNFSM4HTGCZ7Q
ã
@ianlancetaylor
ãšã«ãããç§ã®ãã€ã³ãã¯ãäœããå€æŽããå Žåã¯ããã€ã©ãŒãã¬ãŒããå€§å¹ ã«åæžããããå€§å¹ ã«èªã¿ãããããå¿ èŠããããšããããšã§ãã åŸè ã¯ããªãé£ããã®ã§ãå€æŽã¯åè ã§å®éã«æ©èœããå¿ èŠããããŸãã ãã€ã©ãŒãã¬ãŒãããããã«æžå°ããã ãã®å Žåãç§ã®æèŠã§ã¯ãããè¡ã䟡å€ã¯ãããŸããã
åæãã else
ã¯æ§æç³è¡£æ§æïŒå¥åŠãªæ§æã§ïŒïŒã«ãããããã£ãã«äœ¿çšãããªãå¯èœæ§ãé«ãããšãèãããšãç§ã¯ããã«ã€ããŠããŸãæ°ã«ããŸããã ããã§ããã¹ããŒãã¡ã³ããšããŠtry
ã䜿çšããããšæããŸãã
@ianlancetaylor @DmitriyMVããšã³ãŒãããšã else
ãããã¯ã¯ãªãã·ã§ã³ã«ãªããŸãã äž¡æ¹ã説æããäŸã玹ä»ããŸãïŒå®éã®ã³ãŒãã§åŠçããããããã¯ãšåŠçãããŠããªãtry
ãããã¯ã®çžå¯Ÿçãªæ¯çã«é¢ããŠã¯ããã»ã©é ããªãããã§ãïŒã
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
headRef, err := r.Head()
if err != nil {
return err
}
parentObjOne, err := headRef.Peel(git.ObjectCommit)
if err != nil {
return err
}
parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit)
if err != nil {
return err
}
parentCommitOne, err := parentObjOne.AsCommit()
if err != nil {
return err
}
parentCommitTwo, err := parentObjTwo.AsCommit()
if err != nil {
return err
}
treeOid, err := index.WriteTree()
if err != nil {
return err
}
tree, err := r.LookupTree(treeOid)
if err != nil {
return err
}
remoteBranchName, err := remoteBranch.Name()
if err != nil {
return err
}
userName, userEmail, err := r.UserIdentityFromConfig()
if err != nil {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
_, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
if err != nil {
return err
}
return nil
}
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
try remoteBranchName := remoteBranch.Name()
try userName, userEmail := r.UserIdentityFromConfig() else err {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
try r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
return nil
}
try
/ else
ãã¿ãŒã³ã¯ãè€åif
ã«æ¯ã¹ãŠå€ãã®æåãä¿åããŸãããã次ã®ããã«ãªããŸãã
try
ãšçµ±åããŸãif
ãèŠããã§ããã¹ã³ãŒãã®å¥åŠããæžããæ©äŒãäžããŠãã ãããã ããæªåŠçã®try
ãæãäžè¬çã§ãã
@ianlancetaylor
errïŒ= nil {return err}ã®å Žåããã§ã«éè¬ããããŠããã®ãšåãããã«ãéè¬ããããªãããããã®äŸãèªãã§ã¿ãŠãã ããã
ç§ã¯ãããå¯èœ/åçã ãšã¯æããŸããã æ··éããè¡ã«è©Šè¡ãååšãããããããæ£ç¢ºã«äœãã©ãããããããŸãã¯1è¡ã«è€æ°ã®ã€ã³ã¹ã¿ã³ã¹ãããããšãèŠéããŠããŸã...ãããã¯ããªã¿ãŒã³ãã€ã³ããç°¡å/è¿ éã«ããŒã¯ãããã®äžã®è©³çŽ°ãæ°ã«ããªãããšãšåãã§ã¯ãããŸããã
@ianlancetaylor
äžæåæ¢ã®æšèãèŠããšãããã«å°å·ãããŠããåèªãèªãã§ãã®æ·±ãæå³ãçèãããããã圢ãè²ã§ãããèªèããŸãã
ç§ã®ç®ã¯if err != nil { return err }
ã«éè¬ãããããããããŸãããããããšåæã«ãã¯ã£ãããšç¬æã«ç»é²ãããŸãã
try
ã¹ããŒãã¡ã³ãã®ããªãšãŒã·ã§ã³ã«ã€ããŠç§ãæ°ã«å
¥ã£ãŠããã®ã¯ããã€ã©ãŒãã¬ãŒããæžããããšã§ãããéè¬ãããããããèŠéãã«ããæ¹æ³ã§ãã
ãã¡ãã¡ã«äœåãªè¡ãããããšãæå³ãããããããŸããããããã§ãçŸç¶ãããå°ãªãè¡ã§ãã
@brynbellomy
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
if headRef, err := r.Head(); err != nil {
return err
} else if parentObjOne, err := headRef.Peel(git.ObjectCommit); err != nil {
return err
} else parentObjTwo, err := remoteBranch.Reference.Peel(git.ObjectCommit); err != nil {
return err
} ...
èªã¿ãããã«é¢ããŠã¯ããã»ã©éãã¯ãããŸãããïŒãŸãã¯fmt.ErrorfïŒ "error with get headïŒïŒ s"ãerr.ErrorïŒïŒïŒã䜿çšãããšãè¿œå ã®ããŒã¿ãç°¡åã«å€æŽããŠæå®ã§ããŸãã
ãŸã ãã°ãªã®ã¯
誰ãããã§ã«ãã®ãããªãã®ãæçš¿ããŠããå Žåã¯ç³ãèš³ãããŸããïŒè¯ãã¢ã€ãã¢ããããããããŸãïŒPïŒãã®ä»£æ¿æ§æã¯ã©ãã§ããïŒ
fail := func(err error) error {
log.Print("unexpected error", err)
return err
}
a, b, err := f1() // normal
c, d := f2() -> throw // calls throw(err)
e, f := f3() -> panic // calls panic(err)
g, h := f4() -> t.Error // calls t.Error(err)
i, j := f5() -> fail // calls fail(err)
ã€ãŸããè¿ãããerrïŒ= nilã®å Žåã«åŒã³åºãããé¢æ°åŒã³åºãã®å³åŽã«ã -> handler
ããããŸãã ãã³ãã©ãŒã¯ããšã©ãŒãåäžã®åŒæ°ãšããŠåãå
¥ãããªãã·ã§ã³ã§ãšã©ãŒãè¿ãé¢æ°ã§ãïŒã€ãŸãã func(error)
ãŸãã¯func(error) error
ïŒã ãã³ãã©ãŒãnilãšã©ãŒãè¿ããå Žåãé¢æ°ã¯ç¶è¡ãããŸãããã以å€ã®å Žåã¯ããšã©ãŒãè¿ãããŸãã
ãããã£ãŠã a := b() -> handler
ã¯æ¬¡ãšåçã§ãã
a, err := b()
if err != nil {
if herr := handler(err); herr != nil {
return herr
}
}
ããŠãã·ã§ãŒãã«ãããšããŠã a := b() -> throw
ã®ç¥ã§ããtry
ãã«ãã€ã³ïŒãŸãã¯ããŒã¯ãŒããŸãã¯?=
æŒç®åãªã©ïŒããµããŒãã§ããã®ã§ã次ã®ããã«æžãããšãã§ããŸãã
func() error {
a, b := try(f1())
c, d := try(f2())
e, f := try(f3())
...
return nil
}() -> panic // or throw/fail/whatever
å人çã«ã¯ã ?=
æŒç®åã¯ãtryããŒã¯ãŒã/çµã¿èŸŒã¿ãããèªã¿ããããšæããŸãã
func() error {
a, b ?= f1()
c, d ?= f2()
e, f ?= f3()
...
return nil
}() -> panic
泚ïŒããã§ã¯ãåŒã³åºãå ã«ãšã©ãŒãè¿ããã«ãã€ã³ã®ãã¬ãŒã¹ãã«ããŒãšããŠthrowã䜿çšããŠããŸãã
ç§ã¯äžè¬çã«è³æã§ããã圌ããåãã£ãŠããæ¹æ³ã奜ããªã®ã§ããããŸã§ã®ãšãããšã©ãŒåŠçã®ææ¡ã«ã€ããŠã³ã¡ã³ãããŠããŸããã ææ¡ã§å®çŸ©ãããtryé¢æ°ãš@thepuddsã«ãã£ãŠææ¡ãããtryã¹ããŒãã¡ã³ãã¯ã©ã¡ãããèšèªãžã®åççãªè¿œå ã§ããããã«æãããŸãã GoããŒã ãæãã€ãããã®ã¯äœã§ãè¯ããã®ã«ãªããšç§ã¯ç¢ºä¿¡ããŠããŸãã
ææ¡ã§tryãã©ã®ããã«å®çŸ©ãããŠãããããããŠãããå°æ¥ã®æ¡åŒµã«ã©ã®ããã«åœ±é¿ãããã«ã€ããŠãç§ããã€ããŒãªåé¡ãšèŠãªããŠããããšãåãäžããããšæããŸãã
Tryã¯ãå¯å€æ°ã®åŒæ°ãåãé¢æ°ãšããŠå®çŸ©ãããŸãã
func try(t1 T1, t2 T2, ⊠tn Tn, te error) (T1, T2, ⊠Tn)
é¢æ°åŒã³åºãã®çµæãtry(f())
ã®ããã«try
ã«æž¡ãããšã¯ãGoã§ã®è€æ°ã®æ»ãå€ã®åäœæ¹æ³ã«ãããæé»çã«æ©èœããŸãã
ç§ãææ¡ãèªãã ãšããã次ã®ã¹ããããã¯æå¹ã§ãããæå³çã«åçã§ãã
a, b = try(f())
//
u, v, err := f()
a, b = try(u, v, err)
ãã®ææ¡ã¯ãŸããè¿œå ã®åŒæ°ã§try
ãæ¡åŒµããå¯èœæ§ãé«ããŸãã
äœããã®åœ¢ã§æ瀺çã«æäŸããããšã©ãŒãã³ãã©ãŒé¢æ°ããŸãã¯ãã®ä»ã®è¿œå ãã©ã¡ãŒã¿ãŒã䜿çšããã®ãè¯ãèãã§ãããšå°æ¥çã«å€æããå Žåããã®è¿œå ã®åŒæ°ãtryåŒã³åºãã«æž¡ãããšã¯ç°¡åã«å¯èœã§ãã
ãã³ãã©ãŒåŒæ°ãè¿œå ãããšããŸãã åŒæ°ãªã¹ãã®æåãŸãã¯æåŸã«é 眮ã§ããŸãã
var h handler
a, b = try(h, f())
// or
a, b = try(f(), h)
ïŒäžèšã®ã»ãã³ãã£ã¯ã¹ãåæãšããŠïŒ try
ã¯ãæ瀺çãªãã³ãã©ãŒåŒæ°ãšãã³ãã©ãŒãè¿ãé¢æ°ãåºå¥ã§ããªããããæåã«é
眮ããŠãæ©èœããŸããã
func f() (handler, error) { ... }
func g() (error) { ... }
try(f())
try(h, g())
ãããæåŸã«çœ®ãããšã¯ããããããŸãããã§ãããããããããããtryã¯åŒæ°ãªã¹ãã®å§ãã«varargsãã©ã¡ãŒã¿ãæã€å¯äžã®é¢æ°ã§ãããšããŠèšèªã§ãŠããŒã¯ã§ãããã
ãããã®åé¡ã¯ã©ã¡ããç®ãèŠåŒµããã®ã§ã¯ãããŸãããã try
ãä»ã®èšèªãšççŸããŠãããšæããããããã try
ãå°æ¥æ¡åŒµãããããã©ããã¯ããããŸãããææ¡ã¯è¿°ã¹ãŠããŸãã
@éæ³ã®
ãã³ãã©ãŒãæã€ããšã¯åŒ·åã§ããããããïŒ
ç§ã¯ããªãããã§ã«hã宣èšããŸããã
ããªãã¯ã§ãã
var h handler
a, b, h = f()
ãŸã
a, b, h.err = f()
é¢æ°ã®ãããªå ŽåïŒ
h:= handler(err error){
log(...)
return ....
}
ããããã
a, b, h(err) = f()
ãã¹ãŠããã³ãã©ãŒãåŒã³åºãããšãã§ããŸã
ãŸããææ¡ãããŠããããã«ããšã©ãŒïŒconitnue / break / returnïŒãè¿ããããã£ããã£ããã ãã®ãã³ãã©ãŒããéžæãããããšãã§ããŸãã
ãããã£ãŠãvarargsã®åé¡ã¯ãªããªããŸããã
@brynbellomyã®else
ææ¡ã®1ã€ã®ä»£æ¿æ¡ïŒ
a, b := try f() else err { /* handle error */ }
elseã®çŽåŸã«è£ 食æ©èœããµããŒãããããšãã§ããŸãã
decorate := func(err error) error { return fmt.Errorf("foo failed: %v", err) }
try a, b := f() else decorate
try c, d := g() else decorate
ãããŠå€åãŸãããã€ãã®ãŠãŒãã£ãªãã£ã¯æ¬¡ã®ç·ã«æ²¿ã£ãŠäœããæ©èœãããŸãïŒ
decorate := fmt.DecorateErrorf("foo failed")
è£
食é¢æ°ã¯çœ²åfunc(error) error
ãæã€ããšãã§ããtryãè©Šè¡ãããŠããé¢é£é¢æ°ããæ»ãçŽåã«ããšã©ãŒãååšããå Žåã«tryã«ãã£ãŠåŒã³åºãããŸãã
ããã¯ãææ¡ææžã®ä»¥åã®ãèšèšã®å埩ãã®1ã€ãšç²Ÿç¥çã«äŒŒãŠããŸãã
f := try(os.Open(filename), handler) // handler will be called in error case
ããè€éãªãã®ãã¹ããŒãã¡ã³ãã®ãããã¯ãå¿
èŠãªå Žåã¯ã代ããã«if
ã䜿çšã§ããŸãïŒä»æ¥ãšåãããã«ïŒã
ããã¯èšã£ãŠãã httpsïŒ //github.com/golang/go/issues/32437#issuecomment-500949780ã®@brynbellomyã®äŸã«ç€ºãããŠããtry
ã®èŠèŠçãªé
眮ã«ã¯çŽ æŽãããç¹ããããŸãã
ãã®ã¢ãããŒããåäžãªãšã©ãŒè£
食ã®ããã«éžæãããå Žåãããã¯ãã¹ãŠdefer
ã§æ©èœããå¯èœæ§ããããŸãïŒãŸãã¯çè«çã«ã¯è£
食é¢æ°ãç»é²ããå¥ã®åœ¢åŒãããå¯èœæ§ããããŸãããããã¯å¥ã®ãã€ã³ãã§ãïŒã
ãããã«ãããããã§äœãæåãã¯ããããŸããããå¥ã®ãªãã·ã§ã³ãæ瀺çã«ããããšæããŸããã
ããã@brynbellomyã®äŸã§ã try
é¢æ°ã§æžãçŽããã$ var
ãããã¯ã䜿çšããŠã @ thepuddsãhttps://github.com/golang/go/issuesã§ææããé©åãªé
眮ãä¿æããŠããŸãã
package main
import (
"fmt"
"time"
)
func createMergeCommit(r *repo.Repo, index *git.Index, remote *git.Remote, remoteBranch *git.Branch) error {
var (
headRef = try(r.Head())
parentObjOne = try(headRef.Peel(git.ObjectCommit))
parentObjTwo = try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne = try(parentObjOne.AsCommit())
parentCommitTwo = try(parentObjTwo.AsCommit())
treeOid = try(index.WriteTree())
tree = try(r.LookupTree(treeOid))
remoteBranchName = try(remoteBranch.Name())
)
userName, userEmail, err := r.UserIdentityFromConfig()
if err != nil {
userName = ""
userEmail = ""
}
var (
now = time.Now()
author = &git.Signature{Name: userName, Email: userEmail, When: now}
committer = &git.Signature{Name: userName, Email: userEmail, When: now}
message = fmt.Sprintf(`Merge branch '%v' of %v`, remoteBranchName, remote.Url())
parents = []*git.Commit{
parentCommitOne,
parentCommitTwo,
}
)
_, err = r.CreateCommit(headRef.Name(), author, committer, message, tree, parents...)
return err
}
ããã¯try
ã¹ããŒãã¡ã³ãããŒãžã§ã³ãšåããããç°¡æœã§ãããç§ã¯åãããã«èªã¿ããããšäž»åŒµããŸãã try
ã¯åŒã§ãããããèªã¿ããããç ç²ã«ããŠããããã®äžéå€æ°ã®ããã€ããåé€ã§ããŸãããããã¯ä»ã®äœãããã¹ã¿ã€ã«ã®åé¡ã®ããã§ãã
ãã ãã try
ãvar
ãããã¯ã§ã©ã®ããã«æ©èœããããšããåé¡ãçºçããŸãã var
ã®åè¡ã¯ããã€å²ãåœãŠããããã®é åºã«é¢ããŠã¯ããããã¯å
šäœãåäžã®ã¹ããŒãã¡ã³ãã§ã¯ãªããåå¥ã®ã¹ããŒãã¡ã³ããšããŠã«ãŠã³ãããããšæ³å®ããŠããŸãã
ãtryãã®ææ¡ã§ãåçŽãªã¹ããŒãã¡ã³ãã«ãŠã³ãã䜿çšããŠãã¹ãã«ãã¬ããžçµ±èšãæŠç®ããcmd / coverãªã©ã®ããŒã«ã®çµæãæ瀺çã«åŒã³åºããšããã§ãããã ç®ã«èŠããªããšã©ãŒå¶åŸ¡ãããŒãéå°ã«ãŠã³ãã«ãªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã
@thepudds
aãbïŒ= fïŒïŒãè©ŠããŠãã ããã
ããããç§ã®è³çŽ°èã®ç«å·ãæ·±ããããããããŸããããããã¯ç§ã«ããŸãã«ãå€ãã®ææãäžããŸã
try a, b := f() ;catch(decorate)
ãšæ»ããããåéãž
a, b := f()
catch(decorate)
ç§ã¯ããªãããããã©ãããªãŒãããŠããã®ããèŠãããšãã§ãããšæããŸãããããŠç§ã«ãšã£ãŠã¯æ¯èŒããŸã
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
try remoteBranchName := remoteBranch.Name()
ãš
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
remoteBranchName := remoteBranch.Name()
)
ïŒãŸãã¯æåŸã®ãã£ããïŒ
2ã€ç®ã¯ããèªã¿ããããªã£ãŠããŸããã以äžã®é¢æ°ã2ã€ã®å€æ°ãè¿ããšããäºå®ã匷調ããŠãããéæ³ã®ããã«1ã€ãç Žæ£ããŠããéæ³ã®æ»ããšã©ãŒãã«åéããŸãã
try(err) (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
remoteBranchName := remoteBranch.Name()
); err!=nil {
//handle the err
}
å°ãªããšãæ瀺çã«å€æ°ãè¿ãããã«èšå®ããå¿ èŠãªãšãã«ãã€ã§ãé¢æ°å ã§åŠçã§ããããã«ããŸãã
ä»ã®èª°ãæ瀺çã«èšåããŠããªãã®ã§ãç¹å®ã®ã³ã¡ã³ããæ¿å
¥ããã ãã§ããå
·äœçã«ã¯ã次ã®1è¡ã®æžåŒèšå®ãŸãã¯ä»»æã®ããªã¢ã³ãããµããŒãããããã«gofmt
ãå€æŽããããšã«ã€ããŠã§ãã
if f() { return nil, err }
ãããããé¡ãããŸãã åäžè¡if
ãå¿
èŠãªå Žåã¯ãåäžè¡if
ãäœæããŠãã ãããäŸïŒ
if f() then return nil, err
ãã ããäžãã£ãã䜿çšããã³ãŒããèªã¿ãããããããã®æ¹è¡ãåé€ããæ§æãµã©ãã䜿çšããªãã§ãã ããã
è°è«ã®æäžã«å¿ãããããããããªãããã€ãã®ããšã匷調ããããšæããŸãã
1ïŒãã®ææ¡ã®èŠç¹ã¯ãäžè¬çãªãšã©ãŒåŠçãããã¯ã°ã©ãŠã³ãã«ãã§ãŒãã€ã³ãããããšã§ãããšã©ãŒåŠçãã³ãŒããæ¯é
ããã¹ãã§ã¯ãããŸããã ããããããã§ãæ瀺çã§ããå¿
èŠããããŸãã ãšã©ãŒåŠçãããã«éç«ããã代æ¿æ¡ã®ãããããèŠç¹ãæ¬ ããŠããŸãã @ianlancetaylorããã§ã«è¿°ã¹ãããã«ããããã®ä»£æ¿æ¡ãå®åæã®éã倧å¹
ã«åæžããªãå Žåã¯ã if
ã¹ããŒãã¡ã³ãããã®ãŸãŸäœ¿çšã§ããŸãã ïŒãããŠãå®åæãæžããèŠæ±ã¯ãGoã³ãã¥ããã£ã®ããªãããæ¥ãŠããŸããïŒ
2ïŒçŸåšã®ææ¡ã«é¢ããäžæºã®1ã€ã¯ãããã«ã¢ã¯ã»ã¹ããããã«ãšã©ãŒçµæã«ååãä»ããå¿
èŠãããããšã§ãã 代æ¿æ¡ãè¿œå ã®æ§æãã€ãŸãããã®å€æ°ã«æ瀺çã«ååãä»ããããã®ããå€ãã®å®åæïŒ ... else err { ... }
ãªã©ïŒãå°å
¥ããªãéãã代æ¿æ¡ã§ãåãåé¡ãçºçããŸãã ããããèå³æ·±ãã®ã¯ããšã©ãŒã®è£
食ãæ°ã«ãããçµæãã©ã¡ãŒã¿ãŒã«ååãä»ããªãããããçš®ã®æ瀺çãªãã³ãã©ãŒãããããã«æ瀺çãªreturn
ãå¿
èŠãªå Žåããã®return
ã¹ããŒãã¡ã³ããã®å Žåããã€ããããªã¿ãŒã³ã¯èš±å¯ãããŠããªãããããã¹ãŠã®ïŒéåžžã¯ãŒãã®ïŒçµæå€ãåæããå¿
èŠããããŸãã ç¹ã«ãé¢æ°ããšã©ãŒãè£
食ããã«å€ãã®ãšã©ãŒãªã¿ãŒã³ãå®è¡ããå Žåããããã®æ瀺çãªãªã¿ãŒã³ïŒ return nil, err
ãªã©ïŒã¯ãã€ã©ãŒãã¬ãŒãã«è¿œå ãããŸãã çŸåšã®ææ¡ãããã³æ瀺çãªreturn
ãå¿
èŠãšããªã代æ¿æ¡ã¯ããããæé€ããŸãã äžæ¹ããšã©ãŒãè£
食ãããå ŽåãçŸåšã®ææ¡ã§ã¯ããšã©ãŒå€ã«ã¢ã¯ã»ã¹ããããã«ããšã©ãŒçµæïŒããã³ä»ã®ãã¹ãŠã®çµæïŒã«ååãä»ããå¿
èŠããããŸãã ããã«ã¯ãæ瀺çãªãã³ãã©ãŒã§ãã€ããããªã¿ãŒã³ã䜿çšã§ããä»ã®ãã¹ãŠã®çµæå€ãç¹°ãè¿ãå¿
èŠããªããšããåªããå¯äœçšããããŸãã ïŒè£žã®ãªã¿ãŒã³ã«ã¯åŒ·ãææ
ãããããšã¯ç¥ã£ãŠããŸãããå®éã«ã¯ããšã©ãŒã®çµæã ããæ°ã«ããå Žåãä»ã®ãã¹ãŠã®ïŒéåžžã¯ãŒãã®ïŒçµæå€ãåæããå¿
èŠãããã®ã¯æ¬åœã«åä»ã§ã-ããã¯äœãè¿œå ããŸããã³ãŒãã®ç解ïŒã ã€ãŸãããšã©ãŒçµæã«ååãä»ããŠè£
食ã§ããããã«ããããšã§ããã€ã©ãŒãã¬ãŒããããã«æžããããšãã§ããŸãã
@magicalãããææããŠãããŠããããšãã ç§ã¯ææ¡ãæçš¿ããçŽåŸã«åãããšã«æ°ã¥ããŸããïŒãããããã以äžæ··ä¹±ãåŒãèµ·ãããªãããã«ãããæã¡åºããŸããã§ããïŒã æ£è§£ã§ããã try
ã¯æ¡åŒµã§ããŸããã§ããã 幞ããªããšã«ãä¿®æ£ã¯ç°¡åã§ãã ïŒããŸããŸã以åã®å
éšææ¡ã«ã¯ãã®åé¡ã¯ãããŸããã§ãããå
¬éçšã«æçµããŒãžã§ã³ãæžãçŽããæ¢åã®ãã©ã¡ãŒã¿ãŒåãæž¡ãã«ãŒã«ã«ããå³å¯ã«äžèŽããããã«try
ãåçŽåããããšãããšãã«å°å
¥ãããŸãããããã¯ããã°ãããããã«æããŸããã -ããããçµå±ã®ãšãããæ¬ é¥ããããã»ãšãã©åœ¹ã«ç«ããªã- try(a, b, c, handle)
ãèšè¿°ã§ããããšã«ã¯å©ç¹ããããŸããïŒ
try
ã®ä»¥åã®ããŒãžã§ã³ã§ã¯ã倧ãŸãã«æ¬¡ã®ããã«å®çŸ©ãããŠããŸããã try(expr, handler)
ã¯ãåŒæ°ãšããŠ1ã€ïŒãŸãã¯2ã€ïŒã®åŒãåããŸããæåã®åŒã¯è€æ°å€ã§ããå¯èœæ§ããããŸãïŒåŒãé¢æ°åŒã³åºãïŒã ãã®ïŒããããè€æ°å€ã®ïŒåŒã®æåŸã®å€ã¯error
åã§ããå¿
èŠãããããã®å€ã¯nilã«å¯ŸããŠãã¹ããããŸãã ïŒãªã©-ããªããæ³åã§ããæ®ãã®éšåïŒã
ãšã«ãããèŠç¹ã¯ã try
æ§æçã«1ã€ããŸãã¯ãããã2ã€ã®åŒã®ã¿ãåãå
¥ãããšããããšã§ãã ïŒãã ãã try
ã®ã»ãã³ãã£ã¯ã¹ã説æããã®ã¯å°ãé£ããã§ããïŒçµæã¯ã次ã®ãããªã³ãŒãã«ãªããŸãã
a, b := try(u, v, err)
ããèš±å¯ãããªãã§ãããã ãããããããããããæ©èœãããçç±ã¯ã»ãšãã©ãããŸãããã»ãšãã©ã®å ŽåïŒ a
ãšb
ãçµæã«ååãä»ããããŠããªãéãïŒããã®ã³ãŒãã¯ãäœããã®çç±ã§éèŠãªå Žåã¯ãç°¡åã«æ¬¡ã®ããã«æžãçŽãããšãã§ããŸãã
a, b := u, v // we don't care if the assignment happens in case of an error
try(err)
ïŒãŸãã¯ãå¿
èŠã«å¿ããŠif
ã¹ããŒãã¡ã³ãã䜿çšããŸãïŒã ããããç¹°ãè¿ããŸãããããã¯éèŠã§ã¯ãªãããã§ãã
ãã®å Žåããã€ããããªã¿ãŒã³ã¯èš±å¯ãããªãããããã®returnã¹ããŒãã¡ã³ãã¯ãã¹ãŠã®ïŒéåžžã¯ãŒãã®ïŒçµæå€ãåæããå¿ èŠããããŸãã
裞ã§ã®åž°ãã¯èš±å¯ãããŠããŸããããè©ŠããŠã¿ãŠãã ããã tryïŒé¢æ°ãŸãã¯ã¹ããŒãã¡ã³ããšããŠïŒã«ã€ããŠç§ãæ°ã«å ¥ã£ãŠããããšã®1ã€ã¯ããšã©ãŒãè¿ããšãã«ãšã©ãŒä»¥å€ã®å€ãèšå®ããæ¹æ³ãèããå¿ èŠããªãããšã§ããtryã䜿çšããã ãã§ãã
@griesemer説æããããšãããããŸãã ãããç§ãåŸãçµè«ã§ãã
ã¹ããŒãã¡ã³ããšããŠã®try
ã«é¢ããç°¡åãªã³ã¡ã³ãïŒ httpsïŒ //github.com/golang/go/issues/32437#issuecomment -501035322ã®äŸã§ãããããã«ã try
ã¯ledeãåããŸãã ã³ãŒãã¯äžé£ã®try
ã¹ããŒãã¡ã³ãã«ãªããã³ãŒããå®éã«è¡ã£ãŠããããšãèŠãé ããŸãã
æ¢åã®ã³ãŒãã¯ã if err != nil
ãããã¯ã®åŸã«æ°ãã宣èšããããšã©ãŒå€æ°ãåå©çšããå ŽåããããŸãã å€æ°ãé衚瀺ã«ãããšãããå£ããååä»ãã®æ»ãå€æ°ãé¢æ°ã®ã·ã°ããã£ã«è¿œå ããŠããåžžã«ä¿®æ£ããããšã¯éããŸããã
ãšã©ãŒå®£èš/å²ãåœãŠããã®ãŸãŸã«ããŠã1è¡ã®ãšã©ãŒåŠçstmtãèŠã€ããã®ãæåãããããŸããã
err := f() // followed by one of
on err, return err // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err) // doesn't stop the function
on err, hname err // handler invocation without parens
on err, ignore err // optional ignore handler logs error if defined
if err, return err // alternatively, use if
handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
if err == io.Bad { return err }
fmt.Println(clr.name, err)
}
try
éšååŒã¯ãããã¯ã«ãªãå¯èœæ§ããããŸããã€ãŸãããšã©ãŒã¯äºæãããŸããã ãã®å€çš®ã¯ãšã©ãŒãç¡èŠããå¯èœæ§ããããŸãã
f(try g()) // panic on error
f(try_ g()) // ignore any error
ãã®ææ¡ã®èŠç¹ã¯ãäžè¬çãªãšã©ãŒåŠçãããã¯ã°ã©ãŠã³ãã«ãã§ãŒãã€ã³ãããããšã§ãããšã©ãŒåŠçãã³ãŒããæ¯é ããã¹ãã§ã¯ãããŸããã ããããããã§ãæ瀺çã§ããå¿ èŠããããŸãã
ã³ã¡ã³ãã«try
ãã¹ããŒãã¡ã³ããšããŠãªã¹ããããšããã¢ã€ãã¢ã奜ãã§ãã æ瀺çã§ãããªããïŒåºå®é·ã§ããããïŒç°¡åã«å
æ²¢ãåºãããšãã§ããŸãããæ··éããç·ã§é ãããšãã§ããããïŒåžžã«åãå Žæã«ããããïŒç°¡åã«å
æ²¢ãåºãããšã¯ã§ããŸããã åè¿°ã®ããã«defer fmt.HandleErrorf(...)
ãšçµã¿åãããããšãã§ããŸããããšã©ãŒãã©ããããããã«ååä»ããã©ã¡ãŒã¿ãŒãæªçšãããšããèœãšãç©ŽããããŸãïŒããã¯ãç§ã«ã¯ãŸã å·§åŠãªããã¯ã®ããã§ããå·§åŠãªããã¯ã¯æªãã§ãïŒã
åŒãšããŠtry
ãæ°ã«å
¥ããªãã£ãçç±ã®1ã€ã¯ãç°¡åã«ç解ã§ããªãããç°¡åã«ç解ã§ããªãããšã§ãã 次ã®2ã€ã®äŸãèŠãŠãã ããã
// Too hidden, it's in a crowded function with many symbols that complicate the function.
f, err := os.OpenFile(try(FileName()), os.O_APPEND|os.O_WRONLY, 0600)
// Not easy enough, the word "try" already increases horizontal complexity, and it
// being an expression only encourages more horizontal complexity.
// If this code weren't collapsed to multiple lines, it would be extremely
// hard to read and unclear as to what's executing when.
fullContents := try(io.CopyN(
os.Stdout,
try(net.Dial("tcp", "localhost:"+try(buf.ReadString("\n"))),
try(strconv.Atoi(try(buf.ReadString("\n")))),
))
// easy to see while still not being too verbose
try name := FileName()
os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
// does not allow for clever one-liners, code remains much more readable.
// also, the code reads in sequence from top-to-bottom.
try port := r.ReadString("\n")
try lengthStr := r.ReadString("\n")
try length := strconv.Atoi(lengthStr)
try con := net.Dial("tcp", "localhost:"+port)
try io.CopyN(os.Stdout, con, length)
ãã®ã³ãŒãã¯ééããªãèæ¡ããããã®ã§ããç§ã¯èªããŸãã ããããç§ãåŸãŠããã®ã¯ãäžè¬ã«ãåŒãšããŠã®try
ã¯æ¬¡ã®å Žåã«ã¯ããŸãæ©èœããªããšããããšã§ãã
ãã ãã @ ianlancetaylorã«åæããŸããåè¡ãtry
ã§å§ãããšãåã¹ããŒãã¡ã³ãã®éèŠãªéšåïŒå®çŸ©ãããŠããå€æ°ãŸãã¯å®è¡ãããŠããé¢æ°ïŒã®éªéã«ãªãããã§ãã ãã ããåãå Žæã«ãããå¹
ãåºå®ãããŠãããããæ°ã¥ããªããå
æ²¢ãåºãã®ãã¯ããã«ç°¡åã ãšæããŸãã ãããã人ã®ç®ã¯éããŸãã
ãŸããã³ãŒãã§å·§åŠãªã¯ã³ã©ã€ããŒã奚å±ããããšã¯ãäžè¬çã«ã¯æªãèãã ãšæããŸãã æåã®äŸã®ããã«åŒ·åãªã¯ã³ã©ã€ããŒãäœæã§ããããšã«é©ããŠããŸããããã¯ãå€ãã®ããšãå®è¡ããŠãããããç¬èªã®æ©èœå šäœã«å€ããã¹ããããã§ãããæããããã§ããªãå Žåã¯1è¡ã«åãŸããŸããèªã¿ãããã®ããã«è€æ°ã«ã ãªãŒã«ã€ã³ã¯ã³ã©ã€ã³ïŒ
fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))
*bufio.Reader
ããããŒããèªã¿åããTCPæ¥ç¶ãéå§ããåã*bufio.Reader
ã§æå®ããããã€ãæ°ãstdout
ã«ã³ããŒããŸãã ãã¹ãŠãšã©ãŒåŠçä»ãã ãã®ãããªå³å¯ãªã³ãŒãã£ã³ã°èŠåãæã€èšèªã®å Žåãããã¯å®éã«ã¯èš±å¯ãããã¹ãã§ã¯ãªããšæããŸãã ãã ãã gofmt
ãããã«åœ¹ç«ã€ãšæããŸãã
ãã®ãããªå³å¯ãªã³ãŒãã£ã³ã°èŠåãæã€èšèªã®å Žåãããã¯å®éã«ã¯èš±å¯ãããã¹ãã§ã¯ãªããšæããŸãã
Goã§å¿ãŸãããã³ãŒããæžãããšã¯å¯èœã§ãã ãããã²ã©ããã©ãŒãããããããšããå¯èœã§ãã ããã«å¯ŸããŠåŒ·ãèŠç¯ãšããŒã«ããããŸãã Goã«ãgoto
ããããŸãã
ã³ãŒãã¬ãã¥ãŒäžã«ãè€éãªåŒãæçšãªäžéåãæã€è€æ°ã®ã¹ããŒãã¡ã³ãã«åå²ããããã«äººã
ã«äŸé ŒããããšããããŸãã åãçç±ã§ãæ·±ããã¹ããããtry
ã«å¯ŸããŠãåæ§ã®ããšãè¡ããŸãã
ã€ãŸããèšèªãæªããããšãç ç²ã«ããŠãæªãã³ãŒããéåæ³åããããã«äžçæžåœåªåããªãã§ãã ããã ã³ãŒããã¯ãªãŒã³ã«ä¿ã€ããã®ä»ã®ã¡ã«ããºã ããããåºæ¬çã«ã±ãŒã¹ãã€ã±ãŒã¹ã§äººéã®å€æã䌎ããã®ã«é©ããŠããŸãã
Goã§å¿ãŸãããã³ãŒããæžãããšã¯å¯èœã§ãã ãããã²ã©ããã©ãŒãããããããšããå¯èœã§ãã ããã«å¯ŸããŠåŒ·ãèŠç¯ãšããŒã«ããããŸãã è¡ããåŸè€ããããŸãã
ã³ãŒãã¬ãã¥ãŒäžã«ãè€éãªåŒãæçšãªäžéåãæã€è€æ°ã®ã¹ããŒãã¡ã³ãã«åå²ããããã«äººã ã«äŸé ŒããããšããããŸãã åãçç±ã§ãæ·±ããã¹ããããè©Šè¡ã«å¯ŸããŠãåæ§ã®ããšãè¡ããŸãã
ã€ãŸããèšèªãæªããããšãç ç²ã«ããŠãæªãã³ãŒããéåæ³åããããã«äžçæžåœåªåããªãã§ãã ããã ã³ãŒããã¯ãªãŒã³ã«ä¿ã€ããã®ä»ã®ã¡ã«ããºã ããããåºæ¬çã«ã±ãŒã¹ãã€ã±ãŒã¹ã§äººéã®å€æã䌎ããã®ã«é©ããŠããŸãã
ããã¯è¯ãç¹ã§ãã æªãã³ãŒããäœæããããã«äœ¿çšã§ãããšããçç±ã ãã§ãè¯ãã¢ã€ãã¢ãéåæ³åããã¹ãã§ã¯ãããŸããã ããããããè¯ãã³ãŒããä¿é²ãã代æ¿æ¡ãããã°ãããã¯è¯ãèããããããªããšæããŸãã @ianlancetaylorã®ã³ã¡ã³ããŸã§ã try
ã®èåŸã«ããçã®ã¢ã€ãã¢ãïŒãã¹ãŠã®else { ... }
ãžã£ã³ã¯ãªãã§ïŒã¹ããŒãã¡ã³ããšããŠå®éã«è©±ãããšã¯ããŸããããŸããã§ããããèŠéããå¯èœæ§ããããŸãã
ãŸãããã¹ãŠã®äººãã³ãŒãã¬ãã¥ãŒã¢ãæã£ãŠããããã§ã¯ãªããäžéšã®äººã
ïŒç¹ã«é ãå°æ¥ïŒã¯ã¬ãã¥ãŒãããŠããªãGoã³ãŒããç¶æããå¿
èŠããããŸãã èšèªãšããŠã®ç§»åã¯ãéåžžãèšè¿°ãããã³ãŒãã®ã»ãšãã©ãã¹ãŠãé©åã«ä¿å®å¯èœã§ããããšã確èªããã®ã«éåžžã«åªããä»äºãããŸãïŒå°ãªããšãgo fmt
ã®åŸïŒãããã¯èŠéããªãããšã§ãã
ããã¯èšã£ãŠãããããæ¬åœã«ã²ã©ããã®ã§ã¯ãªããšããç§ã¯ãã®èãã«ã²ã©ãæ¹å€çã§ãã
ã¹ããŒãã¡ã³ããšããŠè©ŠããŠã¿ããšããã€ã©ãŒãã¬ãŒããå€§å¹ ã«åæžãããåŒãšããŠè©ŠããŠã¿ãããããelseãããã¯ããšã©ãŒãã³ãã©ãŒãèš±å¯ããªããŠããåã«ææ¡ããããã«åŒã®ãããã¯ã§æ©èœããããšãã§ããŸãã ããã䜿çšãããšãdeandeveloperã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
try (
name := FileName()
file := os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0600)
port := r.ReadString("\n")
lengthStr := r.ReadString("\n")
length := strconv.Atoi(lengthStr)
con := net.Dial("tcp", "localhost:"+port)
io.CopyN(os.Stdout, con, length)
)
ç®æšãif err!= nil {return err}
ã®å®åæãæžããããšã§ããå Žåãã³ãŒãã®ãããã¯ãåãããšãå¯èœã«ããã¹ããŒãã¡ã³ãtryã¯ãäžæ確ã«ãªãããšãªãããããè¡ãå¯èœæ§ãæãé«ããšæããŸãã
@beoranãã®æç¹ã§ããªããŸã£ããè©ŠããŠã¿ãã®ã§ããïŒ æåŸã®ãšã©ãŒå€ãæ¬ èœããŠããå²ãåœãŠãèš±å¯ãããããtryã¹ããŒãã¡ã³ãïŒãŸãã¯é¢æ°åŒã³åºãïŒã§ãããã®ããã«åäœãããã ãã§ãã ç§ãææ¡ããŠããããã§ã¯ãããŸããããããã¯å®åæãããã«æžããã§ãããã
ãããã®varãããã¯ã«ãã£ãŠãã€ã©ãŒãã¬ãŒããå¹ççã«åæžããããšæããŸããã倧éã®ã³ãŒããè¿œå ã¬ãã«ã§ã€ã³ãã³ããããå¯èœæ§ããããæ®å¿µã§ãã
@deanveloper
fullContents := try(io.CopyN(os.Stdout, try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))), try(strconv.Atoi(try(r.ReadString("\n"))))))
ç§ã¯ç§ã«ãšã£ãŠèªããªãããšãèªããªããã°ãªããŸãããç§ã¯ããããç§ãããªããã°ãªããªããšæããã§ãããïŒ
fullContents := try(io.CopyN(os.Stdout,
try(net.Dial("tcp", "localhost:"+try(r.ReadString("\n"))),
try(strconv.Atoi(try(r.ReadString("\n"))))))
ãŸãã¯åæ§ã®èªã¿ãããã®ããã«ããã¹ãŠã®è¡ã®å é ã«ã€ã³ãã³ããä»ããŠãè©Šè¡ããè¿ããŸãã
ãŸããäžäœäºææ§ãè©Šãå¿ èŠãããããããã¯ã§çºçããå¯èœæ§ã®ãããªã¿ãŒã³ã«ã€ããŠãæ瀺ããå¿ èŠããããšæããŸãã ããããç§ã¯ãã€ã©ãŒãã¬ãŒããæžãããŠããããç§ãã¡ãã©ãã«å°ãããèŠãŠãããšããè«çã«åŸã£ãŠããããšã«æ³šæããŠãã ããã ãã€ã©ãŒãã¬ãŒããæžããããšãšæå¿«ãã®éã«ã¯åžžã«ç·åŒµé¢ä¿ããããŸãã ãã®åé¡ã§ç®åã«ããäž»ãªåé¡ã¯ãç§ãã¡å šå¡ããã©ã³ã¹ãã©ãã«çœ®ãã¹ããã«ã€ããŠæèŠãåãããŠããããã«èŠããããšã ãšæããŸãã
ã€ã³ãã³ãã«é¢ããŠã¯ããããfmtã®ç®çãªã®ã§ãå人çã«ã¯ããã»ã©åé¡ã«ã¯ãªããªããšæããŸãã
äºãã«å ãã£ãŠããããããç¬ç«ããŠããå¥ã®2ã€ã®å¯èœæ§ã«ã€ããŠèšåãããã®ã§ãããããå¥ã ã®æçš¿ã«ä¿ç®¡ããŸãã
ãšã©ãŒæ»ãå€æ°ãžã®ãã€ã³ã¿ãŒãè¿ãããã«try()
ïŒåŒæ°ãªãïŒãå®çŸ©ã§ãããšããææ¡ã¯èå³æ·±ããã®ã ãšæããŸãããããã®ãããªãããã«ã¯ç±å¿ã§ã¯ãããŸããã§ããã ãGoãåé¿ãããã®ã
ãã ããããŒã«ã«ãšã©ãŒå€ãåç §ããäºåå®çŸ©ãããèå¥åã®äžè¬çãªèãæ¹ãæ°ã«å ¥ããŸããã
ã§ã¯ã err
èå¥åèªäœããšã©ãŒæ»ãå€æ°ã®ãšã€ãªã¢ã¹ãšããŠäºåå®çŸ©ããŠã¯ã©ãã§ããããã ãããã£ãŠãããã¯æå¹ã§ãã
func foo() error {
defer handleError(&err, etc)
try(something())
}
æ©èœçã«ã¯æ¬¡ã®ãã®ãšåãã§ãã
func foo() (err error) {
defer handleError(&err, etc)
try(something())
}
err
èå¥åã¯ãé¢æ°ããŒã«ã«ãšã€ãªã¢ã¹ãšããŠæ©èœããŸããããŠãããŒã¹ã¹ã³ãŒãã§å®çŸ©ãããããã err
ã®ããã±ãŒãžã¬ãã«å®çŸ©ãŸãã¯é¢æ°ããŒã«ã«å®çŸ©ã¯ããããªãŒããŒã©ã€ãããŸãã ããã¯å±éºã«æãããããããŸãããã Goã³ãŒãã¹ã§Goã®22mã®ç·ãã¹ãã£ã³ããã®ã§ãéåžžã«ãŸãã§ãã ã°ããŒãã«ãšããŠäœ¿çšãããerr
ã®ã€ã³ã¹ã¿ã³ã¹ã¯4ã€ã ãã§ãïŒãã¹ãŠãåãå®æ°ã§ã¯ãªãå€æ°ãšããŠïŒ-ããã¯vet
ãèŠåããå¯èœæ§ããããã®ã§ãã
ã¹ã³ãŒãå ã«2ã€ã®é¢æ°ãšã©ãŒæ»ãå€æ°ãååšããå¯èœæ§ããããŸãã ãã®å Žåãã³ã³ãã€ã©ãŒããããŸããããããšæå¥ãèšãããŠãŒã¶ãŒã«æ£ããæ»ãå€æ°ã«æ瀺çã«ååãä»ããããã«èŠæ±ããã®ãæåã ãšæããŸãã ãããã£ãŠãããã¯ç¡å¹ã«ãªããŸãã
func foo() error {
f := func() error {
defer handleError(&err, etc)
try(something())
return nil
}
return f()
}
ãããã代ããã«ãã€ã§ããããæžãããšãã§ããŸãïŒ
func foo() error {
f := func() (err error) {
defer handleError(&err, etc)
try(something())
return nil
}
return f()
}
æŒç®åã§ã¯ãªãäºåå®çŸ©ãããèå¥åãšããŠã®try
ã«ã€ããŠã¯ã
æžãåºããšãã«æ¬åŒ§ãç¹°ãè¿ãééããåŸãç§ã¯åŸè
ã奜ãåŸåã«ããããšã«æ°ã¥ããŸããã
try(try(os.Create(filename)).Write(data))
ããªãRustã®ããã«äœ¿çšã§ããªãã®ã§ããïŒãã®äžã«ãFAQã«ã¯æ¬¡ã®ããã«æžãããŠããŸãã
ãããŸã§ã®ãšããããããŸããŸãã¯éèªæãªæå³ãæã€ïŒãªã©ã®ç°åžžãªæŒç®åãå«ããèšèªå ã®äžå¯è§£ãªç¥èªãèšå·ã¯é¿ããŠããŸããã
ãããæ¬åœãã©ããã¯å®å
šã«ã¯ããããŸããã .()
æŒç®åã¯ããã£ãã«æŒç®åãšåæ§ã«ãGoãç解ãããŸã§ã¯çãããã®ã§ãã ?
æŒç®åãè¿œå ããå Žåãããã¯ãŸããªããŠããã¿ã¹ã«ãªãã倧ããªéå£ã«ã¯ãªããªããšæããŸãã
ãã ããRust ?
æŒç®åã¯ãé¢æ°åŒã³åºãã®éãæ¬åŒ§ã®åŸã«è¿œå ãããŸããããã¯ãåŒæ°ãªã¹ããé·ãå Žåã«èŠéããããããšãæå³ããŸãã
?()
ãåŒã³åºãæŒç®åãšããŠè¿œå ããã®ã¯ã©ãã§ããã
ãããã£ãŠã代ããã«ïŒ
x := try(foo(a, b))
ããªããããã ããïŒ
x := foo?(a, b)
?()
ã®ã»ãã³ãã£ã¯ã¹ã¯ãææ¡ãããtry
ãã«ãã€ã³ã®ã»ãã³ãã£ã¯ã¹ãšéåžžã«äŒŒãŠããŸãã åŒã³åºãããé¢æ°ãŸãã¯ã¡ãœãããæåŸã®åŒæ°ãšããŠãšã©ãŒãè¿ããªããã°ãªããªãããšãé€ããŠãé¢æ°åŒã³åºãã®ããã«æ©èœããŸãã try
ãšåæ§ã«ããšã©ãŒãnil以å€ã®å Žåã ?()
ã¹ããŒãã¡ã³ãã¯ãããè¿ããŸãã
è°è«ãååã«éäžããŠããããã«æãããã®ã§ãçŸåšãæ確ã«å®çŸ©ãããè°è«ãããŠããäžé£ã®ãã¬ãŒããªããå·¡åããŠããŸãã 劥åã¯ãã®èšèªã®ç²Ÿç¥ã«éåžžã«ããã®ã§ãããã¯å°ãªããšãç§ã«ãšã£ãŠã¯å¿åŒ·ããã®ã§ãã
@ianlancetaylor try
ã§å§ãŸãæ°åè¡ã«ãªãããšã絶察ã«èªããŸãã ãã ããåãreturn
åŒãæ瀺çã«ç€ºã2ã4è¡ã®æ¡ä»¶åŒã§åŸçœ®ãããæ°åè¡ãããæªãããšã¯ããããŸããã å®éã try
ïŒ else
å¥ãå«ãïŒã䜿çšãããšããšã©ãŒãã³ãã©ãŒãç¹å¥ãª/ããã©ã«ã以å€ã®åŠçãè¡ã£ãŠãããšãã«ç°¡åã«èŠã€ããããšãã§ããŸãã ãŸããæ¥ç·æ¹åã«ãreïŒæ¡ä»¶ä»ãif
åŒãææ¡ãããtry
-as-a-statementãããå€ãã®ledeãåããŠãããšæããŸãïŒé¢æ°åŒã³åºãã¯æ¡ä»¶ä»ããšåãè¡ã«ãããŸããæ¡ä»¶èªäœã¯ãã§ã«æ··éããŠããè¡ã®æåŸã«ãªããå€æ°ã®å²ãåœãŠã¯ãããã¯ã«ã¹ã³ãŒããããŸãïŒãããã¯ã®åŸã«ãããã®å€æ°ãå¿
èŠãªå Žåã¯ãå¥ã®æ§æãå¿
èŠã«ãªããŸãïŒã
@josharianç§ã¯æè¿ãã®èããããªãæã£ãŠããŸããã Goã¯å®ç§ã§ã¯ãªãå®çšäž»çŸ©ãç®æããŠåªåããŠããããã®éçºã¯ååäž»å°ã§ã¯ãªãããŒã¿äž»å°ã§ããããšãå€ãããã§ãã ããªãã¯ã²ã©ãGoãæžãããšãã§ããŸãããããã¯éåžžããŸãšããªGoãæžããããé£ããã§ãïŒããã¯ã»ãšãã©ã®äººã«ãšã£ãŠååã§ãïŒã ãŸããææãã䟡å€ããããŸããäžæ£ãªã³ãŒããšæŠãããã®ããŒã«ããããããããŸãã gofmt
ãšgo vet
ã ãã§ãªããååãããã®ã³ãã¥ããã£ãïŒéåžžã«æ³šææ·±ãïŒèªåèªèº«ãå°ãããã«äœãäžããæåã§ãã 誰ããèªåèªèº«ãæ»æãããããããªããšããçç±ã ãã§ãäžè¬çãªã±ãŒã¹ãå©ããæ¹åãé¿ããããããŸããã
@beoranããã¯ãšã¬ã¬ã³ãã§ãããèããŠã¿ããšãä»ã®èšèªã®try
ãããã¯ãšã¯å®éã«ã¯æå³çã«ç°ãªããŸããããã¯ãæªåŠçã®ãšã©ãŒã§é¢æ°ããæ»ããšãã1ã€ã®å¯èœãªçµæããåŸãããªãããã§ãã ãã ãã 1ïŒããã¯ä»ã®èšèªã§äœæ¥ããæ°ããGoã³ãŒããŒã«ãšã£ãŠããããæ··ä¹±ãæããŸãïŒæ£çŽãªãšãããç§ã®æ倧ã®é¢å¿äºã§ã¯ãããŸãããããã°ã©ããŒã®ã€ã³ããªãžã§ã³ã¹ãä¿¡é ŒããŠããŸãïŒã2ïŒããã«ãããå€ãã®èšèªã§å€§éã®ã³ãŒããã€ã³ãã³ããããŸããã³ãŒãããŒã¹ã ç§ã®ã³ãŒãã«é¢ããéãããã®çç±ãããæ¢åã®type
/ const
/ var
ãããã¯ãé¿ããåŸåããããŸãã ãŸããçŸåšãã®ãããªãããã¯ãèš±å¯ããŠããããŒã¯ãŒãã¯å®çŸ©ã®ã¿ã§ãããå¶åŸ¡ã¹ããŒãã¡ã³ãã§ã¯ãããŸããã
@yiyusæ瀺æ§ã¯ïŒç§ã®æèŠã§ã¯ïŒGoã®é·æã®1ã€ã§ãããããããŒã¯ãŒããåé€ããããšã«åæããŸããã ãããã try
åŒãå©çšããããã«å€§éã®ã³ãŒããã€ã³ãã³ãããããšã¯ãæªãèãã§ããããšã«åæããŸãã ã§ã¯ã try
ãããã¯ã¯ãŸã£ãããªãã®ã§ããããïŒ
@rogpeppeãã®çš®ã®åŸ®åŠãªæŒç®åã¯ããšã©ãŒãè¿ããªãåŒã³åºãã«å¯ŸããŠã®ã¿åççã§ããããšã©ãŒãè¿ããããšãããã¯ã«ãªããšæããŸãã ãŸãã¯ãåžžã«ãšã©ãŒãç¡èŠããå ŽæãåŒã³åºããŸãã ããããäž¡æ¹ãšããŸããªããã§ãã æ°ãããªãã¬ãŒã¿ãŒãåãå ¥ããå Žåã¯ãïŒ32500ãåç §ããŠãã ããã
f(try g())
ã¯ã httpsïŒ //github.com/golang/go/issues/32437#issuecomment -501074836ã§ã1è¡ã®åŠçstmtãšãšãã«ãããã¯ã«ãªãããšãææ¡ããŸããã
on err, return ...
try ... else { ... }
$ã®ãªãã·ã§ã³ã®else
ã¯ãã³ãŒããå³ã«æŒããããŠãã³ãŒããèŠãé ããŠããŸãå¯èœæ§ããããšæããŸãã ã»ãšãã©ã®å Žåããšã©ãŒãããã¯ã«ã¯å°ãªããšã25æåãããã¯ãã§ãã ãŸãããããŸã§ãããã¯ã¯go fmt
ã«ãã£ãŠåãè¡ã«ä¿æãããŠãããããã®åäœã¯try else
ã®éä¿æããããšæããŸãã ãããã£ãŠã else
ãããã¯ãå¥ã®è¡ã«ãããµã³ãã«ã«ã€ããŠè©±ãåããæ¯èŒããå¿
èŠããããŸãã ããããããã§ããè¡æ«ã®else {
ã®èªã¿ãããã«ã€ããŠã¯ããããããŸããã
@yiyus https://github.com/golang/go/issues/32437#issuecomment -501139662
@beoranãã®æç¹ã§ããªããŸã£ããè©ŠããŠã¿ãã®ã§ããïŒ æåŸã®ãšã©ãŒå€ãæ¬ èœããŠããå²ãåœãŠãèš±å¯ãããããtryã¹ããŒãã¡ã³ãïŒãŸãã¯é¢æ°åŒã³åºãïŒã§ãããã®ããã«åäœãããã ãã§ãã ç§ãææ¡ããŠããããã§ã¯ãããŸããããããã¯å®åæãããã«æžããã§ãããã
Go1ã§ã¯ãã§ã«func foo() error
ãfoo()
$ãšããŠåŒã³åºãããšãèš±å¯ãããŠãããããããã¯å®è¡ã§ããŸããã åŒã³åºãå
ã®æ»ãå€ã«, error
ãè¿œå ãããšããã®é¢æ°å
ã®æ¢åã®ã³ãŒãã®åäœãå€æŽãããŸãã https://github.com/golang/go/issues/32437#issuecomment-500289410ãåç
§ããŠãã ãã
@rogpeppeãã¹ããããtry
ã§æ¬åŒ§ãæ£ããããããšã«ã€ããŠã®ããªãã®ã³ã¡ã³ãã§ïŒ try
ã®åªå
é äœã«ã€ããŠäœãæèŠã¯ãããŸããïŒ ãã®ããŒãã«é¢ãã詳现ãªèšèšããã¥ã¡ã³ããåç
§ããŠãã ããã
@griesemerããã«ææãããŠããçç±ãããç§ã¯åé
æ¥é æŒç®åãšããŠtry
ã«ããã»ã©ç±å¿ã§ã¯ãããŸããã å¥ã®ã¢ãããŒãã¯ãé¢æ°ã®æ»ãã¿ãã«ã®ç䌌ã¡ãœãããšããŠtry
ãèš±å¯ããããšã§ãããšç§ã¯æããŸããã
f := os.Open(path).try()
ããã§åªå é äœã®åé¡ã¯è§£æ±ºãããšæããŸãããå®éã«ã¯ããŸãGoã«äŒŒãŠããŸããã
@rogpeppe
ãšãŠãèå³æ·±ãïŒ ã ããªãã¯æ¬åœã«ããã§äœãã«åãçµãã§ãããããããŸããã
ãããŠããã®ã¢ã€ãã¢ããã®ããã«æ¡åŒµããã®ã¯ã©ãã§ããïŒ
for _,fp := range filepaths {
f := os.Open(path).try(func(err error)bool{
fmt.Printf( "Cannot open file %s\n", fp );
continue;
});
}
ãšããã§ãç§ã¯ããããguard()
$ã®ããã«try()
ãšã¯å¥ã®ååã奜ããããããŸããããä»ã®äººãã¢ãŒããã¯ãã£ã«ã€ããŠè°è«ããåã«ååãèªè»¢è»ã«ä¹ããã¹ãã§ã¯ãããŸããã
vsïŒ
for _,fp := range filepaths {
if f,err := os.Open(path);err!=nil{
fmt.Printf( "Cannot open file %s\n", fp )
}
}
ïŒ
ç§ã¯$ïŒ$ if err!=nil {return err}
try a,b := foo()
ã奜ãã§ãããªããªããããã¯æ¬åœã«åçŽãªã±ãŒã¹ã®å®åæã眮ãæããããã§ãã ããããã³ã³ããã¹ããè¿œå ããä»ã®ãã¹ãŠã«ã€ããŠã if err!=nil {...}
以å€ã®ãã®ãæ¬åœã«å¿
èŠã§ããïŒããè¯ããã®ãèŠã€ããã®ã¯éåžžã«å°é£ã§ãïŒïŒ
éåžžãè£ é£Ÿ/æãè¿ãã«è¿œå ã®è¡ãå¿ èŠãªå Žåã¯ããã®è¡ããå²ãåœãŠããŸãããã
f, err := os.Open(path) // normal Go \o/
on err, return fmt.Errorf("Cannot open %s, due to %v", path, err)
@networkimprovç§ãããã奜ãã ãšæããŸãã ç§ããã§ã«è²ãŠããããé é»çã§èª¬æçãªçšèªãæšãé²ããŠ...
f, err := os.Open(path)
relay err { nil, fmt.Errorf("Cannot open %s, due to %v", path, err) }
// marginally shorter, doesn't trigger vertical formatting unless excessively wide
// enclosed expression restricted to a list of values that match the return args
ãŸã
f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)
// somewhere between statement and func, prob more pleasing to type w/out completion
// trailing expression restricted to a list of values that match the return args
// maybe excessive width triggers linting noise - with a reformatter available
// providing a reformatter would make swapping old (narrow enough) code easy
@davedããªãããããæ°ã«å
¥ã£ãŠãããŠããããã§ãïŒ on err, ...
ã¯ãä»»æã®åäžstmtãã³ãã©ãŒãèš±å¯ããŸãã
err := f() // followed by one of
on err, return err // any type can be tested for non-zero
on err, return fmt.Errorf(...)
on err, fmt.Println(err) // doesn't stop the function
on err, continue // retry in a loop
on err, hname err // named handler invocation without parens
on err, ignore err // logs error if handle ignore() defined
handle hname(err error, clr caller) { // type caller has results of runtime.Caller()
if err == io.Bad { return err } // non-local return
fmt.Println(clr, err)
}
ç·šéïŒ on
ã¯JavascriptããåçšããŠããŸãã if
ããªãŒããŒããŒãããããããŸããã§ããã
ã«ã³ãã¯å¿
é ã§ã¯ãããŸããããã»ãã³ãã³ã¯å¥œãã§ã¯ãããŸããã å€åã³ãã³ïŒ
ç§ã¯relay
ãå®å
šã«ã¯ãã©ããŒããŠããŸãã; ãšã©ãŒæã®ãªã¿ãŒã³ãæå³ããŸããïŒ
äœããã®æ¡ä»¶ãæºãããããšãä¿è·ãªã¬ãŒãäœåããŸãã ãã®å Žåããšã©ãŒå€ãnilã§ãªãå Žåããªã¬ãŒã¯å¶åŸ¡ãããŒãå€æŽããŠãåŸç¶ã®å€ã䜿çšããŠæ»ããŸãã
*ãã®å Žåã ,
ããªãŒããŒããŒãããããªãã®ã§ã on
ãšããçšèªã®ãã¡ã³ã§ã¯ãããŸããããã³ãŒãæ§é ã®åæãšå
šäœçãªå€èŠ³ã¯æ°ã«å
¥ã£ãŠããŸãã
@josharianã®å
ã®ææã«ããã°ãæ¬åŒ§ã®äžèŽã«é¢ããè°è«ã®å€§éšåã¯ãã»ãšãã©ã仮説ã§ãããäžèªç¶ãªäŸã䜿çšããŠããããã«æããŸãã ããªãã®ããšã¯ããããŸããããæ¥åžžã®ããã°ã©ãã³ã°ã§é¢æ°åŒã³åºããæžãã®ã«èŠåŽããŠããããšã¯ãããŸããã åŒãèªã¿ã¥ãããªã£ããç解ãã¥ãããªã£ããããå Žåã¯ãäžéå€æ°ã䜿çšããŠè€æ°ã®åŒã«åå²ããŸãã é¢æ°åŒã³åºãæ§æã䜿çšããtry()
ããå®éã«ã¯ãã®ç¹ã§ç°ãªãçç±ãããããŸããã
@eandreéåžžãé¢æ°ã«ã¯ãã®ãããªåçãªå®çŸ©ã¯ãããŸããã ãã®ææ¡ã®å€ãã®åœ¢åŒã¯ãå¶åŸ¡ãããŒã®éä¿¡ãåãå·»ãå®å šæ§ãäœäžãããããã¯åä»ã§ãã
@networkimprov @davedç§ã¯ãããã®2ã€ã®ã¢ã€ãã¢ãå«ãã§ã¯ãããŸãããã1è¡ã®if err != nil { ... }
ã¹ããŒãã¡ã³ãã§èšèªã®å€æŽãä¿èšŒãããããååã«æ¹åãããŠãããšã¯æããŠããŸããã ãŸããåã«ãšã©ãŒãè¿ããŠããå Žåã«ãç¹°ãè¿ãã®ãã€ã©ãŒãã¬ãŒããæžããããã«äœãããŸããïŒ ãããšããåžžã«return
ãæžãåºãå¿
èŠããããšããèãã§ããïŒ
@brynbellomyç§ã®äŸã§ã¯ã return
ã¯ãããŸããã relay
ã¯ãããã®ãšã©ãŒãnilã§ãªãå Žåã次ã®ãšã©ãŒãè¿ãããããšå®çŸ©ãããä¿è·ãªã¬ãŒã§ãã
åã®2çªç®ã®äŸã䜿çšããŸãã
f, err := os.Open(path)
relay(err) nil, fmt.Errorf("Cannot open %s, due to %v", path, err)
次ã®ãããªãã®ããããŸãïŒ
f, err := os.Open(path)
relay(err)
ãªã¬ãŒãããªãããããšã©ãŒãçºçããä»ã®æ»ãå€ïŒãŸãã¯ååä»ãã®æ»ãå€ã«èšå®ãããŠããå€ïŒã®ãŒãå€ãè¿ãããŸãã 圹ã«ç«ã€ãããããªãå¥ã®ãã©ãŒã ïŒ
wrap := func(err error, msg string) error {
if err != nil {
fmt.Errorf("%s: %s", msg, err)
}
return nil
}
// ...
f, err := os.Open(path)
relay(err, wrap(err, fmt.Sprintf("Cannot open %s", path)))
ãªã¬ãŒãæåã®ãªã¬ãŒåŒæ°ã«ãã£ãŠããªãããããªãéãã2çªç®ã®ãªã¬ãŒåŒæ°ã¯åŒã³åºãããŸããã ãªãã·ã§ã³ã®2çªç®ã®ãªã¬ãŒãšã©ãŒåŒæ°ã¯ãè¿ãããå€ã«ãªããŸãã
_go fmt_ã¯åäžè¡ã®if
ãèš±å¯ããå¿
èŠããããŸããã case, for, else, var ()
èš±å¯ããŸãããïŒ å
šéšãé¡ãããŸã;-)
GoããŒã ã¯ãåäžè¡ã®ãšã©ãŒãã§ãã¯ã«å¯Ÿããå€ãã®èŠæ±ãç¡èŠããŸããã
on err, return err
ã¹ããŒãã¡ã³ãã¯ç¹°ãè¿ãã«ãªãå¯èœæ§ããããŸãããæ瀺çã§ç°¡æœã§æ確ã§ãã
@magicalãã£ãŒãããã¯ã¯ã詳现ãªææ¡ã®æŽæ°ããŒãžã§ã³ã§å¯ŸåŠãããŠããŸãã
å°ããªããšã§ããã try
ãããŒã¯ãŒãã®å Žåãçµäºã¹ããŒãã¡ã³ããšããŠèªèãããå¯èœæ§ãããããã代ããã«
func f() error {
try(g())
return nil
}
ããªãã¯ãã ããããšãã§ããŸã
func f() error {
try g()
}
ïŒ try
-statementã¯ç¡æã§ãããååŸãã try
-operatorã¯ç¹å¥ãªåŠçãå¿
èŠãšããŸããç§ã¯äžèšãè¯ãäŸã§ã¯ãªãããšãç解ããŠããŸãïŒãããããã¯æå°éã§ãïŒ
@jimmyfrasche try
ã¯ãããŒã¯ãŒãã§ãªããŠãçµäºã¹ããŒãã¡ã³ããšããŠèªèãããå¯èœæ§ããããŸãããã§ã«panic
ã§ãããè¡ã£ãŠããã®ã§ããã§ã«è¡ã£ãŠããããšä»¥å€ã«ç¹å¥ãªåŠçã¯å¿
èŠãããŸããã ãããããã®ç¹ãé€ãã°ã try
ã¯çµäºã¹ããŒãã¡ã³ãã§ã¯ãªãã人çºçã«ãããäœæããããšããã®ã¯å¥åŠã«æããŸãã
ãã¹ãŠã®æå¹ãªãã€ã³ãã 詳现ãªææ¡ã®CopyFile
ã®ããã«ããšã©ãŒã®ã¿ãè¿ãé¢æ°ã®æåŸã®è¡ã§ãããã try(err)
ãšããŠäœ¿çšãããŠããå Žåã«ã®ã¿ãçµäºã¹ããŒãã¡ã³ããšç¢ºå®ã«èŠãªãããšãã§ãããšæããŸãã if
ã§ããããšãããã£ãŠããerr != nil
ã§ã ããã ãã®äŸ¡å€ã¯ãªãããã§ãã
ãã®ã¹ã¬ããã¯é·ããªãããã©ããŒããã®ãé£ãããªã£ãŠããïŒãããŠããçšåºŠç¹°ãè¿ããå§ããŠããïŒã®ã§ãç§ãã¡ã¯çããææ¡ãæäŸããããã€ãã®å©ç¹ã«ã€ããŠåŠ¥åããå¿ èŠãããããšã«åæããã ããããšæããŸãã
äžèšã®ææ¡ãããã³ãŒãé åã奜ããŸãã¯å«ãã«ãç¶ããã®ã§ããããã¯ä»ã®ãã®ãããè³¢æãªåŠ¥åã§ããã/ãã§ã«æäŸãããŠãããã®ããšããæ¬åœã®æèŠãåŸãã®ãå©ããŠããŸãããïŒ
ãè©ŠããŠã¿ããããªãšãŒã·ã§ã³ãšä»£æ¿ææ¡ãè©äŸ¡ãã客芳çãªåºæºãå¿ èŠã ãšæããŸãã
ãã¡ãããããŒãŽãŒã®åºæ¬ã«ãŒã«ãèšå®ããããšãã§ãïŒäžäœäºææ§ã¯ãããŸããïŒããé åç/è žã®æèŠãªã©ã«èŠããããã®ç°è²ã®é åãæ®ãããšãã§ããŸãïŒäžèšã®ãé£ãããåºæºãè°è«ã®äœå°ããããŸãã ãïŒã
ãã®ãªã¹ãã«å¯ŸããŠææ¡ããã¹ãããåãã€ã³ãïŒãã€ã©ãŒãã¬ãŒã5ãã€ã³ããèªã¿ããã4ãã€ã³ããªã©ïŒãè©äŸ¡ãããšã代ããã«æ¬¡ã®ç¹ã«åãããããšãã§ãããšæããŸãã
ç§ãã¡ã®éžæè¢ã¯ããããAãBãCã§ãããããã«ãæ°ããææ¡ãè¿œå ããã人ã¯ã圌ã®ææ¡ãåºæºãæºãããŠãããã©ãããïŒããçšåºŠïŒãã¹ãããããšãã§ããŸãã
ãããçã«ããªã£ãŠããå Žåã¯ããããé«ãè©äŸ¡ããŠãã ãããå
ã®ææ¡ãæ€èšããããšãã§ããŸã
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
ãããŠãããããä»ã®ææ¡ã®ããã€ãã¯ã³ã¡ã³ããã€ã³ã©ã€ã³åããããªã³ã¯ãããŠããŸããããããç§ãã¡ã¯äœããåŠã¶ãããããã¯ããé«ãè©äŸ¡ã«ãªãããã¯ã¹ãæãä»ãã§ãããã
åºæº+ =ããã±ãŒãžå šäœããã³é¢æ°å ã§ã®ãšã©ãŒåŠçã³ãŒãã®åå©çš
ãã®ææ¡ã«å¯Ÿããç¶ç¶çãªãã£ãŒãããã¯ã«æè¬ããŸãã
è°è«ã¯æ žå¿çãªåé¡ããå°ãéžè±ããŸããã ããã¯ãŸããäœå人ãã®è²¢ç®è ïŒããªãã誰ã§ããããç¥ã£ãŠããïŒã代æ¿æ¡ã«çžåœãããã®ãããã·ã¥ããããšã«ãã£ãŠæ¯é ãããããã«ãªããŸããã
ããã§ããã®åé¡ã¯_ç¹å®ã®_ææ¡ã«é¢ãããã®ã§ããããšã芪ãã¿ã蟌ããŠæãåºãããŠãã ããã ããã¯ããšã©ãŒåŠçã®ããã®æ°ããæ§æäžã®ã¢ã€ãã¢ã®å§èªã§ã¯ãããŸããïŒããã¯è¯ãããšã§ããããã®åé¡ã§ã¯ãããŸããïŒã
è°è«ã«åã³çŠç¹ãåãããŠãè»éã«æ»ããŸãããã
ãã£ãŒãããã¯ã¯ãããã®ææ¡ã¯ãã®å Žåã¯æ£ããæ©èœããªããããç§ãã¡ãæ°ã¥ããªãã£ããšããæå³åããæã€ããªã©ãèŠéããæè¡çãªäºå®ãç¹å®ããã®ã«åœ¹ç«ã€å Žåã«æãçç£çã§ãã
ããšãã°ã @ magicalã¯ãæžãããææ¡ã¯äž»åŒµãããã»ã©æ¡åŒµå¯èœã§ã¯ãªãã£ããšææããŸããïŒå ã®ããã¹ãã§ã¯ãå°æ¥ã®2çªç®ã®åŒæ°ãè¿œå ããããšã¯äžå¯èœã§ããïŒã 幞ããªããšã«ãããã¯å°ããªåé¡ã§ãããææ¡ãå°ã調æŽããã ãã§ç°¡åã«å¯ŸåŠã§ããŸããã 圌ã®æèŠã¯ãææ¡ãããè¯ãããã®ã«çŽæ¥åœ¹ç«ã¡ãŸããã
@crawshawã¯æéããããŠstdã©ã€ãã©ãªã®æ°çŸã®ãŠãŒã¹ã±ãŒã¹ãåæãã try
ãå¥ã®åŒã®äžã«å
¥ãããšã¯ãã£ãã«ãªãããšã瀺ããŸããããããã£ãŠã try
ãåãããŠèŠããªããªãå¯èœæ§ããããšããæžå¿µã«çŽæ¥åè«ããŸããã ããã¯éåžžã«æçšãªäºå®ã«åºã¥ããã£ãŒãããã¯ã§ããããã®å Žåã¯èšèšãæ€èšŒããŸãã
å¯Ÿç §çã«ãå人çãª_çŸç_å€æã¯ããŸã圹ã«ç«ã¡ãŸããã ãã®ãã£ãŒãããã¯ãç»é²ããããšã¯ã§ããŸãããããã«åºã¥ããŠè¡åããããšã¯ã§ããŸããïŒå¥ã®ææ¡ãèãåºã以å€ã«ïŒã
代æ¿æ¡ã®äœæã«ã€ããŠïŒçŸåšã®ææ¡ã¯ãæšå¹Žã®ãã©ããèšèšããå§ãŸã£ãå€ãã®äœæ¥ã®ææã§ãã ãã®èšèšãäœåºŠãç¹°ãè¿ããå€ãã®äººãããã£ãŒãããã¯ãæ±ããŠãããæçš¿ããŠå®éã®å®éšæ®µéã«é²ããããšããå§ãããŸãããããŸã å®éšãè¡ã£ãŠããŸããã å®éšã倱æããå ŽåããŸãã¯ãã£ãŒãããã¯ã«ãã£ãŠå®éšãæããã«å€±æããããšãäºåã«éç¥ãããå Žåã¯ãèšèšå³ã«æ»ãããšã¯çã«ããªã£ãŠããŸãã 第äžå°è±¡ã«åºã¥ããŠãã®å Žã§åèšèšããå Žåãç§ãã¡ã¯çã®æéãç¡é§ã«ããŠããã ãã§ãããããã«æªãããšã«ããã®éçšã§äœãåŠã³ãŸããã
ãšã¯ããããã®ææ¡ã§å€ãã®äººãè¡šæããæãéèŠãªæžå¿µã¯ãèšèªã§ãã§ã«å®è¡ã§ããããšä»¥å€ã«ããšã©ãŒã®è£ 食ãæ瀺çã«å¥šå±ããŠããªãããšã§ãã ããããšãããããŸãããã®ãã£ãŒãããã¯ãç»é²ããŸããã ãã®ææ¡ãæçš¿ããåã«ã瀟å ã§ãŸã£ããåããã£ãŒãããã¯ãåãåããŸããã ããããç§ãã¡ãæ€èšãã代æ¿æ¡ã®ã©ãããç§ãã¡ãçŸåšæã£ãŠãããã®ãããåªããŠããããã§ã¯ãããŸããïŒãããŠç§ãã¡ã¯å€ãã®ããšãæ·±ãèŠãŠããŸããïŒã 代ããã«ããšã©ãŒåŠçã®äžéšã«é©åã«å¯ŸåŠããå¿ èŠã«å¿ããŠãã®æžå¿µã«æ£ç¢ºã«å¯ŸåŠããããã«æ¡åŒµã§ããæå°éã®ã¢ã€ãã¢ãææ¡ããããšã«ããŸããïŒææ¡ã§ã¯ããã«ã€ããŠè©³ãã説æããŠããŸãïŒã
ããããšãã
ïŒä»£æ¿æ¡ãæå±ããæ°äººã®äººã ãç¬èªã®åå¥ã®åé¡ãéå§ããããšã«æ³šæããŠãã ãããããã¯è¯ãããšã§ãããããããã®åé¡ã«çŠç¹ãåããç¶ããã®ã«åœ¹ç«ã¡ãŸããããããšããïŒ
@griesemer
ç§ã¯ç§ãã¡ãçŠç¹ãåãããã¹ãã§ããããšã«å®å
šã«åæããŸãããããŠããã¯ãŸãã«ç§ãæžãããã«ãªã£ããã®ã§ãïŒ
ãããçã«ããªã£ãŠããå Žåã¯ããããé«ãè©äŸ¡ããŠãã ãããå ã®ææ¡ãæ€èšããããšãã§ããŸã
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md
2ã€ã®è³ªåïŒ
LMKWYTã
åŒæ°ããŒãïŒãŸãã¯å¥ã®çµã¿èŸŒã¿ïŒã®try()
ããŸã æ€èšäžããããã¯é€å€ãããŠããŸãã
ææ¡ã«å€æŽãå ããåŸããååä»ãã®æ»ãå€ã®äœ¿çšãã©ã®ããã«ãäžè¬çãã«ãªãã®ãå¿é
ã§ãã ãã ãããããããã¯ã¢ããããããŒã¿ããããŸããïŒupside_down_face :ã
åŒæ°ããŒãïŒãŸãã¯å¥ã®ãã«ãã€ã³ïŒã®try()
ãããããŒã¶ã«ã«è¿œå ãããå Žåãååä»ãã®æ»ããåé¿ããããã«ãããããŒã¶ã«ã®äŸãæŽæ°ããŠtry()
ïŒãŸãã¯å¥ã®ãã«ãã€ã³ïŒã䜿çšã§ããŸããïŒ
@guybrandè³æ祚ãšå察祚ã¯ã_ææ _ãè¡šçŸããã®ã«è¯ãããšã§ãããããã ãã§ãã ããã«ã¯ãã以äžã®æ å ±ã¯ãããŸããã æ祚æ°ãã€ãŸãææ ã ãã«åºã¥ããŠæ±ºå®ãäžãã€ããã¯ãããŸããã ãã¡ããã誰ããïŒããšãã°90ïŒ ä»¥äžïŒææ¡ãå«ãå Žåãããã¯ããããæªãå åã§ãããå ã«é²ãåã«ããèããã¹ãã§ãã ããããããã§ã¯ããã§ã¯ãªãããã§ãã ããªãã®æ°ã®äººãè©ŠããŠã¿ãããšã«æºè¶³ããŠããããã§ãä»ã®ããšã«ç§»ã£ãŠããŸãïŒãããŠãã®ã¹ã¬ããã«ã³ã¡ã³ãããããšãæ°ã«ããªãã§ãã ããïŒã
äžèšã§è¡šçŸããããšããããã«ãææ¡ã®ãã®æ®µéã§ã®ææ ã¯ããã®æ©èœã®å®éã®çµéšã«åºã¥ããã®ã§ã¯ãããŸããã ããã¯æ°æã¡ã§ãã ææ ã¯æéãšãšãã«å€åããåŸåããããŸããç¹ã«ãææ ãé¢ä¿ããŠããäž»é¡ãå®éã«äœéšããæ©äŒããã£ãå Žåã¯... :-)
@Goodwineãšã©ãŒå€ãååŸããããã«try()
ãé€å€ãã人ã¯èª°ãããŸããã ãã®ãããª_if_ãå¿
èŠã§ããã@ rogpeppeãææ¡ããããã«ãäºåã«å®£èšãããerr
å€æ°ã䜿çšããæ¹ãããå ŽåããããŸãïŒç§ã¯æããŸãïŒã
ç¹°ãè¿ããŸããããã®ææ¡ã¯ãããé€å€ãããã®ã§ã¯ãããŸããã å¿ èŠã ãšããã£ãããããžè¡ããŸãããã
@griesemer
ããªãã¯ç§ãå®å
šã«èª€è§£ãããšæããŸãã
ç§ã¯ãããææ¡ã«è³æ祚ãæãããå察祚ãæãããããã®ã§ã¯ãªãããç§ã¯xã奜ãã§ã¯ãªããå³ããåºæºã«åºã¥ããŠæ±ºå®ãäžãã®ãçã«ããªã£ãŠãããšæããŸããïŒ 'ãŸãã¯' yã¯èŠæ ããè¯ããªã '"
ããªããæžãããã®ãã-ããã¯ãŸãã«ããªããèããŠããããšã§ã...ã ããç§ã®ã³ã¡ã³ãã次ã®ããã«è³æããŠãã ããïŒ
ããã®ææ¡ãæ¹åãç®æããã®ã®ãªã¹ããäœæããå¿
èŠããããšæããŸããããã«åºã¥ããŠãç§ãã¡ã¯ã§ãã
A.ãããååã«æå³ããããã©ãããå€æãã
B.ææ¡ã解決ããããšããŠããããšãæ¬åœã«è§£æ±ºããŠããããã«èŠãããã©ãããå€æãã
C.ïŒããªããè¿œå ããããã«ïŒãããå®è¡å¯èœãã©ããã確èªããããã«äœåãªåªåãããŸã...
@guybrand圌ãã¯æããã«ããã¬ãªãªãŒã¹1.14ïŒïŒïŒã§ãããã¿ã€ãã³ã°ããå®è·µçãªãŠãŒã¶ãŒãããã£ãŒãããã¯ãåéãã䟡å€ããããšç¢ºä¿¡ããŠããŸãã IOWã®æ±ºå®ãè¡ãããŸããã
ãŸãã on err, <statement>
ã®è°è«ã®ããã«ïŒ32611ãæåºããŸãã
@guybrandãè©«ã³ç³ãäžããŸãã ã¯ãããã€ã©ãŒãã¬ãŒãã®åæžãªã©ãææ¡ã®ããŸããŸãªç¹æ§ãæ€èšããå¿ èŠãããããšã«åæããŸããããã¯ç®åã®åé¡ã解決ããŸãããããããææ¡ã¯ãã®éšåã®åèšä»¥äžã®ãã®ã§ããå šäœåãèŠãå¿ èŠããããŸãã ããã¯ãšã³ãžãã¢ãªã³ã°ã§ããããšã³ãžãã¢ãªã³ã°ã¯åä»ã§ããèšèšã«ã¯å€ãã®èŠå ãé¢ä¿ããŠããã客芳çã«ïŒå³ããåºæºã«åºã¥ããŠïŒèšèšã®äžéšãæºè¶³ã®ãããã®ã§ãªããŠããå šäœãšããŠãæ£ãããèšèšã§ããå¯èœæ§ããããŸãã ã§ããããç§ã¯ææ¡ã®åã ã®åŽé¢ã®ããçš®ã®_ç¬ç«ãã_è©äŸ¡ã«åºã¥ã決å®ãæ¯æããããšãå°ãèºèºããŸãã
ïŒããŸãããã°ãããã¯ããªããæå³ããããšããããã解決ããŸããïŒ
ããããé¢é£ããåºæºã«é¢ããŠã¯ããã®ææ¡ã¯ãããäœã«å¯ŸåŠããããšããŠããã®ããæ確ã«ããŠãããšæããŸãã ã€ãŸããåç §ããŠãããªã¹ãã¯ãã§ã«ååšããŸãã
...ãç§ãã¡ã®ç®æšã¯ããšã©ãŒãã§ãã¯å°çšã®ãœãŒã¹ã³ãŒãã®éãæžããããšã§ããšã©ãŒåŠçããã軜éã«ããããšã§ãã ãŸãããšã©ãŒåŠçã³ãŒãã®èšè¿°ããã䟿å©ã«ããŠãããã°ã©ããŒããããè¡ãã®ã«æéããããå¯èœæ§ãé«ããããšèããŠããŸãã åæã«ããšã©ãŒåŠçã³ãŒããããã°ã©ã ããã¹ãã«æ瀺çã«è¡šç€ºãããŸãŸã«ããŠãããããšæããŸãã
ãšã©ãŒã®è£
食ã«ã¯ãèšèªãå€æŽããå¿
èŠããªãããã defer
ãšååä»ãã®çµæãã©ã¡ãŒã¿ãŒïŒãŸãã¯å€ãif
ã¹ããŒãã¡ã³ãïŒã䜿çšããããšããå§ãããŸããããã¯çŽ æŽãããããšã§ããèšèªã®å€æŽã«ã¯è«å€§ãªé ããã³ã¹ããããããã§ãã å€ãã®ã³ã¡ã³ããŒã¿ãŒãããã¶ã€ã³ã®ãã®éšåããå®å
šã«ã²ã©ãããšæããŠããããšã¯ç¢ºãã§ãã ããã§ãããã®æç¹ã§ãå
šäœåã§ã¯ãç§ãã¡ãç¥ã£ãŠãããã¹ãŠã®ããšã§ãããã§ååãããããªããšæããŸãã äžæ¹ãå®åæãåãé€ãã«ã¯ãèšèªã®å€æŽïŒèšèªã®ãµããŒãã§ã¯ãªãïŒãå¿
èŠã§ãã try
ã¯ãæãã€ãéãã®æå°éã®å€æŽã§ãã ãããŠæããã«ããã¹ãŠããŸã ã³ãŒãå
ã§æ瀺çã§ãã
éåžžã«å€ãã®åå¿ãšéåžžã«å€ãã®ããææ¡ãããçç±ã¯ãããããGoèšèªããšã©ãŒåŠçã®å®åãæžããããã«äœããããå¿ èŠãããããšã«ã»ãšãã©ã®äººãåæããåé¡ã§ããããã ãšæããŸãããå®éã«ã¯ããã§ã¯ãããŸãããããè¡ãæ¹æ³ã«åæããŸãã
ãã®ææ¡ã¯ãæ¬è³ªçã«ãçµã¿èŸŒã¿ã®append()
é¢æ°ã®ããã«ãéåžžã«äžè¬çã§ãããªããç¹å®ã®ãã€ã©ãŒãã¬ãŒãã®å Žåã®çµã¿èŸŒã¿ã®ããã¯ããã«èŠçŽãããŸãã ãããã£ãŠãç¹å®ã®id err!=nil { return err }
ã®ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«ã¯åœ¹ç«ã¡ãŸãããããã ãã§ãã ä»ã®å Žåã«ã¯ããŸã圹ã«ç«ãããå®éã«ã¯äžè¬çã«é©çšã§ããªãã®ã§ãç§ã¯ãããå§åçã ãšæããŸãã ç§ã¯ãã»ãšãã©ã®Goããã°ã©ããŒãããå°ãæåŸ
ããŠãããšæããŠããã®ã§ããã®ã¹ã¬ããã§ã®è°è«ã¯ç¶ããããŸãã
é¢æ°ãšããŠã¯çŽæã«åããŸãã Goã§ã¯ããã®åŒæ°ã®é åºfunc(... interface{}, error)
ã§é¢æ°ã䜿çšããããšã¯ã§ããªãããã§ãã
æåã«å
¥åããŠãããä»»æã®ãã¿ãŒã³ã®å¯å€æ°ãGoã¢ãžã¥ãŒã«ã®ããããšããã«ãããŸãã
èããã°èããã»ã©ãçŸç¶ã®ãŸãŸã®ææ¡ã奜ãã§ãã
ãšã©ãŒåŠçãå¿ èŠãªå Žåã¯ãåžžã«ifã¹ããŒãã¡ã³ãããããŸãã
çããããã«ã¡ã¯ã ãããŸã§ã®ãšãããç©ããã§ãæ¬æãæã£ãŠã建èšçãªè°è«ãããŠããã ãããããšãããããŸãã ç§ã¯ã¡ã¢ãåãã®ã«æéãè²»ãããæçµçã«ã¯ãGitHubã瀺ããã®ãããããã²ãŒãå¯èœã§å®å šãªã¯ãã®ããã®ã³ã¡ã³ãã¹ã¬ããã®å¥ã®ãã¥ãŒãç¶æããã®ã«åœ¹ç«ã€ããã°ã©ã ãäœæããã®ã«ååãªæ¬²æ±äžæºã«ãªããŸããã ïŒããŒããéããªããŸãïŒïŒ https://swtch.com/try.htmlãåç §ããŠãã ããã ç§ã¯ãããæŽæ°ãç¶ããŸãããåããšã§ã¯ãªãããããã§è¡ããŸãã ïŒããã¯æ éãªæ€èšãå¿ èŠãªè°è«ã§ããããã€ã³ã¿ãŒãããæéãã«ã¯å©ããããŸãããïŒ
è¿œå ããèããããã€ããããŸãããããã¯ããããæææ¥ãŸã§åŸ ããªããã°ãªããªãã§ãããã å床ãæè¬ããŸãã
@ mishak87詳现ãªææ¡ã§ããã«å¯ŸåŠããŸãã ãäžèŠåããªä»ã®ãã«ãã€ã³ïŒ try
ã make
ã unsafe.Offsetof
ãªã©ïŒãããããšã«æ³šæããŠãã ãããããããã«ãã€ã³ã®ç®çã§ãã
@rsc ããšãŠã䟿å©ã§ãïŒ ããã§ãä¿®æ£ããŠããå Žåã¯ãïŒidã®åé¡ã®åç §ããªã³ã¯ããŠãã ããã ãããŠããã©ã³ãã¹ã¿ã€ã«ã®ãµã³ã»ãªãïŒ
ããã¯ãããã以åã«ã«ããŒãããŠããã®ã§ãããã«ãã€ãºãè¿œå ããããšããè©«ã³ããŸãããçµã¿èŸŒã¿ã®è©Šè¡ãšè©Šè¡...ä»ã®ã¢ã€ãã¢ã«ã€ããŠææããããšæããŸãã
çµã¿èŸŒã¿é¢æ°ãè©ŠããŠã¿ããšãéçºäžã«å°ãã€ã©ã€ã©ããããšããããšæããŸãã æ»ãåã«ããããã°ã·ã³ãã«ãè¿œå ãããããšã©ãŒåºæã®ã³ã³ããã¹ããè¿œå ãããããå ŽåããããŸãã 次ã®ãããªè¡ãæžãçŽãå¿ èŠããããŸã
user := try(getUser(userID))
ã«
user, err := getUser(userID)
if err != nil {
// inspect error here
return err
}
deferã¹ããŒãã¡ã³ããè¿œå ãããšåœ¹ç«ã€å ŽåããããŸãããtryïŒïŒåŒã³åºãããšã«ããªã¬ãŒããããããé¢æ°ãè€æ°ã®ãšã©ãŒãã¹ããŒããå Žåã¯ãããã§ãæè¯ã®ãšã¯ã¹ããªãšã³ã¹ã§ã¯ãããŸããã
åãé¢æ°ã§ãã¹ããããè€æ°ã®tryïŒïŒåŒã³åºããæžãçŽããšãããã«é¢åã«ãªããŸãã
äžæ¹ãã³ã³ããã¹ããŸãã¯æ€æ»ã³ãŒããã«è¿œå ãã
user := try getUser(userID)
æåŸã«catchã¹ããŒãã¡ã³ããè¿œå ãããã®åŸã«ã³ãŒããè¿œå ããã®ãšåããããç°¡åã§ãã
user := try getUser(userID) catch {
// inspect error here
}
ãã³ãã©ãŒã®åé€ãŸãã¯äžæçãªç¡å¹åã¯ããã£ããããŠã³ã¡ã³ãã¢ãŠãããåã«è¡ãåå²ããã®ãšåããããç°¡åã§ãã
try()
ãšif err != nil
ãåãæ¿ãããšãIMOã®ç
©ãããã倧å¹
ã«å¢ããŸãã
ããã¯ããšã©ãŒã³ã³ããã¹ãã®è¿œå ãŸãã¯åé€ã«ãåœãŠã¯ãŸããŸãã äœããéåžžã«è¿
éã«ãããã¿ã€ãã³ã°ããªããtry func()
try()
èšè¿°ããããã°ã©ã ãæçããã«ã€ããŠå¿
èŠã«å¿ããŠç¹å®ã®ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ã§ããŸãããããã°äžã«ã³ã³ããã¹ããè¿œå ããããæ€æ»ã³ãŒããè¿œå ãããããè¡ã
tryïŒïŒã¯äŸ¿å©ã ãšæããŸãããæ¥åžžæ¥åã§äœ¿çšããããšãæ³åããŠããã®ã§ã try ... catch
ãããã»ã©äŸ¿å©ã§ãç
©ããããå°ãªããªãããšãæ³åããã«ã¯ããããŸããã däžéšã®ãšã©ãŒã«åºæã®è¿œå ã³ãŒããè¿œå /åé€ããå¿
èŠããããŸãã
ãŸãã try()
ãè¿œå ããŠããã if err != nil
ã䜿çšããŠã³ã³ããã¹ããè¿œå ããããšãæšå¥šããããšã¯ã make()
vs new()
vs :=
ãšéåžžã«äŒŒãŠãããšæããŸãã var
ã ãããã®æ©èœã¯ããŸããŸãªã·ããªãªã§åœ¹ç«ã¡ãŸãããå€æ°ãåæåããæ¹æ³ãå°ãªãããåäžã®æ¹æ³ã§ããããã°ããã®ã§ã¯ãªãã§ããããã ãã¡ããã誰ãtryã䜿çšããããã«åŒ·å¶ããããšã¯ãªããerrïŒ= nilã®å Žåã¯åŒãç¶ã䜿çšã§ããŸãããããã«ãããæ°ããå€æ°ãå²ãåœãŠãè€æ°ã®æ¹æ³ãšåãããã«ãGoã§ã®ãšã©ãŒåŠçãåå²ããããšæããŸãã èšèªã«è¿œå ãããã¡ãœããã¯ããã³ãã©ãŒãè¿œå /åé€ããããã«è¡å
šäœãæžãçŽãã®ã§ã¯ãªãããšã©ãŒãã³ãã©ãŒãç°¡åã«è¿œå /åé€ããæ¹æ³ãæäŸããå¿
èŠããããšæããŸãã ããã¯ç§ã«ãšã£ãŠè¯ãçµæã®ããã«ã¯æããŸããã
ãã€ãºã«ã€ããŠå床ç³ãèš³ãããŸãããã誰ããtry ... else
ã®ã¢ã€ãã¢ã«ã€ããŠå¥ã®è©³çŽ°ãªææ¡ãæžãããå Žåã«åããŠããããææããããšæããŸããã
// cc @brynbellomy
@owais ããããåã³åãäžããŠãããŠããããšã-ããã¯å
¬æ£ãªç¹ã§ãïŒãããŠãããã°ã®åé¡ã¯ç¢ºãã«åã«èšåãããŠããŸãïŒã try
ã¯ããã³ãã©ãŒé¢æ°ã§ããå¯èœæ§ã®ãã2çªç®ã®åŒæ°ãªã©ã®æ¡åŒµæ©èœã®ãã¢ãéãããŸãŸã«ããŸãã ãããã try
é¢æ°ã¯ãããã°ã容æã«ããªãããšã¯äºå®ã§ã- try
- catch
ãŸãã¯try
ãããå°ãå€ãã³ãŒããæžãçŽããªããã°ãªããªãå ŽåããããŸãelse
ã
@owais
deferã¹ããŒãã¡ã³ããè¿œå ãããšåœ¹ç«ã€å ŽåããããŸãããtryïŒïŒåŒã³åºãããšã«ããªã¬ãŒããããããé¢æ°ãè€æ°ã®ãšã©ãŒãã¹ããŒããå Žåã¯ãããã§ãæè¯ã®ãšã¯ã¹ããªãšã³ã¹ã§ã¯ãããŸããã
æ»ãåã«é©åãªæ¹æ³ã§ããŸããŸãªã¿ã€ãã®ãšã©ãŒãåŠçããïŒãŸãã¯åŠçããªãïŒé 延é¢æ°ã«ãåžžã«ã¿ã€ãã¹ã€ãããå«ããããšãã§ããŸãã
ãããŸã§ã®è°è«ãç¹ã«GoããŒã ããã®åçãèãããšãããŒã ãããŒãã«ã«ããææ¡ãé²ããããšãèšç»ããŠãããšãã匷ãå°è±¡ãåããŠããŸãã ã¯ãã®å Žåãã³ã¡ã³ããšãªã¯ãšã¹ãïŒ
çŸç¶ã®ææ¡IMOã«ãããå
¬éãããŠãããªããžããªã®ã³ãŒãå質ã倧å¹
ã«äœäžããŸãã ç§ã®æåŸ
ã¯ãå€ãã®éçºè
ãæãæµæã®å°ãªãæ¹æ³ãåããäŸå€åŠçæè¡ãå¹æçã«äœ¿çšãããšã©ãŒãçºçããæç¹ã§ãšã©ãŒãåŠçãã代ããã«try()
ã䜿çšããããšãéžæããããšã§ãã ãããããã®ã¹ã¬ããã®äžè¬çãªææ
ãèãããšãä»ã®å£®å€§ãªæŠãã¯ææŠãšæŠãã ãã§ããããšã«æ°ä»ããã®ã§ãåŸäžãžã®å察æèŠãç»é²ããŠããã ãã§ãã
ããŒã ãçŸåšæžãããŠããææ¡ãé²ããŠãããšä»®å®ããŠããã®æ¹æ³ã§ãšã©ãŒãç¡èŠããã³ãŒããæãŸãªã人ã®ããã«try()
ãç¡å¹ã«ãã圌ããéãããã°ã©ããŒãçŠæ¢ããã³ã³ãã€ã©ã¹ã€ãããè¿œå ããŠãã ããããã䜿çšããããšããïŒ _ïŒãã¡ããCIçµç±ïŒ_ãã®æ€èšããããããé¡ãããŸãã
tryïŒïŒãç¡å¹ã«ããã³ã³ãã€ã©ã¹ã€ãããè¿œå ããŠããã ããŸããïŒ
ããã¯ãã³ã³ãã€ã©IMOã§ã¯ãªãããªã³ãã£ã³ã°ããŒã«äžã«ããå¿ èŠããããŸãããç§ã¯åæããŸã
ããã¯ãã³ã³ãã€ã©IMOã§ã¯ãªãããªã³ãã£ã³ã°ããŒã«äžã«ããå¿ èŠããããŸãããç§ã¯åæããŸã
ãªãã·ã§ã³ãªã©ã®ã³ã³ãã€ã«ãçŠæ¢ããããããªã³ãã£ã³ã°ããŒã«ã§ã¯ãªãã³ã³ãã€ã©ãªãã·ã§ã³ãæ瀺çã«èŠæ±ããŠããŸãã ããããªããšãããŒã«ã«éçºäžã«ãªã³ãããã®ãç°¡åã«ãªããããŸãã
@mikeschinkelãã®ãããªç¶æ³ã§ã³ã³ãã€ã©ãªãã·ã§ã³ããªã³ã«ããã®ãå¿ããã®ãåããããç°¡åã§ã¯ãªãã§ããããïŒ
ã³ã³ãã€ã©ãã©ã°ã¯èšèªã®ä»æ§ãå€æŽããã¹ãã§ã¯ãããŸããã ããã¯ç£å»/ãªã³ãã«ã¯ããã«é©ããŠããŸã
ãã®ãããªç¶æ³ã§ã³ã³ãã€ã©ãªãã·ã§ã³ããªã³ã«ããã®ãå¿ããã®ãåããããç°¡åã§ã¯ãªãã§ããããïŒ
ã³ã³ãã€ã«åã«lintã匷å¶çã«å®è¡ããæ¹æ³ããªãGoLandã®ãããªããŒã«ã䜿çšããå Žåã¯ããã§ã¯ãããŸããã
ã³ã³ãã€ã©ãã©ã°ã¯èšèªã®ä»æ§ãå€æŽããã¹ãã§ã¯ãããŸããã
-nolocalimports
ã¯ä»æ§ãå€æŽãã -s
èŠåããŸãã
ã³ã³ãã€ã©ãã©ã°ã¯èšèªã®ä»æ§ãå€æŽããã¹ãã§ã¯ãããŸããã
-nolocalimports
ã¯ä»æ§ãå€æŽãã-s
èŠåããŸãã
ããããä»æ§ã¯å€æŽãããŸããã èšèªã®ææ³ã¯åããŸãŸã§ããã ãã§ãªããä»æ§ã«ã¯å ·äœçã«æ¬¡ã®ããã«èšèŒãããŠããŸãã
ImportPathã®è§£éã¯å®è£ ã«äŸåããŸãããéåžžã¯ã³ã³ãã€ã«ãããããã±ãŒãžã®å®å šãªãã¡ã€ã«åã®ãµãã¹ããªã³ã°ã§ãããã€ã³ã¹ããŒã«ãããããã±ãŒãžã®ãªããžããªã«é¢é£ããŠããå ŽåããããŸãã
ã³ã³ãã€ã«åã«lintã匷å¶çã«å®è¡ããæ¹æ³ããªãGoLandã®ãããªããŒã«ã䜿çšããå Žåã¯ããã§ã¯ãããŸããã
https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint
@deanveloper
https://github.com/vmware/dispatch/wiki/Configure-GoLand-with-golint
確ãã«ããã¯ååšããŸãããããªãã¯ãªã³ãŽãšçµç¹ãæ¯èŒããŠããŸãã 衚瀺ããŠããã®ã¯ããã¡ã€ã«ã®å€æŽæã«å®è¡ããããã¡ã€ã«ãŠã©ããã£ãŒã§ããGoLandã¯ãã¡ã€ã«ãèªåä¿åãããããåžžã«å®è¡ããããããä¿¡å·ãããã¯ããã«å€ãã®ãã€ãºãçºçããŸãã
lintã¯ãã³ã³ãã€ã©ãŒãå®è¡ããããã®åææ¡ä»¶ãšããŠæ§æããããšã¯ã§ããŸããïŒAFAIKïŒã
ããããä»æ§ã¯å€æŽãããŸããã èšèªã®ææ³ã¯åããŸãŸã§ããã ãã§ãªããä»æ§ã«ã¯å ·äœçã«æ¬¡ã®ããã«èšèŒãããŠããŸãã
ããã§ã¯ãçµæã«çŠç¹ãåãããã®ã§ã¯ãªããã»ãã³ãã£ã¯ã¹ã§éãã§ããŸãã ã ããç§ãåãããšãããŸãã
try()
ã䜿çšããã³ãŒãã®ã³ã³ãã€ã«ãçŠæ¢ããã³ã³ãã€ã©ãªãã·ã§ã³ãè¿œå ããããã«èŠæ±ããŸãã ããã¯èšèªä»æ§ãå€æŽããããã®èŠæ±ã§ã¯ãªãããã®ç¹å¥ãªå Žåã«ã³ã³ãã€ã©ãŒãåæ¢ããããã®èŠæ±ã«ãããŸããã
ãããŠãããã圹ç«ã€å Žåã¯ãèšèªä»æ§ãæŽæ°ããŠæ¬¡ã®ããã«ããããšãã§ããŸãã
try()
ã®è§£éã¯å®è£ ã«äŸåããŸãããéåžžãæåŸã®ãã©ã¡ãŒã¿ãŒããšã©ãŒã®å Žåã«æ»ããããªã¬ãŒãããã®ã§ãããèš±å¯ãããªãããã«å®è£ ããããšãã§ããŸãã
ã³ã³ãã€ã©ã®åãæ¿ããŸãã¯ç£å»ã®ãã§ãã¯ãèŠæ±ããææã¯ã try()
ãããã¿ã€ãã1.14ïŒïŒïŒãããã«å°éããåŸã§ãã ãã®æç¹ã§ãããªãã¯ããã«ã€ããŠæ°ããåé¡ãæåºããã§ãããïŒãããŠããã§ããããã¯è¯ãèãã ãšæããŸãïŒã ããã§ã®ã³ã¡ã³ãã¯ãçŸåšã®èšèšããã¥ã¡ã³ãã«é¢ããäºå®ã«åºã¥ãå
¥åã«éå®ããããã«æ±ããããŠããŸãã
ããã«ã¡ã¯ãéçºäžã«ãããã°ã¹ããŒãã¡ã³ããªã©ãè¿œå ããããšã§ãåé¡å
šäœã«è¿œå ããŸãã
2çªç®ã®ãã©ã¡ãŒã¿ãŒã®ã¢ã€ãã¢ã¯try()
é¢æ°ã«ã¯åé¡ãªããšæããŸããããããæšãŠãå¥ã®ã¢ã€ãã¢ã¯ã emit
å¥ãtry()
ã®2çªç®ã®éšåã«è¿œå ããããšã§ãã
ããšãã°ãéçºäžãªã©ããã®ç¬éã«fmt
ãåŒã³åºããŠãšã©ãŒãåºåãããå ŽåããããšæããŸãã ã ããç§ã¯ããããè¡ãããšãã§ããŸãïŒ
func writeStuff(filename string) (io.ReadCloser, error) {
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
ãããã°ã¹ããŒãã¡ã³ããäžè¬çãªåŠçããŸãã¯æ»ãåã®ãšã©ãŒã®ããã«ããã®ãããªãã®ã«æžãçŽãããšãã§ããŸãã
func writeStuff(filename string) (io.ReadCloser, error) {
emit err {
fmt.Printf("something happened [%v]\n", err.Error())
return nil, err
}
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
ã ããããã§ç§ã¯æ°ããããŒã¯ãŒãemit
ã®ææ¡ãããããšã«ãªããŸãããããã¯ãæåã®try()
æ©èœã®ããã«ãã¹ããŒãã¡ã³ããŸãã¯ããã«æ»ãããã®1ã€ã®ã©ã€ããŒã§ããå¯èœæ§ããããŸãã
emit return nil, err
æŸåºãšã¯ãåºæ¬çã«ã try()
ãnilã«çãããªããšã©ãŒã«ãã£ãŠããªã¬ãŒãããå Žåã«ãå¿
èŠãªããžãã¯ãæ¿å
¥ã§ããå¥ã«ãããŸããã emit
ããŒã¯ãŒãã®ãã1ã€ã®æ©èœã¯ãããŒã¯ãŒãã®çŽåŸã«ãæåã®äŸã§äœ¿çšãããããªå€æ°åãè¿œå ãããšããã®å Žã§ãšã©ãŒã«ã¢ã¯ã»ã¹ã§ããããšã§ãã
ãã®ææ¡ã¯ã try()
é¢æ°ã«å°ãåé·æ§ããããããŸããããšã©ãŒã§äœãèµ·ãã£ãŠãããã«ã€ããŠã¯ãå°ãªããšãããå°ãæ確ã«ãªã£ãŠãããšæããŸãã ãã®ããã«ããŠããã¹ãŠã1è¡ã«è©°ã蟌ãããšãªããšã©ãŒãè£
食ããããšãã§ããé¢æ°ãèªãã§ãããšãã«ãšã©ãŒãã©ã®ããã«åŠçãããããããã«ç¢ºèªã§ããŸãã
ããã¯@mikeschinkelãžã®å¿çã§ããè°è«ãä¹±éã«ãªããªãããã«ãå¿çã詳现ãããã¯ã«å ¥ããŠããŸãã ãããã«ããã @ networkimprovã¯ããã®ææ¡ãå®è£ ããããŸã§ïŒå®è£ ãããŠããå ŽåïŒããã®è°è«ãããŒãã«ã«èŒããã¹ãã§ãããšããã®ã¯æ£ããããšã§ãã
tryãç¡å¹ã«ãããã©ã°ã®è©³çŽ°
@mikeschinkel
lintã¯ãã³ã³ãã€ã©ãŒãå®è¡ããããã®åææ¡ä»¶ãšããŠæ§æããããšã¯ã§ããŸããïŒAFAIKïŒã
ããããã¹ãããããã ãã«GoLandãåã€ã³ã¹ããŒã«ããŸããã ããã¯åé¡ãªãæ©èœããŠããããã§ãããå¯äžã®éãã¯ãlintãæ°ã«å
¥ããªããã®ãèŠã€ããå Žåã§ããã³ã³ãã€ã«ã倱æããªãããšã§ãã ããã¯ã«ã¹ã¿ã ã¹ã¯ãªããã§ç°¡åã«ä¿®æ£ã§ããŸããã golint
ãå®è¡ããåºåãããå Žåã¯ãŒã以å€ã®çµäºã³ãŒãã§å€±æããŸãã
ïŒç·šéïŒäžéšã«è¡šç€ºããããšããŠãããšã©ãŒãä¿®æ£ããŸããããšã©ãŒãçºçããŠããŠãæ£åžžã«å®è¡ãããŠããŸãããã[ãã¡ã€ã«ã®çš®é¡]ããã£ã¬ã¯ããªã«å€æŽãããšãšã©ãŒãåé€ãããæ£åžžã«æ©èœããŸããïŒ
ãŸããã³ã³ãã€ã©ãã©ã°ã§ãã£ãŠã¯ãªããªããã1ã€ã®çç±-ãã¹ãŠã®Goã³ãŒãã¯ãœãŒã¹ããã³ã³ãã€ã«ãããŸãã ããã«ã¯ã©ã€ãã©ãªãå«ãŸããŸãã ã€ãŸããã³ã³ãã€ã©ãä»ããŠtry
ããªãã«ãããå Žåã¯ã䜿çšããŠããã©ã€ãã©ãªã®ãã¹ãŠã«å¯ŸããŠtry
ããªãã«ããããšã«ãªããŸãã ã³ã³ãã€ã©ãã©ã°ã«ããã®ã¯æªãèãã§ãã
ããã§ã¯ãçµæã«çŠç¹ãåãããã®ã§ã¯ãªããã»ãã³ãã£ã¯ã¹ã§éãã§ããŸãã
ããããéããŸãã ã³ã³ãã€ã©ãã©ã°ã¯èšèªã®ä»æ§ãå€æŽããã¹ãã§ã¯ãããŸããã ä»æ§ã¯éåžžã«ããã¬ã€ã¢ãŠããããŠãããäœãããå®è¡ããããããã«ã¯ãä»æ§ã«åŸãå¿ èŠããããŸãã ããªããèšåããã³ã³ãã€ã©ãã©ã°ã¯èšèªã®æ¯ãèããå€æŽããŸãããäœããã£ãŠããèšèªãä»æ§ã«æºæ ããŠããããšã確èªããŸãã ããã¯Goã®éèŠãªåŽé¢ã§ãã Goä»æ§ã«æºæ ããŠããéããã³ãŒãã¯ä»»æã®Goã³ã³ãã€ã©ã§ã³ã³ãã€ã«ããå¿ èŠããããŸãã
tryïŒïŒã䜿çšããã³ãŒãã®ã³ã³ãã€ã«ãçŠæ¢ããã³ã³ãã€ã©ãªãã·ã§ã³ãè¿œå ããããã«èŠæ±ããŸãã ããã¯èšèªä»æ§ãå€æŽããããã®èŠæ±ã§ã¯ãªãããã®ç¹å¥ãªå Žåã«ã³ã³ãã€ã©ãŒãåæ¢ããããã®èŠæ±ã«ãããŸããã
ã¹ããã¯å€æŽã®ãé¡ãã§ãã ãã®ææ¡èªäœã¯ãä»æ§ãå€æŽããããã®ãªã¯ãšã¹ãã§ãã çµã¿èŸŒã¿é¢æ°ã¯ãä»æ§ã«éåžžã«å
·äœçã«å«ãŸããŠããŸãã ã ãããã£ãŠãçµã¿èŸŒã¿ã®try
ãåé€ããã³ã³ãã€ã©ãã©ã°ãèŠæ±ãããšãã³ã³ãã€ã«ãããèšèªã®ä»æ§ãå€æŽãããã³ã³ãã€ã©ãã©ã°ã«ãªããŸãã
ããã¯èšã£ãŠãã ImportPath
ã¯ä»æ§ã§æšæºåãããã¹ãã ãšæããŸãã ç§ã¯ããã«ã€ããŠææ¡ãããããããŸããã
ãããŠããã圹ã«ç«ã£ãããèšèªä»æ§ãæŽæ°ããŠ[...]ã®ãããªããšãèšãããšãã§ããŸã
ããã¯äºå®ã§ããã try
ã®å®è£
ãå®è£
ã«äŸåãããããªãã§ãããã ããã¯ãèšèªã®ãšã©ãŒåŠçã®éèŠãªéšåãšãªãããã«äœæãããŠããŸããããã¯ããã¹ãŠã®Goã³ã³ãã€ã©ã§åãã§ããå¿
èŠããããŸãã
@deanveloper
_ "ãããã«ããã @ networkimprovã¯ããã®ææ¡ãå®è£ ããããŸã§ïŒå®è£ ãããŠããå ŽåïŒããã®è°è«ãããŒãã«ã«èŒããã¹ãã§ãããšããã®ã¯æ£ããããšã§ãã" _
ã§ã¯ããªããã®ææ¡ãç¡èŠããŠãåŸã§åŸ ã€ã®ã§ã¯ãªãããšã«ãããã®ã¹ã¬ããã«æçš¿ããããšã«ããã®ã§ããïŒ ããªãã¯ããã§ããªãã®è«ç¹ã䞻匵ããåæã«ç§ãããªãã®è«ç¹ã«ç°è°ãå±ããã¹ãã§ã¯ãªããšäž»åŒµããŸããã ããªãã説æããããšãç·Žç¿ããŠãã ãã...
ããªãã®éžæãããã°ãç§ã詳现ãããã¯ã§å¿çããããšãéžæããŸãããïŒ
_ "ããã¯ã«ã¹ã¿ã ã¹ã¯ãªããã§ç°¡åã«ä¿®æ£ã§ããŸãããgolintãå®è¡ããåºåãããå Žåã¯ãŒã以å€ã®çµäºã³ãŒãã§å€±æããŸãã" _
ã¯ããååãªã³ãŒãã£ã³ã°ãããã°ãåé¡ã¯ä¿®æ£ã§ããŸãã ããããç§ãã¡äºäººã¯çµéšããããœãªã¥ãŒã·ã§ã³ãè€éã«ãªãã»ã©ãããã䜿çšããã人ãå°ãªããªããå®éã«ããã䜿çšããããšã«ãªãããšãç¥ã£ãŠããŸãã
ã ããç§ã¯ããã§ãèªåã§è§£æ±ºããã®ã§ã¯ãªããåçŽãªè§£æ±ºçãæ確ã«æ±ããŠããŸããã
_ "䜿çšããŠããã©ã€ãã©ãªã®ãã¹ãŠã«ã€ããŠãè©ŠããŠã¿ãã®ããããŸãã" _
ãããŠãããç§ããããèŠæ±ããçç±ã§ãã ãã®åä»ãª_ "æ©èœ" _ã䜿çšãããã¹ãŠã®ã³ãŒãããé åžããå®è¡å¯èœãã¡ã€ã«ã«çµã¿èŸŒãŸããªãããã«ãããããã§ãã
_ãä»æ§å€æŽã®ãé¡ãã§ãããã®ææ¡èªäœãä»æ§å€æŽã®ãé¡ãã§ãã_ã
ä»æ§ã®å€æŽã§ã¯ãããŸããã ããã¯ãèšèªä»æ§ã®å€æŽã§ã¯ãªãã build
ã³ãã³ãã®_åäœ_ãå€æŽããããã®ã¹ã€ããã®èŠæ±ã§ãã
誰ããgo
ã³ãã³ãã«ããã®ç«¯æ«åºåãå京èªã§è¡šç€ºããããã®ã¹ã€ãããèŠæ±ããå Žåãããã¯èšèªä»æ§ã®å€æŽã§ã¯ãããŸããã
åæ§ã«ã go build
ããã®ã¹ã€ãããæ€åºããå Žåããšã©ãŒã¡ãã»ãŒãžãçºè¡ãã try()
ã«ééãããšåæ¢ããŸãã èšèªä»æ§ã®å€æŽã¯å¿
èŠãããŸããã
_ "ããã¯ãèšèªã®ãšã©ãŒåŠçã®éèŠãªéšåã«ãªãããã«äœæãããŠããŸããããã¯ããã¹ãŠã®Goã³ã³ãã€ã©ã§åãã§ããå¿ èŠããããŸãã" _
ããã¯èšèªã®ãšã©ãŒåŠçã®åé¡ã®ããéšåã§ããããªãã·ã§ã³ã«ããããšã§ãåé¡ãåé¿ããã人ãããã§ããããã«ãªããŸãã
ã¹ã€ããããªããšãã»ãšãã©ã®äººãæ°æ©èœãšèŠãªããŠãããæ¡çšããå®éã«äœ¿çšãã¹ããã©ãããèªåããããšã¯ãªãã§ãããã
_ã¹ã€ããã䜿çšããŠ_âããã³ã¹ã€ããã«ã€ããŠèšåããŠããæ°æ©èœã説æããèšäºâå€ãã®äººã¯ãã¹ã€ããã«åé¡ãããå¯èœæ§ãããããšãç解ããGoããŒã ããå ¬éã³ãŒããã¹ã€ããã®äœ¿çšãã©ãã ãåé¿ããŠãããã確èªããããšã§ããããé©åãªå å«ã§ãããã©ããã調æ»ã§ããããã«ããŸãã察ãããªãã¯ã³ãŒãããããã©ã®ããã«äœ¿çšãããã ããã¯Go3ã®èšèšã«æ å ±ãäžããå¯èœæ§ããããŸãã
_ "ããããéããŸããã³ã³ãã€ã©ãã©ã°ã¯èšèªã®ä»æ§ãå€æŽããã¹ãã§ã¯ãããŸããã" _
ã»ãã³ãã£ã¯ã¹ããã¬ã€ããŠããªããšèšã£ãŠããã»ãã³ãã£ã¯ã¹ããã¬ã€ããŠããªããšããæå³ã§ã¯ãããŸããã
眰éã 次ã«ã代ããã«_ïŒäœãïŒ_ build-guard
ãšããæ°ãããããã¬ãã«ã®ã³ãã³ããèŠæ±ããŸããããã¯ãã³ã³ãã€ã«äžã«åé¡ã®ããæ©èœãçŠæ¢ããããã«äœ¿çšããã try()
ãçŠæ¢ããããšããå§ãŸããŸãã
ãã¡ãããæè¯ã®çµæã¯ã try()
æ©èœãã倧å€æ°ãåæããæ¹æ³ã§ãå°æ¥å¥ã®æ¹æ³ã§åé¡ã解決ããããšãåèããèšç»ãšäžç·ã«ããŒãã«ã«å
¥ããããå Žåã§ãã ããããç§ã¯è¹ããã§ã«try()
ã§èªæµ·ããŠããã®ã§ã¯ãªãããšå¿é
ããŠããã®ã§ããã®æ¬ ç¹ãæå°éã«æããããšãæãã§ããŸãã
ãããã£ãŠã @ networkimprovã«æ¬åœã«åæããå Žåã¯ã圌ããææ¡ããããã«ãåŸã§ãŸã§è¿ä¿¡ãä¿çããŠãã ããã
äžæããŠç³ãèš³ãããŸããããå ±åããäºå®ããããŸã:-)
GoããŒã ã¯ãã§ã«å»¶æã®ãã³ãããŒã¯ãè¡ã£ãŠãããšæããŸãããæ°åã¯èŠãŠããŸãã...
$ go test -bench=.
goos: linux
goarch: amd64
BenchmarkAlways2-2 20000000 72.3 ns/op
BenchmarkAlways4-2 20000000 68.1 ns/op
BenchmarkAlways6-2 20000000 68.0 ns/op
BenchmarkNever2-2 100000000 16.5 ns/op
BenchmarkNever4-2 100000000 13.1 ns/op
BenchmarkNever6-2 100000000 13.5 ns/op
ãœãŒã¹
package deferbench
import (
"fmt"
"errors"
"testing"
)
func Always(iM, iN int) (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("d: %v", err)
}
}()
if iN % iM == 0 {
return errors.New("e")
}
return nil
}
func Never(iM, iN int) (err error) {
if iN % iM == 0 {
return fmt.Errorf("r: %v", errors.New("e"))
}
return nil
}
func BenchmarkAlways2(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e2, a) }}
func BenchmarkAlways4(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e4, a) }}
func BenchmarkAlways6(iB *testing.B) { for a := 0; a < iB.N; a++ { Always(1e6, a) }}
func BenchmarkNever2(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e2, a) }}
func BenchmarkNever4(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e4, a) }}
func BenchmarkNever6(iB *testing.B) { for a := 0; a < iB.N; a++ { Never(1e6, a) }}
@networkimprov
https://github.com/golang/proposal/blob/master/design/32437-try-builtin.md#efficiency -of-deferããïŒå€ªåã§åŒ·èª¿ïŒ
ç¬ç«ããŠãGoã©ã³ã¿ã€ã ããã³ã³ã³ãã€ã©ããŒã ã¯ä»£æ¿ã®å®è£ ãªãã·ã§ã³ã«ã€ããŠè°è«ããŠãããæ¢åã®ãæåãã³ãŒããšã»ãŒåããããå¹ççãªãšã©ãŒåŠçã®äžè¬çãªå»¶æ䜿çšãè¡ãããšãã§ãããšä¿¡ããŠããŸãã ãã®ããé«éãªå»¶æå®è£ ãGo1.14ã§å©çšã§ããããã«ããããšèããŠããŸãïŒãã®æ¹åãžã®æåã®ã¹ãããã§ãã* CL 171758 *ãåç §ããŠãã ããïŒã
ã€ãŸããdeferã¯äžè¬çãªäœ¿çšæ³ã§go1.13ã®ããã©ãŒãã³ã¹ã30ïŒ åäžããgo1.14ã®édeferã¢ãŒããšåããããé«éã§å¹ççã§ããã¯ãã§ãã
ãã¶ã誰ãã1.13ãš1.14CLã®çªå·ãæçš¿ã§ããŸããïŒ
æé©åã¯ãæµãšã®æ¥è§Šãåžžã«çãæ®ããšã¯éããŸãã...ããŒãçæ ç³»ã
1.13 defersã¯çŽ30ïŒ éããªããŸãïŒ
name old time/op new time/op delta
Defer-4 52.2ns ± 5% 36.2ns ± 3% -30.70% (p=0.000 n=10+10)
ããã¯ç§ãäžèšã®@networkimprovã®ãã¹ãã§åŸããã®ã§ãïŒãã³ããŸã§1.12.5ïŒïŒ
name old time/op new time/op delta
Always2-4 59.8ns ± 1% 47.5ns ± 1% -20.57% (p=0.008 n=5+5)
Always4-4 57.9ns ± 2% 43.5ns ± 1% -24.96% (p=0.008 n=5+5)
Always6-4 57.6ns ± 2% 44.1ns ± 1% -23.43% (p=0.008 n=5+5)
Never2-4 13.7ns ± 8% 3.8ns ± 4% -72.27% (p=0.008 n=5+5)
Never4-4 10.5ns ± 6% 1.3ns ± 2% -87.76% (p=0.008 n=5+5)
Never6-4 10.8ns ± 6% 1.2ns ± 1% -88.46% (p=0.008 n=5+5)
ïŒãªãããã»ã©é«éãªãã®ããªãã®ãããããŸãããå€æŽãã€ã³ã©ã€ã³åããã®ã§ã¯ãªãã§ããããïŒïŒ
1.14ã®é 延ã®æé©åã¯ãŸã å®è£ ãããŠããªããããããã©ãŒãã³ã¹ãã©ããªããã¯ããããŸããã ãã ããéåžžã®é¢æ°åŒã³åºãã®ããã©ãŒãã³ã¹ã«è¿ã¥ãå¿ èŠããããšèããŠããŸãã
ã§ã¯ããªããã®ææ¡ãç¡èŠããŠãåŸã§åŸ ã€ã®ã§ã¯ãªãããšã«ãããã®ã¹ã¬ããã«æçš¿ããããšã«ããã®ã§ããïŒ
詳现ãããã¯ã¯ã @ networkimprovã®ã³ã¡ã³ããèªãã åŸãåŸã§ç·šéãããŸããã 圌ã®èšã£ãããšãç解ããŠç¡èŠããããã«èŠããŠããããªããã ãã®å£°æã®åŸã§è°è«ãçµããŸãããªãç§ãã³ã¡ã³ããæçš¿ããã®ããšããªããç§ã«å°ããã®ã§ãç§ã¯èªåèªèº«ã説æããããšæããŸããã
延æããæé©åã«é¢ããŠãç§ã¯ãããã«è奮ããŠããŸãã 圌ãã¯ãã®ææ¡ãå°ãå©ãã defer HandleErrorf(...)
ãå°ã軜ãããŸãã ãã ãããã®ããªãã¯ãæ©èœãããããã«ååä»ããã©ã¡ãŒã¿ãŒãæªçšãããšããã¢ã€ãã¢ã¯ãŸã 奜ãã§ã¯ãããŸããã 1.14ã§ã©ããããã¹ããŒãã¢ãããããšäºæ³ãããŸããïŒ ãããã¯åããããªé床ã§å®è¡ããå¿
èŠããããŸããïŒ
@griesemerããå°ãæ¡åŒµãã䟡å€ããããããããªã1ã€ã®é åã¯ã try
ã®ããäžçã§ãã©ã³ãžã·ã§ã³ãã©ã®ããã«æ©èœãããã§ãã
vet
ãŸãã¯staticcheck
ãªã©ã«ãã£ãŠæ€åºããããããŸãã¯ïŒcïŒãã°ã«ã€ãªããå¯èœæ§ããããŸãæ°ä»ãããªããããã¹ãã§æãŸããå¿
èŠããããããããŸãããgopls
ïŒãŸãã¯å¥ã®ãŠãŒãã£ãªãã£ïŒãäžè¬çãªè£
食ã¹ã¿ã€ã«ã®ç§»è¡ãèªååãã圹å²ãæããããšãã§ãããã©ãããããã¯ç¶²çŸ çãªãã®ã§ã¯ãããŸãããã代衚çãªã¹ããŒãžã®ã»ããã¯æ¬¡ã®ããã«ãªããŸãã
0.ãšã©ãŒè£
食ãªãïŒããšãã°ãè£
食ãªãã§try
ã䜿çšïŒã
1.åäžãªãšã©ãŒè£
食ïŒããšãã°ãåäžãªè£
食ã«try
+ defer
ã䜿çšïŒã
2. N-1åºå£ç¹ã«ã¯åäžãªãšã©ãŒè£
食ããããŸããã1ã€ã®åºå£ç¹ã«ã¯ç°ãªãè£
食ããããŸãïŒããšãã°ã1ã€ã®å Žæã«ããæ°žç¶çãªè©³çŽ°ãªãšã©ãŒè£
食ããŸãã¯äžæçãªãããã°ãã°ãªã©ïŒã
3.ãã¹ãŠã®åºå£ãã€ã³ãã«ã¯ãããããåºæã®ãšã©ãŒè£
食ããŸãã¯åºæã«è¿ããã®ããããŸãã
ç¹å®ã®é¢æ°ã¯ããããã®ã¹ããŒãžãå³å¯ã«é²è¡ããããšã¯ãªãããããã¹ããŒãžãã¯ééã£ãèšèã§ããå¯èœæ§ããããŸãããäžéšã®é¢æ°ã¯ãããè£ é£Ÿã¹ã¿ã€ã«ããå¥ã®è£ 食ã¹ã¿ã€ã«ã«ç§»è¡ããŸãããããã®ç§»è¡å 容ãããæ確ã«ããããšã圹ç«ã€å ŽåããããŸãããããããã€çºçãããããŸãã¯çºçãããã©ããã®ãããªãã®ã§ãã
ã¹ããŒãž0ãšã¹ããŒãž1ã¯ãçŸåšã®ææ¡ã®ã¹ã€ãŒãã¹ãããã®ããã§ãããããªãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ããããŸãã ã¹ããŒãž0-> 1ã®ç§»è¡ã¯ç°¡åã«æããŸãã ã¹ããŒãž0ã§è£
食ãªãtry
ã䜿çšããŠããå Žåã¯ã defer fmt.HandleErrorf(&err, "foo failed with %s", arg1)
ã®ãããªãã®ãè¿œå ã§ããŸãã ãã®æç¹ã§ãæåã«æžãããææ¡ã®äžã«ååä»ãã®æ»ããã©ã¡ãŒã¿ãŒãå°å
¥ããå¿
èŠããããããããŸããã ãã ããææ¡ããæçµçãªãšã©ãŒçµæãã©ã¡ãŒã¿ãŒã®ãšã€ãªã¢ã¹ã§ããäºåå®çŸ©ãããçµã¿èŸŒã¿å€æ°ã®ç·ã«æ²¿ã£ãææ¡ã®1ã€ãæ¡çšããå Žåãããã§ã®ãšã©ãŒã®ã³ã¹ããšãªã¹ã¯ã¯å°ããå¯èœæ§ããããŸããïŒ
äžæ¹ãã¹ããŒãž1ãdefer
ã®åäžãªãšã©ãŒè£
食ã§ããå Žåãã¹ããŒãž1-> 2ã®é·ç§»ã¯åä»ïŒãŸãã¯ä»ã®äººãèšã£ãŠããããã«ãè¿·æãïŒã«èŠããŸãã 1ã€ã®åºå£ãã€ã³ãã«ç¹å®ã®è£
食ã1ã€è¿œå ããã«ã¯ãæåã«defer
ãåé€ããå¿
èŠããããŸãïŒäºéã®è£
食ãé¿ããããïŒã次ã«ããã¹ãŠã®ãªã¿ãŒã³ãã€ã³ãã«ã¢ã¯ã»ã¹ããŠã try
ãè±ç³ããå¿
èŠãããããã§ãã if
ã¹ããŒãã¡ã³ãã䜿çšãããšã©ãŒã®N-1ã¯åãæ¹æ³ã§è£
食ããã1ã€ã¯ç°ãªãæ¹æ³ã§è£
食ãããŸãã
ã¹ããŒãž1-> 3ã®ç§»è¡ããæåã§è¡ããšåä»ãªããã§ãã
æåã®è±ç³ããã»ã¹ã®äžéšãšããŠçºçããå¯èœæ§ã®ããããã€ãã®ééãã«ã¯ãå€æ°ã®èª€ã£ãã·ã£ããŠã€ã³ã°ãååä»ãæ»ããã©ã¡ãŒã¿ãŒãžã®åœ±é¿ã®å€æŽãªã©ããããŸããããšãã°ãã®ãäŸãã»ã¯ã·ã§ã³ã®æåã®æ倧ã®äŸãèŠããšãææ¡ãè©ŠããŠãã ããã CopyFile
é¢æ°ã«ã¯ã次ã®ã»ã¯ã·ã§ã³ãå«ãã4ã€ã®try
ã®çšéããããŸãã
w := try(os.Create(dst))
defer func() {
w.Close()
if err != nil {
os.Remove(dst) // only if a âtryâ fails
}
}()
誰ããw := try(os.Create(dst))
ã®ãæãããªãæåè±ç³ãè¡ã£ãå Žåããã®1è¡ã¯æ¬¡ã®ããã«æ¡åŒµã§ããŸãã
w, err := os.Create(dst)
if err != nil {
// do something here
return err
}
ããã¯äžèŠè¯ãããã«èŠããŸãããå€æŽãå«ãŸãããããã¯ã«ãã£ãŠã¯ãååä»ãã®æ»ããã©ã¡ãŒã¿ãŒerr
ã誀ã£ãŠã·ã£ããŠããåŸç¶ã®defer
ã§ãšã©ãŒåŠçãäžæããå¯èœæ§ããããŸãã
æéã³ã¹ããšãã¹ã®ãªã¹ã¯ã軜æžããããã«ãããããgopls
ïŒãŸãã¯å¥ã®ãŠãŒãã£ãªãã£ïŒã«ãç¹å®ã®try
ãè±ç³ããã³ãã³ãããŸãã¯try
ã®ãã¹ãŠã®äœ¿çšãè±ç³ããã³ãã³ããå«ããããšãã§ããŸããäžããããé¢æ°ã®gopls
ã³ãã³ããtry
ã®åé€ãšçœ®æã®ã¿ã«çŠç¹ãåœãŠãŠããå Žåã§ãããããããå¥ã®ã³ãã³ãã§try
ã®ãã¹ãŠã®äœ¿çšãåæžããå°ãªããšãäžè¬çãªã±ãŒã¹ãå€æããããšãã§ããŸããé¢æ°ã®äžéšã«ããdefer fmt.HandleErrorf(&err, "copy %s %s", src, dst)
ã®ããã«ã以åã®try
ã®åå Žæã«ããåçã®ã³ãŒãã«å€æããŸãïŒããã¯ãã¹ããŒãž1-> 2ãŸãã¯ã¹ããŒãž1-> 3ã«ç§»è¡ãããšãã«åœ¹ç«ã¡ãŸãïŒã ããã¯å®å
šã«çŒãä»ããããã¢ã€ãã¢ã§ã¯ãããŸããããããããäœãå¯èœãŸãã¯æãŸãããããŸãã¯çŸåšã®èãæ¹ã§ææ¡ãæŽæ°ããããšã«ã€ããŠãã£ãšèãã䟡å€ããããŸãã
é¢é£ããã³ã¡ã³ãã¯ã try
ã®ããã°ã©ã ã«ãããã¹ã®ãªãå€æããéåžžã®æ
£çšçãªGoã³ãŒãã®ããã«èŠããé »åºŠãããã«ã¯ããããªããšããããšã§ãã ããšãã°ãè±ç³ãããå Žåã¯ãææ¡ã®äŸã®1ã€ãé©å¿ãããŸãã
x1, x2, x3 = try(f())
å Žåã«ãã£ãŠã¯ãåäœãä¿æããããã°ã©ã ã«ããå€æã¯ã次ã®ããã«ãªãå¯èœæ§ããããŸãã
t1, t2, t3, te := f() // visible temporaries
if te != nil {
return x1, x2, x3, te
}
x1, x2, x3 = t1, t2, t3
ãã®æ£ç¢ºãªåœ¢åŒã¯ãŸãã§ããå¯èœæ§ããããããã°ã©ã ã«ããè±ç³ãè¡ã£ããšãã£ã¿ãŒãŸãã¯IDEã®çµæã¯ãå€ãã®å Žåãããæ
£çšçã«èŠããå¯èœæ§ããããŸãããååä»ãã®æ»ããã©ã¡ãŒã¿ãŒãããäžè¬çã§ãã·ã£ããŠã€ã³ã°ãèæ
®ã«å
¥ãããšã :=
ãš=
ãåãé¢æ°ã§ã®err
ã®ä»ã®äœ¿çšæ³ãªã©ã
ãã®ææ¡ã§ã¯ãååä»ãã®çµæãã©ã¡ãŒã¿ãŒãåå ã§if
ãštry
ã®éã§çºçããå¯èœæ§ã®ããåäœã®éãã«ã€ããŠèª¬æããŠããŸããããã®ç¹å®ã®ã»ã¯ã·ã§ã³ã§ã¯ãäž»ã«if
try
ã®ç§»è¡ã«ã€ããŠèª¬æããŠããããã§ãã ãŸããçŸåšã®åäœãäºæ³ãããå Žåã¯ãifã¹ããŒãã¡ã³ããä¿æããŠãã ããã" _ïŒã 察ç
§çã«ãåãåäœãç¶æããªããtry
ããif
ã«ç§»è¡ããå Žåã¯ã詳ãã説æãã䟡å€ã®ããããŸããŸãªééããçºçããå¯èœæ§ããããŸãã
ãããã«ãããé·ãã³ã¡ã³ãã§ç³ãèš³ãããŸããããã¹ã¿ã€ã«éã®é«ã移è¡ã³ã¹ãã®æãã¯ãããã«æçš¿ãããä»ã®ã³ã¡ã³ãã®ããã€ãã§è¡šæãããæžå¿µã®æ ¹åºã«ããããã§ããæœåšçãªç·©åçã
@thepuddsèšèªæ©èœããªãã¡ã¯ã¿ãªã³ã°ã«ãã©ã¹ãŸãã¯ãã€ãã¹ã®åœ±é¿ãäžããå¯èœæ§ãããããšã«é¢é£ããã³ã¹ããšæœåšçãªãã°ã匷調ããŠããããšããç§ã¯æããŠããŸãã ããã¯ç§ãããè°è«ãããããã¯ã§ã¯ãããŸããããäžæµã«å€§ããªåœ±é¿ãäžããå¯èœæ§ã®ãããããã¯ã§ãã
ã¹ããŒãž1ãé 延ã䌎ãåäžãªãšã©ãŒè£ 食ã§ããå Žåãã¹ããŒãž1-> 2ã®é·ç§»ã¯åä»ã«èŠããŸãã 1ã€ã®åºå£ãã€ã³ãã«ç¹å®ã®è£ 食ã1ã€è¿œå ããã«ã¯ãæåã«å»¶æãåé€ããå¿ èŠããããŸãïŒäºéã®è£ 食ãé¿ããããïŒã次ã«ããã¹ãŠã®æ»ããã€ã³ãã«ã¢ã¯ã»ã¹ããŠãtryã䜿çšããifã¹ããŒãã¡ã³ããNã§è±ç³ããå¿ èŠãããããã§ãã -1ã€ã®ãšã©ãŒãåãæ¹æ³ã§è£ 食ããã1ã€ã®ãšã©ãŒãç°ãªãæ¹æ³ã§è£ 食ãããŸãã
ããã¯ã$ return
break
ã䜿çšããããšã1.12ã§åªããŠãããšããã§ãã for range once { ... }
ãããã¯ã§äœ¿çšãã once = "1"
ã䜿çšããŠãçµäºããå¯èœæ§ã®ããã³ãŒãã·ãŒã±ã³ã¹ãåºå¥ããŸãã次ã«ã1ã€ã®ãšã©ãŒã ããè£
食ããå¿
èŠãããå Žåã¯ã break
ã®æç¹ã§ãããå®è¡ããŸãã return
ã®çŽåã«è¡ããŸãã
ããããã®ãããªè¯ããã¿ãŒã³ã§ããçç±ã¯ããããå€åããèŠä»¶ã«å¯ŸããŠå埩åãããããã§ãã æ°ããèŠä»¶ãå®è£ ããããã«ãåäœäžã®ã³ãŒããå£ãå¿ èŠã¯ãã£ãã«ãããŸããã ãããŠãããã¯ãã¡ãœããã®æåã«æ»ã£ãŠãããžã£ã³ãããããããããã¯ãªãŒã³ã§æçœãªã¢ãããŒãIMOã§ãã
@ randall77ã®ãã³ãããŒã¯ã®çµæã¯ã1.12ãšãããã®äž¡æ¹ã§åŒã³åºãããã40ns以äžã®ãªãŒããŒãããã瀺ããŠããŸãã ããã¯ã延æãæé©åãé»å®³ããå Žåã«ãã£ãŠã¯è«äºã延æããããã®æ¹åãããããå¯èœæ§ãããããšãæå³ããŸãã
@networkimprov Deferã¯çŸåšãæé©åãçŠæ¢ããŠããŸããããã¯ãä¿®æ£ãããéšåã§ãã ããšãã°ãéåžžã®åŒã³åºããã€ã³ã©ã€ã³åããã®ãšåãããã«ãdefer'dé¢æ°ã®æ¬äœãã€ã³ã©ã€ã³åãããšäŸ¿å©ã§ãã
ç§ãã¡ãè¡ãæ¹åãã©ã®ããã«æå³ããªããªããã¯ããããŸããã ãã®äž»åŒµã¯ã©ãããæ¥ãã®ã§ããïŒ
ãã®äž»åŒµã¯ã©ãããæ¥ãã®ã§ããïŒ
ãšã©ãŒãã©ããããããã®å»¶æã䌎ãé¢æ°ã®åŒã³åºãããã40 + nsã®ãªãŒããŒãããã¯å€æŽãããŸããã§ããã
1.13ã§ã®å€æŽã¯ã延æã®æé©åã®äžéšã§ãã ä»ã«ãæ¹åãèšç»ãããŠããŸãã ããã¯ãèšèšããã¥ã¡ã³ããããã³äžèšã®ããæç¹ã§åŒçšãããèšèšããã¥ã¡ã³ãã®äžéšã§èª¬æãããŠããŸãã
re swtch.com/try.htmlããã³https://github.com/golang/go/issues/32437#issuecomment-502192315 ïŒ
@rsc ããšãŠã䟿å©ã§ãïŒ ããã§ãä¿®æ£ããŠããå Žåã¯ãïŒidã®åé¡ã®åç §ããªã³ã¯ããŠãã ããã ãããŠããã©ã³ãã¹ã¿ã€ã«ã®ãµã³ã»ãªãïŒ
ãã®ããŒãžã¯ã³ã³ãã³ãã«é¢ãããã®ã§ãã ã¬ã³ããªã³ã°ã®è©³çŽ°ã«çŠç¹ãåœãŠãªãã§ãã ããã ç§ã¯å ¥åããŒã¯ããŠã³ã§blackfridayã®åºåãå€æŽããã«äœ¿çšããŠããïŒãããã£ãŠãGitHubåºæã®#idãªã³ã¯ã¯ãããŸããïŒãserifãã©ã³ãã«æºè¶³ããŠããŸãã
åç¡å¹å/æ€èšŒããŠã¿ãŠãã ããïŒ
ç³ãèš³ãããŸããããç¹å®ã®Goæ©èœãç¡å¹ã«ããã³ã³ãã€ã©ãªãã·ã§ã³ã¯ãªãããããã®æ©èœã䜿çšããªãããã«æ瀺ããç£å»ã®ãã§ãã¯ããããŸããã æ©èœãç¡å¹åãŸãã¯ç²Ÿæ»ããã®ã«ååãªã»ã©æªãå Žåãããã¯å ¥ããŸãããéã«ãæ©èœãããã«ããå Žåã¯ã䜿çšããŠãåé¡ãããŸããã ã³ã³ãã€ã©ãã©ã°ã®éžæã«åºã¥ããŠéçºè ããšã«ç°ãªãèšèªã§ã¯ãªãã1ã€ã®GoèšèªããããŸãã
@mikeschinkel ããã®åé¡ã«ã€ããŠ2åãtryã®äœ¿çšã_ignoring_ãšã©ãŒãšããŠèª¬æããŸããã
6æ7æ¥ã«ããéçºè
ããšã©ãŒãç¡èŠããããããããšããèŠåºãã®äžã«æ¬¡ã®ããã«æžããŠããŸãã
ããã¯ä»ã®äººãã³ã¡ã³ãããŠããããšã®å®å šãªç¹°ãè¿ãã§ãããåºæ¬çã«
try()
ãæäŸãããã®ã¯ãå€ãã®ç¹ã§ã以äžãidomaticã³ãŒããšããŠåçŽã«åãå ¥ããããšã«é¡äŒŒããŠããŸããããã¯ãã©ã®ã³ãŒãã«ã決ããŠå ¥ã蟌ãŸãªãã³ãŒãã§ãã -éçºè ã®è¹ãå°éããïŒf, _ := os.Open(filename)
ç§ã¯èªåã®ã³ãŒãã§ããè¯ããªãããšãã§ããããšãç¥ã£ãŠããŸãããç§ãã¡ã®å€ãã¯éåžžã«äŸ¿å©ãªããã±ãŒãžãå ¬éããŠããä»ã®Goéçºè ã®å€§éšåã«äŸåããŠããããšãç¥ã£ãŠããŸããã_ "Other People's CodeïŒtmïŒ" _ã§èŠããã®ãããšã©ãŒåŠçã®ãã¹ããã©ã¯ãã£ã¹ã¯ããã°ãã°ç¡èŠãããŸãã
çå£ã«ãéçºè ããšã©ãŒãç¡èŠããããããå ç¢ã§ãªãããã±ãŒãžã§GitHubãæ±æã§ããããã«ãããã®ã§ããããã
ãããŠã 6æ14æ¥ã«ãtryãããã®æ¹æ³ã§ãšã©ãŒãç¡èŠããã³ãŒãããšããŠäœ¿çšããããšã«èšåããŸããã
ã³ãŒãã¹ããããf, _ := os.Open(filename)
ããªããã°ãããšã©ãŒããã§ãã¯ããŠè¿ããããšã©ãŒããç¡èŠããããšè¡šçŸããããšã§ãåã«èªåŒµããŠãããšæããŸãã ããããã³ãŒãã¹ããããã¯ãææ¡ææžãŸãã¯èšèªä»æ§ã§ãã§ã«åçãããŠããå€ãã®è³ªåãšãšãã«ãçµå±ã®ãšããåãã»ãã³ãã£ã¯ã¹ã«ã€ããŠè©±ããŠããã®ãã©ããçåã«æããŸãã ãããã£ãŠãæ確ã«ããŠè³ªåã«çããã ãã§ãã
ææ¡ã®ã³ãŒãã調ã¹ãŠã¿ããšããã®æ¯ãèãã¯èªæã§ã¯ãªããæšè«ããã®ãããé£ããããšãããããŸããã
try()
ãåŒãã©ããããŠããã®ãèŠããšããšã©ãŒãè¿ãããå Žåã¯ã©ããªããŸããïŒ
try(f())
ã衚瀺ãããŠãããšãã«ã f()
ããšã©ãŒãè¿ããšã try
ã¯ã³ãŒãã®å®è¡ãåæ¢ãããã®æ¬äœãtry
ã§ããé¢æ°ãããã®ãšã©ãŒãè¿ããŸãã
ãšã©ãŒã¯ç¡èŠãããŸããïŒ
ãããããšã©ãŒãç¡èŠãããããšã¯ãããŸããã returnã¹ããŒãã¡ã³ãã䜿çšããã®ãšåãããã«è¿ãããŸãã ãæ°ã«å ¥ãïŒ
{ err := f(); if err != nil { return err } }
ãŸãã¯ãæåãŸãã¯ææ°ã®
defer
ã«ãžã£ã³ãããŸããïŒ
ã»ãã³ãã£ã¯ã¹ã¯ãreturnã¹ããŒãã¡ã³ãã䜿çšããå Žåãšåãã§ãã
延æãããé¢æ°ã¯ãã延æãããã®ãšã¯éã®é åºã§ãå®è¡ãããŸãã
ãããããªããããã¯ã¯ããŒãžã£å ã«
err
ãšããååã®å€æ°ãèªåçã«èšå®ããŸããããããšããã©ã¡ãŒã¿_ïŒãã©ã¡ãŒã¿ã衚瀺ãããŸãããïŒïŒ_ãšããŠæž¡ããŸããïŒ
ã»ãã³ãã£ã¯ã¹ã¯ãreturnã¹ããŒãã¡ã³ãã䜿çšããå Žåãšåãã§ãã
é
延é¢æ°æ¬äœã§çµæãã©ã¡ãŒã¿ãŒãåç
§ããå¿
èŠãããå Žåã¯ãååãä»ããããšãã§ããŸãã https://golang.org/ref/spec#Defer_statementsã®result
ã®äŸãåç
§ããŠãã ããã
ãŸããèªåãšã©ãŒåã§ãªãå Žåãã©ã®ããã«ååãä»ããã®ã§ããïŒ ãããŠãããã¯ãè¡çªãé¿ããããã«ãé¢æ°ã§èªåã®
err
å€æ°ã宣èšã§ããªãããšãæå³ããŸããïŒ
ã»ãã³ãã£ã¯ã¹ã¯ãreturnã¹ããŒãã¡ã³ãã䜿çšããå Žåãšåãã§ãã
çµæã«ååãä»ããããŠããªãå Žåããçµæã«ååãä»ããããŠãããã·ã£ããŠãããŠããå Žåã§ããreturnã¹ããŒãã¡ã³ãã¯åžžã«å®éã®é¢æ°ã®çµæã«å²ãåœãŠãŸãã
ãããŠãããã¯ãã¹ãŠã®
defer
ãåŒã³åºããŸããïŒ éé ã§ããããããšãéåžžé ã§ããïŒ
ã»ãã³ãã£ã¯ã¹ã¯ãreturnã¹ããŒãã¡ã³ãã䜿çšããå Žåãšåãã§ãã
延æãããé¢æ°ã¯ãã延æãããã®ãšã¯éã®é åºã§ãå®è¡ãããŸãã ïŒéé ã¯éåžžé ã§ããïŒ
ãŸãã¯ãã¯ããŒãžã£ãšãšã©ãŒãè¿ããã
func
ã®äž¡æ¹ããè¿ãããŸããïŒ _ïŒããã§ãããæ瀺ããèšèãèªãã§ããªãã£ãããç§ãèããããšã®ãªãäœããïŒ_
ãããäœãæå³ããã®ãããããŸããããããããçãã¯ããŒã§ãã ããã§ã¯ãææ¡ããã¹ããšä»æ§ã«çŠç¹ãåœãŠããã®ããã¹ããäœãæå³ããã®ããæå³ããªãã®ãã«ã€ããŠã®ä»ã®è§£èª¬ã«ã¯çŠç¹ãåœãŠãªãããšããå§ãããŸãã
ææ¡ãšãããŸã§ã®ãã¹ãŠã®ã³ã¡ã³ããèªãã åŸãç§ã¯ãŸã æ£çŽã«äžèšã®è³ªåã«å¯Ÿããçããç¥ããŸããã ããã¯ãæ¯æè ã_ "ãã£ããã³ãªããã·ã£ã¹" _ã§ãããšäž»åŒµããèšèªã«è¿œå ãããçš®é¡ã®æ©èœã§ããïŒ
äžè¬çã«ãç§ãã¡ã¯ã·ã³ãã«ã§ç解ããããèšèªãç®æããŠããŸãã ã質åãå€ãã£ãããšããè©«ã³ç³ãäžããŸãã ãããããã®ææ¡ã¯å®éã«ã¯æ¢åã®èšèªãå¯èœãªéãåå©çšããŠããããïŒç¹ã«å»¶æïŒãåŠç¿ããè¿œå ã®è©³çŽ°ã¯ã»ãšãã©ãªãã¯ãã§ãã ããªãããããç¥ã£ãã
x, y := try(f())
æ段
tmp1, tmp2, tmpE := f()
if tmpE != nil {
return ..., tmpE
}
x, y := tmp1, tmp2
ä»ã®ã»ãšãã©ãã¹ãŠã¯ããã®å®çŸ©ã®æå³ããåŸãå¿ èŠããããŸãã
ããã¯ãšã©ãŒããç¡èŠãããããšã§ã¯ãããŸããã ãšã©ãŒãç¡èŠããã®ã¯ã次ã®ããã«æžããšãã§ãã
c, _ := net.Dial("tcp", "127.0.0.1:1234")
io.Copy(os.Stdout, c)
ãããŠãnet.Dialã倱æãããšã©ãŒãç¡èŠãããcãnilã§ãããio.Copyã®c.Readãã©ãŒã«ããžã®åŒã³åºããåå ã§ãã³ãŒãããããã¯ã«ãªããŸãã å¯Ÿç §çã«ããã®ã³ãŒãã¯ãšã©ãŒããã§ãã¯ããŠè¿ããŸãã
c := try(net.Dial("tcp", "127.0.0.1:1234"))
io.Copy(os.Stdout, c)
åè ãããåŸè ã奚å±ããããã©ããã«ã€ããŠã®ããªãã®è³ªåã«çããã«ã¯ïŒã¯ãã
@ damienfamed75ææ¡ãããemit
ã¹ããŒãã¡ã³ãã¯ãåºæ¬çã«ãã©ãããã¶ã€ã³ã®handle
ã¹ããŒãã¡ã³ããšåãããã«èŠããŸãã handle
宣èšãæŸæ£ããäž»ãªçç±ã¯ã defer
ãšã®éè€ã§ããã emit
ãéæããã®ãšåãå¹æãåŸãããã«defer
ã䜿çšã§ããªãçç±ã¯ç§ã«ã¯ããããŸããã
@dominikhã¯å°ããŸããïŒ
acmeã¯ãã€ã©ã€ããè©Šã¿å§ããŸããïŒ
ãã©ã€ã®ææ¡ã«ã€ããŠã®å€ãã¯æªå®ã§ã空äžã§ãäžæã§ãã
ããããç§ãæ確ã«çããããšãã§ãããã®è³ªåïŒãããã
@rsc
ãè¿ä¿¡ããããšãããããŸãã
_ "ãã®åé¡ã«ã€ããŠãtryã®äœ¿çšããšã©ãŒãç¡èŠãããã®ãšããŠ2å説æããŸããã" _
ã¯ããç§ã¯èªåã®èŠç¹ã䜿çšããŠã³ã¡ã³ãããŠããŸããããæè¡çã«æ£ãããããŸããã§ããã
ç§ãæå³ããã®ã¯ã_ "è£ é£Ÿãªãã§ãšã©ãŒãæž¡ãããšãèš±å¯ããããšã§ãã" _ç§ã«ãšã£ãŠãããã¯_ "ç¡èŠ" _-äŸå€åŠçã䜿çšãã人ã ã_ "ç¡èŠ" _ãšã©ãŒãåŠçããæ¹æ³ãšãã䌌ãŠããŸãããä»ã®äººãã©ã®ããã«ç§ã®èšãåãã¯æè¡çã«æ£ãããªããšèããŠãã ããã
_ "
try(f())
ã衚瀺ããããšãã«ãf()
ããšã©ãŒãè¿ããå Žåãtryã¯ã³ãŒãã®å®è¡ãåæ¢ããtryãæ¬äœã«å«ãŸããé¢æ°ãããã®ãšã©ãŒãè¿ããŸãã" _
ããã¯ãã°ããåã®ç§ã®ã³ã¡ã³ãããã®è³ªåãžã®çãã§ããããããä»ãŸã§ã«ç§ã¯ãããç解ããŸããã
ãããŠãããã¯ç§ãæ²ããããã2ã€ã®ããšãããããšã«ãªããŸãã çç±ïŒ
ããã«ããããšã©ãŒã®è£ 食ãåé¿ããããã®æµæãæå°ã«ãªããå€ãã®éçºè ããããå®è¡ããããã«ä¿ãããŸãããŸããå€ãã®éçºè ããã®ã³ãŒããå ¬éããŠä»ã®ãŠãŒã¶ãŒã䜿çšã§ããããã«ããããšã§ããšã©ãŒåŠçããšã©ãŒå ±åã®å ç¢æ§ãäœããªããå ¬éãããŠããã³ãŒãã®å質ãäœäžããŸãã ã
return
break
ãšcontinue
ããšã©ãŒåŠçã«äœ¿çšããç§ã®ãããªäººã«ãšã£ãŠã¯ãèŠä»¶ã®å€åã«å¯ŸããŠãã匟åæ§ã®ãããã¿ãŒã³ã§ããã䜿çšããããšããã§ããŸããã try()
ããšã©ãŒã«æ³šéãä»ããçç±ãæ¬åœã«ãªãå Žåã§ãã
_ "ãŸãã¯ããšã©ãŒãè¿ãããã¯ããŒãžã£ãšé¢æ°ã®äž¡æ¹ããè¿ãããŸããïŒïŒããã§ãããæå³ããåèªãèªãã§ããªãã£ãããç§ã¯èããããªãã£ãã§ããããïŒ" _
_ããããäœãæå³ããã®ãããããŸããããããããçãã¯ããŒã§ããææ¡ããã¹ããšä»æ§ã«çŠç¹ãåœãŠããã®ããã¹ããäœãæå³ããã®ããæå³ããªãã®ãã«ã€ããŠã®ä»ã®è§£èª¬ã«ã¯çŠç¹ãåœãŠãªãããšããå§ãããŸããã_
ç¹°ãè¿ãã«ãªããŸããããã®è³ªåã¯1é±é以äžåã ã£ãã®ã§ãä»ã§ã¯ããç解ã§ããŠããŸãã
æ確ã«ããããã«ãåŸäžã®ããã«ã defer
ã«ã¯ééããããŸãããïŒ ãã®ã¯ããŒãžã£ããæ»ããšã誀解ããªãéããã¯ããŒãžã£ããæ»ãã ãã§ãªãããšã©ãŒãçºçããfunc
ãããæ»ããŸãããïŒ _ïŒã¯ãã®å Žåã¯è¿ä¿¡ããå¿
èŠã¯ãããŸãããïŒ_
func example() {
defer func(err) {
return err // returns from both defer and example()
}
try(SomethingThatReturnsAnError)
}
ãšããã§ãç§ã®ç解ã¯try()
ã®çç±ã¯ãéçºè
ãå®åæã«ã€ããŠäžå¹³ãèšã£ãŠããããã§ãã ãŸãããã®å®åæã®çµæãšããŠè¿ããããšã©ãŒãåãå
¥ãããšããèŠä»¶ããGoã¢ããªãä»ã®å€ãã®èšèªãããå
ç¢ã«ããã®ã«åœ¹ç«ã€ãšæãã®ã§ãããã¯æ²ããããšã§ãã
ç§ã¯å人çã«ããšã©ãŒã®è£ 食ãç¡èŠãããããããããããšã©ãŒãè£ é£Ÿããªãããšãé£ããããããšãæãã§ããŸãã ããããç§ã¯ããã«é¢ããŠå°æ°æŽŸã§ããããã«èŠããããšãèªããŸãã
ãšããã§ã次ã®ãããªæ§æãææ¡ããŠãã人ãããŸã_ïŒäŸãç°¡æœã«ããããã«æ¶ç©ºã®.Extend()
ãè¿œå ããŸããïŒïŒ_
f := try os.Open(filename) else err {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
ãŸãã¯
try f := os.Open(filename) else err {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
ãããŠãä»ã®äººã¯ããã以äžã®æåãå®éã«ã¯ä¿åããªããšäž»åŒµããŠããŸãïŒ
f,err := os.Open(filename)
if err != nil {
err.Extend("Cannot open file %s",filename)
//break, continue or return err
}
ãããã5è¡ãã4è¡ã«ç§»åããåçŽæ¹åã®ã¹ããŒã¹ãæžå°ãããšããæ¹å€ãæ¬ ããŠããããšã®1ã€ã¯ãç¹ã«func
ã«ãã®ãããªæ§æãå€æ°å¿
èŠãªå Žåã«éèŠã ãšæãããããšã§ãã
ããã«è¯ãã®ã¯ãåçŽæ¹åã®ã¹ããŒã¹ã®40ïŒ ãæé€ãããã®ãããªãã®ã§ã_ïŒããŒã¯ãŒãã«é¢ããã³ã¡ã³ããèãããšããããèæ ®ããããšã¯æããŸãããïŒïŒ_
try f := os.Open(filename)
else err().Extend("Cannot open file %s",filename)
end //break, continue or return err
#fwiw
ãšã«ãããå ã»ã©èšã£ãããã«ãè¹ã¯åºèªãããšæãã®ã§ããããåãå ¥ããããšãåŠã³ãŸãã
ç®æš
ããã§ã®ããã€ãã®ã³ã¡ã³ãã¯ãç§ãã¡ãææ¡ã§äœãããããšããŠããã®ãçåã«æã£ãŠããŸãã 念ã®ãããæšå¹Ž8æã«å ¬éãããšã©ãŒåŠçã®åé¡ã¹ããŒãã¡ã³ãã¯ã ãç®æšãã»ã¯ã·ã§ã³ã«æ¬¡ã®ããã«èšèŒãããŠããŸãã
ãGo2ã§ã¯ããšã©ãŒãã§ãã¯ããã軜éã«ãããšã©ãŒãã§ãã¯å°çšã®Goããã°ã©ã ããã¹ãã®éãæžãããããšèããŠããŸãã ãŸãããšã©ãŒåŠçããã䟿å©ã«èšè¿°ã§ããããã«ããŠãããã°ã©ããŒããããè¡ãã®ã«æéããããå¯èœæ§ãé«ããããšèããŠããŸãã
ãšã©ãŒãã§ãã¯ãšãšã©ãŒåŠçã®äž¡æ¹ãæ瀺çã§ããå¿ èŠããããŸããã€ãŸããããã°ã©ã ããã¹ãã«è¡šç€ºãããŸãã äŸå€åŠçã®èœãšãç©Žãç¹°ãè¿ããããããŸããã
æ¢åã®ã³ãŒãã¯æ©èœãç¶ããçŸåšãšåãããã«æå¹ã§ããç¶ããå¿ èŠããããŸãã å€æŽã¯ãã¹ãŠãæ¢åã®ã³ãŒããšçžäºéçšããå¿ èŠããããŸããã
ãäŸå€åŠçã®èœãšãç©Žãã®è©³çŽ°ã«ã€ããŠã¯ãããé·ããåé¡ãã»ã¯ã·ã§ã³ã®èª¬æãåç §ããŠãã ããã ç¹ã«ããšã©ãŒãã§ãã¯ã¯ãã§ãã¯å¯Ÿè±¡ã«æ確ã«æ·»ä»ããå¿ èŠããããŸãã
@mikeschinkel ã
æ確ã«ããããã«ãåŸäžã®ããã«ã
defer
ã«ã¯ééããããŸãããïŒ ãã®ã¯ããŒãžã£ããæ»ããšã誀解ããªãéããã¯ããŒãžã£ããæ»ãã ãã§ãªãããšã©ãŒãçºçããfunc
ãããæ»ããŸãããïŒ _ïŒã¯ãã®å Žåã¯è¿ä¿¡ããå¿ èŠã¯ãããŸãããïŒ_
ããããããã¯ãšã©ãŒåŠçã§ã¯ãªããé 延é¢æ°ã«é¢ãããã®ã§ãã ãããã¯å¿ ãããééã§ã¯ãããŸããã ããšãã°ãäžè¬çãªãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
func (d *Data) Op() int {
d.mu.Lock()
defer d.mu.Unlock()
... code to implement Op ...
}
d.Opããã®ãªã¿ãŒã³ã¯ãreturnã¹ããŒãã¡ã³ãã®åŸãã³ãŒããd.Opã®åŒã³åºãå ã«è»¢éãããåã«ãé 延ããã¯è§£é€åŒã³åºããå®è¡ããŸãã d.mu.Unlockå ã§è¡ãããããšã¯ãd.Opã®æ»ãå€ã«åœ±é¿ããŸããã d.mu.Unlockã®returnã¹ããŒãã¡ã³ãã¯ãUnlockããæ»ããŸãã ããèªäœã¯d.Opããæ»ããŸããã ãã¡ãããd.mu.Unlockãæ»ããšãd.Opãæ»ããŸãããd.mu.Unlockã®ããã«çŽæ¥ã§ã¯ãããŸããã 埮åŠãªç¹ã§ãããéèŠãªç¹ã§ãã
ããªãã®äŸã«å°éããïŒ
func example() { defer func(err) { return err // returns from both defer and example() } try(SomethingThatReturnsAnError) }
å°ãªããšãæžãããŠããããã«ãããã¯ç¡å¹ãªããã°ã©ã ã§ãã ç§ã¯ããã§è¡åŠè ã«ãªãããšã¯ããŠããŸãã-詳现ãéèŠã§ãã æå¹ãªããã°ã©ã ã¯æ¬¡ã®ãšããã§ãã
func example() (err error) {
defer func() {
if err != nil {
println("FAILED:", err.Error())
}
}()
try(funcReturningError())
return nil
}
延æãããé¢æ°åŒã³åºãã®çµæã¯ãåŒã³åºãã®å®è¡æã«ç Žæ£ãããããã延æãããã®ãã¯ããŒãžã£ãŒã®åŒã³åºãã§ããå Žåãå€ãè¿ãããã«ã¯ããŒãžã£ãŒãæžã蟌ãããšã¯ãŸã£ããæå³ããããŸããã ãããã£ãŠãã¯ããŒãžã£æ¬äœå
ã«return err
ãæžã蟌ããšãã³ã³ãã€ã©ã¯ãè¿ãåŒæ°ãå€ãããŸãããšéç¥ããŸãã
ãããã£ãŠããããã return err
ãèšè¿°ããŠããå®éã®æå³ã§ã¯é
延é¢æ°ãšå€éšé¢æ°ã®äž¡æ¹ããè¿ãããããšã¯ãªããåŸæ¥ã®äœ¿çšæ³ã§ã¯ããã®ããã«èŠããã³ãŒããèšè¿°ããããšããã§ããŸããã
ãã®åé¡ã«æçš¿ãããå察ææ¡ã®å€ãã¯ãifã¹ããŒãã¡ã³ãã®ããã«ãä»ã®ããæèœãªãšã©ãŒåŠçæ§é ãæ¢åã®èšèªæ§é ãšéè€ããŠããããšã瀺åããŠããŸãã ïŒãŸãã¯ãããšã©ãŒãã§ãã¯ããã軜éã«ããGoããã°ã©ã ããã¹ãã®éããšã©ãŒãã§ãã¯ã«æžããããšããç®æšãšççŸããŸãããŸãã¯ãã®äž¡æ¹ãïŒ
äžè¬ã«ãGoã«ã¯ãã§ã«å®å šã«æ©èœãããšã©ãŒåŠçæ§é ããããŸããèšèªå šäœãç¹ã«ifã¹ããŒãã¡ã³ãã§ãã @DavexProã¯ãGoããã°ãšã³ããªãåç §ããã®ã«é©åã§ããããšã©ãŒã¯å€ã§ãã ãšã©ãŒã«é¢ä¿ããå®å šã«å¥åã®ãµãèšèªãèšèšããå¿ èŠã¯ãããŸããããèšèšããå¿ èŠããããŸããã éå»å幎ã»ã©ã®äž»ãªæŽå¯ã¯ãããã§ãã¯/ãã³ãã«ãææ¡ããããã³ãã«ããåé€ããå¿ èŠã«å¿ããŠifã¹ããŒãã¡ã³ãã«ãã©ãŒã«ããã¯ãããªã©ãæ¢åã®èšèªãåå©çšããããšã§ããã ã§ããéãè¡ããªãããšã«ã€ããŠã®ãã®èŠ³å¯ã¯ãæ°ããæ§æãããã«ãã©ã¡ãŒã¿åããããšã«é¢ããã»ãšãã©ã®ã¢ã€ãã¢ãèæ ®ããé€å€ããŸãã
@brynbellomyã®å€ãã®è¯ãã³ã¡ã³ãã«æè¬ãã説æã®ããã«åœŒã®try-elseã䜿çšããŸãã ã¯ããç§ãã¡ã¯æžããããããŸããïŒ
func doSomething() (int, error) {
// Inline error handler
a, b := try SomeFunc() else err {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
handler logAndContinue err {
log.Errorf("non-critical error: %v", err)
}
handler annotateAndReturn err {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d := try SomeFunc() else logAndContinue
e, f := try OtherFunc() else annotateAndReturn
// ...
return 123, nil
}
ãããããããèæ ®ãããã¹ãŠã®ããšã¯ãããããæ¢åã®èšèªæ§é ã䜿çšããããšã«å¯ŸããéèŠãªæ¹åã§ã¯ãããŸããã
func doSomething() (int, error) {
a, b, err := SomeFunc()
if err != nil {
return 0, errors.Wrap(err, "error in doSomething:")
}
// Named error handlers
logAndContinue := func(err error) {
log.Errorf("non-critical error: %v", err)
}
annotate:= func(err error) (int, error) {
return 0, errors.Wrap(err, "error in doSomething:")
}
c, d, err := SomeFunc()
if err != nil {
logAndContinue(err)
}
e, f, err := SomeFunc()
if err != nil {
return annotate(err)
}
// ...
return 123, nil
}
ã€ãŸããtry-elseãtry-gotoãtry-arrowãªã©ãæ°ããã¹ããŒãã¡ã³ããäœæããããããæ¢åã®èšèªã«äŸåããŠãšã©ãŒåŠçããžãã¯ãèšè¿°ãç¶ããæ¹ãæãŸããããã§ãã
ãããã try
ãåçŽãªã»ãã³ãã£ã¯ã¹if err != nil { return ..., err }
ã«å¶éãããŠããçç±ã§ããããã以äžã®ãã®ã¯ãããŸããã1ã€ã®äžè¬çãªãã¿ãŒã³ãçãããŸãããå¯èœãªãã¹ãŠã®å¶åŸ¡ãããŒãåçºæããããšããªãã§ãã ããã ifã¹ããŒãã¡ã³ããŸãã¯ãã«ããŒé¢æ°ãé©åã§ããå Žåãç§ãã¡ã¯äººã
ããããã䜿ãç¶ããããšãå®å
šã«æåŸ
ããŠããŸãã
@rscæ確ã«ããŠããã ãããããšãããããŸãã
æ£è§£ã§ãã詳现ãããããŸããã§ããã æ§æãèŠããã®ã«ååãªé »åºŠã§defer
ã䜿çšããªããšæããŸãã
_ïŒFWIWãã¡ã€ã«ãã³ãã«ãéãããããè€éãªãã®ã«defer
ã䜿çšãããšãæ»ãåã«func
ãåŸæ¹ã«ãžã£ã³ãããããããããã«ãããªããŸãããããã£ãŠãåžžã«ãã®ã³ãŒããæåŸã«é
眮ããŠãã ããã func
ã®åŸã«for range once{...}
ãšã©ãŒåŠçã³ãŒãbreak
ãåºãŠããŸããïŒ_
è€æ°è¡ãžã®ãã¹ãŠã®tryåŒã³åºããgofmtãããšããææ¡ã¯ãããšã©ãŒãã§ãã¯ããã軜éã«ããGoããã°ã©ã ããã¹ãã®éããšã©ãŒãã§ãã¯ã«æžããããšããç®æšãšçŽæ¥ççŸããŸãã
1è¡ã®ifã¹ããŒãã¡ã³ãã®ãšã©ãŒãã¹ããgofmtãããšããææ¡ãããã®ç®æšãšçŽæ¥ççŸããŸãã ãšã©ãŒãã§ãã¯ã¯ãå éšã®æ¹è¡æåãåé€ããŠããå€§å¹ ã«è»œéåãããããéãæžã£ããããããšã¯ãããŸããã ã©ã¡ãããšããã°ã圌ãã¯ã¹ããã³ã°ããã®ãããé£ãããªããŸãã
tryã®äž»ãªå©ç¹ã¯ãæãäžè¬çãªã±ãŒã¹ã®æ確ãªçç¥åœ¢ã䜿çšããŠãçããã±ãŒã¹ã泚ææ·±ãèªã䟡å€ããããã®ãšããŠç®ç«ãããããšã§ãã
gofmtããäžè¬çãªããŒã«ã«ããã¯ã¢ããããå Žåãèšèªã®å€æŽã§ã¯ãªããšã©ãŒãã§ãã¯ãäœæããããã®ããŒã«ã«çŠç¹ãåœãŠããšããææ¡ãåæ§ã«åé¡ããããŸãã AbelsonãšSussmanãè¿°ã¹ãŠããããã«ããããã°ã©ã ã¯ã人ã ãèªãããšãã§ããããã«ããããŠå¶ç¶ã«ãã·ã³ãå®è¡ããããã«ã®ã¿äœæããå¿ èŠããããŸããã èšèªã«å¯ŸåŠããããã«å·¥äœæ©æ¢°ã_å¿ èŠ_ã§ããå Žåããã®èšèªã¯ãã®åœ¹å²ãæãããŠããŸããã èªã¿ãããã¯ãç¹å®ã®ããŒã«ã䜿çšããŠãã人ã«éå®ãããŠã¯ãªããŸããã
ããžãã¯ãå察æ¹åã«å®è¡ãã人ãããŸããè€éãªåŒãæžãããšãã§ããã®ã§ãå¿ ç¶çã«ãããªãã®ã§ãtryåŒãèŠã€ããã«ã¯IDEãŸãã¯ä»ã®ããŒã«ã®ãµããŒããå¿ èŠã«ãªãã®ã§ãtryã¯æªãèãã§ãã ãã ããããã«ã¯ãµããŒããããŠããªãé£èºãããã€ããããŸãã äž»ãªãã®ã¯ãè€éã§èªããªãã³ãŒããæžãããšã¯_å¯èœ_ã§ããããããã®ãããªã³ãŒãã¯è³ãæã«ååšããããã«ãªããšãã䞻匵ã§ãã @josharianãææããããã«ãã Goã§å¿ãŸãããã³ãŒããæžãããšã¯ãã§ã«å¯èœã§ããã éçºè ã¯ç¹å®ã®ã³ãŒããæžãããã®æãèªã¿ãããæ¹æ³ãèŠã€ããããšããããšã«ã€ããŠã®èŠç¯ãæã£ãŠããã®ã§ãããã¯äžè¬çã§ã¯ãããŸããã ãããã£ãŠãtryãå«ãããã°ã©ã ãèªã¿åãããã«IDEãµããŒããå¿ èŠã«ãªãããšã¯ã»ãšãã©ãããŸããã ãããŠã人ã ãè©Šã¿ãæªçšããŠæ¬åœã«ã²ã©ãã³ãŒããæžãããã€ãã®ã±ãŒã¹ã§ã¯ãIDEãµããŒãã¯ããŸã圹ã«ç«ããªãã§ãããã ãã®å察æèŠïŒäººã ã¯æ°ããæ©èœã䜿çšããŠéåžžã«æªãã³ãŒããæžãããšãã§ããïŒã¯ããã¹ãŠã®èšèªã®ãã¹ãŠã®æ°ããèšèªæ©èœã«é¢ããã»ãšãã©ãã¹ãŠã®è°è«ã§æèµ·ãããŠããŸãã ããã¯ã²ã©ã圹ã«ç«ã¡ãŸããã ããæçšãªå察æèŠã¯ãå°å·ç©ã®ãããã°ã®è°è«ã®ããã«ãã人ã ã¯æåã¯è¯ãããã«èŠãããããã®äºæããªãçç±ã®ããã«ããŸãè¯ããªãããšãå€æããã³ãŒããæžãããšãã圢åŒã§ãã
ç¹°ãè¿ããŸãããèªã¿ãããã¯ç¹å®ã®ããŒã«ã䜿çšããŠãã人ã«éå®ãããŠã¯ãªããŸããã
ïŒç§ã¯ãŸã çŽã«ããã°ã©ã ãå°å·ããŠèªãã§ããŸããã人ã
ã¯ãããããããã«ç§ã«å¥åŠãªå€èŠãäžããããšããããããŸããïŒ
if
ã¹ããŒãã¡ã³ãã1è¡ãšããŠgofmtããããšãèš±å¯ããããšã«ã€ããŠã®èããæäŸããŠããã@rscã«æè¬ããŸãã
1è¡ã®ifã¹ããŒãã¡ã³ãã®ãšã©ãŒãã¹ããgofmtãããšããææ¡ãããã®ç®æšãšçŽæ¥ççŸããŸãã ãšã©ãŒãã§ãã¯ã¯ãå éšã®æ¹è¡æåãåé€ããŠããå€§å¹ ã«è»œéåãããããéãæžã£ããããããšã¯ãããŸããã ã©ã¡ãããšããã°ã圌ãã¯ã¹ããã³ã°ããã®ãããé£ãããªããŸãã
ç§ã¯ãããã®äž»åŒµãç°ãªã£ãŠæšå®ããŸãã
è¡æ°ã3ãã1ã«æžãããšã倧å¹
ã«è»œéåãããŸãã ããšãã°ã3ã€ã§ã¯ãªã9ã€ïŒãŸãã¯5ã€ïŒã®æ¹è¡ãå«ãifã¹ããŒãã¡ã³ããèŠæ±ããgofmtã¯ã倧å¹
ã«éãã®ã§ã¯ãªãã§ããããã çž®å°ã»æ¡å€§ãšåãèŠçŽ ïŒéïŒã§ãã æ§é äœãªãã©ã«ã«ã¯ãã®æ£ç¢ºãªãã¬ãŒããªããããã try
ãè¿œå ãããšã if
ã¹ããŒãã¡ã³ããšåããããã®å¶åŸ¡ãããŒãå¯èœã«ãªããšç§ã¯äž»åŒµããŸãã
第äºã«ãç§ã¯ãããããtry
ã«çããããŸãé©çšããããã«ã¹ããã³ã°ããã®ãããé£ãããªããšããè°è«ãèŠã€ããŸãã å°ãªããšãif
ã¹ããŒãã¡ã³ãã¯ããèªèº«ã®è¡ã«ãªããã°ãªããŸããã ããããããããç§ã¯ãã®æèã§ãã¹ãã ããäœãæå³ããã®ã誀解ããŠããŸãã ç§ã¯ããããã»ãšãã©ã¹ãããããŸããã泚æããŠãã ããããšããæå³ã§äœ¿çšããŠããŸãã
ãšã¯ãããgofmtã®ææ¡ã¯ã try
ãããããã«ä¿å®çãªæé ãèžãããšãåæãšããŠãããååã§ãªãéãã try
ã«åœ±é¿ãäžããããšã¯ãããŸããã ããã§ã¯ãªãããã«æãããã®ã§ããã£ãšè©±ãåãããå Žåã¯ãæ°ããåé¡/ææ¡ãéããŸãã ïŒ+1ïŒ
è¡æ°ã3ãã1ã«æžãããšãå€§å¹ ã«è»œéåãããŸãã
ã³ãŒããå¯éããããå¯èœæ§ãããããšã«èª°ããåæããŠãããšæããŸãã ããšãã°ãããã±ãŒãžå šäœã1è¡ã®å Žåããããåé¡ã§ããããšã«å šå¡ãåæãããšæããŸãã ç§ãã¡ã¯ããããæ£ç¢ºãªç·ã«ã€ããŠã¯æèŠãåãããŠããŸãã ç§ã®ããã«ãç§ãã¡ã¯ç¢ºç«ããŸãã
n, err := src.Read(buf)
if err == io.EOF {
return nil
} else if err != nil {
return err
}
ãã®ã³ãŒãããã©ãŒãããããæ¹æ³ãšããŠããããŠç§ã¯ããªãã®äŸã«ã·ããããããšããããšã¯ããªãäžå¿«ã ãšæããŸã
n, err := src.Read(buf)
if err == io.EOF { return nil }
else if err != nil { return err }
代ããã¯ã ç§ãã¡ããã®ããã«å§ããŠããããããã¯å€§äžå€«ã ãšç¢ºä¿¡ããŠããŸãã ããããç§ãã¡ã¯ããããŸããã§ããããããŠããã¯ç§ãã¡ãä»ããå Žæã§ã¯ãããŸããã
å人çã«ã¯ãã¹ããã³ã°ãç°¡åã§ãããšããæå³ã§ãåè ã®æ¹ãããŒãžäžã§è»œéã§ããããšãããããŸãã å®éã®æåãèªãŸãªããŠããif-elseãäžç®ã§ããããŸãã å¯Ÿç §çã«ãå¯åºŠã®é«ãããŒãžã§ã³ã¯ã3ã€ã®ã¹ããŒãã¡ã³ãã®ã·ãŒã±ã³ã¹ããäžç®ã§ãããã«ãããããæå³ãæ確ã«ãªãåã«ããã泚ææ·±ã調ã¹ãå¿ èŠããããŸãã
çµå±ãæ¹è¡ã®æ°ãŸã§ãããŸããŸãªå Žæã«å¯åºŠå¯Ÿèªã¿ãããã®ç·ãåŒããŠãåé¡ãããŸããã tryã®ææ¡ã¯ãæ¹è¡ãåé€ããã ãã§ãªããæ§æãå®å šã«åé€ããããšã«çŠç¹ãåœãŠãŠãããgofmtã®è³ªåãšã¯å¥ã«è»œéã®ããŒãžãã¬ãŒã³ã¹ãçæããŸãã
ããžãã¯ãå察æ¹åã«å®è¡ãã人ãããŸããè€éãªåŒãæžãããšãã§ããã®ã§ãå¿ ç¶çã«ãããªãã®ã§ãtryåŒãèŠã€ããã«ã¯IDEãŸãã¯ä»ã®ããŒã«ã®ãµããŒããå¿ èŠã«ãªãã®ã§ãtryã¯æªãèãã§ãã ãã ããããã«ã¯ãµããŒããããŠããªãé£èºãããã€ããããŸãã äž»ãªãã®ã¯ãè€éã§èªããªãã³ãŒããæžãããšã¯_å¯èœ_ã§ããããããã®ãããªã³ãŒãã¯è³ãæã«ååšããããã«ãªããšãã䞻匵ã§ãã @josharianãææããããã«ãã Goã§å¿ãŸãããã³ãŒããæžãããšã¯ãã§ã«å¯èœã§ããã éçºè ã¯ç¹å®ã®ã³ãŒããæžãããã®æãèªã¿ãããæ¹æ³ãèŠã€ããããšããããšã«ã€ããŠã®èŠç¯ãæã£ãŠããã®ã§ãããã¯äžè¬çã§ã¯ãããŸããã ãããã£ãŠãtryãå«ãããã°ã©ã ãèªã¿åãããã«IDEãµããŒããå¿ èŠã«ãªãããšã¯ã»ãšãã©ãããŸããã ãããŠã人ã ãè©Šã¿ãæªçšããŠæ¬åœã«ã²ã©ãã³ãŒããæžãããã€ãã®ã±ãŒã¹ã§ã¯ãIDEãµããŒãã¯ããŸã圹ã«ç«ããªãã§ãããã ãã®å察æèŠïŒäººã ã¯æ°ããæ©èœã䜿çšããŠéåžžã«æªãã³ãŒããæžãããšãã§ããïŒã¯ããã¹ãŠã®èšèªã®ãã¹ãŠã®æ°ããèšèªæ©èœã«é¢ããã»ãšãã©ãã¹ãŠã®è°è«ã§æèµ·ãããŠããŸãã ããã¯ã²ã©ã圹ã«ç«ã¡ãŸããã
ãããã Goã«äžé æŒç®åããªãçç±ã®ãã¹ãŠã§ã¯ãããŸãããïŒ
ããããGoã«äžé æŒç®åããªãçç±ã®ãã¹ãŠã§ã¯ãããŸãããïŒ
ããããããã®æ©èœã¯éåžžã«èªã¿ãããã³ãŒããæžãããã«äœ¿çšã§ããŸãããèªããªãã³ãŒããæžãããã«æªçšãããå¯èœæ§ããããŸãããšããã®æ©èœã®äž»ãªçšéã¯èªããªãã³ãŒããæžãããšã§ãããåºå¥ã§ããŸãã
Cã®çµéšã¯ããã瀺åããŠããŸããïŒ ïŒ2çªç®ã®ã«ããŽãªã«çŽæ¥åé¡ãããŸãã ïŒminãšmaxãé€ããŠãïŒã䜿çšããã³ãŒããèŠãããšããããã©ããã¯ããããŸããã代ããã«ifã¹ããŒãã¡ã³ãã䜿çšããããã«æžãçŽããŠãæ¹åãããŸããã§ããããããããã®æ®µèœã¯è©±é¡ããå€ããŠããŸããïŒ
æ§æ
ãã®è°è«ã¯ãææ¡ããåãã»ãã³ãã£ã¯ã¹ãæžãããã®6ã€ã®ç°ãªãæ§æãç¹å®ããŸããã
f := try(os.Open(file))
ãææ¡ããïŒçµã¿èŸŒã¿é¢æ°ïŒf := try os.Open(file)
ãããŒã¯ãŒãïŒãã¬ãã£ãã¯ã¹ããŒã¯ãŒãïŒã䜿çšf := os.Open(file)?
ã Rustã®ããã«ïŒåŒã³åºããµãã£ãã¯ã¹æŒç®åïŒf := os.Open?(file)
ã @ rogpeppeïŒcall-infixæŒç®åïŒã«ãã£ãŠææ¡ãããŸããtry f := os.Open(file)
ã @ thepuddsã«ãã£ãŠææ¡ãããŸããïŒã¹ããŒãã¡ã³ããè©ŠããŠãã ããïŒtry ( f := os.Open(file); f.Close() )
ã @ bakulã«ãã£ãŠææ¡ãããŸããïŒãããã¯ãè©ŠããŠãã ããïŒïŒãªãªãžã³ã¹ããŒãªãŒãééããå Žåã¯ãè©«ã³ããŸãïŒïŒ
ãããã«ã¯ãã¹ãŠé·æãšçæããããŸããè¯ãç¹ã¯ããã¹ãŠåãã»ãã³ãã£ã¯ã¹ãæã£ãŠãããããããã«å®éšããããã«ããŸããŸãªæ§æããéžæããããšã¯ããã»ã©éèŠã§ã¯ãªããšããããšã§ãã
ç§ã¯@brynbellomyã®èããåºæ¿ããããšã«ãã£ãŠãã®äŸãèŠã€ããŸããïŒ
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := try(parentObjOne.AsCommit())
parentCommitTwo := try(parentObjTwo.AsCommit())
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
try parentCommitOne := parentObjOne.AsCommit()
try parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// vs
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
ãã¡ããããããã®ç¹å®ã®äŸã®éã«å€§ããªéãã¯ãããŸããã ãããŠããã¹ãŠã®è¡ã«è©ŠããŠã¿ããããããã䞊ã¹ãããé€å€ãããããŠã¿ãŸãããïŒ ã¯ãªãŒããŒãããªãã§ããïŒ ãããæ°ã«ãªããŸããã
ãããã @ ianlancetaylorã芳å¯ããããã«ããè©ŠããŠã¿ããšããªãŒããåãããŠããŸããŸãã ã³ãŒãã¯äžé£ã®tryã¹ããŒãã¡ã³ãã«ãªããã³ãŒããå®éã«å®è¡ããŠããããšãèŠãé ããŸããã
ãããéèŠãªãã€ã³ãã ãšæããŸãããã®ããã«è©Šè¡ã䞊ã¹ããããããã¯ã®ããã«ãããé€å€ãããããããšã¯ã誀ã£ã䞊ååŠçãæå³ããŸãã ãããã®ã¹ããŒãã¡ã³ãã§éèŠãªã®ã¯ããã¹ãŠãè©Šè¡ããããšã§ãã ããã¯éåžžãã³ãŒãã«é¢ããŠæãéèŠãªããšã§ã¯ãªããã³ãŒããèªããšãã«çŠç¹ãåœãŠãã¹ããã®ã§ããããŸããã
è°è«ã®ããã«ãAsCommitã倱æããããšã¯ãªãããã®çµæããšã©ãŒãè¿ããªããšããŸãã ä»ãç§ãã¡ã¯æã£ãŠããŸãïŒ
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// vs
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
äžèŠãããšãçãäžã®2æ¬ã®ç·ãä»ã®ç·ãšã¯æããã«ç°ãªã£ãŠããããšãããããŸãã ãªãã§ïŒ ãšã©ãŒåŠçã®ããã«å€æããŸããã ããããã®ã³ãŒãã®æãéèŠãªè©³çŽ°ã§ãããäžç®ã§æ°ä»ãã¹ãããšã§ããïŒ ç§ã®çãã¯ããŒã§ãã ããã°ã©ã ãæåã«å®è¡ããŠããããšã®ã³ã¢ããžãã¯ãšãåŸã§ãšã©ãŒåŠçã«æ³šæããå¿ èŠããããšæããŸãã ãã®äŸã§ã¯ãtryã¹ããŒãã¡ã³ããštryãããã¯ãã³ã¢ããžãã¯ã®ãã¥ãŒã劚ããŠããŸãã ç§ã«ãšã£ãŠãããã¯ãããããããã®ã»ãã³ãã£ã¯ã¹ã®æ£ããæ§æã§ã¯ãªãããšã瀺åããŠããŸãã
ããã«ãããæåã®4ã€ã®æ§æãæ®ããŸãããããã®æ§æã¯ãäºãã«ããã«é¡äŒŒããŠããŸãã
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// vs
headRef := try r.Head()
parentObjOne := try headRef.Peel(git.ObjectCommit)
parentObjTwo := try remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try index.WriteTree()
tree := try r.LookupTree(treeOid)
// vs
headRef := r.Head()?
parentObjOne := headRef.Peel(git.ObjectCommit)?
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)?
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()?
tree := r.LookupTree(treeOid)?
// vs
headRef := r.Head?()
parentObjOne := headRef.Peel?(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel?(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree?()
tree := r.LookupTree?(treeOid)
ä»ã®ãã®ããã1ã€ãéžæããããšã«ã€ããŠããŸãã«ã粟åçã«ãªãã®ã¯é£ããã§ãã ãããã¯ãã¹ãŠè¯ãç¹ãšæªãç¹ããããŸãã çµã¿èŸŒã¿ãã©ãŒã ã®æãéèŠãªå©ç¹ã¯æ¬¡ã®ãšããã§ãã
ïŒ1ïŒæ£ç¢ºãªãªãã©ã³ãã¯ãç¹ã«ãã¬ãã£ãã¯ã¹æŒç®åtry x.y().z()
ãšæ¯èŒãããšãéåžžã«æ確ã§ãã
ïŒ2ïŒtryã«ã€ããŠç¥ãå¿
èŠã®ãªãããŒã«ã¯ããããåçŽãªé¢æ°åŒã³åºããšããŠæ±ãããšãã§ãããããããšãã°ãgoimportsã¯èª¿æŽãªãã§æ£åžžã«æ©èœããŸãã
ïŒ3ïŒå¿
èŠã«å¿ããŠãå°æ¥ã®æ¡åŒµãšèª¿æŽã®äœå°ããããŸãã
ãããã®æ§é ã䜿çšããŠå®éã®ã³ãŒããèŠãåŸãä»ã®3ã€ã®æ§æã®ããããã®å©ç¹ãé¢æ°åŒã³åºãæ§æã®ãããã®å©ç¹ãäžåããã©ããã«ã€ããŠããè¯ãæèŠãé€ãããšã¯å®å šã«å¯èœã§ãã å®éšãšçµéšã ãããããæããŠãããŸãã
ãã¹ãŠã®èª¬æã«æè¬ããŸãã èããã°èããã»ã©ããã®ææ¡ã奜ãã«ãªãããããç®æšã«ã©ã®ããã«é©åããããããããŸãã
ã©ãããæ¥ãã®ãããããªãerr
recover()
ã®ãããªé¢æ°ã䜿ã£ãŠã¿ãŸãããïŒ ããäžè²«æ§ããããå®è£
ãç°¡åã«ãªãå¯èœæ§ããããŸãã
func f() error {
defer func() {
if err:=error();err!=nil {
...
}
}()
}
ç·šéïŒç§ã¯ååä»ããªã¿ãŒã³ã䜿çšããããšã¯ãããŸãããããããç§ãããã®ããã ãã«ååä»ããªã¿ãŒã³ãè¿œå ããã®ã¯å¥åŠã§ããã
@flibustenet ãããã€ãã®åæ§ã®ææ¡ã«ã€ããŠã¯https://swtch.com/try.html#namedãåç
§ããŠãã ããã
ïŒããããã¹ãŠã«çããïŒããã¯å¯èœã§ãããååä»ãã®çµæãèãããšå¿
ãããå¿
èŠã§ã¯ãªãã®ã§ã2çªç®ã®æ¹æ³ãæäŸããå¿
èŠããããšå€æããåã«æ¢åã®æŠå¿µã䜿çšããããšããå§ãããŸããïŒ
try()
ã®æå³ããªãçµæã¯ããããžã§ã¯ããåäžè¡ã®ãšã©ãŒãã§ãã¯ãååŸããããã«_gofmt_ãæŸæ£ããããšã§ããå¯èœæ§ããããŸãã ãããtry()
ã®ã»ãšãã©ãã¹ãŠã®ã¡ãªããã§ãããã³ã¹ãã¯ããããŸããã ç§ã¯ãããæ°å¹Žéè¡ã£ãŠããŸããã ããã¯ããŸããããŸãã
ããããç§ã¯ããããããã±ãŒãžã®æåŸã®æ段ã®ãšã©ãŒãã³ãã©ãŒãå®çŸ©ãããããå¿
èŠãšãããã¹ãŠã®ãšã©ãŒãã§ãã¯ãæé€ã§ããããã«ããããšæããŸãã ç§ãå®çŸ©ããã®ã¯try()
ã§ã¯ãããŸããã
@networkimprov ãããªãã¯ç§ãã¡ãã¿ãŒã²ããã«ããŠããGoãŠãŒã¶ãŒãšã¯ç°ãªãç«å Žããæ¥ãŠããããã§ããããªãã®èŠç¹ãããããç解ã§ããããã«ãã¡ãã»ãŒãžã«è¿œå ã®è©³çŽ°ããªã³ã¯ãå«ãŸããŠãããšãã¡ãã»ãŒãžã¯äŒè©±ã«ããã«è²¢ç®ããŸãã
ããªããè©ŠããŠã¿ããšä¿¡ããŠãããã³ã¹ãããäœã§ãããã¯äžæã§ãã ãããŠãgofmtãæŸæ£ããããšã¯ãè©Šè¡ã®ãã³ã¹ãããŸã£ãããªãããšèšããŸãããgofmtã®ãã©ãŒãããã¯ãgoimportsãªã©ã®GoãœãŒã¹ã³ãŒãã®æžãæããæ¯æŽãããã¹ãŠã®ããã°ã©ã ã§äœ¿çšããããã®ã§ããããšãç¡èŠããŠããããã§ãã ã çã ã ããªãã¯ãããã®ãã«ããŒãæŸæ£ããããšãç ç²ã«ããŠgofmtãæŸæ£ããããå°ãªããšãããªããããããåŒã³åºããšãã«ããªãã®ã³ãŒããžã®å®è³ªçãªå¶çºçãªç·šéã«ææ ¢ããŸãã ããã§ãããããããŸãããã®ã§ããã°ãããã¯çŽ æŽãããããšã§ãããã²ããããç¶ããŠãã ããã
ãŸãããããã±ãŒãžã®æåŸã®æ段ã®ãšã©ãŒãã³ãã©ãŒãå®çŸ©ããããšã¯ã©ãããæå³ãããŸãã¯äžåºŠã«1ã€ã®é¢æ°ã§ã¯ãªããããã±ãŒãžå šäœã«ãšã©ãŒåŠçããªã·ãŒãé©çšããããšãé©åã§ããçç±ãäžæã§ãã ãšã©ãŒãã³ãã©ã§å®è¡ãããäž»ãªããšãã³ã³ããã¹ãã®è¿œå ã§ããå Žåãåãã³ã³ããã¹ãã¯ããã±ãŒãžå šäœã«é©åã§ã¯ãããŸããã
@rsc ãã芧ã®ãšãããtryãããã¯æ§æãææ¡ããŸããããåŸã§ãã®æ©èœã®ãnoãåŽã«æ»ããŸãããããã¯ãã¹ããŒãã¡ã³ããŸãã¯é¢æ°ã¢ããªã±ãŒã·ã§ã³ã§1ã€ä»¥äžã®æ¡ä»¶ä»ããšã©ãŒãªã¿ãŒã³ãé衚瀺ã«ããããšã«äžå¿«æãæããããã§ãã ãããã1ã€ã®ãã€ã³ããæ確ã«ããŸãããã tryãããã¯ã®ææ¡ã§ã¯ã try
ãå¿
èŠãšããªãã¹ããŒãã¡ã³ããæ瀺çã«èš±å¯ããŸããã ãããã£ãŠãæåŸã®tryãããã¯ã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
ããã¯åã«ãtryãããã¯å ã§è¿ããããšã©ãŒãåŒã³åºãå ã«è¿ãããããšã瀺ããŠããŸãã ã³ã³ãããŒã«ãtryãããã¯ãééããå Žåããããã¯ã«ãšã©ãŒã¯ãããŸããã§ããã
ããªããèšã£ã
ããã°ã©ã ãæåã«å®è¡ããŠããããšã®ã³ã¢ããžãã¯ãšãåŸã§ãšã©ãŒåŠçã«æ³šæããå¿ èŠããããšæããŸãã
ããããŸãã«ç§ãtryãããã¯ãèããçç±ã§ãïŒ é€å€ãããã®ã¯ãããŒã¯ãŒãã ãã§ãªãããšã©ãŒåŠçã§ãã ãšã©ãŒãçæããå¯èœæ§ã®ããNåã®ç°ãªãå Žæã«ã€ããŠèããå¿ èŠã¯ãããŸããïŒç¹å®ã®ãšã©ãŒãæ瀺çã«åŠçããããšããŠããå Žåãé€ãïŒã
èšåãã䟡å€ããããããããªãããã€ãã®ããå€ãã®ãã€ã³ãïŒ
try(try(foo(try(bar)).fum())
ãªã©ã®åŒãèš±å¯ãããŠãããã©ããã¯ããããŸããã ãã®ãããªäœ¿çšã¯çãã²ããããããããŸãããããããã®ã»ãã³ãã£ã¯ã¹ãæå®ããå¿
èŠããããŸãã tryãããã¯ã®å Žåãã³ã³ãã€ã©ã¯ãã®ãããªäœ¿çšãæ€åºãããã¹ãŠã®ãšã©ãŒåŠçãtryãããã¯ã¬ãã«ã«çµãåºãããã«ããã«åªåããå¿
èŠããããŸããtry
return-on-error
ã奜ãã«ãªãåŸåããããŸãã ããã¯ãããã¯ã¬ãã«ã§é£²ã¿èŸŒãã®ãç°¡åã§ãïŒFWIWãç§ã¯ãŸã ãããè¡ã䟡å€ã¯ãªããšæããŸãã
@rsc
[...]
äž»ãªãã®ã¯ãè€éã§èªããªãã³ãŒããæžãããšãå¯èœã§ããããããã®ãããªã³ãŒãã¯è³ãæã«ååšããããã«ãªããšãã䞻匵ã§ãã @josharianãææããããã«ããã§ã«ãGoã§å¿ãŸãããã³ãŒããæžãããšã¯å¯èœã§ããã
[...]headRef := try(r.Head()) parentObjOne := try(headRef.Peel(git.ObjectCommit)) parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit)) parentCommitOne := try(parentObjOne.AsCommit()) parentCommitTwo := try(parentObjTwo.AsCommit())
ãæªãã³ãŒããã«å¯Ÿããããªãã®ç«å Žã¯ãä»æ¥ã次ã®ãããã¯ã®ãããªã²ã©ãã³ãŒããæžãããšãã§ãããšããããšã ãšç解ããŠããŸãã
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
ãã¹ããããtry
åŒã³åºããçŠæ¢ããŠã誀ã£ãŠäžæ£ãªã³ãŒããèšè¿°ããªãããã«ããããšã«ã€ããŠã©ãæããŸããïŒ
æåã®ããŒãžã§ã³ã§ãã¹ããããtry
ãèš±å¯ããªãå Žåãå¿
èŠã«å¿ããŠåŸã§ãã®å¶éãåé€ã§ããŸãããã®éã¯äžå¯èœã§ãã
ãã®ç¹ã«ã€ããŠã¯ãã§ã«èª¬æããŸããããé¢é£æ§ãããããã§ããã³ãŒãã®è€é床ã¯ãæ°Žå¹³æ¹åã§ã¯ãªãåçŽæ¹åã«ã¹ã±ãŒãªã³ã°ããå¿ èŠããããŸãã
åŒãšããŠã®try
ã¯ããã¹ããããåŒã³åºãã奚å±ããããšã«ãããã³ãŒãã®è€éããæ°Žå¹³æ¹åã«ã¹ã±ãŒãªã³ã°ããããã«ä¿ããŸãã ã¹ããŒãã¡ã³ããšããŠã®try
ã¯ãã³ãŒãã®è€éããåçŽæ¹åã«ã¹ã±ãŒãªã³ã°ããããšãä¿é²ããŸãã
@rsc ãããªãã®è³ªåã«ã
æåŸã®æ段ã®ç§ã®ããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒ-ãšã©ãŒãäºæãããŠããªãå ŽåïŒ
func quit(err error) {
fmt.Fprintf(os.Stderr, "quit after %s\n", err)
debug.PrintStack() // because panic(err) produces a pile of noise
os.Exit(3)
}
ã³ã³ããã¹ãïŒos.Fileãå€çšããŠããŸãïŒ2ã€ã®ãã°ãèŠã€ãããŸããïŒïŒ26650ãšïŒ32088ïŒ
åºæ¬çãªã³ã³ããã¹ããè¿œå ããããã±ãŒãžã¬ãã«ã®ãã³ã¬ãŒã¿ã«ã¯ã caller
åŒæ°ãå¿
èŠã§ããããã¯runtime.CallerïŒïŒã®çµæãæäŸããçæãããæ§é äœã§ãã
_go fmt_ rewriterãæ¢åã®ãã©ãŒãããã䜿çšããããå€æããšã«ãã©ãŒããããæå®ã§ããããã«ããããšæããŸãã ç§ã¯ä»ã®ããŒã«ã§ããéããŸãã
try()
ã®ã³ã¹ãïŒã€ãŸãæ¬ ç¹ïŒã¯ãäžèšã§ååã«ææžåãããŠããŸãã
ç§ã¯æ£çŽã«èšã£ãŠãGoããŒã ãæåcheck/handle
ïŒæ
åçã«ã¯æ¬æ°ãªã¢ã€ãã¢ïŒãæäŸãã次ã«äžè
æäžã®try()
ãæäŸããŠãããŸããã ãªãRFPåãšã©ãŒåŠçãçºè¡ããªãã£ãã®ãããããŸããããã®åŸãçµæãšããŠåŸãããææ¡ã®ããã€ãã«ã€ããŠã³ãã¥ããã£ã®ã³ã¡ã³ããåéããŸãïŒïŒ29860ãåç
§ïŒã ããã«ã¯ã掻çšã§ããå€ãã®ç¥æµããããŸãã
@rsc
æ§æ
ãã®è°è«ã¯ãææ¡ããåãã»ãã³ãã£ã¯ã¹ãæžãããã®6ã€ã®ç°ãªãæ§æãç¹å®ããŸããã
f := try(os.Open(file))
ãææ¡ããïŒçµã¿èŸŒã¿é¢æ°ïŒf := try os.Open(file)
ãããŒã¯ãŒãïŒãã¬ãã£ãã¯ã¹ããŒã¯ãŒãïŒã䜿çšf := os.Open(file)?
ã Rustã®ããã«ïŒåŒã³åºããµãã£ãã¯ã¹æŒç®åïŒf := os.Open?(file)
ã @ rogpeppeïŒcall-infixæŒç®åïŒã«ãã£ãŠææ¡ãããŸããtry f := os.Open(file)
ã @ thepuddsã«ãã£ãŠææ¡ãããŸããïŒã¹ããŒãã¡ã³ããè©ŠããŠãã ããïŒtry ( f := os.Open(file); f.Close() )
ã @ bakulã«ãã£ãŠææ¡ãããŸããïŒãããã¯ãè©ŠããŠãã ããïŒ
try {error} {optional wrap func} {optional return args in brackets}
f, err := os.Open(file)
try err wrap { a, b }
...ãããŠãIMOãïŒé é»æ³ã«ããïŒèªã¿ããããšæå³ã®æ£ç¢ºãã®åäžïŒ
f, err := os.Open(file)
relay err
ãŸã
f, err := os.Open(file)
relay err wrap
ãŸã
f, err := os.Open(file)
relay err wrap { a, b }
ãŸã
f, err := os.Open(file)
relay err { a, b }
ãªã¬ãŒå¯Ÿãã©ã€ã®æå±ã¯ãããã¯ããå€ããŠããã®ã§ç°¡åã«åŽäžã§ããããšã¯ç¥ã£ãŠããŸããããã©ã€ãäœãè©Šè¡ãããäœãã¹ããŒããªãããšã説æããããšããããšã¯æ³åã§ããŸãã ããã¯æ確ã§ã¯ãªããè·ç©ããããŸãã relay
ãæ°ããçšèªã§ãããšãæ確ãªèª¬æãå¯èœã«ãªãã説æã«ã¯åè·¯ã®åºç€ããããŸãïŒãšã«ããããããã¹ãŠã§ãïŒã
æ確ã«ããããã«ç·šéïŒ
è©ŠããŠã¿ãŠãã ãã-1ãäœããäœéšããŠäž»èŠ³çã«å€æãã2.äœãã客芳çã«æ€èšŒãã3.äœããããããšãã4.äžæãããå¯èœæ§ã®ããè€æ°ã®å¶åŸ¡ãããŒãèµ·åãããã®å Žåã¯ååå¯èœãªéç¥ãèµ·åãã
ãã®ææ¡ã§ã¯ãtryã¯ãããã®ããããå®è¡ããŠããŸããã å®éã«é¢æ°ãå®è¡ããŠããŸãã 次ã«ããšã©ãŒå€ã«åºã¥ããŠå¶åŸ¡ãããŒãåé ç·ããŸãã ããã¯æåéãä¿è·ãªã¬ãŒã®å®çŸ©ã§ãã ãã¹ãããããšã©ãŒã®å€ã«å¿ããŠãåè·¯ãçŽæ¥åé 眮ããŸãïŒã€ãŸããçŸåšã®æ©èœã¹ã³ãŒããç絡ããŸãïŒã
tryãããã¯ã®ææ¡ã§ã¯ãtryãå¿ èŠãšããªãã¹ããŒãã¡ã³ããæ瀺çã«èš±å¯ããŸãã
JavaãPythonãªã©ã®èšèªã®try-catchã·ã¹ãã ã«æ¯ã¹ãŠãGoã®ãšã©ãŒåŠçã®äž»ãªå©ç¹ã¯ãã©ã®é¢æ°åŒã³åºãã§ãšã©ãŒãçºçããããã©ã®é¢æ°åŒã³åºãã§ãšã©ãŒãçºçããªãããåžžã«æ確ã«ãªãããšã§ãã å
ã®ææ¡ã«èšèŒãããŠããtry
ã®å©ç¹ã¯ããã®éèŠãªæ©èœãç¶æããªãããåçŽãªãšã©ãŒåŠçã®å®åæãåæžã§ããããšã§ãã
@Goodwineã®äŸããããã®éãã«ããããããããšã©ãŒåŠçã®èŠ³ç¹ãããããã§ããåããããšãã§ããŸãã
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
... try-catchèšèªã§ããèŠããããã®ãããåªããŠããŸã
parentCommitOne := r.Head().Peel(git.ObjectCommit).AsCommit()
parentCommitTwo := remoteBranch.Reference.Peel(git.ObjectCommit).AsCommit()
...ãšã©ãŒãåå ã§ã³ãŒãã®ã©ã®éšåãå¶åŸ¡ãããŒãè¿åãããå¯èœæ§ããããã©ã®éšåãè¿åã§ããªããããŸã å€æã§ããããã§ãã
@bakulããã®ãããã¯æ§æã®ææ¡ãæ¯æããŠããªãããšã¯ç¥ã£ãŠããŸãããä»ã®äººãšæ¯èŒããŠGoã®ãšã©ãŒåŠçã«ã€ããŠèå³æ·±ãç¹ãæµ®ãã³äžãã£ãŠãããšæããŸãã Goãæ¡çšãããšã©ãŒåŠçã®ææ¡ã¯ãã³ãŒãã®ã©ã®éšåããšã©ãŒã«ãªãå¯èœæ§ãããããšã©ãŒã«ãªããªãã®ããé£èªåããŠã¯ãªããªãããšãéèŠã ãšæããŸãã
ç§ã¯å°ããªããŒã«ãäœæããŸããïŒ tryhard
ïŒçŸæç¹ã§ã¯ããã»ã©åªåããŠããŸããïŒã¯ãã¡ã€ã«ããšã«åäœããåçŽãªASTãã¿ãŒã³ãããã³ã°ã䜿çšããŠtry
ã®æœåšçãªåè£ãèªèããŸãããã¥ã¡ã³ãããèªã¿ãã ããã
try
ã®5000ïŒïŒïŒã®æ©äŒãè¶
ãããããã¬ããŒãã§$GOROOT/src
ã«é©çšããŸãã 誀æ€ç¥ããããããããããããŸããããæäœæ¥ã§ãŸãšããªãµã³ãã«ããã§ãã¯ããããšã¯ãã»ãšãã©ã®æ©äŒãçŸå®ã®ãã®ã§ããããšã瀺åããŠããŸãã
æžãæãæ©èœã䜿çšãããšã try
ã䜿çšããã³ãŒããã©ã®ããã«èŠããããããããŸãã ç¹°ãè¿ãã«ãªããŸãããåºåããã£ãšèŠããšãç§ã®å¿ã倧å¹
ã«æ¹åãããŠããããšãããããŸãã
ïŒæ³šæïŒæžãæãæ©èœã¯ãã¡ã€ã«ãç Žå£ããŸãïŒèªå·±è²¬ä»»ã§äœ¿çšããŠãã ããã ïŒ
ããŸãããã°ãããã«ããã try
ã䜿çšããŠã³ãŒããã©ã®ããã«èŠãããã«ã€ããŠã®å
·äœçãªæŽå¯ãåŸãããã¢ã€ãã«ç¶æ
ã§éçç£çãªæšæž¬ãä¹ãè¶ããããšãã§ããŸãã
ããããšãïŒã楜ãã¿ãã ããã
ãæªãã³ãŒããã«å¯Ÿããããªãã®ç«å Žã¯ãä»æ¥ã次ã®ãããã¯ã®ãããªã²ã©ãã³ãŒããæžãããšãã§ãããšããããšã ãšç解ããŠããŸãã
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()) parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
ç§ã®ç«å Žã¯ãGoéçºè ãæ確ãªã³ãŒããæžãã®ã«ãŸãšããªä»äºãããŠããããšããããŠã»ãŒééããªããã³ã³ãã€ã©ãŒã ããããªããããªãã®ååããã®ããã«èŠããã³ãŒããæžãã®ãéªéããŠããããã§ã¯ãªããšããããšã§ãã
ãã¹ãããã
try
åŒã³åºããçŠæ¢ããŠã誀ã£ãŠäžæ£ãªã³ãŒããèšè¿°ããªãããã«ããããšã«ã€ããŠã©ãæããŸããïŒ
Goã®åçŽãã®å€§éšåã¯ãç¬ç«ããŠæ§æããçŽäº€ããç¹åŸŽã®éžæã«ç±æ¥ããŸãã å¶éãè¿œå ãããšãçŽäº€æ§ãæ§æå¯èœæ§ãç¬ç«æ§ãæãªãããããããããšã§åçŽããæãªãããŸãã
ä»æ¥ãããã¯ããªããæã£ãŠããå Žåã®ã«ãŒã«ã§ãïŒ
x := expression
y := f(x)
ä»ã«xã䜿çšããªãå Žåã¯ããããåçŽåããããã®æå¹ãªããã°ã©ã å€æã§ãã
y := f(expression)
tryåŒã«å¶éãæ¡çšãããšããããåžžã«æå¹ãªå€æã§ãããšæ³å®ããŠããããŒã«ãæ©èœããªããªããŸãã ãŸãã¯ãåŒãåŠçããtryåŒãåŠçããå¯èœæ§ã®ããã³ãŒããžã§ãã¬ãŒã¿ãŒãããå Žåã¯ãå¶éãæºããããã«äžæçãªãã®ãå°å ¥ããå¿ èŠããããŸãã ãªã©ãªã©ã
èŠããã«ãå¶éã¯ããªãã®è€éããè¿œå ããŸãã 圌ãã¯ãã誰ãããã®å£ã«ã¶ã€ãã£ãŠãç§ãã¡ã«ãããéããããã«é Œããã©ããèŠãŠã¿ãŸããããã§ã¯ãªããéèŠãªæ£åœåãå¿ èŠãšããŠããŸãã
ç§ã¯2幎åã«https://github.com/golang/go/issues/18130#issuecomment-264195616 ïŒåãšã€ãªã¢ã¹ã®ã³ã³ããã¹ãã§ïŒã§ããé·ã説æãæžããŸããããããã¯ããã§ãåæ§ã«åœãŠã¯ãŸããŸãã
@bakul ã
ãããã1ã€ã®ãã€ã³ããæ確ã«ããŸãããã tryãããã¯ã®ææ¡ã§ã¯ã
try
ã_å¿ èŠãšããªã_ã¹ããŒãã¡ã³ããæ瀺çã«èš±å¯ããŸããã
ãããè¡ããšã2çªç®ã®ç®æšã«ã¯éããŸãããããšã©ãŒãã§ãã¯ãšãšã©ãŒåŠçã®äž¡æ¹ãæ瀺çã§ããå¿ èŠããããŸããã€ãŸããããã°ã©ã ããã¹ãã«è¡šç€ºãããŸããäŸå€åŠçã®èœãšãç©Žãç¹°ãè¿ããããããŸãããã
åŸæ¥ã®äŸå€åŠçã®äž»ãªèœãšãç©Žã¯ããã§ãã¯ãã©ãã«ããããç¥ããªãããšã§ãã æ€èšïŒ
try {
s = canThrowErrors()
t = cannotThrowErrors()
u = canThrowErrors() // a second call
} catch {
// how many ways can you get here?
}
é¢æ°ã®ååãããŸããããã«ããå Žåãã©ã®é¢æ°ã倱æããå¯èœæ§ããããã©ã®é¢æ°ãæåããããšãä¿èšŒãããŠããããå€æããã®ã¯éåžžã«é£ããå ŽåããããŸããã€ãŸããäŸå€ã«ãã£ãŠäžæã§ããã³ãŒãã®ãã©ã°ã¡ã³ããšã§ããªãé¢æ°ãç°¡åã«æšæž¬ããããšã¯ã§ããŸããã
ãããSwiftã®ã¢ãããŒããšæ¯èŒããŠãã ãããSwiftã®ã¢ãããŒãã§ã¯ãåŸæ¥ã®äŸå€åŠçæ§æã®äžéšãæ¡çšããŠããŸãããå®éã«ã¯ãšã©ãŒåŠçãè¡ã£ãŠããããã§ãã¯ãããåé¢æ°ã«æ瀺çãªããŒã«ãŒããããçŸåšã®ã¹ã¿ãã¯ãã¬ãŒã ãè¶ ããŠå·»ãæ»ãæ¹æ³ã¯ãããŸããã
do {
let s = try canThrowErrors()
let t = cannotThrowErrors()
let u = try canThrowErrors() // a second call
} catch {
handle error from try above
}
RustãSwiftããŸãã¯ãã®ææ¡ã®ãããã§ãã£ãŠããäŸå€åŠçã«å¯ŸããéèŠãªéèŠãªæ¹åç¹ã¯ããã§ãã¯ãè¡ãããåå Žæã«ãéåžžã«è»œéã®ããŒã«ãŒã䜿çšããŠããããã¹ãã«æ瀺çã«ããŒã¯ãä»ããããšã§ãã
æé»çãªãã§ãã¯ã®åé¡ã®è©³çŽ°ã«ã€ããŠã¯ãæšå¹Ž8æã®åé¡ã®æŠèŠã®ãåé¡ãã»ã¯ã·ã§ã³ãç¹ã«2ã€ã®RaymondChenã®èšäºãžã®ãªã³ã¯ãåç §ããŠãã ããã
ç·šéïŒ @velovixã®ã³ã¡ã³ã3ãåç §ããŠãã ãããããã¯ãç§ãããã«åãçµãã§ãããšãã«å¯ããããŸããã
@daved ãç§ã¯ãä¿è·ãªã¬ãŒãã®ã¢ãããžãŒãããªãã®ããã«åãããšãããããæããŸãã ããã¯ç§ã«ã¯ããŸããããŸããã ããã°ã©ã ã¯åè·¯ã§ã¯ãããŸããã
ã©ããªèšèã誀解ãããå¯èœæ§ããããŸãïŒ
ãbreakãã¯ããã°ã©ã ãå£ããŸããã
ãcontinueãã¯ãéåžžã®ããã«æ¬¡ã®ã¹ããŒãã¡ã³ãã§å®è¡ãç¶ç¶ããŸããã
ãgotoã...ãŸãgotoã¯å®éã«èª€è§£ããããšã¯äžå¯èœã§ãã :-)
https://www.google.com/search?q=define+tryã¯ããäœããããããšããããåªåããããšãè£å€ãåããããšèšã£ãŠããŸãã ãããã¯äž¡æ¹ãšããfïŒ= tryïŒos.OpenïŒfileïŒïŒãã«é©çšãããŸãã os.Openãå®è¡ããããšãïŒãŸãã¯ããšã©ãŒçµæãè©Šè¡ããŸãïŒãè©Šè¡ïŒãŸãã¯ãšã©ãŒçµæïŒã倱æããå Žåã¯ãé¢æ°ããæ»ããŸãã
æšå¹Ž8æã«ãã§ãã¯ã䜿çšããŸããã ãããããèšèã§ããã C ++ / Java / Pythonã®æŽå²çãªæè·ç©ã«ããããããããã®ææ¡ã§ã®tryã®çŸåšã®æå³ã¯ã Swiftã®tryïŒåšå²ã®do-catchãªãïŒããã³Rustã®å ã®tryã®æå³ãšäžèŽãããããtryã«åãæ¿ããŸããã ã çµå±ãå°åæãæ£ããèšèã§ãããšåŸã§å€æããŠãã²ã©ãããšã§ã¯ãããŸããããä»ã®ãšãããåå以å€ã®ãã®ã«çŠç¹ãåœãŠãå¿ èŠããããŸãã
ããã¯ã github.com/josharian/pct
ããã®èå³æ·±ãtryhard
ã®åœé°æ§ã§ãã ç§ã¯ããã§ããã«ã€ããŠèšåããŸãïŒ
try
æ€åºãé£ããæ¹æ³ã瀺ããŠããŸãif err != nil
ã®èŠèŠçãªã³ã¹ããã人ã
ïŒå°ãªããšãç§ïŒãã³ãŒããæ§é åããæ¹æ³ã«åœ±é¿ãäžãã try
ããããæ¯æŽã§ããããšã瀺ããŠããŸããåïŒ
var err error
switch {
case *flagCumulative:
_, err = fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s)
case *flagQuiet:
_, err = fmt.Fprintln(w, line.s)
default:
_, err = fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s)
}
if err != nil {
return err
}
åŸïŒæåæžãæãïŒïŒ
switch {
case *flagCumulative:
try(fmt.Fprintf(w, "% 6.2f%% % 6.2f%%% 6d %s\n", p, f*float64(runtot), line.n, line.s))
case *flagQuiet:
try(fmt.Fprintln(w, line.s))
default:
try(fmt.Fprintf(w, "% 6.2f%%% 6d %s\n", p, line.n, line.s))
}
å€æŽhttps://golang.org/cl/182717ã¯ãã®åé¡ã«èšåããŠããŸãïŒ src: apply tryhard -r $GOROOT/src
stdã©ã€ãã©ãªã®try
ã®èŠèŠçãªã¢ã€ãã¢ã«ã€ããŠã¯ã CL182717ã«ã¢ã¯ã»ã¹ããŠãã ããã
ããããšãã @ josharian ããããã ã¯ããåªããããŒã«ã§ããã try
ã®ãã¹ãŠã®å¯èœãªäœ¿çšåè£ãæ€åºããããšã¯äžå¯èœãããããŸããã ããã幞ããªããšã«ãããã¯ïŒãã®ææ¡ã®ïŒäž»èŠãªç®æšã§ã¯ãããŸããã ããŒã«ããããšäŸ¿å©ã§ããããŸã èšè¿°ãããŠããªãã³ãŒãã§try
ã®äž»ãªå©ç¹ãããããŸãïŒãã§ã«æã£ãŠããã³ãŒããããã¯ããã«å€ãã®ããŒã«ãããããïŒã
ãbreakãã¯ããã°ã©ã ãå£ããŸããã
ãcontinueãã¯ãéåžžã®ããã«æ¬¡ã®ã¹ããŒãã¡ã³ãã§å®è¡ãç¶ç¶ããŸããã
ãgotoã...ãŸãgotoã¯å®éã«èª€è§£ããããšã¯äžå¯èœã§ãã :-)
break
ã¯ã«ãŒããå£ããŸãã continue
ã¯ã«ãŒããç¶è¡ãã goto
ã¯æå®ãããå®å
ã«ç§»åããŸãã æçµçã«ã¯èãããŸãããé¢æ°ãã»ãŒå®äºããŠãšã©ãŒãè¿ããããããŒã«ããã¯ããªãå Žåã«ã©ããªãããèããŠã¿ãŠãã ããã ããã¯è©Šç·Ž/è£å€ã§ã¯ãããŸããã§ããã ãã®ç¹ã§ã¯check
ã®æ¹ãã¯ããã«åªããŠãããšæããŸãïŒã審æ»ããéããŠãé²è¡ãæ¢ãããããšã¯ç¢ºãã«é©åã§ãïŒã
ãã£ãšé©åãªã®ã¯ãä»ã®æ§æãšã¯å¯Ÿç
§çã«ãç§ãæäŸããtry / checkã®åœ¢åŒã«èå³ããããŸãã
try {error} {optional wrap func} {optional return args in brackets}
f, err := os.Open(file)
try err wrap { a, b }
æšæºã©ã€ãã©ãªã¯ãä»ã®ããã±ãŒãžã®èª¿æŽãæ¥ç¶ã«å€ãã®æéãè²»ãããªããšããç¹ã§ããå®éã®ãGoã³ãŒããè¡šããŠããªãããšã«ãªããŸãã äŸåé¢ä¿ã®é£ç©é£éã®ããã«äžæµã«ããããã±ãŒãžãšæ¯èŒããŠãæšæºã©ã€ãã©ãªã§ãã£ãã«ã®äœ¿çšãéåžžã«å°ãªãçç±ãšããŠãéå»ã«ããã«æ°ã¥ããŸããã ãšã©ãŒåŠçãšäŒæã¯ããã®ç¹ã§ãã£ãã«ã«äŒŒãŠãããšæããŸããäžã«è¡ãã»ã©ãããå€ãã®ããšãããããŸãã
ãã®ããã誰ããããã€ãã®ãã倧ããªã¢ããªã±ãŒã·ã§ã³ã³ãŒãããŒã¹ã§tryhardãå®è¡ãããã®ã³ã³ããã¹ãã§ã©ã®ãããªæ¥œããããšãçºèŠã§ãããã確èªããããšã¯èå³æ·±ãã§ãããã ïŒæšæºã©ã€ãã©ãªãèå³æ·±ããã®ã§ãããäžçã®æ£ç¢ºãªãµã³ããªã³ã°ãšããããã¯å°å®å®ã®ãããªãã®ã§ããïŒ
ä»ã®æ§æãšã¯å¯Ÿç §çã«ãç§ãæäŸããtry / checkã®åœ¢åŒã«èå³ããããŸãã
ãã©ãŒã ã¯ãæ¢åã®å¶åŸ¡æ§é ãåäœæããããšã«ãªããšæããŸãã
@ networkimprovãre https://github.com/golang/go/issues/32437#issuecomment -502879351
ç§ã¯æ£çŽã«èšã£ãŠãGoããŒã ãæåã«ãã§ãã¯/åŠçïŒæ åçã«ã¯æ¬æ°ãªã¢ã€ãã¢ïŒãæäŸãã次ã«äžè æäžã®tryïŒïŒãæäŸããŠãããŸããã ãªãRFPåãšã©ãŒåŠçãçºè¡ããªãã£ãã®ãããããŸããããã®åŸãçµæãšããŠåŸãããææ¡ã®ããã€ãã«ã€ããŠã³ãã¥ããã£ã®ã³ã¡ã³ããåéããŸãïŒïŒ29860ãåç §ïŒã ããã«ã¯ã掻çšã§ããå€ãã®ç¥æµããããŸãã
ïŒ29860ã§èª¬æããããã«ãã³ãã¥ããã£ããã®ãã£ãŒãããã¯ãæ±ããéããããªããææ¡ããŠããããšãšå®éã«è¡ã£ãããšãšã®éã«å€§ããªéãã¯ãããŸããã ãã©ãããã¶ã€ã³ããŒãžã«ã¯ããå®éã®ææ¡ã«å€æããã®ã«ååãªãã¶ã€ã³ãäœæãããšããæçµçãªç®æšãæã£ããè°è«ã®åºçºç¹ããšæèšãããŠããŸãã ãããŠã人ã ã¯çããã£ãŒãããã¯ããå®å šãªä»£æ¿æ¡ã«è³ããŸã§å€ãã®ããšãæžããŸããã ãããŠããã®ã»ãšãã©ã¯åœ¹ã«ç«ã¡ãŸããããããŠç§ã¯ç¹ã«çµç¹åãšèŠçŽã«ãããŠããªãã®å©ãã«æè¬ããŸãã ããªãã¯ãããå¥ã®ååãšåŒãã ããå®å䞻矩ã®è¿œå ã®å±€ãå°å ¥ãããããããšã«åºå·ããŠããããã§ããããã®åé¡ã«ã€ããŠè°è«ããããã«ãç§ãã¡ã¯å®éã«ã¯å¿ èŠæ§ãæããŠããŸããã
ããããç§ãã¡ãã©ããããããã³ãã¥ããã£ã®ã¢ããã€ã¹ãæ±ãããç¡èŠãããããªãã£ããšäž»åŒµããªãã§ãã ããã ããã¯åã«çå®ã§ã¯ãããŸããã
ç§ã¯ãŸãããããäœãæå³ããã«ãããè©Šè¡ãã©ã®ããã«ãäžå çãã§ããããèŠãããšãã§ããŸããã
åæããŸããããããç§ã®ç®æšã ã£ããšæããŸãã ãã£ãšè€éãªã¡ã«ããºã ã¯äŸ¡å€ããªããšæããŸãã ããç§ãããªãã®ç«å Žã«ãã£ããšããããç§ãæäŸããã®ã¯ãèŠæ ã®å€§éšåãæ²é»ãããããã®å°ãã®ç³è¡£æ§æã§ããããã以äžã§ã¯ãããŸããã
@rsc ããããã¯ããå€ããããšããè©«ã³ããŸãïŒ
https://github.com/golang/go/issues/32437#issuecomment-502840914ã§ããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒãäœæããŸãã
https://github.com/golang/go/issues/32437#issuecomment-502879351ã§èª¬æã®ãªã¯ãšã¹ãã«å¿çããŸãã
ããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒã¯ãäºå®äžãã¹ãŠã®äººãåŸããåãããšãã§ããæ©èœã ãšæããŸãã
try {} catch {}æ§æã䜿çšããŠãã ããããã以äžããã€ãŒã«ãäœæããªãã§ãã ãã
try {} catch {}æ§æã䜿çšããŠãã ããããã以äžããã€ãŒã«ãäœæããªãã§ãã ãã
ä»ã®äººã䜿ããã€ãŒã«ãæ£æ¹åœ¢ã®åœ¢ãããŠãããšãã¯ããã£ãšè¯ããã€ãŒã«ãäœãã®ãé©åã ãšæããŸã
@jimwei
äŸå€ããŒã¹ã®ãšã©ãŒåŠçã¯æ¢åã®ãã€ãŒã«ã§ããå¯èœæ§ããããŸãããããªãã®æ°ã®æ¢ç¥ã®åé¡ããããŸãã å ã®ãã©ããèšèšã®åé¡ã¹ããŒãã¡ã³ãã¯ããããã®åé¡ã®æŠèŠã説æããã®ã«æé©ã§ãã
ç§èªèº«ã®ããŸãããèããããŠããªã解説ãè¿œå ããããã«ãå€ãã®éåžžã«æåããæ°ããèšèªïŒã€ãŸããSwiftãRustãããã³GoïŒãäŸå€ãæ¡çšããŠããªãããšã¯èå³æ·±ããšæããŸãã ããã¯ãç§ãã¡ãäœå¹Žã«ãããã£ãŠååããªããã°ãªããªãã£ãåŸãããåºããœãããŠã§ã¢ã³ãã¥ããã£ãäŸå€ãåèããŠããããšãç§ã«æããŠãããŸãã
https://github.com/golang/go/issues/32437#issuecomment -502837008ãžã®å¿çïŒã¹ããŒãã¡ã³ããšããŠã®try
ã«é¢ãã@rscã®ã³ã¡ã³ãïŒ
ããªãã¯è¯ãç¹ãäžããŸãã ãããäœæããåã«ãã©ãããããããã®ã³ã¡ã³ããèŠéããŠããŸã£ãããšããè©«ã³ããŸãïŒ https ïŒ//github.com/golang/go/issues/32437#issuecomment -502871889
åŒãšããŠtry
ã䜿çšããäŸã¯ãã¹ããŒãã¡ã³ããšããŠtry
ã䜿çšããäŸãããã¯ããã«èŠæ ããããŸãã ã¹ããŒãã¡ã³ããtry
ã§å§ãŸããšããäºå®ã¯ãå®éãèªã¿ã«ããããŸãã ãã ããåŒãšããŠã®try
ã¯ãç§ã®ç®ã«ã¯ãã®åäœãå®éã«_奚å±_ããããã人ã
ãäžç·ã«åŒã³åºããè©Šã¿ãŠæªãã³ãŒããäœæããããšããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã
golint
ããã¹ããããtry
åŒã³åºããçŠæ¢ããŠããå Žåã¯ããã®ææ¡ã«ããå°ãæè¬ãããšæããŸãã ä»ã®åŒã®äžã§ãã¹ãŠã®try
åŒã³åºããçŠæ¢ããããšã¯å°ãå³ãããããšæããŸããåŒãšããŠtry
ã䜿çšããããšã«ã¯ãã¡ãªããããããŸãã
ããªãã®äŸãåãããšã2ã€ã®tryåŒã³åºããäžç·ã«ãã¹ãããã ãã§ãéåžžã«æãããããã«èŠããŸããç¹ã«ãã³ãŒãã¬ãã¥ãŒã¢ãªãã§åäœããå Žåã¯ãGoããã°ã©ããŒããããå®è¡ããŠããããšãããããŸãã
parentCommitOne := try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit()
parentCommitTwo := try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()
tree := try(r.LookupTree(try(index.WriteTree())))
å
ã®äŸã¯å®éã«ã¯éåžžã«èŠæ ããããŸããããããã¯ãtryåŒããã¹ããããšïŒæ·±ãã2ã€ãããªãå Žåã§ãïŒãã³ãŒãã®å¯èªæ§ã倧å¹
ã«äœäžããããšã瀺ããŠããŸãã ãã¹ããããtry
åŒã³åºããæåŠãããšãããããã°å¯èœæ§ãã®åé¡ã«ã圹ç«ã¡ãŸããããã¯ãåŒã®å€åŽã«ããå Žåã try
ãif
ã«å±éããæ¹ãã¯ããã«ç°¡åã ããã§ãã
ç¹°ãè¿ãã«ãªããŸãããéšååŒå
ã®try
ã«ã¯golint
ã®ãã©ã°ãä»ããå¿
èŠããããŸãããããã¯å°ãå³ãããããããããŸããã ãŸãããã®ãããªã³ãŒãã«ãã©ã°ãç«ãŠãŸããããã¯ç§ã®ç®ã«ã¯åé¡ãããŸããã
x := 5 + try(strconv.Atoi(input))
ãã®ããã«ããŠãåŒãšããŠtry
ã䜿çšããããšã®äž¡æ¹ã®å©ç¹ãåŸãããŸããã暪軞ã«é床ã®è€éããè¿œå ããããšã¯ä¿é²ããŠããŸããã
ããããå¥ã®è§£æ±ºçã¯ã golint
ãã¹ããŒãã¡ã³ãããšã«æ倧1 try
ããèš±å¯ããªããšããããšã§ãããé
ããªããç²ããŠããŸããããåççã«èããå¿
èŠããããŸãã ãããã«ãããç§ã¯ããæç¹ã§ãã®ææ¡ã«ããªãåŠå®çã§ããããããã«é¢é£ããããã€ãã®golint
åºæºãããã°ãå®éã«ãããæ¬åœã«å¥œãã«ãªãããšãã§ãããšæããŸãã
@rsc
_ããã®æ©èœã¯éåžžã«èªã¿ãããã³ãŒããæžãããã«äœ¿çšã§ããŸãããèªããªãã³ãŒããæžãããã«æªçšãããå¯èœæ§ããããŸãã_ãšããã®æ©èœã®äž»ãªçšéã¯èªããªãã³ãŒããæžãããšã§ãããåºå¥ã§ããŸãã
Cã®çµéšã¯ããã瀺åããŠããŸããïŒ ïŒ2çªç®ã®ã«ããŽãªã«çŽæ¥åé¡ãããŸãã ïŒæå°å€ãšæ倧å€ãé€ããŠã
try()
ã«ã€ããŠæåã«ç§ãé©ãããã®ã¯ãã¹ããŒãã¡ã³ããšããŠã®try
ã«å¯ŸããŠãäžé
æŒç®åãšã®ãã¹ãå¯èœæ§ãã©ãã»ã©äŒŒãŠããããããã§ãtry()
ãšäžé
ã«å¯ŸããåŒæ°ãã©ãã»ã©å察ããšããããšã§ããã _ïŒèšãæãïŒïŒ_
try():
_ "ãã¹ãããããšã¯ã§ããŸãããã»ãšãã©ã®äººãåªããã³ãŒããæžãããã®ã§ãå€ãã®äººãããããããšã¯ãªããšæããŸã" _ãæ¬æãè¡šããŠã2ã€ã®éãã®åçæ§ã¯éåžžã«äž»èŠ³çã§ãããšæããŸããå çãæ±ããå°ãªããšãã奜ããªæ©èœãšå«ããªæ©èœã®éããåçåã§ãããã©ãããæ€èšããŸããïŒ #please_dont_shoot_the_messenger
_ "ïŒã䜿çšããŠããã³ãŒããèŠãããšããããã©ããã¯ããããŸããã代ããã«ifã¹ããŒãã¡ã³ãã䜿çšããããã«æžãçŽããŠãæ¹åãããŸããã§ããããããããã®æ®µèœã¯è©±é¡ããå€ããŠããŸããïŒ" _
ä»ã®èšèªã§ã¯ãã¹ããŒãã¡ã³ããif
ããäžé
æŒç®åã«æžãçŽãããšã§ã¹ããŒãã¡ã³ããé »ç¹ã«æ¹åããŸããããšãã°ãä»æ¥PHPã§æžããã³ãŒãããã§ãã
return isset( $_COOKIE[ CookieNames::CART_ID ] )
? intval( $_COOKIE[ CookieNames::CART_ID ] )
: null;
æ¯èŒå¯Ÿè±¡ïŒ
if ( isset( $_COOKIE[ CookieNames::CART_ID ] ) ) {
return intval( $_COOKIE[ CookieNames::CART_ID ] );
} else {
return null;
}
ç§ã«é¢ããéããåè ã¯åŸè ãããã¯ããã«æ¹åãããŠããŸãã
ãã®ææ¡ã«å¯Ÿããæ¹å€ã¯ã以åã®ææ¡ã«ãã£ãŠæèµ·ãããé«ãæåŸ ã«ãããã®ã ãšæããŸãã以åã®ææ¡ã¯ãã¯ããã«å æ¬çã ã£ãã§ãããã ããããäžè²«æ§ã®çç±ããããã®ãããªé«ãæåŸ ã¯æ£åœåããããšæããŸãã å€ãã®äººãèŠããã£ãã®ã¯ããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã§åœ¹ç«ã€ãšã©ãŒåŠçã®ããã®åäžã®å æ¬çãªæ§é ã ãšæããŸãã
ããšãã°ããã®æ©èœãçµã¿èŸŒã¿ã®append()
é¢æ°ãšæ¯èŒããŠãã ããã ã¹ã©ã€ã¹ãžã®è¿œå ã¯éåžžã«äžè¬çãªãŠãŒã¹ã±ãŒã¹ã§ãããæåã§è¡ãããšã¯å¯èœã§ããããééã£ãŠè¡ãããšãç°¡åã ã£ããããè¿œå ãäœæãããŸããã append()
ã§ã¯ã1ã€ã ãã§ãªããå€ãã®èŠçŽ ããŸãã¯ã¹ã©ã€ã¹å
šäœãè¿œå ã§ããŸãããŸãã[]ãã€ãã¹ã©ã€ã¹ã«æååãè¿œå ããããšãã§ããŸãã ã¹ã©ã€ã¹ã«è¿œå ãããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããã®ã«åå匷åã§ãã ãããã£ãŠãã¹ã©ã€ã¹ãæåã§è¿œå ãã人ã¯ããããŸããã
ãã ãã try()
ã¯ç°ãªããŸãã ååã«åŒ·åã§ã¯ãªãããããšã©ãŒåŠçã®ãã¹ãŠã®å Žåã«äœ¿çšã§ããŸãã ãããŠãããããã®ææ¡ã®æãæ·±å»ãªæ¬ é¥ã ãšæããŸãã try()
çµã¿èŸŒã¿é¢æ°ã¯ããã€ã©ãŒãã¬ãŒããæžãããšããæå³ã§ã®ã¿æ¬åœã«åœ¹ç«ã¡ãŸããæãåçŽãªã±ãŒã¹ã§ã¯ãã€ãŸããåŒã³åºãå
ã«ãšã©ãŒãæž¡ãã ãã§ããã¹ãŠã®ãšã©ãŒãçºçããå Žåã¯deferã¹ããŒãã¡ã³ãã䜿çšããŸããé¢æ°ãåãããã«æ±ãå¿
èŠããããŸãã
ããè€éãªãšã©ãŒåŠçã«ã€ããŠã¯ã if err != nil {}
ã䜿çšããå¿
èŠããããŸãã ããã«ããã以åã¯1ã€ãããªãã£ãããšã©ãŒåŠçã®2ã€ã®ç°ãªãã¹ã¿ã€ã«ãçºçããŸãã ãã®ææ¡ãGoã§ã®ãšã©ãŒåŠçã«åœ¹ç«ã€ãã¹ãŠã§ããå Žåãå°ãªããšãããã¯äžè²«ããŠãããããäœãããã«ããã€ãã®ããã«if
ã§ãšã©ãŒåŠçãåŠçãç¶ããæ¹ããããšæããŸãã ããããè¡ãæ¹æ³ã¯1ã€ãããªãããšããå©ç¹ããããŸããã
@rsc ããããã¯ããå€ããããšããè©«ã³ããŸãïŒ
ïŒ32437ã§ããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒãäžããŸããïŒã³ã¡ã³ãïŒ
ïŒ32437ïŒã³ã¡ã³ãïŒã§èª¬æã®ãªã¯ãšã¹ãã«å¿çããŸããããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒã¯ãäºå®äžãã¹ãŠã®äººãåŸããåãããšãã§ããæ©èœã ãšæããŸãã
ããã±ãŒãžã®æŠå¿µãšç¹å®ã®ãšã©ãŒåŠçãçµã³ä»ãããã®ãããããŸããã ããšãã°ã net/http
ã«åœ¹ç«ã€ããã±ãŒãžã¬ãã«ã®ãã³ãã©ãŒã®æŠå¿µãæ³åããã®ã¯é£ããã§ãã åæ§ã«ãäžè¬çã«net/http
ãããå°ããããã±ãŒãžãäœæããŠããã«ããããããããšã©ãŒåŠçãè¡ãããã«ããã±ãŒãžã¬ãã«ã®æ§æãåªå
ããåäžã®ãŠãŒã¹ã±ãŒã¹ã¯èããããŸããã äžè¬çã«ã誰ããèªåã®çµéšããŠãŒã¹ã±ãŒã¹ãæèŠãå
±æãããšããä»®å®ã¯å±éºãªãã®ã§ããããšãããããŸãã:)
@beoranãã®ææ¡ã¯ãããªãæ¹åãå¯èœã«ãããšä¿¡ããŠããŸãã try(..., func(err) error)
ã®æåŸã®åŒæ°ã®ãã³ã¬ãŒã¿ããŸãã¯tryf(..., "context of my error: %w")
ã®ããã«ïŒ
@flibustenetãã®ãããªåŸã®æ¡åŒµã¯å¯èœãããããŸããããçŸåšã®ææ¡ã¯ãã®ãããªæ¡åŒµãæããšã©ãŸãããããã§ããããã¯äž»ã«ããšã©ãŒãã³ãã©ãŒã®è¿œå ãdeferã§åé·ã«ãªãããã§ãã
é£ããåé¡ã¯ãdefeã®æ©èœãè€è£œããã«å æ¬çãªãšã©ãŒåŠçãè¡ãæ¹æ³ã ãšæããŸãã ãããããdeferã¹ããŒãã¡ã³ãèªäœãäœããã®åœ¢ã§æ¡åŒµãããããè€éãªã±ãŒã¹ã§ãšã©ãŒåŠçã容æã«ãªãå¯èœæ§ããããŸã...ããããããã¯å¥ã®åé¡ã§ãã
https://github.com/golang/go/issues/32437#issuecomment -502975437
ããã«ããã以åã¯1ã€ãããªãã£ãããšã©ãŒåŠçã®2ã€ã®ç°ãªãã¹ã¿ã€ã«ãçºçããŸãã ãã®ææ¡ãGoã§ã®ãšã©ãŒåŠçãæ¯æŽãããã¹ãŠã§ããå Žåãå°ãªããšãããã¯äžè²«ããŠãããããäœãããã«ããã€ãã®ããã«
if
ã§ãšã©ãŒåŠçãåŠçãç¶ããæ¹ããããšæããŸãã ããããè¡ãæ¹æ³ã¯1ã€ãããªãããšããå©ç¹ããããŸããã
@beoranåæããŸããã ãããããšã©ãŒã±ãŒã¹ã®å€§éšåãtry
ããŒã¯ãŒãïŒ try
ããã³try
/ else
ïŒã§çµ±åããããšãææ¡ããçç±ã§ãã try
/ else
æ§æã§ã¯ãæ¢åã®if err != nil
ã¹ã¿ã€ã«ãšæ¯èŒããŠã³ãŒãé·ã倧å¹
ã«ççž®ããããšã¯ã§ããŸãããã try
ãšã®äžè²«æ§ãä¿ã€ããšãã§ããŸãã else
ãªãïŒã®å Žåã ãããã®2ã€ã®ã±ãŒã¹ïŒtryãštry-elseïŒã¯ããšã©ãŒåŠçã®ã±ãŒã¹ã®å€§éšåãã«ããŒããå¯èœæ§ããããŸãã ããã¯ãçµã¿èŸŒã¿ã®no-elseããŒãžã§ã³ã®try
ãšã¯å察ã«ãããã°ã©ããŒããšã©ãŒãåŠçããããã«å®éã«äœãããŠããªãå Žåã«ã®ã¿é©çšãããŸãïŒä»ã®äººããã®ã¹ã¬ããã§èšåããŠããããã«ãããããç§ãã¡ãæ¬åœã«å¥šå±ããããã®ã§ããå¿
èŠã¯ãããŸããïŒã
äžè²«æ§ã¯èªã¿ãããã«ãšã£ãŠéèŠã§ãã
append
ã¯ãã¹ã©ã€ã¹ã«èŠçŽ ãè¿œå ããããã®æãä¿¡é Œã®ãããæ¹æ³ã§ãã make
ã¯ãæ°ãããã£ãã«ããããããŸãã¯ã¹ã©ã€ã¹ãæ§ç¯ããããã®æãä¿¡é Œã®ãããæ¹æ³ã§ãïŒãªãã©ã«ãé€ããŠãç§ã¯ããããããŠããŸããïŒã ãããã try()
ïŒçµã¿èŸŒã¿ã§ã else
ãªãïŒã¯ãããã°ã©ããŒãç¹å®ã®ãšã©ãŒãåŠçããæ¹æ³ã«å¿ããŠãã³ãŒãããŒã¹å
šäœã«æ£ãã°ã£ãŠããŸããèªè
ã ããã¯ä»ã®ãã«ãã€ã³ã®ç²Ÿç¥ã§ã¯ãªãããã§ãïŒã€ãŸããä»ã®æ¹æ³ã§ã¯éåžžã«é£ãããããŸã£ããäžå¯èœãªã±ãŒã¹ãåŠçããŸãïŒã ãããæåããtry
ã®ããŒãžã§ã³ã§ããå Žåãããã/ã¹ã©ã€ã¹ãªãã©ã«ãåé¿ããããšããã®ãšåãããã«ïŒãããŠãã¹ãã®ããã«new
ãåé¿ããããã«ïŒãäžè²«æ§ãšå¯èªæ§ã«ãã䜿çšããªãããã«åŒ·å¶ãããŸãã
ãšã©ãŒã®åŠçæ¹æ³ãå€æŽãããšããèãã®å Žåã¯ãããããããããåããããã®ãŸãŸã«ããããã®ãè¿œå ããã®ã§ã¯ãªããã§ããã ãå€ãã®ã±ãŒã¹ã§ã¢ãããŒããçµ±äžããããšãè©Šã¿ãã®ãè³¢æãªããã§ãã åŸè ã¯å®éã«ãã€ãºãæžããã®ã§ã¯ãªãè¿œå ããã®ã§ã¯ãªãããšå¿é ããŠããŸãã
@deanveloperã¯æžããïŒ
golintããã¹ããããtryåŒã³åºããçŠæ¢ããŠããå Žåã¯ããã®ææ¡ãããå°ãããã ããã°å¹žãã§ãã
æ·±ããã¹ããããtry
ã¯èªã¿ã«ããå¯èœæ§ãããããšã«åæããŸãã ãã ããããã¯ã try
çµã¿èŸŒã¿é¢æ°ã ãã§ãªããæšæºã®é¢æ°åŒã³åºãã«ãåœãŠã¯ãŸããŸãã ãããã£ãŠã golint
ããããçŠæ¢ããçç±ãããããŸããã
@brynbellomyã¯æžããïŒ
try / elseæ§æã§ã¯ãæ¢åã®if errïŒ= nilã¹ã¿ã€ã«ãšæ¯èŒããŠã³ãŒãé·ãå€§å¹ ã«ççž®ãããããšã¯ãããŸããããtryïŒno elseïŒã®å Žåãšã®äžè²«æ§ãåŸãããŸãã
try
çµã¿èŸŒã¿é¢æ°ã®ç¬èªã®ç®æšã¯å®åæãæžããããšã§ãããã®ãããã倧å¹
ãªåæžãè¡ãããªãããšãèªãããšãã«ãææ¡ããtry / elseæ§æãæ¡çšããå¿
èŠãããçç±ãç解ããã®ã¯å°é£ã§ããã³ãŒãé·ã§ãã
ãŸããææ¡ããæ§æã«ãã£ãŠãtryã±ãŒã¹ãtry / elseã±ãŒã¹ãšäžèŽããããã«ãªãããšã«ãèšåããŸããã ãã ãããã§ã«if / elseãããå Žåã¯ãäžè²«æ§ã®ãªãåå²æ¹æ³ãäœæãããŸãã ç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯å°ãäžè²«æ§ããããŸãããæ®ãã®éšåã§ã¯å€ãã®äžè²«æ§ã倱ãããŸãã
ãã®äŸ¡å€ã«ã€ããŠæèŠãè¿°ã¹ãå¿ èŠããããšæããŠããŸãã ããããã¹ãŠãæ¬è³ªçã«åŠè¡çããã³æè¡çã§ããããã§ã¯ãããŸããããèšãå¿ èŠããããšæããŸãã
ãã®å€æŽã¯ããšã³ãžãã¢ãªã³ã°ã®ããã«ãšã³ãžãã¢ãªã³ã°ãè¡ãããæ£åœåã®ããã«ãé²æãã䜿çšãããŠããã±ãŒã¹ã®1ã€ã§ãããšæããŸãã Goã§ã®ãšã©ãŒåŠçã¯ç ŽãããŠãããããã®ææ¡ã¯ãç§ãGoã«ã€ããŠæ°ã«å ¥ã£ãŠããå€ãã®èšèšå²åŠã«éåããŠããŸãã
ç©äºãç解ãããããããç°¡åã§ã¯ãªã
ãã®ææ¡ã¯ãæ£ç¢ºããããæ æ°ãæé©åããããšãéžæããŠããŸãã çŠç¹ã¯ãšã©ãŒåŠçã容æã«ããããšã«ããããã®èŠè¿ãã«å€§éã®èªã¿ãããã倱ãããŠããŸãã èªã¿ããããšãããã°å¯èœæ§ãåäžããããããšã©ãŒåŠçã®é¢åãªæ§è³ªã¯èš±å®¹ãããŸãã
æ»ãåŒæ°ã«ååãä»ããããšã¯é¿ããŠãã ãã
defer
ã¹ããŒãã¡ã³ãã«ã¯ãreturnåŒæ°ã®åœåãæå¹ãªãšããžã±ãŒã¹ãããã€ããããŸãã ããã以å€ã§ã¯ãé¿ããå¿
èŠããããŸãã ãã®ææ¡ã¯ãæ»ãåŒæ°ã®åœåã®äœ¿çšãä¿é²ããŸãã ããã¯ãGoã³ãŒããèªã¿ãããããã®ã«åœ¹ç«ã¡ãŸããã
ã«ãã»ã«åã¯ã絶察çã«æ£ç¢ºãªæ°ããã»ãã³ãã£ã¯ã¹ãäœæããå¿
èŠããããŸã
ãã®æ°ããæ§æã«ã¯ç²ŸåºŠããããŸããã ãšã©ãŒå€æ°ãšæ»ãå€ãé衚瀺ã«ããŠããç解ãããããªããŸããã å®éãæ§æã¯ãä»æ¥ã®Goã§è¡ãããšãšã¯éåžžã«ç°è³ªãªæããããŸãã 誰ããåæ§ã®é¢æ°ãæžããå Žåãã³ãã¥ããã£ã¯ãæœè±¡åãã³ã¹ããé ããæäŸããããšããŠããåçŽãã®äŸ¡å€ããªãããšã«åæãããšæããŸãã
ç§ãã¡ã¯èª°ãå©ããããšããŠããŸããïŒ
ãã®å€æŽã¯ããšã³ã¿ãŒãã©ã€ãºéçºè
ãçŸåšã®èšèªããGoã«èªå°ããããã«å®æœãããŠããã®ã§ã¯ãªãããšå¿é
ããŠããŸãã æ°ãå¢ããããã ãã«èšèªã®å€æŽãå®è£
ããããšã¯ãæªãåäŸãèšå®ããŸãã ãã®è³ªåãããŠã解決ããããšããŠããããžãã¹äžã®åé¡ãšãéæããããšããŠããæåŸ
åçã«å¯ŸããçããåŸãã®ã¯å
¬æ£ã ãšæããŸããïŒ
ç§ã¯ãããæ°ååã«èŠãããšããããŸãã èšèªããŒã ããã®æè¿ã®ãã¹ãŠã®æŽ»åã«ããããã®ææ¡ã¯åºæ¬çã«ç³ã«èšå®ãããŠããããšã¯éåžžã«æçœãªããã§ãã å®è£ èªäœã«ã€ããŠã®å®éã®è°è«ããããå®è£ ã®æè·ããããŸãã ããã¯ãã¹ãŠ13æ¥åã«å§ãŸããŸããã ãã®å€æŽãGoã®èšèªãã³ãã¥ããã£ãå°æ¥ã«äžãã圱é¿ã確èªããŸãã
Goã§ã®ãšã©ãŒåŠçã¯ç ŽãããŠãããããã®ææ¡ã¯ãç§ãGoã«ã€ããŠæ°ã«å ¥ã£ãŠããå€ãã®èšèšå²åŠã«éåããŠããŸãã
ãã«ã¯ç§ã®èããå®ç§ã«è¡šçŸããŠããŸãã
try
ã®å°å
¥ãæ¢ããããšã¯ã§ããŸãããããããããªããç§ã¯ãããèªåã§äœ¿çšããããšã¯ãããŸããã ç§ã¯ãããæããŸããããããŠç§ãã¬ãã¥ãŒããPRã§ãããåãå
¥ããŸããã ããã¯åã«ä»ã®ãç§ã決ããŠäœ¿çšããªãGoã®ç©ãã®ãªã¹ãã«è¿œå ãããŸãïŒãããã®è©³çŽ°ã«ã€ããŠã¯ãYouTubeã§ã®Mat Ryerã®é¢çœã話ãåç
§ããŠãã ããïŒã
@ ardan-bkennedyãã³ã¡ã³ãããããšãããããŸãã
ããªãã¯ã解決ããããšããŠããããžãã¹äžã®åé¡ãã«ã€ããŠå°ããŸããã ãããã°ã©ãã³ã°ã«è¡ãã以å€ã®ç¹å®ã®ããžãã¹ã®åé¡ãã¿ãŒã²ããã«ããŠãããšã¯æããŸããã ããããããäžè¬çã«ã¯ãæšå¹Ž8æã«è§£æ±ºããããšããŠããåé¡ãGopherconèšèšãã©ãããã£ã¹ã«ãã·ã§ã³ããã¯ãªãã§æ確ã«ããŸããïŒåé¡ã®æŠèŠãç¹ã«ç®æšã®ã»ã¯ã·ã§ã³ãåç §ïŒã ãã®äŒè©±ãæšå¹Ž8æããç¶ããŠãããšããäºå®ãããããã¯ãã¹ãŠ13æ¥åã«å§ãŸã£ãããšããããªãã®äž»åŒµãšå®å šã«ççŸããŠããŸãã
ãããåé¡ã§ã¯ãªãããŸãã¯è§£æ±ºãã䟡å€ã®ããåé¡ã§ã¯ãªãããšã瀺åããã®ã¯ããªãã ãã§ã¯ãããŸããã ä»ã®ãã®ãããªã³ã¡ã³ãã«ã€ããŠã¯ã httpsïŒ//swtch.com/try.html#nonissueãåç §ããŠãã ããã ç§ãã¡ã¯ãããã«æ³šæããå®éã®åé¡ã解決ããŠããããšã確èªããããšæããŸãã èŠã€ããæ¹æ³ã®äžéšã¯ãå®éã®ã³ãŒãããŒã¹ã§ææ¡ãè©äŸ¡ããããšã§ãã Robertã®tryhardã®ãããªããŒã«ã¯ããããè¡ãã®ã«åœ¹ç«ã¡ãŸãã ç§ã¯ä»¥åã人ã ã«åœŒãã圌ãèªèº«ã®ã³ãŒãããŒã¹ã§èŠã€ãããã®ãç§ãã¡ã«ç¥ãããŠãããããã«é Œã¿ãŸããã ãã®æ å ±ã¯ãå€æŽã䟡å€ããããã©ãããè©äŸ¡ããããã«éåžžã«éèŠã«ãªããŸãã ããªãã«ã¯1ã€ã®æšæž¬ããããç§ã«ã¯å¥ã®æšæž¬ããããŸãããããã¯åé¡ãããŸããã çãã¯ããããã®æšæž¬ã®ä»£ããã«ããŒã¿ã䜿çšããããšã§ãã
å®éã®åé¡ã確å®ã«è§£æ±ºããããã«å¿ èŠãªããšãè¡ããŸãã
ç¹°ãè¿ããŸãããåé²ããéã¯å®éšããŒã¿ã§ãããè žã®åå¿ã§ã¯ãããŸããã æ®å¿µãªãããããŒã¿ã®åéã«ã¯ããå€ãã®åŽåãå¿ èŠã§ãã ãã®æç¹ã§ãç§ã¯å€åºããŠããŒã¿ãåéããã®ãæäŒããã人ã ã奚å±ããããšæããŸãã
@ ardan-bkennedyã2åç®ã®ãã©ããŒã¢ããã§ç³ãèš³ãããŸãããã次ã®ç¹ã«ã€ããŠèª¬æããŸãã
ãã®å€æŽã¯ããšã³ã¿ãŒãã©ã€ãºéçºè ãçŸåšã®èšèªããGoã«èªå°ããããã«å®æœãããŠããã®ã§ã¯ãªãããšå¿é ããŠããŸãã æ°ãå¢ããããã ãã«èšèªã®å€æŽãå®è£ ããããšã¯ãæªãåäŸãèšå®ããŸãã
ãã®ç·ã«ã¯ãç§ãéãéããããšãã§ããªã2ã€ã®é倧ãªåé¡ããããŸãã
ãŸããGoã䜿çšããããåé¡ãæ€èšããããã䟡å€ã®ãªãéçºè ã®ã¯ã©ã¹ïŒãã®å Žåã¯ããšã³ã¿ãŒãã©ã€ãºéçºè ãïŒãååšãããšããæé»ã®äž»åŒµãæåŠããŸãã ããšã³ã¿ãŒãã©ã€ãºãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãGoãéåžžã«å¹æçã«äœ¿çšããŠããäžå°äŒæ¥ãšå€§äŒæ¥ã®äž¡æ¹ã®äŸãããããèŠãããŸãã
次ã«ãGoãããžã§ã¯ãã®éå§ä»¥æ¥ãRobertãRobãKenãIanãããã³Iã¯ãå€ãã®ã·ã¹ãã ãæ§ç¯ããçµéšã«åºã¥ããŠãèšèªã®å€æŽãšæ©èœãè©äŸ¡ããŠããŸããã ãããã¯ç§ãã¡ãæžããããã°ã©ã ã§ããŸãããã§ããããïŒããšå°ããŸãã ããã¯å¹ åºãé©çšæ§ãåããæåããã¬ã·ãã§ãããããããã䜿çšãç¶ããã€ããã§ãããããã以åã®ã³ã¡ã³ããšçµéšã¬ããŒãã§ç§ãæ±ããããŒã¿ã«ãã£ãŠããã«äžè¬çã«è£åŒ·ãããŠããŸãã èªåãã¡ã®ããã°ã©ã ã§äœ¿çšããŠããããšãããããªãããŸãã¯Goã«ããŸãé©åããªããšæãããèšèªã®å€æŽãææ¡ãããããµããŒããããããããšã¯ãããŸããã ãããŠãGoããã°ã©ããŒãå¢ããããã ãã«ãæªãå€æŽãææ¡ããããµããŒããããããããšã¯ãããŸããã çµå±ãGoã䜿ã£ãŠããŸãã
@rsc
ãã®äŸ¿å©ããé
眮ã§ããå Žæã«äºæ¬ ããŸããã ãã以å€ã®ã¡ã«ããºã ã®å®äœã蚌æããããã«ãã©ã®ãããªæž¬å®åºæºãæ±ããããŠããŸããïŒ åé¡ããããšã©ãŒåŠçã±ãŒã¹ã®ãªã¹ãã¯ãããŸããïŒ å
¬éããã»ã¹ã®å€ããææ
ã«ãã£ãŠæšé²ãããŠããå ŽåãããŒã¿ããã©ã®ããã«äŸ¡å€ãå°ãåºãããŸããïŒ
ããŒã«tryhard
ã¯éåžžã«æçã§ãïŒ
return ...,err
ãé »ç¹ã«äœ¿çšããŠããããšãããããŸããããã»ãšãã©ã®å Žåhttpãã³ãã©ãŒã§ãšã©ãŒãïŒ pkg/errors
ïŒæ¢ã«ã©ããããŠããé¢æ°ãåŒã³åºãããšãããã£ãŠããå Žåã«éããŸãã ç§ã¯ããå°ãªãã³ãŒãè¡ã§èªã¿ãããã§åã¡ãŸãã
次ã«ããããã®httpãã³ãã©ãŒã«ã defer fmt.HandleErrorf(&err, "handler xyz")
ãè¿œå ããæåŸã«ä»¥åãããå€ãã®ã³ã³ããã¹ããè¿œå ããŸãã
fmt.Printf
ã§ãšã©ãŒããŸã£ããæ°ã«ããªãå Žåãå€ãããã try
åŠçããŸãã
ããšãã°ã defer try(f.Close())
ãå®è¡ããããšã¯å¯èœã§ããïŒ
ãããã£ãŠãããããtry
ã¯ãã³ã³ããã¹ããè¿œå ãããã®éã§ã¯ãªãããã¹ããã©ã¯ãã£ã¹ãæšé²ããã®ã«æçµçã«åœ¹ç«ã€ã§ãããã
ç§ã¯å®éã«ãã¹ãããã®ããšãŠãåŸ ã¡é ããã§ãïŒ
@flibustenetãã®ãŸãŸã®ææ¡ã§ã¯ã defer try(f())
ã¯èš±å¯ãããŸããïŒçè«çæ ¹æ ãåç
§ïŒã ããã«ã¯ãããããªåé¡ããããŸãã
ãã®tryhard
ããŒã«ã䜿çšããŠã³ãŒãããŒã¹ã®å€æŽã確èªããå ŽåãååŸã®if err != nil
ã®æ¯çãæ¯èŒããŠãã³ã³ããã¹ããè¿œå ããã®ãäžè¬çãããšã©ãŒãè¿ãã®ãäžè¬çãã確èªã§ããŸããïŒ
ç§ã®èãã§ã¯ãæ¶ç©ºã®å·šå€§ãªãããžã§ã¯ãã§ã¯ã try()
ãè¿œå ããã1000ã®å ŽæãèŠãããšãã§ããŸãããã³ã³ããã¹ããè¿œå ããif err != nil
ã10000ããã®ã§ã1000ã¯å·šå€§ã«èŠããŸãããå
šäœã®10ïŒ
ã«ãããŸããã ã
@Goodwineã¯ãã ä»é±ã¯ãããããã®å€æŽãè¡ãããšã¯ã§ããŸããããã³ãŒãã¯éåžžã«åçŽã§èªå·±å®çµåã§ãã èªç±ã«è©ŠããŠã¿ãŠïŒãããã¯æå³ããŠããŸããïŒãã¯ããŒã³ãäœæããå¿ èŠã«å¿ããŠèª¿æŽããŠãã ããã
defer try(f())
ã¯åçã§ã¯ãããŸãã
defer func() error {
if err:= f(); err != nil { return err }
return nil
}()
ããïŒifããŒãžã§ã³ïŒã¯çŸåšèš±å¯ãããŠããŸããããïŒ ããã§äŸå€ãäœæããã¹ãã§ã¯ãªãããã§ã-èŠåãçæãããå¯èœæ§ããããŸããïŒ ãããŠãäžèšã®å»¶æã³ãŒããå¿
ãããééã£ãŠãããã©ããã¯æããã§ã¯ãããŸããã close(file)
ãdefer
ã¹ããŒãã¡ã³ãã§å€±æããå Žåã¯ã©ããªããŸããïŒ ãã®ãšã©ãŒãå ±åããå¿
èŠããããŸããïŒ
defer try(f())
defer try(f)
ã«ã€ããŠè©±ããŠããããã«èŠããçè«çæ ¹æ ãèªã¿ãŸããã ã¿ã€ããã¹ãããããŸãããïŒ
go try(f())
ã«ã€ããŠãåæ§ã®è°è«ãããããšãã§ããããã¯æ¬¡ã®ããã«è§£éãããŸãã
go func() error {
if err:= f(); err != nil { return err }
return nil
}()
ããã§try
ã¯äœã®åœ¹ã«ãç«ã¡ãŸããããç¡å®³ã§ãã
@ ardan-bkennedyãæèŠããããšãããããŸãã æ¬æãè¡šããŠãããªãã¯ãã®ææ¡ã®æå³ã誀ã£ãŠäŒããæ ¹æ ã®ãªã䞻匵ãããã€ãè¡ã£ããšæããŸãã
@rscã以åã«åãäžããŠããªãããã€ãã®ç¹ã«ã€ããŠïŒ
ãšã©ãŒåŠçãå£ããŠãããšèšã£ãããšã¯äžåºŠããããŸããã ãã®èšèšã¯ãçŸåšã®åŠçã¯åé¡ãªããšããïŒGoã³ãã¥ããã£ã«ããïŒïŒèŠ³å¯ã«åºã¥ããŠããŸãããå€ãã®å Žåãåé·ã§ããããã¯è°è«ã®äœå°ããããŸããã ãããææ¡ã®å€§åæã§ãã
ç©äºãããç°¡åã«ããããšã§ãããããç解ããããããããšãã§ããŸããããã2ã€ã¯ãçžäºã«æé€ããããçžäºã«æ瀺ãããããããšã¯ãããŸããã äŸãšããŠããã®ã³ãŒãã確èªããããšããå§ãããŸãã try
ã䜿çšãããšãããªãã®éã®å®åæãåé€ããããã®å®åæã¯ã³ãŒãã®ç解å¯èœæ§ã«å®è³ªçã«äœãè¿œå ããŸããã å埩çãªã³ãŒããé€å€ããããšã¯ãã³ãŒãã®å質ãåäžãããããã®æšæºçã§åºãåãå
¥ããããŠããã³ãŒãã£ã³ã°ææ³ã§ãã
ããã®ææ¡ã¯å€ãã®ãã¶ã€ã³å²åŠã«éåããŠãããã«ã€ããŠïŒéèŠãªã®ã¯ãããã¶ã€ã³å²åŠãã«ã€ããŠç¬æçã«ãªããªãããšã§ããããã¯ãå€ãã®å Žåãåªããã¢ã€ãã¢ã®å€±æã§ãïŒããã«ãç§ãã¡ã¯1ã€ã2ã€ã®ããšãç¥ã£ãŠãããšæããŸãïŒ Goã®ãã¶ã€ã³å²åŠïŒã ååä»ããšååãªãã®çµæãã©ã¡ãŒã¿ãŒã®åšãã«ã¯ãïŒããè¯ãçšèªããªãããã«ïŒå€ãã®ãå®æçãªç±æãããããŸãã æèããå€ãããååä»ãçµæãã©ã¡ãŒã¿ã䜿çšããŠã¯ãªããªãããªã©ã®ãã³ãã©ã¯ç¡æå³ã§ãã ãããã¯äžè¬çãªã¬ã€ãã©ã€ã³ãšããŠåœ¹ç«ã€ãããããŸãããã絶察çãªçå®ã§ã¯ãããŸããã ååä»ãçµæãã©ã¡ãŒã¿ã¯æ¬è³ªçã«ãæªãããã®ã§ã¯ãããŸããã é©åãªååã®çµæãã©ã¡ãŒã¿ãŒã¯ãæå³ã®ããæ¹æ³ã§APIã®ããã¥ã¡ã³ãã«è¿œå ã§ããŸãã èŠããã«ãèšèªèšèšã®æ±ºå®ãè¡ãããã«ã¹ããŒã¬ã³ã䜿çšããªãããã«ããŸãããã
ãã®ææ¡ã®ãã€ã³ãã¯ãæ°ããæ§æãå°å ¥ããªãããšã§ãã æ°ããæ©èœãææ¡ããã ãã§ãã ãã®é¢æ°ããã®èšèªã§æžãããšã¯ã§ããªãã®ã§ãGoã§ã¯çµã¿èŸŒã¿ãèªç¶ãªå Žæã§ãã åçŽãªé¢æ°ã§ããã ãã§ãªããéåžžã«æ£ç¢ºã«å®çŸ©ãããŠããŸãã ããå æ¬çãªãœãªã¥ãŒã·ã§ã³ããããã®æå°éã®ã¢ãããŒããéžæããã®ã¯ãããã1ã€ã®ããšãéåžžã«ããŸãå®è¡ããä»»æã®èšèšæ±ºå®ã«ã»ãšãã©äœãæ®ããªãããã§ãã ãŸããä»ã®èšèªïŒRustãªã©ïŒã®æ§æãéåžžã«äŒŒãŠãããããç§ãã¡ã¯å€§ããããšã§ã¯ãããŸããã ãã³ãã¥ããã£ã¯ãæœè±¡åãã³ã¹ããé ããæäŸããããšããŠããåçŽãã®äŸ¡å€ããªãããšã«åæããã ããããšç€ºåããããšã¯ãä»ã®äººã ã®å£ã«èšèãå ¥ããŠããŸãã ãã®ææ¡ã®å察è ã®å£°ã¯ã¯ã£ãããšèãããŸãããå®éšãé²ããããšã«è³æãè¡šæãã人ã®ããªãã®å²åïŒæšå®40ïŒ ïŒãããŸãã èªåŒµã§ãããã®æš©å©ãå¥å¥ªããªãããã«ããŸãããã
ããããšãã
return isset( $_COOKIE[ CookieNames::CART_ID ] )
? intval( $_COOKIE[ CookieNames::CART_ID ] )
: null;
ããã¯return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null;
FWIWã§ããå¿
èŠããããŸãã ð
@bakulåŒæ°ã¯ããã«è©äŸ¡ããããããå®éã«ã¯æ¬¡ãšã»ãŒåçã§ãã
<result list> := f()
defer try(<result list>)
f()
ã¯åŸã§å»¶æããããããã«å®è¡ããããããããã¯äžéšã®äººã«ãšã£ãŠã¯äºæããªãåäœã«ãªãå¯èœæ§ããããŸãã åãããšãgo try(f())
ã«ãåœãŠã¯ãŸããŸãã
@bakulããã¥ã¡ã³ãã«ã¯defer try(f)
ãèšèŒãããŠããŸãïŒ try
ã¯äžè¬ã«é¢æ°åŒã³åºãã ãã§ãªãããã¹ãŠã®åŒã«é©çšãããããã$ defer try(f())
$ã§ã¯ãããŸããïŒ try(err)
ãšèšãããšãã§ããŸãïŒããšãã°ã err
ã®ã¿ã€ããerror
ã®å ŽåïŒããããã£ãŠãã¿ã€ããã¹ã§ã¯ãããŸããããæåã¯æ··ä¹±ããå¯èœæ§ããããŸãã f
åã«åŒãè¡šããéåžžã¯é¢æ°ã§ããé»è©±ã
@ deanveloper ã @ griesemeræ°ã«ããªãã§ãã ãã:-)ããããšãã
@ carl-mastrangelo
_ "ããã¯
return intval( $_COOKIE[ CookieNames::CART_ID ] ) ?? null;
ã§ããå¿ èŠããããŸã_
PHP7.xãæ³å®ããŠããŸãã ç§ã§ã¯ãããŸããã§ããã ããããç¹°ãè¿ãã«ãªããŸãããããªãã®åå£ãªé¡ãèãããšãããããã€ã³ãã§ã¯ãªãã£ãããšãããªãã¯ç¥ã£ãŠããŸãã ïŒãŠã£ã³ã¯ïŒ
ææ¥ã®äº€æµäŒã§ãã®ãã£ã¹ã«ãã·ã§ã³ã衚瀺ããããã®çããã¢ã³ã¹ãã¬ãŒã·ã§ã³ãæºåããŠããŸãããã®ã¹ã¬ããã®ã»ãšãã©ã®åå è ïŒå¯çš¿è ãŸãã¯ãŠã©ããã£ãŒïŒã¯èšèªã«æ·±ãé¢ãã£ãŠãã人ã§ãããšç§ã¯ä¿¡ããŠããã®ã§ãããã€ãã®æ°ããèããèããŸããã»ãšãã©ã®å Žåããå¹³åçãªGoéçºè ã§ã¯ãããŸãããïŒåãªãäºæïŒã
ãã®éãç§ãã¡ã¯å®éã«ãšã©ãŒã«ã€ããŠã®äº€æµäŒãš2ã€ã®ãã¿ãŒã³ã«ã€ããŠã®è°è«ããã£ãããšãæãåºããŸããã
type ExtErr struct{
error
someOtherField string
}
ãããã¯ãç§ã®ããŒã ãå®éã«æ§ç¯ããããã€ãã®ã¹ã¿ãã¯ã§äœ¿çšãããŸãã
ææ¡ã®QïŒAã¯è¿°ã¹ãŠããŸã
QïŒtryã«æž¡ãããæåŸã®åŒæ°ã¯ããšã©ãŒåã§ããå¿
èŠããããŸãã çä¿¡åŒæ°ããšã©ãŒã«å²ãåœãŠãã ãã§ã¯äžååãªã®ã¯ãªãã§ããïŒ
AïŒã...å¿
èŠã«å¿ããŠãå°æ¥ãã®æ±ºå®ãåæ€èšããããšãã§ããŸãã
誰ããåæ§ã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠã³ã¡ã³ãã§ããã®ã§ããã®å¿ èŠæ§ãäžèšã®ãšã©ãŒæ¡åŒµãªãã·ã§ã³ã®äž¡æ¹ã«å ±éããŠãããã©ãããç解ã§ããŸããïŒ
@mikeschinkelç§ã¯ããªããæ¢ããŠããã«ãŒã«ã§ã¯ãããŸããã
@ daved ãreïŒ
ãã®äŸ¿å©ããé 眮ã§ããå Žæã«äºæ¬ ããŸããã ãã以å€ã®ã¡ã«ããºã ã®å®äœã蚌æããããã«ãã©ã®ãããªæž¬å®åºæºãæ±ããããŠããŸããïŒ åé¡ããããšã©ãŒåŠçã±ãŒã¹ã®ãªã¹ãã¯ãããŸããïŒ å ¬éããã»ã¹ã®å€ããææ ã«ãã£ãŠæšé²ãããŠããå ŽåãããŒã¿ããã©ã®ããã«äŸ¡å€ãå°ãåºãããŸããïŒ
決å®ã¯ããããå®éã®ããã°ã©ã ã§ã©ãã ãããŸãæ©èœãããã«åºã¥ããŠããŸãã ã³ãŒãã®å€§éšåã§è©Šè¡ãå¹æçã§ãªãããšã人ã ã瀺ããå Žåãããã¯éèŠãªããŒã¿ã§ãã ããã»ã¹ã¯ããã®çš®ã®ããŒã¿ã«ãã£ãŠé§åãããŸãã ããã¯ææ ã«ãã£ãŠåããããã®ã§ã¯ãããŸããã
ãšã©ãŒã³ã³ããã¹ã
ãã®åé¡ã§æèµ·ãããæãéèŠãªã»ãã³ãã£ãã¯ã®æžå¿µã¯ãtryãã³ã³ããã¹ãã«ãããšã©ãŒã®æ³šéãããè¯ããããããæªãããããä¿é²ãããã©ããã§ãã
æšå¹Ž8æã®åé¡ã®æŠèŠã§ã¯ããåé¡ãã»ã¯ã·ã§ã³ãšãç®æšãã»ã¯ã·ã§ã³ã«äžé£ã®CopyFileå®è£ ã®äŸã瀺ããŠããŸãã åœæãçŸåšããã©ã®ãœãªã¥ãŒã·ã§ã³ã§ããŠãŒã¶ãŒããšã©ãŒã«é©åãªã³ã³ããã¹ããè¿œå ããå¯èœæ§ãé«ããªãããšãæ確ãªç®æšã§ãã ãããŠãç§ãã¡ã¯ãããã§ãããšæããŸãããããªããã°ç§ãã¡ã¯ãããææ¡ããªãã£ãã§ãããã
ãã ããè©Šãåã«ãé©åãªãšã©ãŒã³ã³ããã¹ãã«ã€ããŠå šå¡ãåãããŒãžã«ããããšã確èªããããšããå§ãããŸãã æ£èŠã®äŸã¯os.Openã§ãã Goããã°æçš¿ããšã©ãŒåŠçãšGo ãã®åŒçšïŒ
ã³ã³ããã¹ããèŠçŽããã®ã¯ãšã©ãŒå®è£ ã®è²¬ä»»ã§ãã
os.Openã«ãã£ãŠè¿ããããšã©ãŒã¯ããpermissiondeniedãã ãã§ãªããopen / etc / passwdïŒpermissiondeniedããšããŠãã©ãŒããããããŸãã
ãšã©ãŒã«é¢ããEffectiveGoã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ãã®èŠåã¯ã䜿ãæ £ããä»ã®èšèªãšã¯ç°ãªãå ŽåããããGoã³ãŒãã§ãäžè²«ããŠåŸããªãããšã«æ³šæããŠãã ããã ãšã©ãŒåŠçãåçåããããšããæ確ãªç®æšã¯ã人ã ããã®èŠåã«åŸããé©åãªã³ã³ããã¹ããè¿œå ããããããããšã§ãããããã«ãã£ãŠãããäžè²«ããŠåŸãããã«ããããšã§ãã
ä»æ¥ã®GoèŠåã«åŸã£ãã³ãŒãã¯ãããããããŸãããå察ã®èŠåãæ³å®ããã³ãŒãããããããããŸãã 次ã®ãããªã³ãŒããèŠãã®ã¯ããŸãã«ãäžè¬çã§ãã
f, err := os.Open(file)
if err != nil {
log.Fatalf("opening %s: %v", file, err)
}
ãã¡ãããããã¯åããã®ã2ååºåããŸãïŒãã®ãã£ã¹ã«ãã·ã§ã³ã®å€ãã®äŸã¯æ¬¡ã®ããã«ãªããŸãïŒã ãã®åãçµã¿ã®äžç°ãšããŠããã¹ãŠã®äººã倧äŒã«ã€ããŠç¥ã£ãŠãããããã«åŸã£ãŠããããšã確èªããå¿ èŠããããŸãã
Goãšã©ãŒã³ã³ããã¹ãèŠåã«åŸã£ãã³ãŒãã§ã¯ãã»ãšãã©ã®é¢æ°ãåãšã©ãŒãªã¿ãŒã³ã«åãã³ã³ããã¹ããé©åã«è¿œå ããããšãæåŸ ããŠãããããäžè¬ã«1ã€ã®è£ 食ãé©çšãããŸãã ããšãã°ãCopyFileã®äŸã§ã¯ãããããã®å Žåã«è¿œå ããå¿ èŠãããã®ã¯ãã³ããŒããããã®ã®è©³çŽ°ã§ãã ä»ã®ç¹å®ã®è¿åã¯ãããå€ãã®ã³ã³ããã¹ããè¿œå ããå¯èœæ§ããããŸãããéåžžã¯ã眮ãæãã§ã¯ãªãè¿œå ã§ãã ãã®æåŸ ã«ã€ããŠééã£ãŠããå Žåã¯ããããç¥ã£ãŠãããšããã§ãããã å®éã®ã³ãŒãããŒã¹ããã®æ確ãªèšŒæ ã圹ç«ã¡ãŸãã
Gopherconã®ãã§ãã¯/ãã³ãã«ãã©ããèšèšã§ã¯ã次ã®ãããªã³ãŒãã䜿çšãããŸãã
func CopyFile(src, dst string) error {
handle err {
return fmt.Errorf("copy %s %s: %v", src, dst, err)
}
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
ãã®ææ¡ã¯ãããä¿®æ£ããŸããããèãæ¹ã¯åãã§ãïŒ
func CopyFile(src, dst string) (err error) {
defer func() {
if err != nil {
err = fmt.Errorf("copy %s %s: %v", src, dst, err)
}
}()
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
...
}
ãããŠããã®äžè¬çãªãã¿ãŒã³ã«ãŸã ååã®ãªããã«ããŒãè¿œå ããããšæããŸãã
func CopyFile(src, dst string) (err error) {
defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)
r := try(os.Open(src))
defer r.Close()
w := try(os.Create(dst))
...
}
èŠããã«ããã®ã¢ãããŒãã®åçæ§ãšæåã¯ããããã®ä»®å®ãšè«ççãªã¹ãããã«äŸåããŸãã
ããªããééã£ãŠãããšæãä»®å®ãŸãã¯è«ççãªã¹ããããããå Žåãç§ãã¡ã¯ç¥ãããã§ãã ãããŠãç§ãã¡ã«äŒããæè¯ã®æ¹æ³ã¯ãå®éã®ã³ãŒãããŒã¹ã®èšŒæ ãææããããšã§ãã è©Šè¡ãäžé©åãŸãã¯äºæ ãæªåãããäžè¬çãªãã¿ãŒã³ã瀺ããŠãã ããã è©ŠããŠã¿ãæ¹ãæã£ãããå¹æçã ã£ãäŸãæããŠãã ããã ã³ãŒãããŒã¹ã®ã©ãã ããã©ã¡ããã®åŽã«ããããå®éåããŠã¿ãŠãã ããã çã ã ããŒã¿ã¯éèŠã§ãã
ããããšãã
ãšã©ãŒã³ã³ããã¹ãã®ãã¹ããã©ã¯ãã£ã¹ã«é¢ããè¿œå æ
å ±ãæäŸããŠããã@rscã«æè¬ããŸãã ç¹ã«ãã¹ããã©ã¯ãã£ã¹ã«é¢ãããã®ç¹ã¯ç§ãã»ã®ããããŸãããããšã©ãŒã³ã³ããã¹ãã«å¯Ÿããtry
ã®é¢ä¿ã倧å¹
ã«æ¹åããŸãã
ãããã£ãŠãã»ãšãã©ã®é¢æ°ã¯ãå šäœã説æããé¢æ°ã¬ãã«ã®ã³ã³ããã¹ããè¿œå ããã ãã§æžã¿ãŸã
倱æããç¹å®ã®ãµãããŒã¹ã§ã¯ãªããæäœïŒãã®ãµãããŒã¹ã¯ãã§ã«èªå·±å ±åããŠããŸãïŒã
ãããã£ãŠã try
ã圹ã«ç«ããªãã®ã¯ããšã©ãŒãã³ã³ããã¹ãåããã ãã§ãªãããšã©ãŒã«å¯Ÿå¿ããå¿
èŠãããå Žåã§ãã
ããã¯ãªãŒã³ã§ããããšã¬ã¬ã³ãã§ãééã£ãäŸãé©å¿ãããããã«ãããã§ã¯ããšã©ãŒåŠçã埮åŠã«ééã£ãŠããé¢æ°ã®äŸã瀺ããŸãã try
ããã³defer
ã¹ã¿ã€ã«ã®ãšã©ãŒã©ããã³ã°ã䜿çšããŠGoã«é©åãããŸããã
func AddNewGuy(name string) (guy Guy, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("adding guy %v: %v", name, err)
}
}()
guy = Guy{name: name}
guy.Team = ChooseRandomTeam()
try(guy.Team.Add(guy))
try(AddToLeague(guy))
return guy, nil
}
guy.Team.Add(guy)
æåãããã AddToLeague(guy)
ã倱æããå ŽåãããŒã ã«ã¯ãªãŒã°ã«ãªãç¡å¹ãªGuyãªããžã§ã¯ããããããããã®é¢æ°ã¯æ£ãããããŸããã æ£ããã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããããã§ã¯ã guy.Team.Add(guy)
ãããŒã«ããã¯ãã try
ã䜿çšã§ããªããªããŸãã
func AddNewGuy(name string) (guy Guy, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("adding guy %v: %v", name, err)
}
}()
guy = Guy{name: name}
guy.Team = ChooseRandomTeam()
try(guy.Team.Add(guy))
if err := AddToLeague(guy); err != nil {
guy.Team.Remove(guy)
return Guy{}, err
}
return guy, nil
}
ãŸãã¯ããšã©ãŒä»¥å€ã®æ»ãå€ã«ãŒãå€ãæå®ããå¿
èŠããªãå Žåã¯ã return Guy{}, err
ãtry(err)
ã«çœ®ãæããããšãã§ããŸãã ãšã«ããã defer
-edé¢æ°ã¯åŒãç¶ãå®è¡ãããã³ã³ããã¹ããè¿œå ãããŸããããã¯ãã°ãããããšã§ãã
ç¹°ãè¿ãã«ãªããŸãããããã¯ã try
ããšã©ãŒãžã®åå¿ã«ã€ããŠã¯ãã³ãããŸããããšã©ãŒãžã®ã³ã³ããã¹ãã®è¿œå ã«ã€ããŠã¯ãã³ãããªãããšãæå³ããŸãã ããã¯ç§ãšããããä»ã®äººãã»ã®ããããŠããåºå¥ã§ãã é¢æ°ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããæ¹æ³ã¯èªè
ã«ãšã£ãŠç¹ã«éèŠã§ã¯ãªããããããã¯çã«ããªã£ãŠããŸãããé¢æ°ããšã©ãŒã«åå¿ããæ¹æ³ã¯éèŠã§ãã ã³ãŒãã®ããŸãé¢çœããªãéšåã®åé·æ§ãæžããå¿
èŠããããŸãããããtry
ã®æ©èœã§ãã
ãããåé¡ã§ã¯ãªãããŸãã¯è§£æ±ºãã䟡å€ã®ããåé¡ã§ã¯ãªãããšã瀺åããã®ã¯ããªãã ãã§ã¯ãããŸããã ä»ã®ãã®ãããªã³ã¡ã³ãã«ã€ããŠã¯ã httpsïŒ//swtch.com/try.html#nonissueãåç §ããŠãã ããã ç§ãã¡ã¯ãããã«æ³šæããå®éã®åé¡ã解決ããŠããããšã確èªããããšæããŸãã
@rscçŸåšã®ãšã©ãŒã³ãŒãã«ãåé¡ã¯ãªããšæããŸãã ã ãããç§ãæ°ããŠãã ããã
Robertã®tryhardã®ãããªããŒã«ã¯ããããè¡ãã®ã«åœ¹ç«ã¡ãŸãã ç§ã¯ä»¥åã人ã ã«åœŒãã圌ãèªèº«ã®ã³ãŒãããŒã¹ã§èŠã€ãããã®ãç§ãã¡ã«ç¥ãããŠãããããã«é Œã¿ãŸããã ãã®æ å ±ã¯ãå€æŽã䟡å€ããããã©ãããè©äŸ¡ããããã«éåžžã«éèŠã«ãªããŸãã ããªãã«ã¯1ã€ã®æšæž¬ããããç§ã«ã¯å¥ã®æšæž¬ããããŸãããããã¯åé¡ãããŸããã çãã¯ããããã®æšæž¬ã®ä»£ããã«ããŒã¿ã䜿çšããããšã§ãã
https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.goãèŠãŠãå€ãã³ãŒãã®æ¹ã奜ãã§ãã tryé¢æ°åŒã³åºããçŸåšã®å®è¡ãäžæããå¯èœæ§ãããããšã¯ç§ã«ã¯é©ãã§ãã ããã¯ãçŸåšã®Goã®åäœæ¹æ³ã§ã¯ãããŸããã
ç§ã¯ããªããæèŠãå€ããã®ãèŠã€ããã ãããšæãã ããã¯éåžžã«äž»èŠ³çãªããšã ãšæããŸãã
ãããŠãç§ã¯ããŠãŒã¶ãŒã®å€§å€æ°ããã®è°è«ã«åå ããŠããªãã®ã§ã¯ãªãããšæããŸãã 圌ãã¯ãã®å€åãæ¥ãããšããç¥ããŸããã ç§ã¯èªåã§Goã«ããªãé¢ãã£ãŠããŸãããæããªãã®ã§ãã®å€æŽã«ã¯åå ããŸããã
ä»ã¯å¥ã®èãæ¹ãããããã«ãæ¢åã®ãã¹ãŠã®GoãŠãŒã¶ãŒãåæè²ããå¿ èŠããããšæããŸãã
ãŸããã³ãŒãã§ã®tryã®äœ¿çšãæåŠããäžéšã®ãŠãŒã¶ãŒ/äŒæ¥ãã©ããããã決å®ããå¿ èŠããããŸãã 確ãã«ããã€ãããã§ãããã
ãã¶ããçŸåšã®ã³ãŒããèªåçã«æžãçŽãã«ã¯ãgofmtãå€æŽããå¿ èŠããããŸãã ãã®ãããªãäžæ£ãªããŠãŒã¶ãŒã«æ°ããtryé¢æ°ã®äœ¿çšã匷å¶ããããã gofmtã«ããããããããšã¯å¯èœã§ããïŒ
人ã ãgo1.13ã䜿çšããtryã䜿çšããŠã³ãŒãããã«ãããåã«ãã³ã³ãã€ã«ãšã©ãŒã«ã©ã®ããã«å¯ŸåŠããŸããïŒ
ãã®å€æŽãå®è£ ããããã«å æããªããã°ãªããªãä»ã®å€ãã®åé¡ãããããèŠéããŠããŸããã ãã©ãã«ã®äŸ¡å€ã¯ãããŸããïŒ ç§ã¯ããã¯æããªãã
ã¢ã¬ãã¯ã¹
@griesemer
97 errããã£ãããããŠããªããã¡ã€ã«ã§è©ŠããŠã¿ããšããã2ã€ã®ãã¿ãŒã³ã翻蚳ãããŠããªãããšãããããŸãã
1ïŒ
if err := updateItem(tx, fields, entityView.DataBinding, entityInstance); err != nil {
tx.Rollback()
return nil, err
}
ããããerrïŒ=ãšãªã¿ãŒã³ã©ã€ã³ã®éã®tx.RollbackïŒïŒãåå ã§ã眮ãæããããŸããã
ããã¯ãdeferã«ãã£ãŠã®ã¿åŠçã§ãããšæããŸã-ãããŠããšã©ãŒã®ãã¹ãŠã®ãã¹ãtx.RollbackïŒïŒã§ããå¿
èŠãããå Žå
ããã¯æ£è§£ ïŒ
if err := db.Error; err != nil {
return nil, err
} else if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
return nil, err
} else {
return itemDb, nil
}
ãŸã
if err := db.Error; err != nil {
return nil, err
} else {
if itemDb, err := GetItem(c, entity, entityView, ItemRequest{recNo}); err != nil {
return nil, err
} else {
return itemDb, nil
}
return result, nil
}
ããã¯ãã·ã£ããŠã€ã³ã°ãŸãã¯ãã¹ãã®è©Šè¡ãå€æãããããã§ããïŒ æå³-ããã䜿çšããããerrïŒ= ... return errãšããŠæ®ãããšãææ¡ããå¿ èŠããããŸããïŒ
@guybrand ReïŒããªããèŠã€ãã2ã€ã®ãã¿ãŒã³ïŒ
1ïŒã¯ãã tryhard
ã¯ããã»ã©é 匵ã£ãŠããŸããã ããè€éãªã±ãŒã¹ã§ã¯ãã¿ã€ããã§ãã¯ãå¿
èŠã§ãã tx.Rollback()
ããã¹ãŠã®ãã¹ã§å®è¡ããå¿
èŠãããå Žåã¯ã defer
ãé©åãªã¢ãããŒãã§ããå¯èœæ§ããããŸãã ããã§ãªããã°ã if
ãç¶æããããšãæ£ããã¢ãããŒããããããŸããã ç¹å®ã®ã³ãŒãã«ãã£ãŠç°ãªããŸãã
2ïŒããã§ãåãã§ãïŒ tryhard
ã¯ããã®ããè€éãªãã¿ãŒã³ãæ¢ããŸããã å€åããã¯å¯èœã§ããã
ç¹°ãè¿ããŸãããããã¯ããã€ãã®ç°¡åãªçããåŸãããã®å®éšçãªããŒã«ã§ãã ãããæ£ããè¡ãã«ã¯ãããå°ãäœæ¥ãå¿ èŠã§ãã
@alexbrainman
人ã ãgo1.13ã䜿çšããtryã䜿çšããŠã³ãŒãããã«ãããåã«ãã³ã³ãã€ã«ãšã©ãŒã«ã©ã®ããã«å¯ŸåŠããŸããïŒ
ç§ã®ç解ã§ã¯ãèšèªèªäœã®ããŒãžã§ã³ã¯ãã³ã³ãã€ã«ãããåã³ãŒãã®go.mod
ãã¡ã€ã«å
ã®go
èšèªããŒãžã§ã³ãã£ã¬ã¯ãã£ãã«ãã£ãŠå¶åŸ¡ãããŸãã
å®è¡äžã®go.mod
ããã¥ã¡ã³ãã§ã¯ã次ã®ããã«go
èšèªããŒãžã§ã³ãã£ã¬ã¯ãã£ãã«ã€ããŠèª¬æããŠããŸãã
go
ãã£ã¬ã¯ãã£ãã«ãã£ãŠèšå®ããããäºæ³ãããèšèªããŒãžã§ã³ã«ãã£ãŠæ±ºå®ãããŸã
ã¢ãžã¥ãŒã«ã®ã³ã³ãã€ã«æã«äœ¿çšã§ããèšèªæ©èœã
ãã®ããŒãžã§ã³ã§å©çšå¯èœãªèšèªæ©èœã䜿çšå¯èœã«ãªããŸãã
以åã®ããŒãžã§ã³ã§åé€ãããããŸãã¯åŸã®ããŒãžã§ã³ã§è¿œå ãããèšèªæ©èœã
å©çšã§ããªããªããŸãã èšèªããŒãžã§ã³ã¯åœ±é¿ããªãããšã«æ³šæããŠãã ãã
䜿çšãããŠããGoãªãªãŒã¹ã«ãã£ãŠæ±ºå®ããããã«ãã¿ã°ã
ä»®ã«ãæ°ããtry
ãã«ãã€ã³ã®ãããªãã®ãGo 1.15ã®ãããªãã®ã«å°éããå Žåããã®æç¹ã§ã go.mod
ãã¡ã€ã«ãgo 1.12
ãèªã¿åã人ã¯ããã®æ°ããtry
ã«ã¢ã¯ã»ã¹ã§ããŸããã Go 1.15ããŒã«ãã§ãŒã³ã§ã³ã³ãã€ã«ããå Žåã§ãã go.mod
ã§å®£èšãããŠããGoèšèªããŒãžã§ã³ãgo 1.12
ãã代ããã«go 1.15
ã«å€æŽããå¿
èŠããããŸãã try
ã®1.15èšèªæ©èœã
äžæ¹ã try
ã䜿çšããã³ãŒããããããã®ã³ãŒããgo.mod
ãã¡ã€ã«ãGoèšèªããŒãžã§ã³ãgo 1.15
ãšããŠå®£èšããŠããã¢ãžã¥ãŒã«ã«ååšããå Žåã誰ããGo 1.12ããŒã«ãã§ãŒã³ã䜿çšããŠãã«ãããŸãããã®æç¹ã§ãGo1.12ããŒã«ãã§ãŒã³ã¯ã³ã³ãã€ã«ãšã©ãŒã§å€±æããŸãã Go 1.12ããŒã«ãã§ãŒã³ã¯try
ã«ã€ããŠäœãç¥ããŸããããã³ã³ãã€ã«ã«å€±æããã³ãŒããgo.mod
ãã¡ã€ã«ã®å
容ã«åºã¥ããŠGo1.15ãå¿
èŠãšãããšäž»åŒµããè¿œå ã®ã¡ãã»ãŒãžãåºåããã®ã«ååã§ãã ã ä»æ¥ã®Go1.12ããŒã«ãã§ãŒã³ã䜿çšããŠãã®å®éšãå®éã«è©Šãããšãã§ããçµæã®ãšã©ãŒã¡ãã»ãŒãžã確èªã§ããŸãã
.\hello.go:3:16: undefined: try
note: module requires Go 1.15
Go2移è¡ææ¡ææžã«ã¯ãã¯ããã«é·ãè°è«ããããŸãã
ããã¯èšã£ãŠãããã®æ£ç¢ºãªè©³çŽ°ã¯ä»ã®å Žæã§ããããè°è«ããããããããŸããïŒäŸãã°ãããããïŒ30791ããŸãã¯ãã®æè¿ã®golang-nutsã¹ã¬ããã§ïŒã
@griesemer ããã©ãŒãããã®ããå
·äœçãªãªã¯ãšã¹ããéããå Žåã¯ç³ãèš³ãããŸããããããã€ãã®çµæãå
±æããäžéšã®äŒæ¥ã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ïŒå¯èœãªèš±å¯ïŒããããšæããŸãã
以äžã¯å°ããªãããžã§ã¯ãã®å®éã®äŸã§ããæ·»ä»ã®ââçµæã¯è¯ããµã³ãã«ãæäŸãããšæããŸãããããããªããããããããã€ãã®è¡šãåæ§ã®çµæãšå
±æããããšãã§ããŸãã
åèš=ã³ãŒãè¡æ°$find /path/to/repo -name '*.go' -exec cat {} \; | wc -l
Errs = errïŒ=ã®è¡æ°ïŒããã¯ããããerr =ãããã³myerrïŒ=ãèŠéããŸãããã»ãšãã©ã®å Žåã¯ã«ããŒããŠãããšæããŸãïŒ
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
tryhard = tryhardãæ€åºããè¡æ°
ç§ãç 究ããããã«ãã¹ãããæåã®ã±ââãŒã¹ãæ»ã£ãŠããŸããïŒ
åèš= 5106
ãšã©ãŒ= 111
tryhard = 16
ãã倧ããªã³ãŒãããŒã¹
åèš= 131777
ãšã©ãŒ= 3289
tryhard = 265
ãã®åœ¢åŒãåãå
¥ããããå Žåã¯ãçµæãååŸããæ¹æ³ããç¥ãããã ãããããã«æããã ãã§ã¯æ£ãã圢åŒã§ã¯ãªããšæããŸãã
ãŸããerrïŒ=ïŒãããŠããããerr =ãç§ãåŠãŒããšããã³ãŒãããŒã¹ã§ã¯4ã€ã ãïŒã®è¡ãtryhardã«ã«ãŠã³ããããã®ã¯ããããè¿
éã§ãããã
ããããšãã
https://github.com/golang/go/issues/32437#issuecomment-503276339ã®@griesemerãã
äŸãšããŠããã®ã³ãŒãã確èªããããšããå§ãããŸãã
ãã®ã³ãŒãã«é¢ããŠãããã§äœæãããoutãã¡ã€ã«ãéããããŠããªãããã«èŠããããšã«æ°ã¥ããŸããã ããã«ãæžã蟌ã¿ã«åé¡ããã£ãããšãéç¥ãããã®ã¯ããã ãã§ããå¯èœæ§ããããããæžã蟌ã¿ãè¡ã£ããã¡ã€ã«ãéããéã®ãšã©ãŒã確èªããããšãéèŠã§ãã
ç§ã¯ããããã°ã¬ããŒããšããŠã§ã¯ãªãïŒå€åããããã¹ãã§ããïŒïŒã try
ããããä¿®æ£ããæ¹æ³ã«åœ±é¿ãäžãããã©ããã確èªããæ©äŒãšããŠåãäžããŠããŸãã ç§ã¯ãããä¿®æ£ããããã«èããããšãã§ãããã¹ãŠã®æ¹æ³ãåæãã try
ã®è¿œå ã圹ç«ã€ã害ãåãŒããã©ãããæ€èšããŸãã ããã«ããã€ãã®æ¹æ³ããããŸãïŒ
outf.Close()
ã«æ瀺çãªåŒã³åºããè¿œå ããŸããfunc foo() (err error) {
outf := try(os.Create())
defer func() {
cerr := outf.Close()
if err == nil {
err = cerr
}
}()
...
}
defer outf.Close()
ãå®è¡ãããšã©ãŒããªãããšãä¿èšŒããããã«æ»ãåã«try(outf.Close())
ãå®è¡ãããããã«ã¯ããŒãºããã¿ãŒã³ãfunc foo() error {
outf := try(os.Create())
if err := helper(outf); err != nil {
outf.Close()
return err
}
try(outf.Close())
return nil
}
ã±ãŒã¹çªå·1ãé€ããã¹ãŠã®ã±ãŒã¹ã§ã try
ã¯ææªã®äžç«ã§ãããéåžžã¯æ£ã§ãããšæããŸãã ãããŠããã®é¢æ°ã®ãšã©ãŒã®å¯èœæ§ã®ãµã€ãºãšæ°ãèãããšã1çªã¯æãå£ã«åããªããªãã·ã§ã³ã ãšæããŸãããããã£ãŠã try
ãè¿œå ãããšãåŠå®çãªéžæã®é
åãæžããŸãã
ãã®åæãã圹ã«ç«ãŠã°å¹žãã§ãã
ä»®ã«ãæ°ãã
try
ãã«ãã€ã³ã®ãããªãã®ãGo 1.15ã®ãããªãã®ã«å°éããå Žåããã®æç¹ã§ãgo.mod
ãã¡ã€ã«ãgo 1.12
ãèªã¿åã人ã¯ã¢ã¯ã»ã¹ã§ããŸããã
@thepudds説æããããšãããããŸãã ããããç§ã¯ã¢ãžã¥ãŒã«ã䜿çšããŸããã ã ããããªãã®èª¬æã¯ç§ã®é ãã¯ããã«è¶ ããŠããŸãã
ã¢ã¬ãã¯ã¹
@alexbrainman
人ã ãgo1.13ã䜿çšããtryã䜿çšããŠã³ãŒãããã«ãããåã«ãã³ã³ãã€ã«ãšã©ãŒã«ã©ã®ããã«å¯ŸåŠããŸããïŒ
try
ãä»®ã«Go 1.15ã®ãããªãã®ã«å°éããå Žåãããªãã®è³ªåã«å¯Ÿããéåžžã«çãçãã¯ãGo1.13ã䜿çšããŠtry
ã§ã³ãŒãããã«ããããšã次ã®ãããªã³ã³ãã€ã«ãšã©ãŒãçºçãããšããããšã§ãã
.\hello.go:3:16: undefined: try
note: module requires Go 1.15
ïŒå°ãªããšãã移è¡ææ¡ã«ã€ããŠè¿°ã¹ãããŠããããšãç解ããŠããéãïŒã
@alexbrainmanãã£ãŒãããã¯ãããããšãããããŸãã
ãã®ã¹ã¬ããã«é¢ããã³ã¡ã³ãã®å€ãã¯ããããã¯Goã®ããã«ã¯èŠããŸãããããGoã¯ãã®ããã«æ©èœããŸãããããŸãã¯ããããããã§çºçãããšã¯æããªãããšãã圢åŒã§ãã ããã¯ãã¹ãŠæ£ããã§ãã_existing_Goã¯ãã®ããã«ã¯æ©èœããŸããã
ããã¯ãããããããå®è³ªçãªæ¹æ³ã§èšèªã®æ觊ã«åœ±é¿ãäžããæåã«ææ¡ãããèšèªå€æŽã§ãã ç§ãã¡ã¯ãããèªèããŠããã®ã§ããããæå°éã«æããŸããã ïŒå ·äœçãªãžã§ããªãã¯å»è¬åã®ææ¡ãåŒãèµ·ããå¯èœæ§ã®ããéšåãæ³åããã®ã¯é£ããã§ã-èšèªã®å€åã«ã€ããŠè©±ããŸãïŒã
ããããããªãã®ãã€ã³ãã«æ»ããšãããã°ã©ããŒã¯ããã°ã©ãã³ã°èšèªãã©ã®ããã«æ©èœããæããŠãããã«æ
£ããŠããŸãã 35幎éã®ããã°ã©ãã³ã°ã®éçšã§äœããåŠãã ãšããããããã¯ã»ãšãã©ãã¹ãŠã®èšèªã«æ
£ããŠãããšããããšã§ãããããã¯éåžžã«è¿
éã«èµ·ãããŸãã ç§ã®æåã®é«çŽèšèªãšããŠãªãªãžãã«ã®PascalãåŠãã åŸãããã°ã©ãã³ã°èšèªããã®ãã¹ãŠã®ããŒã¯ãŒãã掻çšããªãããšã¯_èããããªã_ããšã§ããã ããããCã§ãããåèªã®æµ·ãã«æ
£ããã®ã«1é±éã»ã©ããããããŸããã§ããããã³ãŒãã¯ãã¹ãŠå°æåã§ãããããã³ãŒãã®æ§é ãèŠãããšãã§ããŸããã§ãããã Cã§ã®æåã®æ¥ã
ã®åŸãPascalã³ãŒãã¯ã²ã©ãéšã
ããèŠããå®éã®ã³ãŒãã¯ãã¹ãŠãå«ã³å£°ã®ããŒã¯ãŒãã®æ··ä¹±ã«åãããŠããããã«èŠããŸããã Goã«æ©éãããŸãããšã¯ã¹ããŒããããèå¥åãããŒã¯ããããã«ãã£ãã¿ã©ã€ãŒãŒã·ã§ã³ãå°å
¥ãããšãã以åã®ããŒã¯ãŒãããŒã¹ã®ã¢ãããŒãïŒGoãå
¬éãããåïŒããã®è¡æçãªå€æŽã§ããã ä»ã§ã¯ãããã¯ããåªããèšèšäžã®æ±ºå®ã®1ã€ã§ãããšèããŠããŸãïŒå
·äœçãªã¢ã€ãã¢ã¯å®éã«ã¯GoããŒã ã®å€éšããã®ãã®ã§ãïŒã ãŸãã¯ã次ã®æèå®éšãèããŠã¿ãŠãã ãããGoã«defer
ã¹ããŒãã¡ã³ãããªãã誰ããdefer
ã匷ã䞻匵ããŠãããšããŸãã defer
ã«ã¯ããã®èšèªã®ä»ã®èšèªã®ãããªã»ãã³ãã£ã¯ã¹ã¯ãããŸãããæ°ããèšèªã¯ã defer
以åã®ããã«ã¯æããããŸããã ããã§ãã10幎éãããšäžç·ã«æ®ãããåŸãããã¯å®å
šã«ããŽãŒã©ã€ã¯ãã®ããã«èŠããŸãã
éèŠãªã®ã¯ãå®éã®ã³ãŒãã§ã¡ã«ããºã ãå®éã«è©Šããå
·äœçãªãã£ãŒãããã¯ãåéããªããã°ãèšèªã®å€æŽã«å¯Ÿããæåã®åå¿ã¯ã»ãšãã©æå³ããªããšããããšã§ãã ãã¡ãããæ¢åã®ãšã©ãŒåŠçã³ãŒãã¯åé¡ãªãã try
ã䜿çšãã眮æãããæ確ã«èŠããŸããç§ãã¡ã¯ããããã®if
ã¹ããŒãã¡ã³ãã10幎åããèããããã«èšç·ŽãããŠããŸãã ãããŠãã¡ããã try
ã³ãŒãã¯å¥åŠã«èŠãããå¥åŠãªãã»ãã³ãã£ã¯ã¹ãæã£ãŠããŸãããããŸã§äœ¿çšããããšããªããèšèªã®äžéšãšããŠããã«èªèãããŸããã
ãã®ãããç¬èªã®ã³ãŒãã§å®éšããŠå®éã«å€æŽã«åãçµãããã«äººã
ã«æ±ããŠããŸãã ã€ãŸããå®éã«ãããæžãããæ¢åã®ã³ãŒãã«å¯ŸããŠtryhard
ãå®è¡ããŠãçµæãæ€èšããŸãã ãã°ããããããã1é±éã»ã©ãã®ãŸãŸã«ããŠããããšããå§ãããŸãã ããäžåºŠèŠãŠãå ±åããŠãã ããã
æåŸã«ãç§ã¯ã倧å€æ°ã®äººã ããã®ææ¡ã«ã€ããŠç¥ããªããããŸãã¯ããã«é¢äžããŠããªããšããããªãã®è©äŸ¡ã«åæããŸãã ãã®è°è«ãããããåæ°äººã»ã©ã®äººã ã«ãã£ãŠæ¯é ãããŠããããšã¯éåžžã«æçœã§ãã ãããããŸã æ©ã段éã§ããã®ææ¡ã¯2é±éããçºè¡šãããŠãããã決å®ã¯äžãããŠããŸããã ããå€ãã®ç°ãªã人ã ãããã«åŸäºããããã®ååãªæéããããŸãã
https://github.com/golang/go/issues/32437#issuecomment -503297387ã¯ãåäžã®é¢æ°ã§è€æ°ã®æ¹æ³ã§ãšã©ãŒãã©ããããŠããå Žåãæããã«ééã£ãŠãããšèšã£ãŠããŸãã ãã®éãç§ã¯æ¬¡ã®ãããªã³ãŒããããããæã£ãŠããŸãïŒ
if err := gen.Execute(tmp, s); err != nil {
return fmt.Errorf("template error: %v", err)
}
if err := tmp.Close(); err != nil {
return fmt.Errorf("cannot write temp file: %v", err)
}
closed = true
if err := os.Rename(tmp.Name(), *genOutput); err != nil {
return fmt.Errorf("cannot finalize file: %v", err)
}
removed = true
ïŒ closed
ãšremoved
ã¯ãå¿
èŠã«å¿ããŠãã¯ãªãŒã³ã¢ããããããã«å»¶æè
ã«ãã£ãŠäœ¿çšãããŸãïŒ
ç§ã¯ãããããã¹ãŠã«ããã®æ©èœã®ãããã¬ãã«ã®äœ¿åœã説æããåãã³ã³ããã¹ããäžããã¹ãã§ã¯ãªããšæ¬åœã«æããŸãã ç§ã¯æ¬åœã«ãŠãŒã¶ãŒããã èŠãã¹ãã§ã¯ãªããšæããŸã
processing path/to/dir: template: gen:42:17: executing "gen" at <.Broken>: can't evaluate field Broken in type main.state
ãã³ãã¬ãŒããå°ç¡ãã«ãªã£ãŠããå Žåããå®è¡ãã³ãã¬ãŒãããŸãã¯ãã®ãããªå°ãäœåãªããããè¿œå ããããã®ãã³ãã¬ãŒãExecuteåŒã³åºãã®ãšã©ãŒãã³ãã©ãŒã®è²¬ä»»ã ãšæããŸãã ïŒããã¯ã³ã³ããã¹ãã®æ倧ã®éšåã§ã¯ãããŸããããäœæãããäŸã§ã¯ãªããå®éã®ã³ãŒããã³ããŒããŠè²Œãä»ãããã£ãã®ã§ããïŒ
ãŠãŒã¶ãŒã«è¡šç€ºãããã¹ãã§ã¯ãªããšæããŸã
processing path/to/dir: rename /tmp/blahDs3x42aD commands.gen.go: No such file or directory
ç§ã®ããã°ã©ã ããã®ååã®å€æŽãå®çŸããããšããŠããçç±ãã»ãã³ãã£ã¯ã¹ãæå³ã¯äœããšããæãããããªããŸãŸã§ãã ããã¡ã€ã«ããã¡ã€ãã©ã€ãºã§ããŸããïŒããå°ãè¿œå ãããšãæ¬åœã«åœ¹ç«ã€ãšæããŸãã
ãããã®äŸã§ååã«çŽåŸã§ããªãå Žåã¯ãã³ãã³ãã©ã€ã³ã¢ããªããã®æ¬¡ã®ãšã©ãŒåºåãæ³åããŠã¿ãŠãã ããã
processing path/to/dir: open /some/path/here: No such file or directory
ã©ãããæå³ã§ããïŒ ã¢ããªãããã«ãã¡ã€ã«ãäœæããããšããçç±ãè¿œå ããããšæããŸãïŒos.Openã ãã§ãªããäœæã§ãããšã¯ç¥ããªãã£ãã®ã§ãïŒäžéãã¹ãååšããªããããENOENTã§ãïŒã ããã¯ããã®é¢æ°ããã®_every_ãšã©ãŒãªã¿ãŒã³ã«è¿œå ããå¿ èŠããããã®ã§ã¯ãããŸããã
ã ãããç§ã¯äœãæ¬ ããŠããŸãã ç§ã¯ãééã£ãŠãããã®ã§ããããïŒ ãããã®ãããããããã¹ãŠã®ãšã©ãŒãã©ããããããã«é 延ã䜿çšããåå¥ã®å°ããªé¢æ°ã«ããã·ã¥ããããšã«ãªã£ãŠããŸããïŒ
@guybrandãããã®çªå·ãããããšãã tryhard
ã®æ°åãäœã§ãããã«ã€ããŠãããã€ãã®æŽå¯ãåŸãã®ã¯è¯ãããšã§ãã ãããããç¹å®ã®ãšã©ãŒè£
食ãããããè¡ãããŠããã®ã§ããããïŒ ãããããªããããã¯çŽ æŽãããããšã§ããã if
ã¹ããŒãã¡ã³ããæ£ããéžæã§ãã
ããã«å°éããããããŒã«ãæ¹åããŸãã
@ tv42 https://github.com/golang/go/issues/32437#issuecomment -503340426ã®äŸããããééã£ããããšãããŠããªããšä»®å®ãããšã if
ã¹ããŒãã¡ã³ãã䜿çšããŠããããã«èŠããŸããããã®ã±ãŒã¹ããã¹ãŠç°ãªãå¿çãå¿
èŠãšããå Žåã«åŠçããæ¹æ³ã§ãã try
ã¯åœ¹ã«ç«ã¡ãŸããããããŠdefer
ã¯ãããé£ãââãããã ãã§ãïŒãã®ã³ãŒããããç°¡åã«æžãããšããŠãããã®ã¹ã¬ããã®ä»ã®èšèªå€æŽææ¡ã¯if
ã«ãšãŠãè¿ãã§ãæ°ããã¡ã«ããºã ãå°å
¥ãã䟡å€ããªããšãã
@griesemerãããªããç§ãèããããšãã§ããã®ã¯ãããªããš@rscãåæããªããšããããšã ãã§ãã ãŸãã¯ãç§ã¯ç¢ºãã«ãééã£ãããšãããŠãããã®ã§ãããã«ã€ããŠè©±ãåããããšæããŸãã
åœæãšçŸåšã®äž¡æ¹ã§ãã©ã®ãœãªã¥ãŒã·ã§ã³ã§ããŠãŒã¶ãŒããšã©ãŒã«é©åãªã³ã³ããã¹ããè¿œå ããå¯èœæ§ãé«ããªãããšãæ確ãªç®æšã§ãã ãããŠãç§ãã¡ã¯ãããã§ãããšæããŸãããããªããã°ç§ãã¡ã¯ãããææ¡ããªãã£ãã§ãããã
@ tv42 @rsc postã¯ãè¯ãã³ãŒãã®å šäœçãªãšã©ãŒåŠçæ§é ã«é¢ãããã®ã§ãããç§ã¯åæããŸãã ãã®ãã¿ãŒã³ã«æ£ç¢ºã«é©åããªãæ¢åã®ã³ãŒãããããã³ãŒãã«æºè¶³ããŠããå Žåã¯ããã®ãŸãŸã«ããŠãããŸãã
延æ
Gopherconã®ãã§ãã¯/ãã³ãã«ãã©ãããããã®ææ¡ãžã®äž»ãªå€æŽã¯ã defer
ã®åå©çšãåªå
ããŠã handle
ãåé€ããããšã§ããã ããã§ããšã©ãŒã³ã³ããã¹ãã¯ããã®é
延åŒã³åºãã®ãããªã³ãŒãã«ãã£ãŠè¿œå ãããŸãïŒãšã©ãŒã³ã³ããã¹ãã«é¢ãã以åã®ã³ã¡ã³ããåç
§ããŠãã ããïŒã
func CopyFile(src, dst string) (err error) {
defer HelperToBeNamedLater(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
ãã®äŸã®ãšã©ãŒæ³šéã¡ã«ããºã ãšããŠã®å»¶æã®å®è¡å¯èœæ§ã¯ãããã€ãã®ããšã«äŸåããŸãã
_ååä»ããšã©ãŒã®çµæã_ååä»ããšã©ãŒã®çµæãè¿œå ããããšã«ã€ããŠå€ãã®æžå¿µããããŸããã éå»ã«ææžåã®ç®çã§å¿ èŠãšãããªãã£ãå Žåã¯ãããæããšã©ãŸãããŠããã®ã¯äºå®ã§ãããããã¯ãã匷åãªæ±ºå®èŠå ããªãå Žåã«ç§ãã¡ãéžãã æ £ç¿ã§ãã ãŸããéå»ã«ãããŠããããã¥ã¡ã³ãã§ç¹å®ã®çµæãåç §ãããªã©ã®ãã匷åãªæ±ºå®èŠå ã¯ãååã®ãªãçµæã®äžè¬çãªèŠåãäžåããŸããã ããã§ã2çªç®ã«åŒ·åãªæ±ºå®èŠå ããããŸããã€ãŸãã延æã®ãšã©ãŒãåç §ããå¿ èŠããããŸãã ããã¯ãããã¥ã¡ã³ãã§äœ¿çšããããã«çµæã«ååãä»ããããšã»ã©äžå¿«ã§ã¯ãªãããã§ãã å€ãã®äººãããã«å¯ŸããŠããªãåŠå®çãªåå¿ã瀺ããŠãããç§ã¯æ£çŽã«ãã®çç±ãç解ããŠããŸããã 人ã ã¯ãåŒãªã¹ãã®ãªããªã¿ãŒã³ïŒããããããã€ããããªã¿ãŒã³ãïŒãšååä»ãã®çµæãæ··åããŠããããã§ãã åŒãªã¹ããªãã§æ»ããšããã倧ããªé¢æ°ã§æ··ä¹±ãçããå¯èœæ§ãããã®ã¯äºå®ã§ãã é·ãé¢æ°ã§ãããã®æ»ãå€ãåé¿ããããšã§ãã®æ··ä¹±ãåé¿ããããšã¯ãå€ãã®å Žåçã«ããªã£ãŠããŸãã ååã®ä»ããçµæãåããã©ã·ã§ãã€ã³ãããããšã¯ã§ããŸããã
_ã¢ãã¬ã¹åŒã_ãã®ãã¿ãŒã³ã䜿çšããã«ã¯ãGoéçºè ãã¢ãã¬ã¹åŒãç解ããå¿ èŠããããšããæžå¿µãæèµ·ãã人ãããŸãã ãã€ã³ã¿ã¡ãœããã䜿çšããŠå€ãã€ã³ã¿ãŒãã§ã€ã¹ã«æ ŒçŽããã«ã¯ããã§ã«ãããå¿ èŠã§ãããããããã¯é倧ãªæ¬ ç¹ã®ããã«ã¯èŠããŸããã
_Deferèªäœã_æ°ãããŠãŒã¶ãŒãdeferã«æ
£ããŠããªãå¯èœæ§ããããããèšèªã®æŠå¿µãšããŠdeferã䜿çšããããšã«ã€ããŠæžå¿µãè¡šæãã人ãããŸãã ã¢ãã¬ã¹åŒãšåæ§ã«ãdeferã¯æçµçã«åŠç¿ããå¿
èŠã®ããã³ã¢èšèªã®æŠå¿µã§ãã defer f.Close()
ãdefer l.mu.Unlock()
ã®ãããªãã®ã«é¢ããæšæºçãªã€ãã£ãªã ã¯éåžžã«äžè¬çã§ãããããèšèªã®ãããŸããªã³ãŒããŒãšããŠå»¶æãåé¿ããããšãæ£åœåããã®ã¯å°é£ã§ãã
_ããã©ãŒãã³ã¹._é¢æ°ã®å é ã§ã®é 延ã®ãããªäžè¬çãªé 延ãã¿ãŒã³ããåãªã¿ãŒã³ã§æåã§ãã®åŒã³åºããæ¿å ¥ããå Žåãšæ¯èŒããŠããªãŒããŒãããããŒãã«ããããšã«åãçµãã§ããŸããã ç§ãã¡ã¯ãããè¡ãæ¹æ³ãç¥ã£ãŠãããšæãã次ã®GoãªãªãŒã¹ã®ããã«ãããæ¢æ±ããŸãã ãã ããããã§ãªãå Žåã§ãããšã©ãŒã³ã³ããã¹ããè¿œå ããå¿ èŠã®ããã»ãšãã©ã®åŒã³åºãã§ã¯ãçŸåšã®çŽ50nsã®ãªãŒããŒããããæ³å€ãªãã®ã«ãªãããšã¯ãããŸããã ãŸããããã©ãŒãã³ã¹ã«ææãªããã€ãã®åŒã³åºãã¯ãdeferãéããªããŸã§ifã¹ããŒãã¡ã³ãã䜿çšãç¶ããããšãã§ããŸãã
æåã®3ã€ã®æžå¿µã¯ãã¹ãŠãæ¢åã®èšèªæ©èœã®åå©çšã«å¯Ÿããç°è°ã«çžåœããŸãã ããããæ¢åã®èšèªæ©èœãåå©çšããããšã¯ããã§ãã¯/åŠçããããŸãã«ãã®ææ¡ã®é²æ©ã§ããã³ã¢èšèªã«è¿œå ãããã®ãå°ãªããåŠç¿ããæ°ããéšåãå°ãªããé©ãã¹ãçžäºäœçšãå°ãªããªããŸãã
ããã§ãããã®æ¹æ³ã§deferã䜿çšããã®ã¯æ°ããããšã§ãããå¿ èŠãªãšã©ãŒåŠçã€ãã£ãªã ã«å¯ŸããŠdeferãå®éã«ååã«æ©èœãããã©ãããè©äŸ¡ããæéã人ã ã«äžããå¿ èŠãããããšãç解ããŠããŸãã
æšå¹Ž8æã«ãã®ãã£ã¹ã«ãã·ã§ã³ãéå§ããŠä»¥æ¥ãç§ã¯ããã®ã³ãŒãã¯ãã§ãã¯/ãã³ãã«ã§ã©ã®ããã«èŠãããããšããã¡ã³ã¿ã«ãšã¯ãµãµã€ãºãè¡ã£ãŠããŸããã ãããŠæè¿ã§ã¯ãtry / deferã§ïŒã æ°ããã³ãŒããæžããã³ã«ã éåžžãçãã¯ãã³ã³ããã¹ãããã¹ãŠã®ãªã¿ãŒã³ã§è¿œå ãããããå®å šã«çç¥ããããããã®ã§ã¯ãªãã1ã€ã®å ŽæïŒå»¶æïŒã«è¿œå ããããç°ãªããããè¯ãã³ãŒããäœæããããšãæå³ããŸãã
ãšã©ãŒã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããããã«é 延ãã³ãã©ãŒã䜿çšãããšããèããèãããšãåçŽãªã©ã€ãã©ãªããã±ãŒãžã§æå¹ã«ã§ããããŸããŸãªãã¿ãŒã³ããããŸãã ããã«ã€ããŠãã£ãšèããããã«ïŒ32676ãæåºããŸãããããã®åé¡ã§ããã±ãŒãžAPIã䜿çšãããšãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func CopyFile(src, dst string) (err error) {
defer errd.Add(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
CopyFileããããã°ããŠããŠãè¿ããããšã©ãŒãšã¹ã¿ãã¯ãã¬ãŒã¹ã確èªãããå ŽåïŒãããã°å°å·ãæ¿å ¥ãããå Žåãšåæ§ïŒã次ã䜿çšã§ããŸãã
func CopyFile(src, dst string) (err error) {
defer errd.Trace(&err)
defer errd.Add(&err, "copy %s %s", src, dst)
r := check os.Open(src)
defer r.Close()
w := check os.Create(dst)
...
}
çã ã
ãã®ããã«deferã䜿çšãããšãããªã匷åã«ãªããŸãããŸããé¢æ°ã®å é ã«ãããããã¹ãŠã®ãšã©ãŒã§å®è¡ããããšèšè¿°ããŠãæ®ãã®éšåã«ã€ããŠå¿é ããå¿ èŠããªããšãããã§ãã¯/ãã³ãã«ã®å©ç¹ãä¿æãããŸããäœã ããã«ãããæ©æã®ã¯ã€ãã¯çµäºãšã»ãŒåãæ¹æ³ã§èªã¿ããããåäžããŸãã
ããã¯å®éã«æ©èœããŸããïŒ ç¥ãããã
æ°ã¶æéãèªåã®ã³ãŒãã§å»¶æãã©ã®ããã«èŠãããã«ã€ããŠã®ç²Ÿç¥çãªå®éšãè¡ã£ãã®ã§ãããã¯ããŸãããå¯èœæ§ãé«ããšæããŸãã ããããã¡ãããå®éã®ã³ãŒãã§ããã䜿çšããããšã¯å¿ ãããåãã§ã¯ãããŸããã 調ã¹ãããã«å®éšããå¿ èŠããããŸãã
人ã
ã¯ä»æ¥ã if err != nil
ã¹ããŒãã¡ã³ããæžãç¶ããããšã§ãã®ã¢ãããŒããè©Šãããšãã§ããŸãããdeferãã«ããŒãã³ããŒããå¿
èŠã«å¿ããŠããããå©çšããŸãã ãããè¡ãåŸåãããå Žåã¯ãåŠãã ããšããç¥ãããã ããã
@ tv42 ã@ griesemerã«åæããŸãã ååã®å€æŽããæçµåãã¹ãããã§ãããªã©ãæ¥ç¶ãã¹ã ãŒãºã«ããããã«è¿œå ã®ã³ã³ããã¹ããå¿ èŠã§ããããšãããã£ãå Žåã¯ãifã¹ããŒãã¡ã³ãã䜿çšããŠè¿œå ã®ã³ã³ããã¹ããè¿œå ããŠãåé¡ã¯ãããŸããã ãã ããå€ãã®é¢æ°ã§ã¯ããã®ãããªè¿œå ã®ã³ã³ããã¹ãã¯ã»ãšãã©å¿ èŠãããŸããã
@ guybrand ãtryhardã®æ°å€ã¯çŽ æŽãããã§ãããç¹å®ã®äŸãå€æãããªãã£ãçç±ã®èª¬æãããã«é©åã§ãããããã«ãå€æã§ããããã«æžãçŽãã®ã¯äžé©åã§ããã @ tv42ã®äŸãšèª¬æã¯ãã®äžäŸã§ãã
延æã«ã€ããŠã®ããªãã®æžå¿µã«ã€ããŠ@griesemer ã ç§ã¯ãã®emit
ãŸãã¯æåã®ææ¡handle
ã«è¡ããŸããã err
emit/handle
ãåŒã³åºãããŸãã ãããŠãé¢æ°ã®çµããã§ã¯ãªãããã®ç¬éã«éå§ããŸãã 延æã¯æåŸã«åŒã³åºãããŸãã emit/handle
err
ãnilã§ãããã©ããã«åºã¥ããŠãé¢æ°ãçµäºããŸãã ãã®ããã延æã¯æ©èœããŸããã
ããã€ãã®ããŒã¿ïŒ
ã裞ã®ãšã©ãŒãªã¿ãŒã³ããå®æçã«æé€ããããã«ç§ãæãããçŽ70kã®LOCãããžã§ã¯ãã®ãã¡ããŸã 612ã®è£žã®ãšã©ãŒãªã¿ãŒã³ããããŸãã äž»ã«ãšã©ãŒããã°ã«èšé²ãããå Žåãæ±ããŸãããã¡ãã»ãŒãžã¯å éšçã«ã®ã¿éèŠã§ãïŒãŠãŒã¶ãŒãžã®ã¡ãã»ãŒãžã¯äºåå®çŸ©ãããŠããŸãïŒã ãã ããtryïŒïŒã¯ããã€ããããªã¿ãŒã³ããšã«2è¡ãããå€§å¹ ã«ç¯çŽãããŸããããã¯ãäºåå®çŸ©ããããšã©ãŒã䜿çšããŠããã³ãã©ãŒã延æããããå€ãã®å Žæã§tryã䜿çšã§ããããã§ãã
ããã«èå³æ·±ãããšã«ããã³ããŒãã£ã¬ã¯ããªã§ã¯ãçŽ62äžä»¥äžã®LOCã®ãã¡ã1600ã®ãã€ããããšã©ãŒãè¿ãããŸãã ç§ãã¡ãéžæããã©ã€ãã©ãªã¯ãç§ãã¡ãããããã«å®æçã«ãšã©ãŒãè£ é£ŸããåŸåããããŸãã
@rscåŸã§ããã³ãã©ãŒãtry
ã«è¿œå ãããå Žåã func Wrap(msg string) func(error) error
ã®ãããªé¢æ°ãå«ãerrors / errcããã±ãŒãžãããã®ã§ã try(f(), errc.Wrap("f failed"))
ãå®è¡ã§ããŸããïŒ
@ damienfamed75ã説æããããšãããããŸãã ãããã£ãŠã emit
ã¯ã try
ããšã©ãŒãæ€åºãããšãã«åŒã³åºããããã®ãšã©ãŒã§åŒã³åºãããŸãã ããã¯ååã«æãããªããã§ãã
ãŸãããšã©ãŒãçºçããå Žåã¯emit
ãé¢æ°ãçµäºãããšã©ãŒãäœããã®æ¹æ³ã§åŠçãããå Žåã¯çµäºããªããšèšã£ãŠããŸãã é¢æ°ãçµäºããªãå Žåãã³ãŒãã¯ã©ãã«é²ã¿ãŸããïŒ ããããtry
ããæ»ããšïŒããã§ãªããã°ãé¢æ°ãçµäºããªãemit
ãããããŸããïŒã ãã®å Žåã try
if
ã䜿çšããæ¹ãç°¡åã§æ確ã§ã¯ãªãã§ããããã emit
ãŸãã¯handle
ã䜿çšãããšããããã®å Žåãç¹ã«emit
å¥ãé¢æ°ã®å®å
šã«ç°ãªãéšåïŒãããã以åïŒã«ããå¯èœæ§ããããããå¶åŸ¡ãããŒãéåžžã«ãããã«ãããªããŸãã ïŒãã®ç¹ã§ãè€æ°ã®emit
ãæã€ããšãã§ããŸããïŒããã§ãªãå Žåã¯ããªãã§ããïŒ emit
ããªãå Žåã¯ã©ããªããŸããïŒå
ã®check
ãæ©ãŸããã®ãšåã質åããããããããŸãhandle
ãã©ãããã¶ã€ã³ãïŒ
ãšã©ãŒè£
食以å€ã®äœåãªäœæ¥ãè¡ããã«ããŸãã¯åžžã«åãäœæ¥ã§é¢æ°ããæ»ãããå Žåã«ã®ã¿ã try
ãšããçš®ã®ãã³ãã©ãŒã䜿çšããã®ãçã«ããªã£ãŠããŸãã ãããŠãé¢æ°ãæ»ãåã«å®è¡ããããã®ãã³ãã©ãŒã¡ã«ããºã ã¯ããã§ã«defer
ã«ååšããŸãã
@guybrand ïŒããã³@griesemerïŒã®2çªç®ã®èªèãããªããã¿ãŒã³ã«ã€ããŠã¯ã httpsïŒ//github.com/griesemer/tryhard/issues/2ãåç §ããŠãã ããã
@daved
å ¬éããã»ã¹ã®å€ããææ ã«ãã£ãŠæšé²ãããŠããå ŽåãããŒã¿ããã©ã®ããã«äŸ¡å€ãå°ãåºãããŸããïŒ
ããããä»ã®äººã¯ããã§å ±åãããç§ã®ãããªçµéšãæã£ãŠãããããããŸããã tryhard
ã«ãã£ãŠæ¿å
¥ããã$ try
ã®ããã€ãã®ã€ã³ã¹ã¿ã³ã¹ãããã£ãŠããã®ã¹ã¬ããã«ãã§ã«ååšãããã®ãšã»ãŒåãããã«èŠããããšã確èªããŠã次ã«é²ãããšãæåŸ
ããŠããŸããã 代ããã«ããããŸã§è°è«ãããŠããªãã£ãæ¹æ³ã§ã try
ãæããã«åªããã³ãŒãã«ã€ãªããã±ãŒã¹ãèŠã€ããŠé©ããã
ãããã£ãŠãå°ãªããšãåžæã¯ãããŸãã :)
tryhard
ãè©ŠããŠãã人ã¯ããŸã è¡ã£ãŠããªãå Žåã¯ãããŒã«ãã©ã®ãããªå€æŽãå ãããã確èªããã ãã§ãªãã err != nil
ã®æ®ãã®ã€ã³ã¹ã¿ã³ã¹ãgrepããŠç¢ºèªããããšããå§ãããŸãããããæŸã£ãŠããããã®ãšãã®çç±ã
ïŒãŸããhttpsïŒ//github.com/griesemer/tryhard/ã«ããã€ãã®åé¡ãšPRãããããšã«æ³šæããŠãã ãããïŒ
@rscã¯ãç§ãå人çã«defer HandleFunc(&err, ...)
ãã¿ãŒã³ã奜ãã§ã¯ãªãçç±ã«ã€ããŠã®ç§ã®æŽå¯ã§ãã ããã¯ç§ãããã裞ã®ãªã¿ãŒã³ãäœããšé¢é£ä»ããããã§ã¯ãªãããã ãè³¢ãããšæããŸãã
æ°ãæåïŒãããã1幎åïŒïŒã«ãšã©ãŒåŠçã®ææ¡ããããŸããããä»ã¯ãããèŠå€±ã£ãŠããŸãã ç§ã¯ãããäœãèŠæ±ããŠããããå¿ããŸãããããã誰ãã次ã®ãããªç·ã«æ²¿ã£ãŠäœãã§å¿çããŸããïŒ
func myFunction() (i int, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("wrapping the error: %s", err)
}
}()
// ...
return 0, err
// ...
return someInt, nil
}
æ§ããã«èšã£ãŠãé¢çœãã£ãã§ãã defer
ããšã©ãŒåŠçã«äœ¿çšãããã®ãèŠãã®ã¯åããŠã§ããããçŸåšã¯ããã«è¡šç€ºãããŠããŸãã ç§ã¯ããããè³¢ãããããŠãããããŒããšèŠãŠããŸãããããŠå°ãªããšãç§ãè²ãŠãäŸã§ã¯ãããã¯å²ç¢ã®ããã«ã¯æããŸããã ãã ãã fmt.HandleErrorf
ã®ãããªé©åãªé¢æ°åŒã³åºãã§ã©ãããããšãã¯ããã«å¿«é©ã«ãªããŸãã ããããç§ã¯ãŸã ããã«åŠå®çã«æããŠããŸãã
人ã
ãããã奜ãŸãªãã®ãèŠãããšãã§ããããäžã€ã®çç±ã¯ã return ..., err
ãæžããšãã err
ãè¿ãããã¹ãã§ããããã«èŠãããšããããšã§ãã ãã ããè¿ãããŸããã代ããã«ãéä¿¡åã«å€ãå€æŽãããŸãã return
ã¯ãGoã§ã¯åžžã«ãç¥èãªãæäœã®ããã«èŠããå®éã«æ»ãåã«æ»ãå€ãå€æŽããã³ãŒãã奚å±ããããšã¯ãééã£ãŠãããšæããŸãã
OKãæ°åãšããŒã¿ã§ãã :)
ãã€ã¯ããµãŒãã¹ãã©ãããã©ãŒã ã®ããã€ãã®ãµãŒãã¹ã®ãœãŒã¹ã§tryhardãå®è¡ããloccountããã³grep'iferr 'ã®çµæãšæ¯èŒããŸããã loccount / grep'if err '|ã®é åºã§æ¬¡ã®çµæãåŸãããŸããã wc / tryhardïŒ
1382/64/14
108554/66/5
58401 / 22/5
2052/247/39
12024/1655/1
äžéšã®ãã€ã¯ããµãŒãã¹ã¯å€ãã®ãšã©ãŒåŠçãå®è¡ããäžéšã¯ã»ãšãã©å®è¡ããŸããããæ®å¿µãªãããtryhardã¯ã³ãŒããèªåçã«æ¹åããããšããã§ããŸããã§ããããããã22ïŒ
ãããã«æªãããšã«1ïŒ
æªæºã§ããã ããã§ã¯ããšã©ãŒåŠçãæåã§æžãçŽãããšã¯ãªããããã³ãŒãããŒã¹ã«try()
ãå°å
¥ããã«ã¯ãtryhardãªã©ã®ããŒã«ãäžå¯æ¬ ã§ãã ãããåçŽãªäºåããŒã«ã§ããããšãæè¬ããŸããããããã»ãšãã©åœ¹ã«ç«ããªãã£ãããšã«é©ããŸããã
ããããä»ã§ã¯ãæ°åãæå ã«ããã®ã§ãtryïŒïŒã¯å®éã«ã¯åé¡ã解決ããŠããªãããŸãã¯å°ãªããšãtryhardãã¯ããã«è¯ããªããŸã§ã¯è§£æ±ºããŠããªããšèšããŸãã
ãŸããã³ãŒãããŒã¹ã§ã if err != nil { return err }
ã®try()
$ã®ãŠãŒã¹ã±ãŒã¹ã¯ãäžè¬çãªgoã³ã³ãã€ã©ãšã¯ç°ãªããå®éã«ã¯éåžžã«ãŸãã§ããããšãããããŸããã æ¬æãè¡šããŸãããGoã³ã³ãã€ã©ã®ãœãŒã¹ã³ãŒããä»ã®ã³ãŒãããŒã¹ãããã¯ããã«é »ç¹ã«èŠãŠããGoèšèšè
ã¯ããã®ããã«try()
ã®æçšæ§ãé倧è©äŸ¡ããŠãããšæããŸãã
@beoran tryhard
ã¯ãçŸæç¹ã§ã¯éåžžã«åæ©çãªãã®ã§ãã try
ãã³ãŒãããŒã¹ã§ãŸãã§ããæãäžè¬çãªçç±ã«ã€ããŠç解ããŠããŸããïŒ ããšãã°ããšã©ãŒã食ãããã§ããïŒ æ»ãåã«ä»ã®äœåãªä»äºãããŠããããã§ããïŒ ä»ã«äœããããŸããïŒ
@ rsc ã @ griesemer
äŸãšããŠãtryHardãèŠéãã2ã€ã®ç¹°ãè¿ããµã³ãã«ãããã«ç€ºããŸãããäžæ¹ã¯ãããããifErrïŒ=ãã®ãŸãŸã§ãããäžæ¹ã¯è§£æ±ºãããå¯èœæ§ããããŸã
ãšã©ãŒãã³ã¬ãŒã·ã§ã³ã«é¢ããŠã¯ãã³ãŒãã«èŠããã2ã€ã®ç¹°ãè¿ããã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãïŒ2ã€ã1ã€ã®ã³ãŒãã¹ããããã«å ¥ããŸãïŒã
if v, err := someFunction(vars...) ; err != nil {
return fmt.Errorf("extra data to help with where did error occur and params are %s , %d , err : %v",
strParam, intParam, err)
} else if v2, err := passToAnotherFunc(v,vars ...);err != nil {
extraData := DoSomethingAccordingTo(v2,err)
return formatError(err,extraData)
} else {
}
ãããŠãå€ãã®å ŽåãformatErrorã¯ã¢ããªã®æšæºã§ããããã¯ãã¹ãªããžããªã§ãããã»ãšãã©ã®å ŽåãDbErrorãã©ãŒãããïŒãã¹ãŠã®ã¢ããª/ã¢ããªã§1ã€ã®é¢æ°ãæ°åã®å Žæã§äœ¿çšãããŸãïŒãå Žåã«ãã£ãŠã¯ïŒãããã¯æ£ãããã¿ãŒã³ãïŒãã°ã«ããŒã¿ãä¿åãïŒã¹ã¿ãã¯ãæž¡ããããªãSQLã¯ãšãªã倱æããå ŽåïŒããã®ä»ã®ããã¹ãããšã©ãŒã«ä¿åããŸãã
èšãæããã°ãããšã©ãŒAã®ãã°èšé²ããšã©ãŒBã®çºçãªã©ãè¿œå ã®ããŒã¿ã䜿ã£ãŠã¹ããŒãã«äœãããããå Žåã¯ããšã©ãŒåŠçãæ¡åŒµããããã®ããã2ã€ã®ãªãã·ã§ã³ã«ã€ããŠã®èšåã«å ããŠ
ããã¯ãããšã©ãŒãè¿ãããä»ã®èª°ãããŸãã¯ãä»ã®æ©èœãã«åŠçãããã ãã§ã¯ãªãããšããå¥ã®ãªãã·ã§ã³ã§ãã
ã€ãŸãããå®è¡å¯èœããã°ã©ã ãããããã©ã€ãã©ãªãã®æ¹ãtryïŒïŒã®äœ¿çšæ³ãå€ãããšãæå³ããŸãããããããã©ã€ãã©ãªãšå®è¡å¯èœãã¡ã€ã«ïŒãã¢ããªãïŒãåºå¥ããTotal / Errs / tryHardæ¯èŒãå®è¡ããããšããŸãã
https://github.com/golang/go/issues/32437#issuecomment-503297387ã«èšèŒãããŠããç¶æ³ã«æ£ç¢ºã«èªåèªèº«ãèŠã€ããŸãã
äžéšã®ã¬ãã«ã§ã¯ããšã©ãŒãåå¥ã«ã©ããããŸããããã¯try
ã§å€æŽããŸããã if err!=nil
ã§åé¡ãããŸããã
ä»ã®ã¬ãã«ã§ã¯ã return err
ã ãã§ããã¹ãŠã®ãªã¿ãŒã³ã«åãã³ã³ããã¹ããè¿œå ããã®ã¯é¢åã§ãããã®åŸã try
ãšdefer
ã䜿çšããŸãã
ãšã©ãŒãçºçããå Žåã«åããŠãé¢æ°ã®éå§æã«äœ¿çšããç¹å®ã®ãã¬ãŒã䜿çšããŠãããããã§ã«å®è¡ããŠããŸãã ç§ã«ãšã£ãŠtry
ã§ãæ©èœã«ããè£
食ã¯ãã§ã«ãããã§ãã
@thepudds
try
ãGo 1.15ã®ãããªãã®ã«ä»®æ³çã«çéžããå Žåãããªãã®è³ªåã«å¯Ÿããéåžžã«çãçãã¯ã誰ããGo1.13ã䜿çšããŠãããšããããšã§ãã
Go 1.13ã¯ãŸã ãªãªãŒã¹ãããŠããªãã®ã§ã䜿çšã§ããŸããã ãŸããç§ã®ãããžã§ã¯ãã§ã¯Goã¢ãžã¥ãŒã«ã䜿çšããŠããªããããGo1.13ã«ã¢ããã°ã¬ãŒãããããšã¯ã§ããŸããã ïŒGo 1.13ã§ã¯å šå¡ãGoã¢ãžã¥ãŒã«ã䜿çšããå¿ èŠããããšæããŸãïŒ
try
ã§ã³ãŒãããã«ããããšã次ã®ãããªã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã.\hello.go:3:16: undefined: try note: module requires Go 1.15
ïŒå°ãªããšãã移è¡ææ¡ã«ã€ããŠè¿°ã¹ãããŠããããšãç解ããŠããéãïŒã
ããã¯ãã¹ãŠæ¶ç©ºã®ãã®ã§ãã æ¶ç©ºã®ãã®ã«ã€ããŠã³ã¡ã³ãããã®ã¯é£ããã§ãã ãããŠãããªãã¯ãã®ãšã©ãŒã奜ããããããŸããããç§ã¯ãããæ··ä¹±ããŠåœ¹ã«ç«ããªããšæããŸãã
tryãå®çŸ©ãããŠããªãå Žåã¯ãgrepããŸãã ãããŠãç§ã¯äœãèŠã€ãããŸããã ãããªãã©ãããã°ããã§ããïŒ
ãããŠã note: module requires Go 1.15
ã¯ããã®ç¶æ³ã§ææªã®å©ãã«ãªããŸãã ãªãmodule
ïŒ ãªãGo 1.15
ïŒ
@griesemer
ããã¯ãããããããå®è³ªçãªæ¹æ³ã§èšèªã®æ觊ã«åœ±é¿ãäžããæåã«ææ¡ãããèšèªå€æŽã§ãã ç§ãã¡ã¯ãããèªèããŠããã®ã§ããããæå°éã«æããŸããã ïŒå ·äœçãªãžã§ããªãã¯å»è¬åã®ææ¡ãåŒãèµ·ããå¯èœæ§ã®ããéšåãæ³åããã®ã¯é£ããã§ã-èšèªã®å€åã«ã€ããŠè©±ããŸãïŒã
è©ŠããŠã¿ããããããžã§ããªãã¯å»è¬åã«æéãè²»ãããã»ããããã§ãã ãã¶ããGoã«ãžã§ããªãã¯ã¹ãå«ããããšã«ã¯å©ç¹ããããŸãã
ããããããªãã®ãã€ã³ãã«æ»ããšãããã°ã©ããŒã¯ããã°ã©ãã³ã°èšèªãã©ã®ããã«æ©èœããæããŠãããã«æ £ããŠããŸãã ..ã
ç§ã¯ããªãã®ãã¹ãŠã®ç¹ã«åæããŸãã ããããifã¹ããŒãã¡ã³ãã®ç¹å®ã®åœ¢åŒãtryé¢æ°åŒã³åºãã«çœ®ãæããããšã«ã€ããŠè©±ããŠããŸãã ããã¯ãåçŽããšçŽäº€æ§ã«èªããæã£ãŠããèšèªã§ãã ç§ã¯ãã¹ãŠã«æ £ããããšãã§ããŸããããã€ã³ãã¯äœã§ããïŒ æ°è¡ã®ã³ãŒããä¿åããã«ã¯ïŒ
ãŸãã¯ã次ã®æèå®éšãèããŠã¿ãŠãã ãããGoã«
defer
ã¹ããŒãã¡ã³ãããªãã誰ããdefer
ã匷ã䞻匵ããŠãããšããŸããdefer
ã«ã¯ããã®èšèªã®ä»ã®èšèªã®ãããªã»ãã³ãã£ã¯ã¹ã¯ãããŸãããæ°ããèšèªã¯ãdefer
以åã®ããã«ã¯æããããŸããã ããã§ãã10幎éãããšäžç·ã«æ®ãããåŸãããã¯å®å šã«ããŽãŒã©ã€ã¯ãã®ããã«èŠããŸãã
äœå¹Žãçµã£ãä»ã§ãã defer
ã®æ¬äœã«ã ãŸãããŠãå€æ°ãéããŠããŸãã ãããã defer
ã¯ããªãœãŒã¹ç®¡çã«é¢ããŠã¯ã¹ããŒãã§ãã®ä»£åãæã£ãŠããŸãã defer
ãªãã§Goãæ³åããããšã¯ã§ããŸããã ããããããã§ã¯ã¡ãªãããèŠåœãããªãããã try
ã«åæ§ã®äŸ¡æ Œãæ¯æãæºåã¯ã§ããŠããŸããã
ãã®ãããç¬èªã®ã³ãŒãã§å®éšããŠå®éã«å€æŽã«åãçµãããã«äººã ã«æ±ããŠããŸãã ã€ãŸããå®éã«ãããæžãããæ¢åã®ã³ãŒãã«å¯ŸããŠ
tryhard
ãå®è¡ããŠãçµæãæ€èšããŸãã ãã°ããããããã1é±éã»ã©ãã®ãŸãŸã«ããŠããããšããå§ãããŸãã ããäžåºŠèŠãŠãå ±åããŠãã ããã
ç§ã®å°ããªãããžã§ã¯ãïŒçŽ1200è¡ã®ã³ãŒãïŒãå€æŽããŠã¿ãŸããã ãããŠããã¯https://go-review.googlesource.com/c/go/+/182717/1/src/cmd/link/internal/ld/macho_combine_dwarf.goã§ã®ããªãã®å€æŽã«äŒŒãŠããŸãç§ã¯ç§ã®æèŠãèŠãŠããŸãã1é±éåŸã«ããã«ã€ããŠå€æŽããŸãã ç§ã®å¿ã¯ãã€ãäœãã«å€¢äžã«ãªã£ãŠããŠãå¿ããŠããŸããŸãã
...ããããããã¯ãŸã æ©ãã§ãããã®ææ¡ã¯2é±éããåºãŠããŸãã...
ãããŠããã®ã¹ã¬ããã ãã§ããã®ææ¡ã«é¢ãã504ã®ã¡ãã»ãŒãžããã§ã«ããããšãããããŸãã ãã®å€æŽãæšé²ããããšã«èå³ãããå Žåã¯ãããããã¹ãŠèªãã§ç解ããã ãã§ãæ°é±éã§ã¯ãªãã«ããŠãæ°æ¥ããããŸãã ç§ã¯ããªãã®ä»äºãããããŸãããªãã
ç§ã®ã¡ãã»ãŒãžã«è¿ä¿¡ããããã«æéãå²ããŠããã ãããããšãããããŸãã ç³ãèš³ãããŸãããããã®ã¹ã¬ããã«è¿ä¿¡ããªãå Žåã¯ãã¡ãã»ãŒãžãç§å®ãŠã§ãããã©ããã«ããããããç£èŠããã«ã¯å€§ããããŸãã
ã¢ã¬ãã¯ã¹
@griesemerçŽ æŽãããææ¡ãããããšãããããŠtryhardã¯ç§ãæåŸ ãããããã£ãšåœ¹ã«ç«ã€ããã§ãã ç§ãæè¬ããããšæããŸãã
@rscã¯ãæ確ã«è¡šçŸãããå¿çãšããŒã«ã«æè¬ããŸãã
ãã°ãããã®ã¹ã¬ããããã©ããŒããŠããŠã @ beoranã«ãã次ã®ã³ã¡ã³ãã¯ç§ã«æªå¯ãäžããŸã
ãšã©ãŒå€æ°ãšæ»ãå€ãé衚瀺ã«ããŠããç解ãããããªããŸããã
ãããŸã§ã«ããã€ãã®bad written code
ã管çããããšããããŸãããããã¯ãã¹ãŠã®éçºè
ã«ãšã£ãŠææªã®æªå€¢ã§ãããšèšŒèšã§ããŸãã
ããã¥ã¡ã³ãã«A
ã®ãããã䜿çšãããšæžãããŠãããšããäºå®ã¯ãããã«åŸããšããæå³ã§ã¯ãããŸããã AA
ã AB
ã䜿çšã§ããå Žåã¯ããã®æ¹æ³ã«å¶éã¯ãããŸããã䜿çšã§ããŸãã
To my surprise, people already think the code below is cool
... it's an abomination
ã¯ãæ°åã害ãã人ã«ã¯æ¬æãè¡šããŠè¬çœªããŸãã
parentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit())
parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
AsCommit
ããã§ãã¯ããŠã衚瀺ããããŸã§åŸ
ã¡ãŸã
func AsCommit() error(){
return try(try(try(tail()).find()).auth())
}
çæ°ã¯ç¶ããæ£çŽãªãšãããããã@robpikeã®å®çŸ©ã ãšã¯ä¿¡ããããããŸããsimplicity is complicated
ïŒãŠãŒã¢ã¢ïŒ
@rscã®äŸã«åºã¥ã
// Example 1
headRef := try(r.Head())
parentObjOne := try(headRef.Peel(git.ObjectCommit))
parentObjTwo := try(remoteBranch.Reference.Peel(git.ObjectCommit))
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
treeOid := try(index.WriteTree())
tree := try(r.LookupTree(treeOid))
// Example 2
try headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid)
// Example 3
try (
headRef := r.Head()
parentObjOne := headRef.Peel(git.ObjectCommit)
parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try (
treeOid := index.WriteTree()
tree := r.LookupTree(treeOid)
)
å°ãelse
ã§Example 2
ãæ¯æããŠããŸãããããã¯æåã®ã¢ãããŒãã§ã¯ãªãå¯èœæ§ãããããšã«æ³šæããŠãã ãã
abomination
ã«å€ç°ããå¯èœæ§ã¯ã»ãšãã©ãããŸããtry
ã¯éåžžã®é¢æ°ã®ããã«ã¯åäœããŸããã é¢æ°ã®ãããªæ§æãäžããããšã¯ã»ãšãã©ãããŸããã go
ã¯if
ã䜿çšããŸããã try tree := r.LookupTree(treeOid) else {
ã«å€æŽã§ããã°ãããèªç¶ã«æããããŸãtry
ãšcatch
ããµããŒãããªãã£ãçç±ã ãšæããŸããtry headRef := r.Head()
try parentObjOne := headRef.Peel(git.ObjectCommit)
try parentObjTwo := remoteBranch.Reference.Peel(git.ObjectCommit)
parentCommitOne := parentObjOne.AsCommit()
parentCommitTwo := parentObjTwo.AsCommit()
try treeOid := index.WriteTree()
try tree := r.LookupTree(treeOid) else {
// Heal the world
// I may return with return keyword
// I may not return but set some values to 0
// I may remember I need to log only this
// I may send a mail to let the cute monkeys know the server is on fire
}
ããäžåºŠãå°ãå©å·±çã§ããããšããè©«ã³ããããšæããŸãã
@josharianããã§ã¯ããŸãæããããšã¯ã§ããŸããããçç±ã¯ããªãå€æ§ã§ãã ãã£ãããããã«ããšã©ãŒãè£
食ããããããŸããŸãªåŠçãè¡ã£ããããŸãããŸããéèŠãªãŠãŒã¹ã±ãŒã¹ã¯ããšã©ãŒããã°ã«èšé²ããããšã§ãããã°ã¡ãã»ãŒãžã¯ãé¢æ°ãè¿ãå¯èœæ§ã®ãããšã©ãŒããšã«ç°ãªããŸãããŸãã¯ã if err := foo() ; err != nil { /* various handling*/ ; return err }
ã䜿çšããããã§ãã
ç§ã匷調ãããã®ã¯ãããã§ãã try()
ãèšèšãããŠããåçŽãªãŠãŒã¹ã±ãŒã¹ã¯ãã³ãŒãããŒã¹ã§ã¯ãã£ãã«çºçããŸããã ãããã£ãŠãç§ãã¡ã«ãšã£ãŠãèšèªã«ãtryïŒïŒããè¿œå ããããšã§åŸãããããšã¯ããŸããããŸããã
ç·šéïŒtryïŒïŒãå®è£ ããå Žåã次ã®ã¹ãããã¯tryhardãã¯ããã«æ¹åããããšã§ãããšæããŸããããããã°ãæ¢åã®ã³ãŒãããŒã¹ãã¢ããã°ã¬ãŒãããããã«åºã䜿çšã§ããŸãã
@griesemerç§ã¯ããªãã®æåŸã®å¿çããããªãã®ãã¹ãŠã®æžå¿µã«äžã€ãã€å¯ŸåŠããããšããŸãã
æåã«ããã³ãã©ãŒãäœããã®æ¹æ³ã§é¢æ°ãè¿ããªããçµäºããªããã©ãããå°ãããšãããã©ããªãã§ããããã ã¯ãã emit
/ handle
å¥ãé¢æ°ãè¿ãããçµäºããããããäžæãããšããããåéããå ŽåããããŸãã ããšãã°ããªãŒããŒã䜿çšããŠåºåãæåãªã©ã®åçŽãªãã®ãèŠã€ããããšããŠã EOF
ã«å°éããå Žåããããããããããšãã«ãšã©ãŒãè¿ããããªãå ŽåããããŸãã ããã§ãç§ã¯ãããã©ã®ããã«èŠãããã«ã€ããŠã®ãã®ç°¡åãªäŸãäœæããŸããïŒ
func findDelimiter(r io.Reader) ([]byte, error) {
emit err {
// if this doesn't return then continue from where we left off
// at the try function that was called last.
if err != io.EOF {
return nil, err
}
}
bufReader := bufio.NewReader(r)
token := try(bufReader.ReadSlice('|'))
return token, nil
}
ãŸãã¯ãããã«ããã«ç°¡ç¥åããããšãã§ããŸãã
func findDelimiter(r io.Reader) ([]byte, error) {
emit err != io.EOF {
return nil, err
}
bufReader := bufio.NewReader(r)
token := try(bufReader.ReadSlice('|'))
return token, nil
}
2çªç®ã®æžå¿µã¯ãå¶åŸ¡ãããŒã®äžæã«é¢ãããã®ã§ããã ãããŠãã¯ããããã¯ãããŒãæ··ä¹±ãããã§ãããããå
¬å¹³ãæãããã«ãææ¡ã®ã»ãšãã©ã¯ã1ã€ã®äžå€®ãšã©ãŒåŠçæ©èœãªã©ââãæã€ããã«ãããŒãããããæ··ä¹±ãããŠããŸãã ãããéãã¯ãªããšæããŸãã
次ã«ã emit
/ handle
ãè€æ°å䜿çšãããã©ããã«ã€ããŠè³ªåãããŸããããåå®çŸ©ããããšèšã£ãŠããŸãã
emit
ãè€æ°å䜿çšãããšãæåŸã®ãã®ãäžæžããããŸãã äœãæã£ãŠããªãå Žåã try
ã«ã¯ãnilå€ãšãšã©ãŒãè¿ãã ãã®ããã©ã«ããã³ãã©ãŒããããŸãã ã€ãŸãããã®äŸã¯æ¬¡ã®ãšããã§ãã
func writeStuff(filename string) (io.ReadCloser, error) {
emit err {
return nil, err
}
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
ãã®äŸãšåãããšãããŸãïŒ
func writeStuff(filename string) (io.ReadCloser, error) {
// when not defining a handler then try's default handler kicks in to
// return nil valued then error as usual.
f := try(os.Open(filename))
try(fmt.Fprintf(f, "stuff\n"))
return f, nil
}
æåŸã®è³ªåã¯ã defer
ã§åŒã³åºããããã³ãã©ãŒé¢æ°ã宣èšããããšã§ããã error
ãžã®åç
§ãæ³å®ããŠããŸãã ãã®èšèšã¯ã defer
ãæ¡ä»¶èªäœãæå®ããŠé¢æ°ãããã«åæ¢ã§ããªããšããçç±ã§ããã®ææ¡ãæ©èœããã®ãšåãããã«ã¯æ©èœããŸããã
ç§ã¯ããªãã®åçã®ãã¹ãŠã«åãçµãã ãšä¿¡ããŠããããããç§ã®ææ¡ãããå°ãæ確ã«ããããšãé¡ã£ãŠããŸãã ããæ°ã«ãªãããšãããã°æããŠãã ãããã¿ããªãšã®ãã®è©±ãåãå šäœãæ°ããã¢ã€ãã¢ãèããã®ã«ãšãŠã楜ãããšæãããã§ãã çãããçŽ æŽãããä»äºãç¶ããŠãã ããïŒ
@ velovix ãre https://github.com/golang/go/issues/32437#issuecomment -503314834ïŒ
ç¹°ãè¿ãã«ãªããŸãããããã¯ã
try
ããšã©ãŒãžã®åå¿ã§ã¯ãã³ãããŸããããšã©ãŒãžã®ã³ã³ããã¹ãã®è¿œå ã§ã¯ãã³ãããªãããšãæå³ããŸãã ããã¯ç§ãšããããä»ã®äººãã»ã®ããããŠããåºå¥ã§ãã é¢æ°ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããæ¹æ³ã¯èªè ã«ãšã£ãŠç¹ã«éèŠã§ã¯ãªããããããã¯çã«ããªã£ãŠããŸãããé¢æ°ããšã©ãŒã«åå¿ããæ¹æ³ã¯éèŠã§ãã ã³ãŒãã®ããŸãé¢çœããªãéšåã®åé·æ§ãæžããå¿ èŠããããŸãããããtry
ã®æ©èœã§ãã
ããã¯æ¬åœã«ããæ¹æ³ã§ãã ããããšãã
@ olekukonko ãre https://github.com/golang/go/issues/32437#issuecomment -503508478ïŒ
To my surprise, people already think the code below is cool
...it's an abomination
ã¯ãæ°åã害ãã人ã«ã¯æ¬æãè¡šããŠè¬çœªããŸããparentCommitOne := try(try(try(r.Head()).Peel(git.ObjectCommit)).AsCommit()) parentCommitTwo := try(try(remoteBranch.Reference.Peel(git.ObjectCommit)).AsCommit())
https://swtch.com/try.htmlãååŸãããšããã®ã¹ã¬ããã§ãã®åŒã3åçºçããŠããŸãã
@goodwineã¯ãããæªãã³ãŒããšããŠæã¡åºããŸãããç§ã¯åæããŸããããããŠ@velovixã¯ããã®éãã«ãããããã...ããªããtry-catchèšèªã§ãã°ãã°èŠããã®ãããåªããŠããŸã...ããªãã¯ãŸã ã³ãŒãã®ã©ã®éšåãè¿åãããããããªãããç¥ãããšãã§ããã®ã§ãšã©ãŒãåå ã§ãããŒãå¶åŸ¡ã§ããŸãããã
çŽ æŽãããã³ãŒããšããŠåºãã®ãããã£ãããããšããäœãã ãšã¯èª°ãèšããŸããã§ããã ç¹°ãè¿ããŸãããæªãã³ãŒããæžãããšã¯åžžã«å¯èœã§ãã
ç§ãèšããŸã
ãšã©ãŒã¯éåžžã«é«é¡ã«ãªãå¯èœæ§ããããå¯èœãªéãå€ãã®å¯èŠæ§ãå¿ èŠã§ã
Goã®ãšã©ãŒã¯ãè²»çšãããããªãããšãç®çãšããŠããŸãã ãããã¯æ¥åžžã®æ¥åžžçãªåºæ¥äºã§ããã軜éã§ããããšãæå³ããŠããŸãã ïŒããã¯ãç¹ã«äŸå€ã®äžéšã®å®è£ ãšã¯å¯Ÿç §çã§ãããã€ãŠãæ¢ç¥ã®ãªã¹ãããã§ãã¯ããã«ãŒãã§å€±æããããã¡ã€ã«ãªãŒãã³ãåŒã³åºãã®ã¹ã¿ãã¯ãã¬ãŒã¹ãå«ãäŸå€ãªããžã§ã¯ãã®æºåãšç Žæ£ã«CPUæéãè²»ããããµãŒããŒããããŸãããç¹å®ã®ãã¡ã€ã«ã®å ŽæãïŒ
@alexbrainman ãå€ãããŒãžã§ã³ã®Goãã«ãã³ãŒãã«tryãå«ãŸããŠãããšã©ããªããã«ã€ããŠæ··ä¹±ããŠç³ãèš³ãããŸããã ç°¡åã«èšããšãèšèªãå€æŽãããšããšåãã§ããå€ãã³ã³ãã€ã©ã¯ãã»ãšãã©åœ¹ã«ç«ããªãã¡ãã»ãŒãžïŒãã®å Žåã¯ãundefinedïŒtryãïŒã§æ°ããã³ãŒããæåŠããŸãã å€ãã³ã³ãã€ã©ã¯æ°ããæ§æãèªèããŠããããå®éã«ã¯ãã以äžåœ¹ç«ã€ããšãã§ããªãããããã®ã¡ãã»ãŒãžã¯åœ¹ã«ç«ã¡ãŸããã 人ã ã¯ãã®æç¹ã§ãããããæªå®çŸ©ã®è©Šã¿ã«è¡ãããšãããŠã§ãæ€çŽ¢ãè¡ããæ°æ©èœã«ã€ããŠç¥ãã§ãããã
@thepuddsã®äŸã§ã¯ãtryã䜿çšããã³ãŒãã«ã¯ãgo1.15ããšããè¡ãå«ãgo.modããããŸããããã¯ãã¢ãžã¥ãŒã«ã®äœæè ããã³ãŒããGoèšèªã®ããŒãžã§ã³ã«å¯ŸããŠèšè¿°ãããŠããããšãæå³ããŸãã ããã¯ãã³ã³ãã€ã«ãšã©ãŒã®åŸã«ããããã圹ã«ç«ããªãã¡ãã»ãŒãžãGoã®ããŒãžã§ã³ãå€ãããããã§ãããšç€ºåãããå€ãgoã³ãã³ããžã®ã·ã°ãã«ãšããŠæ©èœããŸãã ããã¯æããã«ããŠãŒã¶ãŒã«Webæ€çŽ¢ã«é Œãããšãªããã¡ãã»ãŒãžãããå°ã圹ç«ã€ãã®ã«ããè©Šã¿ã§ãã ããã圹ã«ç«ã£ãããè¯ãã§ãã ããã§ãªããã°ããšã«ãããŠã§ãæ€çŽ¢ã¯éåžžã«å¹æçã ãšæãããŸãã
@ guybrand ãre https://github.com/golang/go/issues/32437#issuecomment -503287670ãããŠãããŒãã¢ããã«ã¯é ãããå¯èœæ§ãããããšããè©«ã³ããŸãã
not-quite-errorã¿ã€ããè¿ãé¢æ°ã«é¢ããäžè¬çãªåé¡ã®1ã€ã¯ãéã€ã³ã¿ãŒãã§ãŒã¹ã®å Žåããšã©ãŒãžã®å€æã§nil-nessãä¿æãããªãããšã§ãã ãããã£ãŠãããšãã°ãç¬èªã®ã«ã¹ã¿ã * MyErrorå ·è±¡åïŒããšãã°ãæ§é äœãžã®ãã€ã³ã¿ïŒããããæåã®ã·ã°ãã«ãšããŠerr == nilã䜿çšããå Žåãããã¯æ¬¡ã®ããã«ãªããŸã§ã¯çŽ æŽãããããšã§ãã
func f() (int, *MyError)
func g() (int, error) { x, err := f(); return x, err }
fãnil * MyErrorãè¿ãå Žåãgã¯nil以å€ã®ãšã©ãŒãšåãå€ãè¿ããŸãããããã¯æå³ãããã®ã§ã¯ãªãå¯èœæ§ããããŸãã * MyErrorãæ§é äœãã€ã³ã¿ãŒã§ã¯ãªãã€ã³ã¿ãŒãã§ãŒã¹ã§ããå Žåãå€æã¯nilnessãä¿æããŸãããããã§ã埮åŠã§ãã
tryã®å Žåãtryã¯nil以å€ã®å€ã«å¯ŸããŠã®ã¿ããªã¬ãŒããããããåé¡ã¯ãªããšèãããããããŸããã ããšãã°ãããã¯ãfã倱æãããšãã«nil以å€ã®ãšã©ãŒãè¿ãéãã¯å®éã«ã¯åé¡ãããŸããããŸããfãæåãããšãã«nilãšã©ãŒãè¿ãéããåé¡ãããŸããã
func g() (int, error) {
return try(f()), nil
}
ã§ããããå®éã«ã¯åé¡ãããŸãããããããèŠãŠã次ã®ããã«æžãçŽãããšãèãããããããŸããã
func g() (int, error) {
return f()
}
åãããã«èŠããŸãããããã§ã¯ãããŸããã
å®éã®çµéšã§æ³šææ·±ãæ€èšãšè©äŸ¡ãå¿ èŠãšããè©Šè¡ææ¡ã®è©³çŽ°ã¯ä»ã«ãååã«ããããããã®ç¹å®ã®åŸ®åŠãªç¹ã«ã€ããŠæ±ºå®ããã®ã¯å»¶æããã®ãæåã®ããã«æãããŸãã
ãããŸã§ã®ãã¹ãŠã®ãã£ãŒãããã¯ã«æè¬ããŸãã ãã®æç¹ã§ã try
ã®äž»ãªå©ç¹ãæžå¿µäºé
ãããã³èããããè¯ã圱é¿ãšæªã圱é¿ãç¹å®ããããã§ãã é²æ©ãéããã«ã¯ãå®éã®ã³ãŒãããŒã¹ã«å¯ŸããŠtry
ãäœãæå³ãããã調ã¹ãŠãããããããã«è©äŸ¡ããå¿
èŠããããŸãã ãã®æç¹ã§ã®è°è«ã¯ãåãç¹ãå·¡åããŠç¹°ãè¿ããŠããŸãã
çµéšã¯ãç¶ç¶çãªè°è«ããã䟡å€ããããŸãã try
ãèªåã®ã³ãŒãããŒã¹ã§ã©ã®ããã«è¡šç€ºãããããå®éšãããã£ãŒãããã¯ããŒãžã«ãšã¯ã¹ããªãšã³ã¹ã¬ããŒããäœæããŠãªã³ã¯ããããšããå§ãããŸãã
ã¿ããªã«æ¯ãããŠå®éšããæéãäžããããã«ããã®äŒè©±ãäžæåæ¢ããŠã次ã®1é±éåã®éåé¡ãããã¯ããŸãã
ããã¯ã¯çŽ1pPDT / 4p EDTïŒä»ããçŽ3æéåŸïŒã«éå§ãããä¿çäžã®æçš¿ãéä¿¡ããæ©äŒãæäŸããŸãã 7æ1æ¥ã«ããã«è°è«ããããã«ããã®å·ãåéããŸãã
æéããããŠæ°ããèšèªæ©èœãç解ããå®éã®ã³ãŒãã§å®éã®åé¡ã解決ããŠããããšã確èªããã«ãæ°ããèšèªæ©èœãæ¥ãã€ããã¯ãããŸããã®ã§ãå®å¿ãã ããã ãããŸã§ãšåãããã«ããããæ£ããè¡ãããã«å¿ èŠãªæéãåããŸãã
ãã®wikiããŒãžã¯ããã§ãã¯/åŠçãžã®å¿çã§ãã£ã±ãã§ãã æ°ããããŒãžãéå§ããããšããå§ãããŸãã
ãããã«ããããŠã£ãã§ã¬ãŒããã³ã°ãç¶ããæéã¯ãããŸããã
@networkimprov ãã¬ãŒããã³ã°ã«ãååããã ãããããšãããããŸãã https://github.com/golang/go/wiki/Go2ErrorHandlingFeedbackã«æ°ãããããã»ã¯ã·ã§ã³ãäœæããŸããã ãŸã£ããæ°ããããŒãžãããè¯ãã¯ãã ãšæããŸãã
ãŸããããã¯ã«é¢ããRobertã®1p PDT / 4p EDTããŒããèŠéããã®ã§ãå°ãæ©ãããŠäžæçã«ããã¯ããŸããã ããå°ãé·ãéããŠããŸãã
ç§ã¯ãããæžãããšãèšç»ããŠããŠããããããã¯ããŠã³ãããåã«ãããå®æããããã£ãã ãã§ãã
ãŽãŒããŒã ãæ¹å€ãèŠãŠããããå€æ°æŽŸã®ææ ã瀺ããŠãããšæããªãããšãé¡ã£ãŠããŸãã ããŒã«ã«ãã€ããªãã£ãäŒè©±ãå§åããåŸåãåžžã«ããããããããã§èµ·ãã£ãã®ã§ã¯ãªãããšæããŸãã 誰ããæ¥ç·ããã©ã£ãŠãããšããããã¯ææ¡ã«ã€ããŠçŸç¶ã®ãŸãŸè©±ãããã ãã®äººãæããšã©ãŸãããŸãã
ã ãã-ç§ã¯ããã䟡å€ããããã®ã«ã€ããŠã®ç§ã®ååããªç«å Žãæ確ã«ããããšæããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ãåãåºãå Žåã§ãããšã©ãŒã®è£ 食/泚éä»ãã«deferããã§ã«äœ¿çšããŠããã³ãŒãããããŸãããããã¯ãŸãã«ãã®çç±ã«ãããã®ã§ãã
èŠãïŒ
https://github.com/ugorji/go-ndb/blob/master/ndb/ndb.go#L331
https://github.com/ugorji/go-serverapp/blob/master/app/baseapp.go#L129
https://github.com/ugorji/go-serverapp/blob/master/app/webrouter.go#L180
ããã¯ãã¹ãŠerrorutil.OnErrorïŒ* errorïŒãåŒã³åºããŸã
https://github.com/ugorji/go-common/blob/master/errorutil/errors.go#L193
ããã¯ãRuss / Robertãåè¿°ãã延æãã«ããŒã®æ¹éã«æ²¿ã£ããã®ã§ãã
ãã§ã«äœ¿ã£ãŠãããã¿ãŒã³ã§ããFWIWã ããã¯éæ³ã§ã¯ãããŸããã ããã¯å®å šã«è¡ã-ç§èŠã®ããã§ãã
ååä»ããã©ã¡ãŒã¿ãŒã§ã䜿çšããŸãããããŸãæ©èœããŸãã
ããã§æšå¥šãããŠããã®ã¯éæ³ã§ãããšããèãã«ç°è°ãå±ããããã«ãããèšããŸãã
次ã«ãé¢æ°ãšããŠtryïŒ...ïŒã«ã³ã¡ã³ããè¿œå ããããšæããŸãã
ããã«ã¯ããã©ã¡ãŒã¿ãååŸããããã«æ¡åŒµã§ãããšããç¹ã§ãããŒã¯ãŒãã«æ¯ã¹ãŠæãããªå©ç¹ã1ã€ãããŸãã
ããã§èª¬æãã2ã€ã®æ¡åŒµã¢ãŒãããããŸãã
ãããã®ããããã«ã€ããŠãé¢æ°ãšããŠåäžã®ãã©ã¡ãŒã¿ãŒãååŸããããã«è©Šè¡ããå¿ èŠããããå¿ èŠã«å¿ããŠãåŸã§2çªç®ã®ãã©ã¡ãŒã¿ãŒãååŸããããã«æ¡åŒµã§ããŸãã
è©Šè¡ã延é·ããå¿ èŠããããã©ãããå¿ èŠãªå Žåã¯ã©ã®æ¹åã«é²ãã¹ããã«ã€ããŠã¯æ±ºå®ãããŠããŸããã ãããã£ãŠãæåã®æ¹åæ§ã¯ãç§ãæ°žé ã«å«ã£ãŠããããå€åºå ã§ããžãã¹ãè¡ãããã®ã³ã¹ããšããŠåã£ããif errïŒ= nil {returnerr}ãã®åé³ã®ã»ãšãã©ãæé€ããè©Šã¿ãæäŸããããšã§ãã
ç§ã¯å人çã«ãtryãé¢æ°ã§ãããã€ã³ã©ã€ã³ã§åŒã³åºãããšãã§ããããšãå¬ããæããŸããããšãã°ã次ã®ããã«æžãããšãã§ããŸãã
var u User = db.loadUser(try(strconv.Atoi(stringId)))
ãšã¯å¯Ÿç §çã«ïŒ
var id int // i have to define this on its own if err is already defined in an enclosing block
id, err = strconv.Atoi(stringId)
if err != nil {
return
}
var u User = db.loadUser(id)
ã芧ã®ãšãããç§ã¯6è¡ã1è¡ã«æžãããŸããããããã®è¡ã®ãã¡5è¡ã¯æ¬åœã«å®åæã§ãã
ããã¯ç§ãäœåºŠãæ±ã£ãŠãããã®ã§ãããå€ãã®goã³ãŒããšããã±ãŒãžãäœæããŸãããgithubããã§ãã¯ããŠããªã³ã©ã€ã³ã§æçš¿ãããã®ãgo-codecã©ã€ãã©ãªã確èªã§ããŸãã
æåŸã«ãããã«ããã³ã¡ã³ãã®å€ãã¯ãåé¡ã解決ããããã®ç¬èªã®å¥œãŸããæ¹æ³ãæ瀺ããŠããã®ãšåãããã«ãææ¡ã«é¢ããåé¡ãå®éã«ã¯ç€ºããŠããŸããã
ç§ã¯å人çã«tryïŒ...ïŒãå ¥ã£ãŠããããšã«è奮ããŠããŸãããããŠãé¢æ°ãšããŠã®tryã奜ãŸãã解決çã§ããçç±ã«æè¬ããŸãã æå³ãããã ããªã®ã§ãããã§å»¶æã䜿çšãããŠããã®ãæããã«å¥œãã§ãã
goã®ã³ã¢ååã®1ã€ã§ãããããŸãçµã¿åãããããšãã§ããçŽäº€æŠå¿µãæãåºããŠã¿ãŸãããã ãã®ææ¡ã¯ãgoã®çŽäº€æŠå¿µïŒé
延ãååä»ãæ»ããã©ã¡ãŒã¿ãŒããŠãŒã¶ãŒã³ãŒãã§ã¯äžå¯èœãªããšãå®è¡ããçµã¿èŸŒã¿é¢æ°ãªã©ïŒã掻çšããŠã次ã®ãããªäž»èŠãªå©ç¹ãæäŸããŸãã
goãŠãŒã¶ãŒã¯ãäœå¹Žã«ãããã£ãŠæ®éçã«èŠæ±ããŠããŸãããã€ãŸããif errïŒ= nil {returnerr}ãã€ã©ãŒãã¬ãŒããåæž/æé€ããŸãã Go User Surveysã¯ããããå®éã®åé¡ã§ããããšã瀺ããŠããŸãã å²ç¢ããŒã ã¯ããããæ¬åœã®åé¡ã§ããããšãèªèããŠããŸãã æ°äººã®å€§ããªå£°ããŽãŒããŒã ã®ããžã·ã§ã³ã倧ããæªããŠããªããŠããã£ãã§ãã
errïŒ= nilã®å Žåãæé»ã®gotoãšããŠtryããããšã«ã€ããŠ1ã€ã®è³ªåããããŸããã
ãããæ¹åæ§ã ãšå€æããå Žåããtry doesreturnãããtrydoesgotoãã«æ¹é ããã®ã¯é£ããã§ããããã
gotoããå²ãåœãŠãããŠããªãå€æ°ãééã§ããªãã»ãã³ãã£ã¯ã¹ãå®çŸ©ããŠãããšãããïŒ
ãã¡ã¢ããããšãããããŸãã@ ugorjiã
errïŒ= nilã®å Žåãæé»ã®gotoãšããŠtryããããšã«ã€ããŠ1ã€ã®è³ªåããããŸããã
ãããæ¹åæ§ã ãšå€æããå Žåããtry doesreturnãããtrydoesgotoãã«æ¹é ããã®ã¯é£ããã§ããããã
gotoããå²ãåœãŠãããŠããªãå€æ°ãééã§ããªãã»ãã³ãã£ã¯ã¹ãå®çŸ©ããŠãããšãããïŒ
ã¯ãããã®éãã§ãã ïŒ26058ã«ã€ããŠããã€ãã®è°è«ããããŸãã
ãtry-gotoãã«ã¯å°ãªããšã3åã®ã¹ãã©ã€ãããããšæããŸãã
ïŒ1ïŒæªå²ãåœãŠã®å€æ°ã«çããå¿
èŠããããŸãã
ïŒ2ïŒå€±æããè©Šè¡ã«é¢ããã¹ã¿ãã¯æ
å ±ã倱ãããŸãããããšã¯å¯Ÿç
§çã«ãreturn + deferã®å Žåã§ããã£ããã£ã§ããŸãã
ïŒ3ïŒèª°ããåŸè€ãå«ãã®ã倧奜ãã§ãã
ããã try
ãè¡ãæ¹æ³ã§ãã
try
ãäžåºŠè¿œå ããããšããŸããããæ°ã«å
¥ããŸããã
ããã-httpsïŒ//github.com/ascheglov/go/pull/1
Redditã®ãããã¯-httpsïŒ//www.reddit.com/r/golang/comments/6vt3el/the_try_keyword_proofofconcept/
@griesemer
https://github.com/golang/go/issues/32825#issuecomment-507120860ããç¶ã..ã
try
ã®ä¹±çšã¯ã³ãŒãã¬ãã¥ãŒã審æ»ãããã³/ãŸãã¯ã³ãã¥ããã£æšæºã«ãã£ãŠè»œæžããããšããåæã«æ²¿ã£ãŠã try
ã®æè»æ§ãå¶éããããã«èšèªã®å€æŽãåé¿ããããšã®ç¥æµãèŠãããšãã§ããŸã
ãããããã€ãå解ãããšããšã©ãŒãã¹å¶åŸ¡ãããŒã®2ã€ã®åœ¢åŒãè¡šçŸãããŠããããã«èŠããŸããæåãšèªåã§ãã ãšã©ãŒã©ããã³ã°ã«é¢ããŠã¯ãçŽæ¥ãéæ¥ããã¹ã¹ã«ãŒã®3ã€ã®åœ¢åŒãè¡šçŸãããŠããããã§ãã ããã«ããããšã©ãŒåŠçã®åèš6ã€ã®ãã¢ãŒãããçºçããŸãã
æåãã€ã¬ã¯ãã¢ãŒããšèªåãã€ã¬ã¯ãã¢ãŒãã¯é©åãªããã§ãã
wrap := func(err error) error {
return fmt.Errorf("failed to process %s: %v", filename, err)
}
f, err := os.Open(filename)
if err != nil {
return nil, wrap(err)
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return nil, wrap(err)
}
// in errors, named better, and optimized
WrapfFunc := func(format string, args ...interface{}) func(error) error {
return func(err error) error {
if err == nil {
return nil
}
s := fmt.Sprintf(format, args...)
return errors.Errorf(s+": %w", err)
}
}
`` `è¡ã
wrapïŒ= errors.WrapfFuncïŒ "ïŒ
sã®åŠçã«å€±æããŸãã"ãfilenameïŒ
fãerrïŒ= os.OpenïŒfilenameïŒ
tryïŒwrapïŒerrïŒïŒ
f.CloseïŒïŒã延æãã
infoãerrïŒ= f.StatïŒïŒ
tryïŒwrapïŒerrïŒïŒ
Manual Pass-through, and Automatic Pass-through modes are also simple enough to be agreeable (despite often being a code smell):
```go
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer f.Close()
info, err := f.Stat()
if err != nil {
return nil, err
}
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
ãã ããæåéæ¥ã¢ãŒããšèªåéæ¥ã¢ãŒãã¯ã©ã¡ããã埮åŠãªééãã®å¯èœæ§ãé«ããããã©ã¡ããéåžžã«äžå¿«ã§ãã
defer errd.Wrap(&err, "failed to do X for %s", filename)
var f *os.File
f, err = os.Open(filename)
if err != nil {
return
}
defer f.Close()
var info os.FileInfo
info, err = f.Stat()
if err != nil {
return
}
defer errd.Wrap(&err, "failed to do X for %s", filename)
f := try(os.Open(filename))
defer f.Close()
info := try(f.Stat())
ç¹°ãè¿ãã«ãªããŸãããç§ã¯ããããçŠæ¢ããŠããªãããšã¯ç解ã§ããŸãããéæ¥ã¢ãŒããä¿é²/ç¥çŠããããšã¯ãããããŸã ç§ã«ãšã£ãŠæ確ãªå±éºä¿¡å·ãäžããŠãããšããã§ãã ååã«ãçŸæç¹ã§ã¯ãç§ãåæå šäœã«åŒ·ãæççã§ããç¶ããããã«ã
è©ŠããŠã¿ãŠãã ãããããé¿ããããã®æ©èœã§ãã£ãŠã¯ãªããŸãã
info := try(try(os.Open(filename)).Stat())
ãã¡ã€ã«ãªãŒã¯ã
ã€ãŸãã try
ã¹ããŒãã¡ã³ãã¯é£éãèš±å¯ããŸããã ãããŠãããã¯ããŒãã¹ãšããŠèŠãç®ãè¯ãã§ãã ãã ããäºææ§ã®åé¡ããããŸãã
@sirkon try
ã¯ç¹å¥ãªã®ã§ã try
ãé¢æ°ã®ããã«èŠããŠãããããéèŠãªå Žåãèšèªã¯ãã¹ããããtry
ãèš±å¯ããªãå¯èœæ§ããããŸãã ç¹°ãè¿ãã«ãªããŸããããããtry
ã®å¯äžã®é害ã§ããå ŽåãããŸããŸãªæ¹æ³ïŒ go vet
ããŸãã¯èšèªå¶éïŒã§ç°¡åã«å¯ŸåŠã§ããŸãã ããããå
ã«é²ã¿ãŸããã-ç§ãã¡ã¯ä»äœåºŠããããèããŠããŸãã ããããšãã
ããããå ã«é²ã¿ãŸããã-ç§ãã¡ã¯ä»¥åã«äœåºŠããããèããããšããããŸã
ãããã¯ãšãŠãéå±ã§ããããããå ã«é²ã¿ãŸãããã
å¥ã®è¯ãé¡äŒŒç©ããããŸãïŒ
-ããªãã®çè«ã¯äºå®ãšççŸããŠããŸãïŒ
-äºå®ã¯ãã£ãšæªãïŒ
ããŒã²ã«
ç§ã¯ããªããå®éã«ã¯ååšããªãåé¡ã解決ããŠããããšãæå³ããŸãã ãããŠããã®éãæ¹æ³ã
ãã®åé¡ãå®éã«çºçããå ŽæãèŠãŠã¿ãŸããããå€çããã®å¯äœçšã®åŠçãããã ãã§ãã ãããŠãããã¯å®éã«ã¯ãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã§è«ççã«æãç°¡åãªéšåã®1ã€ã§ãã ãããŠããã®äžã§æãéèŠã§ãã ä¿¡é Œæ§ãäœäžããæãç°¡åãªãã®ãåçŽåããå¿ èŠãããçç±ãããããŸããã
IMOã®ãã®çš®ã®æãé£ããåé¡ã¯ãåæ£ã·ã¹ãã ã§ã®ããŒã¿ã®äžè²«æ§ã®ç¶æã§ãïŒå®éã«ã¯ããã»ã©åæ£ãããŠããŸããïŒã ãããŠããšã©ãŒåŠçã¯ããããã解決ãããšãã«Goã§æŠã£ãŠããåé¡ã§ã¯ãããŸããã§ããã ã¹ã©ã€ã¹ãšãããã®ç解ã®æ¬ åŠãåèš/代æ°/åæ£/ãã®ä»ã®ã¿ã€ãã®æ¬ åŠã¯ãã¯ããã«åä»ã§ããã
ããã§ã®è°è«ã¯è¡°ããããšãªãç¶ããŠããããã«æãããã®ã§ãããäžåºŠç¹°ãè¿ããŸãããã
çµéšã¯ãç¶ç¶çãªè°è«ããã䟡å€ããããŸãã
try
ãèªåã®ã³ãŒãããŒã¹ã§ã©ã®ããã«è¡šç€ºãããããå®éšãããã£ãŒãããã¯ããŒãžã«ãšã¯ã¹ããªãšã³ã¹ã¬ããŒããäœæããŠãªã³ã¯ããããšããå§ãããŸãã
å ·äœçãªçµéšããã®ææ¡ã«è³æãŸãã¯å察ã®éèŠãªèšŒæ ãæäŸããå Žåã¯ãããã§ãããèããããšæããŸãã å人çãªãããã®ããã£ããæ¶ç©ºã®ã·ããªãªã代æ¿ãã¶ã€ã³ãªã©ãç§ãã¡ã¯èªããããšãã§ããŸããããããã¯ããŸãå®çšçã§ã¯ãããŸããã
ããããšãã
ç§ã¯ããã§å€±ç€Œã«ãªããããããŸããããããŠããªãã®ãã¹ãŠã®ç¯åºŠã«æè¬ããŸãããããã³ãã¥ããã£ã¯ãšã©ãŒåŠçãå€æŽãããããšã«ã€ããŠéåžžã«åŒ·ã話ããŸããã ç©äºãå€æŽããããæ°ããã³ãŒããè¿œå ããããããšãçŸåšã®ã·ã¹ãã ã奜ããã¹ãŠã®äººãåæºããŸãã ã¿ããªã幞ãã«ããããšã¯ã§ããªãã®ã§ãç§ãã¡ã幞ãã«ã§ãã88ïŒ ã«çŠç¹ãåœãŠãŸãããïŒä»¥äžã®æ祚çããå°ãåºãããæ°å€ïŒã
ãã®èšäºã®å·çæç¹ã§ã¯ãããã®ãŸãŸã«ããŠãããã¹ã¬ããã¯ãè³æ1322祚ãå察158祚ã§ãã ãã®ã¹ã¬ããã¯ãäžã«158ãäžã«255ã§ãã ããããšã©ãŒåŠçã«é¢ãããã®ã¹ã¬ããã®çŽæ¥ã®çµããã§ã¯ãªãå Žåã¯ãåé¡ãããã·ã¥ãç¶ããéåžžã«æ£åœãªçç±ãããã¯ãã§ãã
ããªãã®ã³ãã¥ããã£ãå«ã¶ããšãåžžã«è¡ããåæã«ããªãã®è£œåãç Žå£ããããšã¯å¯èœã§ãã
å°ãªããšãããã®ç¹å®ã®ææ¡ã¯å€±æãããšèŠãªãããã¹ãã ãšæããŸãã
幞ãã go
ã¯å§å¡äŒã«ããèšèšã§ã¯ãããŸããã ç§ãã¡ã¯ãç§ãã¡å
šå¡ãæããèšèªã®ç®¡çè
ããå©çšå¯èœãªãã¹ãŠã®ããŒã¿ãèæ
®ããŠæåã®æ±ºå®ãäžãç¶ãã倧è¡ã®äžè¬çãªæèŠã«åºã¥ããŠæ±ºå®ãäžããªãããšãä¿¡é Œããå¿
èŠããããŸãã èŠããŠãããŠãã ãã-ç§ãã¡ãšåãããã«ã圌ããgoã䜿çšããŠããŸãã 圌ãã¯ç§ãã¡ãšåãããã«ãåé¡ç¹ãæããŸãã
ããªããããžã·ã§ã³ãæã£ãŠãããªãããŽãŒããŒã ã圌ãã®ææ¡ãå®ãã®ãšåãããã«ãããå®ãããã«æéããããŠãã ããã ãã以å€ã®å Žåã¯ãå®è¡å¯èœã§ã¯ãªããäŒè©±ãé²ããªãå€éã®ææ ã§äŒè©±ã溺ããããŠããã ãã§ãã ãããŠãããã¯ã人ã ããã éšé³ãæ¶ãããŸã§ãããåŸ ã¡ãããããããªããšèšã£ãããã«ãåŸäºããã人ã ã«ãšã£ãŠããé£ãããªããŸãã
ææ¡ããã»ã¹ãéå§ããããšããã©ã¹ã¯ãææ¡ã«åœ±é¿ãäžããããããªãã®èŠæ±ãèãããããæ¹æ³ãšããŠãçµéšå ±åã®å¿ èŠæ§ãåºããããšã«ã€ããŠå€§ããããšãããŸããã å°ãªããšããããå°éããããšããŸãããã
goããŒã ã¯ãå®çšçãªãã£ãŒãããã¯ããã¹ãŠèæ ®ã«å ¥ããŠããŸãã 圌ãã¯ãŸã ç§ãã¡ã倱æãããŠããŸããã ãšã€ãªã¢ã¹ãã¢ãžã¥ãŒã«ãªã©ã«ã€ããŠäœæããã詳现ãªããã¥ã¡ã³ããåç §ããŠãã ãããå°ãªããšãåãããã«èããæéããããŠç§ãã¡ã®å察æèŠãæ€èšããå察æèŠã«å¯Ÿãã圌ãã®ç«å Žã«å¯Ÿå¿ããå察æèŠãç¡èŠããã«ããããããã«ããŸãããã
Goã®å©ç¹ã¯åžžã«ãããžã·ã§ã³ã«ã³ãããããåã«ã¹ããŒã¹ãæ¹å€çã«èããå°æ°ã®äººã ã«ãã£ãŠèšèšãããçŽäº€æ§é ãæã€ãå°ãããŠåçŽãªèšèªã§ãããšããããšã§ãã ãèŠãŠã人æ°æ祚ã¯ããŒãšèšãããšèšãã®ã§ã¯ãªããã§ããéã圌ããå©ããŸããããæ祚ããå€ãã®äººã ã¯ãè¡ãããšãè¡ãããšãå®å šã«ç解ããããšããããŸãçµéšããŠããªããããããŸããã ç§ã¯ããã®æããã«å°ãããŠåçŽãªèšèªã®ããã€ãã®åºæ¬çãªæŠå¿µãç¥ããªãããšãèªããã·ãªã¢ã«ãã¹ã¿ãŒãèªã¿ãŸããã ããã¯ããªãã®ãã£ãŒãããã¯ãçå£ã«åãæ¢ããã®ãé£ããããŸãã
ãšã«ãããç§ãããã§ãããè¡ã£ãŠããã®ã¯æ®å¿µã§ã-ãã®ã³ã¡ã³ããåé€ããŠãã ããã ç§ã¯æ°åã害ããŸããã ãããã誰ãããããççŽã«èšããªããã°ãªããŸããïŒ
ãã®2çªç®ã®ææ¡å šäœã¯ãç§ã«éäŒãçµç¹ããããžã¿ã«ã€ã³ãã«ãšã³ãµãŒãšéåžžã«ãã䌌ãŠããŸãã 人æ°ã³ã³ãã¹ãã¯æè¡çãªã¡ãªãããè©äŸ¡ããŸããã
人ã ã¯æ²é»ããŠãããããããŸããããããã§ãGo2ãæåŸ ããŠããŸããç§ã¯å人çã«ãããšGo2ã®æ®ãã®éšåã楜ãã¿ã«ããŠããŸããGo1ã¯çŽ æŽãããèšèªã§ãããããŸããŸãªçš®é¡ã®ããã°ã©ã ã«é©ããŠããŸãã Go2ããããæ¡å€§ããããšãé¡ã£ãŠããŸãã
æåŸã«ãã¹ããŒãã¡ã³ããšããŠtry
ã䜿çšãããšããç§ã®å¥œã¿ãéã«ããŸãã ä»ã¯ãã®ãŸãŸææ¡ãæ¯æããŸãã ãGo1ãã³ã³ãããã®çŽæã®äžã§äœå¹Žãçµã£ãåŸã人ã
ã¯Goãç³ã«å»ãŸãããšæããŸãã ãã®åé¡ã®ããä»®å®ã®ããã«ããã®ã€ã³ã¹ã¿ã³ã¹ã§èšèªæ§æãå€æŽããªãããšã¯ãä»ã®ç§ã®ç®ã«ã¯ã¯ããã«è¯ã劥åã®ããã«æããŸãã ç·šéïŒãã¡ã¯ããã§ãã¯ã®ããã®ãšã¯ã¹ããªãšã³ã¹ã¬ããŒããèŠãã®ã楜ãã¿ã§ãã
PSïŒãžã§ããªãã¯å»è¬åãææ¡ããããšãã©ã®ãããªå察ãèµ·ããã®ã ãããã
ç§ãã¡ã®äŒç€Ÿã«ã¯ãäžæ°ã«æžãããçŽ12ã®ããŒã«ããããŸãã ã³ãŒãããŒã¹ã«å¯ŸããŠtryhardããŒã«ãå®è¡ãã933ã®æœåšçãªtryïŒïŒåè£ãèŠã€ããŸããã å人çã«ã¯ãtryïŒïŒé¢æ°ã¯ãã³ãŒãã®å®åæã®åé¡ä»¥äžã®ãã®ã解決ããããããã°ãããã¢ã€ãã¢ã ãšæããŸãã
åŒã³åºãå ãšåŒã³åºãããé¢æ°/ã¡ãœããã®äž¡æ¹ã«ãæåŸã®ãã©ã¡ãŒã¿ãŒãšããŠãšã©ãŒãè¿ãããã«åŒ·å¶ããŸãã ããã¯èš±å¯ãããŸããïŒ
var file= try(parse())
func parse()(err, result) {
}
ãšã©ãŒå€æ°ã宣èšããerrïŒ= nil err == nilãã¿ãŒã³ã倧ãŸãã«èš±å¯ãã代ããã«ããšã©ãŒãåŠçãã1ã€ã®æ¹æ³ã匷å¶ããŸããããã«ãããèªã¿ãããã劚ããããIMOã§ãšã©ãŒãçºçããããã³ãŒãã®ãªã¹ã¯ãé«ãŸããŸãã
func Foo() (err error) {
var file, ferr = os.Open("file1.txt")
if ferr == nil {
defer file.Close()
var parsed, perr = parseFile(file)
if perr != nil {
return
}
fmt.Printf("%s", parsed)
}
return nil
}
tryïŒïŒã䜿çšãããšãç§ã®æèŠã§ã¯ãã³ãŒãã¯ããèªã¿ããããäžè²«æ§ããããããå®å šã«ãªããŸãã
func Foo() (err error) {
var file = try(os.Open("file.txt"))
defer file.Close()
var parsed = try(parseFile(file))
fmt.Printf(parsed)
return
}
@lparãHerokuã®ã¢ãŒã«ã€ããããŠããªããã¹ãŠã®GoãªããžããªïŒãããªãã¯ããã³ãã©ã€ããŒãïŒã§å®è¡ããã®ãšåæ§ã®å®éšãããã€ãå®è¡ããŸããã
çµæã¯ãã®èŠç¹ã«ãããŸãïŒ https ïŒ//gist.github.com/freeformz/55abbe5da61a28ab94dbb662bfc7f763
cc @davecheney
@ubikenobiããªãã®ããå®å šãªæ©èœãæŒããŠããŸããã
ãŸãããšã©ãŒã®åŸã«å€ãè¿ãããã®ãèŠãããšããããŸããã ãã ããé¢æ°ããã¹ãŠãšã©ãŒã«é¢ãããã®ã§ãããè¿ãããä»ã®å€ããšã©ãŒèªäœã«äŸåããªãå Žåã¯ãçã«ããªã£ãŠãããšæ³åã§ããŸãïŒ2çªç®ã®ãšã©ãŒãåã®å€ããä¿è·ãããŠ2åè¿ãããå¯èœæ§ããããŸãïŒã
æåŸã«ãäžè¬çã§ã¯ãããŸãããã err == nil
ã¯ãããã€ãã®æ©æè¿åã®æ£åœãªãã¹ããæäŸããŸãã
@Daved
ãªãŒã¯ã«ã€ããŠææããŠãããŠããããšããäž¡æ¹ã®äŸã«defer.CloseïŒïŒãè¿œå ããã®ãå¿ããŸããã ïŒä»ããæŽæ°ïŒã
errããã®é åºã§è¿ãããããšã¯ãã£ãã«ãããŸããããèšèšãããééãã§ããå Žåã¯ãã³ã³ãã€ã«æã«ãããããã£ããã§ããã®ã¯è¯ãããšã§ãã
ã»ãšãã©ã®å Žåãerr == nilã®å Žåã¯æšæºãããäŸå€ã ãšæããŸãã ããªããèšã£ãããã«ããã¯ããã€ãã®å Žåã«åœ¹ç«ã€ãããããŸããããç§ã奜ãã§ã¯ãªãã®ã¯ãéçºè ãæ£åœãªçç±ãªãã«äžè²«æ§ã®ãªãéžæãããŠããããšã§ãã 幞ããã³ãŒãããŒã¹ã§ã¯ãã¹ããŒãã¡ã³ãã®å€§éšåãerrïŒ= nilã§ãããtryïŒïŒé¢æ°ã®æ©æµãåããããšãã§ããŸãã
tryhard
ãå®è¡ããŸããã 45580è¡ã®Goã³ãŒãã§ã tryhard
ã¯æžãæãã301ãšã©ãŒãèå¥ããŸããïŒã€ãŸãã+ 301 / -903ã®å€æŽã«ãªããŸãïŒããŸãã¯ãåãšã©ãŒã«çŽ3è¡ããããšä»®å®ãããšãã³ãŒãã®çŽ2ïŒ
ãæžãæããããŸãã ã³ã¡ã³ãã空çœãã€ã³ããŒããªã©ãèæ
®ã«å
¥ãããšãç§ã«ãšã£ãŠéèŠã ãšæããŸããtry
ãç§ã®äœæ¥ãã©ã®ããã«å€ãããã調æ»ããŠããŸãããã䞻芳çã«ã¯éåžžã«ããŸãæµããŸãã åè©tryã¯ãåŒã³åºãå
ã®é¢æ°ã§åé¡ãçºçããå¯èœæ§ãããããšãããæ確ã«æããã³ã³ãã¯ãã«å®è¡ããŸãã ç§ã¯if err != nil
ãæžãããšã«éåžžã«æ
£ããŠããŠãæ¬åœã«æ°ã«ããŸããããå€æŽããŠãããŸããŸããã ãšã©ãŒã®åã«ç©ºã®å€æ°ãæžã蟌ãã§ãªãã¡ã¯ã¿ãªã³ã°ããïŒã€ãŸãã空ã®ã¹ã©ã€ã¹/ããã/å€æ°ãè¿ãããã«ããïŒããšã¯ãããããerr
èªäœãããé¢åã§ããtry(json.Unmarshal(b, &accountBalance), "failed to decode bank account info for user %s", user)
ã®ãããªã³ã³ããã¹ããè¿œå ãããå Žåã¯ã try
ãå¯å€ååŒæ°ã§ãããšäŸ¿å©ã§ãã ç·šéïŒãã®ç¹ã¯ãããããããã¯ããå€ããŠããŸãã ãã ããè©Šè¡ããªãæžãæããèŠããšããããçºçããŸããããã¯ã亀æãåççã§ããããšã確èªããããã«ãçµéšè±å¯ãªGopherã«ãã£ãŠç²Ÿæ»ããããœãŒã¹ã§è¡ãããã¹ãã§ã¯ãããŸãããïŒ ãã®ã2ïŒ ãã®æžãæãã®ãã¡ãæ瀺çãªåŠçã§æžãæããã¹ãã ã£ãã®ã¯ã©ããããã§ããïŒ ãããããããªãå ŽåãLOCã¯æ¯èŒç圹ã«ç«ããªãã¡ããªãã¯ã®ãŸãŸã§ãã
*ããããä»æã®ç§ã®æçš¿ããšã©ãŒåŠçã®ãã¢ãŒããã«çŠç¹ãåœãŠãçç±ã§ãã try
ã容æã«ãããšã©ãŒåŠçã®ã¢ãŒãã«ã€ããŠèª¬æãããããããããªãä»»æã®ã©ã€ã³ã«ãŠã³ã¿ãŒãå®è¡ããããããäœæããå¯èœæ§ã®ããã³ãŒãã®æœåšçãªå±éºæ§ã«åãçµãæ¹ãç°¡åã§å®è³ªçã§ãã
@kingishbã¡ã€ã³ä»¥å€ã®ããã±ãŒãžã®ãããªãã¯é¢æ°ã§èŠã€ãã£ã_try_ã¹ãããã¯ããã€ãããŸããïŒ éåžžããããªãã¯é¢æ°ã¯ããã±ãŒãžãã€ãã£ãïŒã€ãŸããã©ãããŸãã¯è£ 食ãããïŒãšã©ãŒãè¿ãå¿ èŠããããŸãã
@networkimprovããã¯ç§ã®ææ§ã®ããã®é床ã«åçŽåãããåŒã§ãã ãããçå®ã§ããã®ã¯ãæ€æ»å¯èœãªãšã©ãŒãè¿ãAPIãµãŒãã§ã¹ã®èŠ³ç¹ããã§ãã éåžžã¯ãã³ãŒã«ã¹ã¿ãã¯å ã®äœçœ®ã§ã¯ãªããã³ã³ããã¹ãã®é¢é£æ§ã«åºã¥ããŠãšã©ãŒã¡ãã»ãŒãžã«ã³ã³ããã¹ããè¿œå ããã®ãé©åã§ãã
çŸåšã®ææšã§ã¯ãå€ãã®èª€æ€ç¥ãçºçããŠããå¯èœæ§ããããŸãã ãŸããæšå¥šãããæ¹æ³ïŒhttps://blog.golang.org/errors-are-valuesïŒã«åŸãããšã§çºçãããã¹ã«ã€ããŠã¯ã©ãã§ããããã try
ã¯ããã®ãããªãã©ã¯ãã£ã¹ã®äœ¿çšãæžããå¯èœæ§ãããããã®æå³ã§ããããã¯çœ®ãæãã®äž»èŠãªã¿ãŒã²ããã§ãïŒãããããç§ãæ¬åœã«èå³ãæã£ãŠããå¯äžã®ãŠãŒã¹ã±ãŒã¹ã®1ã€ã§ãïŒã ãããã£ãŠãç¹°ãè¿ãã«ãªããŸãããããã¯ããã¥ãŒããªãžã§ã³ã¹ã倧å¹
ã«è¡ããã«æ¢åã®ãœãŒã¹ãã¹ã¯ã¬ã€ãããããšã¯ç¡æå³ã«æããŸãã
ããŒã¿ãåéããŠããã@ ubikenobi ã@ freeformzã @ kingishbã«æè¬ããŸãïŒ äœè«ã§ããããªãã·ã§ã³-err=""
$ãæå®ããŠtryhard
ãå®è¡ãããšããšã©ãŒå€æ°ãerr
以å€ã®ååïŒ e
ãªã©ïŒã§åŒã³åºãããã³ãŒããåŠçããããšããŸãã
ããå€ãã®ããŒã¿ãã€ã³ããæ¢ããŠããå Žåã¯ã @ griesemer ã 2ã€ã®ãã€ã¯ããµãŒãã¹ã«å¯ŸããŠtryhard
ãå®è¡ãããšããã次ã®çµæãåŸãããŸããã
cloc v 1.82 / tryhard
13280Goã³ãŒãè¡/ 148è©Šè¡çšã«èå¥ïŒ1ïŒ
ïŒ
å¥ã®ãµãŒãã¹ïŒ
9768Goã³ãŒãè¡/è©Šè¡çšã«èå¥ããã50ïŒ0.5ïŒ
ïŒ
ãã®åŸã tryhard
ã¯ãããŸããŸãªãã€ã¯ããµãŒãã¹ã®å¹
åºãã»ãããæ€æ»ããŸããã
314343Goã³ãŒãè¡/ 1563è©Šè¡çšã«èå¥ïŒ0.5ïŒ ïŒ
è¿
éãªæ€æ»ãè¡ããŸãã try
ãæé©åã§ããããã±ãŒãžã®ã¿ã€ãã¯ãéåžžãã©ããããããµãŒãã¹ããè¿ãããïŒGRPCïŒãšã©ãŒãééçã«è¿ãã¢ããã¿ãŒ/ãµãŒãã¹ã©ãããŒã§ãã
ã圹ã«ç«ãŠãã°ã
ããã¯çµ¶å¯Ÿã«æªãèãã§ãã
defer
ã®err
varã¯ãã€è¡šç€ºãããŸããïŒ ãæé»çãããæ瀺çãã¯ã©ãã§ããïŒdefer
ã¯ãå€ãã®éããŠç解ãã«ããã³ãŒããäœæããŸããos.Exit
ã䜿çšãããšããšã©ãŒã®ãã§ãã¯ãå€ãããŸããããã±ãŒãžïŒãã³ããŒã䜿çšïŒã§tryhard
ãå®è¡ãããšãããã³ãŒãæ°ã873934
ãã851178
ã«æžå°ãã2478
ãå ±åãããŸããããããããããŸãããããã©ã®ããã«è§£éãããã¯ããªãŒããŒã©ããã³ã°ïŒstdlibãã¹ã¿ãã¯ãã¬ãŒã¹ãšã©ãŒã©ããã³ã°ã®ãµããŒããæ¬ ããŠããïŒã«ãããã®ãããã®ã³ãŒãã®ã©ãã ãããšã©ãŒåŠçã«é¢ãããã®ãããããªãããã§ãã
ããããç§ãç¥ã£ãŠããã®ã¯ãä»é±ã ãã§ãã if err != nil { return nil }
ã®ãããªã³ããŒãã¹ã¿ãšerror: cannot process ....file: cannot parse ...file: cannot open ...file
ã®ãããªãšã©ãŒã®ããã«ãæ¥ããããæéãç¡é§ã«ãããšããããšã§ãã
\
ãŸããåœå±ãžã®èšŽãã®è©Šã¿ãçå£ã«åãæ¢ããŸããããªããªãããããã®åãåœå±ã¯ã圌ãèªèº«ã®ç¡ç¥ã誀解ãææãããåŸã§ããæ°ããã¢ã€ãã¢ãææ¡ãæåŠããããšãç¥ãããŠããããã§ãã
\
æ倧ã®ïŒãã¹ããå«ã±163kè¡ã®ã³ãŒãïŒãµãŒãã¹ã§tryhard -err=""
ãå®è¡ããŸãã-566åã®çºçãèŠã€ãããŸããã äžéšã®ã³ãŒãã¯if err != nil
ã念é ã«çœ®ããŠèšè¿°ãããŠãããããå®éã«ã¯ããã«å€ããªããšæããŸãããã®ãããã³ãŒãã¯ãããäžå¿ã«èšèšãããŠããŸãïŒRob Pikeã®ç¹°ãè¿ãã®åé¿ã«é¢ããããšã©ãŒã¯äŸ¡å€èŠ³ãã®èšäºãæãæµ®ãã³ãŸãïŒã
@griesemerèŠç¹ã«æ°ãããã¡ã€ã«ãè¿œå ããŸããã -err = ""ã§çæãããŸããã ã¹ããããã§ãã¯ãè¡ããŸããããããã€ãå€æŽããããŸãã ä»æãtryhardãã¢ããããŒãããã®ã§ãæ°ããããŒãžã§ã³ã䜿çšããŸããã
@griesemeréèšã§ããã°ãtryhardã®æ¹ã䟿å©ã ãšæããŸãã
aïŒãšã©ãŒãçºçããã³ãŒã«ãµã€ãã®æ°
bïŒã·ã³ã°ã«ã¹ããŒãã¡ã³ãif err != nil [&& ...]
ãã³ãã©ãŒã®æ°ïŒ on err
ïŒ32611ã®åè£ïŒ
cïŒäœããè¿ããã®ã®æ°ïŒ defer
ïŒ32676ã®åè£ïŒ
dïŒ err
ãè¿ããã®ã®æ°ïŒ try()
ã®åè£ïŒ
eïŒéã¡ã€ã³ããã±ãŒãžã®ãšã¯ã¹ããŒããããæ©èœã«å«ãŸãããã®ã®æ°ïŒèª€æ€ç¥ã®å¯èœæ§ãé«ãïŒ
åèšLoCãreturn err
ã®ã€ã³ã¹ã¿ã³ã¹ãšæ¯èŒãããšãã³ã³ããã¹ããäžè¶³ããŠããŸããIMOã
@networkimprovåæããŸãã-åæ§ã®ææ¡ã以åã«æèµ·ãããŸããã ãããæ¹åããããã«ãä»åŸæ°æ¥éã§æéãèŠã€ããããšæããŸãã
å éšã³ãŒãããŒã¹ïŒäŸåé¢ä¿ã§ã¯ãªããã³ãŒãã®ã¿ïŒã«å¯ŸããŠtryhardãå®è¡ããå Žåã®çµ±èšã¯æ¬¡ã®ãšããã§ãã
åïŒ
è©ŠããŠã¿ãåŸïŒ
ç·šéïŒ @griesemerãèŠçŽçµ±èšéãå«ãããã«tryhardãæŽæ°ããã®ã§ãããã«ããã«ããã€ããããŸãïŒ
if
if <err> != nil
ã§ãtry
åè£ã§ãtryhardãèŠã€ãã眮æãèŠããšã try
ã®äœ¿çšãéåžžã«äžè¬çã§ããã¿ã€ãã®ã³ãŒããšããã£ãã«äœ¿çšãããªãã¿ã€ãã®ã³ãŒãã確ãã«ãããŸãã
ãŸããtryhardãå€æã§ããªãå ŽæããããŸãããtryã®æ©æµãåããããšãã§ããŸãã ããšãã°ãåçŽãªã¯ã€ã€ãŒãããã³ã«ïŒåçŽã/æ確ãã®ããã«ç·šéïŒã«åŸã£ãŠã¡ãã»ãŒãžããã³ãŒãããããã®ã³ãŒãã次ã«ç€ºããŸãã
func (req *Request) Decode(r Reader) error {
typ, err := readByte(r)
if err != nil {
return err
}
req.Type = typ
req.Body, err = readString(r)
if err != nil {
return unexpected(err)
}
req.ID, err = readID(r)
if err != nil {
return unexpected(err)
}
n, err := binary.ReadUvarint(r)
if err != nil {
return unexpected(err)
}
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err = readID(r)
if err != nil {
return unexpected(err)
}
}
return nil
}
// unexpected turns any io.EOF into an io.ErrUnexpectedEOF.
func unexpected(err error) error {
if err == io.EOF {
return io.ErrUnexpectedEOF
}
return err
}
try
ããªãå Žåã1ãæã§åŠçããŠã倧ããªæ¹åã¯ãªããããå¿
èŠãªãªã¿ãŒã³ãã€ã³ãã«unexpected
ãæžã蟌ãã ã ãã§ãã ãã ãã try
ã䜿çšãããšã unexpected
ãšã©ãŒå€æã延æããŠé©çšããã³ãŒãã倧å¹
ã«ççž®ããŠãããæ確ã§ç°¡åã«ã¹ããã³ã°ã§ããŸãã
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
@cespareçŽ æŽãããã¬ããŒãïŒ
å®å
šã«çž®å°ãããã¹ããããã®æ¹ãäžè¬çã«åªããŠããŸãããæ¬åŒ§ã¯äºæ³ãããããã«æªããã«ãŒãå
ã®try
ã¯äºæ³ã©ããã«æªããªã£ãŠããŸãã
ããŒã¯ãŒãã¯ã¯ããã«èªã¿ããããä»ã®å€ãã®äººãç°ãªãç¹ã§ãããšããã®ã¯å°ãéçŸå®çã§ãã 以äžã¯èªã¿ããããè¿ãããå€ã1ã€ã ãã§ããããã埮åŠãªç¹ã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããïŒãã ããããé·ãé¢æ°ããã¹ãã®å€ãé¢æ°ã§ã¯ãããã§ãçºçããå¯èœæ§ããããŸãïŒã
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = wrapEOF(err) }()
req.Type = try readByte(r)
req.Body = try readString(r)
req.ID = try readID(r)
n := try binary.ReadUvarint(r)
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err = readID(r)
try err
}
return nil
}
*å ¬å¹³ãæããšãã³ãŒãã®åŒ·èª¿è¡šç€ºã¯å€§ãã«åœ¹ç«ã¡ãŸãããããã¯å®ãå£çŽ ã®ããã§ãã
ããªãã¯æ¬åœã«æªãã³ãŒãã®å Žåã«ããªããåŸãæ倧ã®å©ç¹ãç解ããŠããŸããïŒ
unexpected()
ã䜿çšãããããšã©ãŒããã®ãŸãŸè¿ãå Žåãã³ãŒããšã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠäœãç¥ããŸããã
try
ã¯ãããè¯ãã³ãŒããæžãã®ã«åœ¹ç«ã¡ãŸããããããæªãã³ãŒããçæããå¯èœæ§ããããŸãã
@cespareãã³ãŒããŒã¯ããšã©ãŒã¿ã€ããå
éšã«ããæ§é äœã«ããããšãã§ããŸããã¡ãœããã¯ããã¹ãŠã®æäœã®åã«err == nil
ããã§ãã¯ããããŒã«å€ã®okãè¿ããŸãã
ããã¯ã³ãŒããã¯ã«äœ¿çšããããã»ã¹ã§ããããã try
ã¯ããã®ç¹å®ã®ã±ãŒã¹ã®ãšã©ãŒãåŠçããããã®ééæ³çã§çããããç°¡æœãªã€ãã£ãªã ãç°¡åã«äœæã§ããããããŸã£ãã圹ã«ç«ã¡ãŸããã
@makhov ãæ¬åœã«æªãã³ãŒãããšã¯ããšã©ãŒãã©ããããªãã³ãŒããæå³ãããšæããŸãã
ãããããªããããªãã¯ãã®ãããªã³ãŒããåãããšãã§ããŸãïŒ
a, b, c, err := someFn()
if err != nil {
return ..., errors.Wrap(err, ...)
}
ãããŠãããã次ã®ãããªæå³çã«åäžã®[1]ã³ãŒãââã«å€æããŸãã
a, b, c, err := someFn()
try(errors.Wrap(err, ...))
ææ¡ã§ã¯ããšã©ãŒã®æãè¿ãã«deferã䜿çšããå¿
èŠããããšã¯èšã£ãŠããããèšèªãå€æŽããã«deferã®èŠ³ç¹ããå®è£
ã§ãããããææ¡ã®åã®å埩ã®handle
ããŒã¯ãŒããäžèŠã§ããçç±ã説æããŠããã ãã§ãã
ïŒããªãã®ä»ã®ã³ã¡ã³ãããææ¡ãããŠãããã®ã®æ žå¿ã§ã¯ãªããææ¡ã®äŸãŸãã¯æ¬äŒŒã³ãŒãã«åºã¥ããŠããããã§ãïŒ
ã³ãŒãããŒã¹ã§54KLOCã䜿çšããŠtryhard
ãå®è¡ããŸãããã1116åã®ã€ã³ã¹ã¿ã³ã¹ãèŠã€ãããŸããã
ç§ã¯diffãèŠãŸãããã if err != nil
ã¿ã€ãã®æ§æã®ã»ãšãã©ãã¹ãŠã®äœ¿çšã¯ãåçŽãªåäžã¬ãã«ã®ãããã¯ã§ãããè¿œå ãããã³ã³ããã¹ãã§ãšã©ãŒãçºçããŸããã try
ãå®éã«ã³ãŒãã®æ§æãå€æŽããã€ã³ã¹ã¿ã³ã¹ãããã€ãèŠã€ããã ãã ãšæããŸãã
èšãæããã°ãç§ã®èŠè§£ã¯ãçŸåšã®åœ¢åŒã®try
ãç§ã«äžãããšããããšã§ãïŒ
- **if err := **json.NewEncoder(&buf).Encode(in)**; err != nil {**
- **return err**
- **}**
+ try(json.NewEncoder(&buf).Encode(in))
ããã¯ç§ã«ãããã®åé¡ããããããŸããïŒ
ãã®ã¹ã¬ããã§åã«æžããããã«ãç§ã¯try
ã§ç掻ã§ããŸãããã³ãŒãã§è©ŠããŠã¿ãåŸãå人çã«ã¯ãããèšèªã«å°å
¥ããããªããšæããŸãã ç§ã®$ .02
圹ã«ç«ããªãæ©èœãã¿ã€ãã³ã°ãç¯çŽããŸããã倧ããããšã§ã¯ãããŸããã
ç§ã¯ãããå€ãæ¹æ³ãéžã³ãŸãã
ããå€ãã®ãšã©ãŒãã³ãã©ãäœæããŠããã©ãã«ã·ã¥ãŒãã£ã³ã°ã容æã«ããããã°ã©ã ãäœæããŸãã
ã¡ãã£ãšèããŠ...
ãã®ã€ãã£ãªã ã¯goã§åœ¹ç«ã¡ãŸãããããã¯ãŸãã«ããã§ãïŒããªããããªããã°ãªããªãã€ãã£ãªã
æ°èŠåå
¥è
ã«æããã æ°ããgoããã°ã©ããŒã¯ãããåŠã¶å¿
èŠããããŸãã
ãé ãããããšã©ãŒåŠçããªãã¡ã¯ã¿ãªã³ã°ããããªããããããŸããã ãŸãã
å¿ããªãéãããã®ã€ãã£ãªã ã䜿çšããŠã³ãŒããçãããããšã¯ã§ããŸããïŒãŸã£ããéã§ãïŒã
ã¡ãœãããæ°ããŸãã
ããã§ãtryãå®è£
ãããŠãããšæ³åããŠã¿ãŸãããããã®ã€ãã£ãªã ã¯ãã©ã®çšåºŠåœ¹ç«ã€ã®ã§ããããã
ãã®ãŠãŒã¹ã±ãŒã¹ïŒ èæ
®äºé
ïŒ
ãããã£ãŠããã®ã€ãã£ãªã ã¯ãtryã«åã£ãŠä»£ãããããšèŠãªãããå¯èœæ§ããããŸãã
Em terã2019幎7æ2æ¥18ïŒ06ã notifications @ github.com escreveuãšããŠïŒ
@cespare https://github.com/cespareãã³ãŒããŒã¯ã次ã®æ§é äœã«ããããšãã§ããŸã
ãã®äžã®ãšã©ãŒã¿ã€ããã¡ãœããã¯åã«err == nilããã§ãã¯ããŸãã
ãã¹ãŠã®æäœãšããŒã«å€ã®OKãè¿ããŸããããã¯ã³ãŒããã¯ã«äœ¿çšããããã»ã¹ã§ãããããtryã¯ãŸã£ãã圹ã«ç«ã¡ãŸãã
ãªããªããéæ³ã§ã¯ãªããçããããç°¡æœãªã€ãã£ãªã ãç°¡åã«äœæã§ããããã§ãã
ãã®ç¹å®ã®ã±ãŒã¹ã®ãšã©ãŒãåŠçãããããâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=AAT5WM3YDDRZXVXOLDQXKH3P5O7L5A5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AAT5WMYXLLO74CIM6H4Y2RLP5O7L5ANCNFSM4HTGCZ7Q
ã
ç§ã®æèŠã§ã¯ããšã©ãŒåŠçã®åé·æ§ã¯è¯ãããšã§ãã èšãæããã°ãç§ã¯è©ŠããŠã¿ãããã®åŒ·åãªãŠãŒã¹ã±ãŒã¹ãèŠãŠããŸããã
ç§ã¯ãã®èããåãå ¥ããŠããŸãããå®è¡åå²ãçºçããå Žæãå€å¥ããããã®äœããã®ã¡ã«ããºã ãå«ããå¿ èŠããããšæããŠããŸãã Xerror / Isã¯ãå Žåã«ãã£ãŠã¯åé¡ãããŸãããïŒããšãã°ããšã©ãŒãErrNotExistsã®å ŽåãOpenã§çºçãããšæšæž¬ã§ããŸãïŒãã©ã€ãã©ãªã®ã¬ã¬ã·ãŒãšã©ãŒãå«ãä»ã®å Žåã«ã¯ä»£æ¿æ段ããããŸããã
å¶åŸ¡ãããŒãå€æŽãããå Žæã«é¢ããã³ã³ããã¹ãæ å ±ãæäŸããããã«ãrecoverãšåæ§ã®çµã¿èŸŒã¿ãå«ããããšãã§ããŸããïŒ ããããããããå®ãä¿ã€ããã«ãtryïŒïŒã®ä»£ããã«å¥ã®é¢æ°ã䜿çšãããŸãã
ãŸãã¯ããããããããã°ã§ããtryïŒïŒãšåãæ§æã§ããããã°æ å ±ãè¿œå ããŠè©ŠããŠãã ããã ãã®ããã«ãtryïŒïŒã¯ãå€ããšã©ãŒåŠçã«é Œãããšãªããå€ããšã©ãŒã䜿çšããã³ãŒãã§ãåæ§ã«åœ¹ç«ã¡ãŸãã
å¥ã®æ¹æ³ã¯ãtryïŒïŒã§ã³ã³ããã¹ããã©ããããŠè¿œå ããããšã§ãããã»ãšãã©ã®å Žåãããã¯ç®çã®ãªãããã©ãŒãã³ã¹ãäœäžããããããè¿œå ã®é¢æ°ãææ¡ããŸãã
ç·šéïŒãããæžããåŸãã³ã³ãã€ã©ãŒã¯ãdeferã¹ããŒãã¡ã³ãããrecoverããšåæ§ã®ãã®ã³ã³ããã¹ãæäŸé¢æ°ã䜿çšãããã©ããã«åºã¥ããŠã䜿çšããtryïŒïŒã®ããªã¢ã³ãã決å®ã§ããããšã«æ°ä»ããŸããã ãã ããããã®è€éãã«ã€ããŠã¯å®ãã§ã¯ãããŸãã
@lestrratãã®ã³ã¡ã³ãã§ã¯ç§ã®æèŠã¯èšããŸãããããtryããç§ãã¡ã«ã©ã®ããã«åœ±é¿ãããã説æããæ©äŒãããã°ãifã¹ããŒãã¡ã³ãã«2ã€ä»¥äžã®ããŒã¯ã³ãæžã蟌ãããšãã§ããŸãã ãããã£ãŠãifã¹ããŒãã¡ã³ãã«200ã®æ¡ä»¶ãèšè¿°ãããšãå€ãã®è¡ãæžããããšãã§ããŸãã
if try(foo()) == 1 && try(bar()) == 2 {
// err
}
n1, err := foo()
if err != nil {
// err
}
n2, err := bar()
if err != nil {
// err
}
if n1 == 1 && n2 == 2 {
// err
}
@mattnã¯ããã§ããã_çè«çã«ã¯_ããªãã¯çµ¶å¯Ÿã«æ£ããã§ãã try
ããŽã£ããåãã±ãŒã¹ãæãã€ãããšãã§ãããšç¢ºä¿¡ããŠããŸãã
ç§ã¯ãå®éã«ã¯ãå°ãªããšã_I_ãã_mycode_ã§è©Šè¡ããããã®ç¿»èš³ã®æ©æµãåãããããªæ§é ã®çºçãã»ãšãã©æ€åºããªãã£ãããŒã¿ãæäŸããŸããã
ç§ãä»ã®äžçãšã¯ç°ãªãæ¹æ³ã§ã³ãŒããæžãããšã¯å¯èœã§ãããPoCã®ç¿»èš³ã«åºã¥ããŠã誰ãããã£ã€ã ã鳎ãã䟡å€ããããšæã£ãã®ã§ããã try
ã®å°å
¥ããå®éã«å€ããåŸãããšãã§ããªã人ãããŸããèšèªã«
äœè«ã§ãããã³ãŒãã§ã¯ãŸã ããªãã®ã¹ã¿ã€ã«ã䜿çšããŸããã ç§ã¯ããã次ã®ããã«æžããŸã
n1 := try(foo())
n2 := try(bar())
if n1 == 1 && n2 == 2 {
return errors.New(`boo`)
}
ãããã£ãŠããããã®n1 / n2 / .... nïŒnïŒã®ã€ã³ã¹ã¿ã³ã¹ããšã«ã»ãŒåãéã®å ¥åãç¯çŽã§ããŸãã
ãªãããŒã¯ãŒãïŒãŸãã¯é¢æ°ïŒãããã®ã§ããïŒ
åŒã³åºãå ã®ã³ã³ããã¹ããn + 1ã®å€ãæåŸ ããŠããå Žåããã¹ãŠã以åãšåãã§ãã
åŒã³åºãå ã®ã³ã³ããã¹ããnåã®å€ãäºæããŠããå Žåãtryåäœãéå§ãããŸãã
ïŒããã¯ããã¹ãŠã®ã²ã©ãæ··ä¹±ãçºçããn = 1ã®å Žåã«ç¹ã«åœ¹ç«ã¡ãŸããïŒ
ç§ã®ideã¯ãã§ã«ç¡èŠãããæ»ãå€ã匷調ããŠããŸãã å¿ èŠã«å¿ããŠããã®ããã®èŠèŠçãªæããããæäŸããã®ã¯ç°¡åã§ãã
@balasanjayã¯ããã©ããã³ã°ãšã©ãŒãçºçããŸãã ãããããã®ã³ã°ãããŸããŸãªãšã©ãŒã«å¯ŸããããŸããŸãªåå¿ïŒ sql.NoRows
ãªã©ã®ãšã©ãŒå€æ°ã§äœããã¹ããïŒãèªã¿åãå¯èœãªã³ãŒããªã©ããããŸãã èªè
ã«ããããããããããã«ããã¡ã€ã«ãéããçŽåŸã«defer f.Close()
ãšæžã蟌ã¿ãŸãã åãçç±ã§ããã«ãšã©ãŒããã§ãã¯ããŸãã
æãéèŠãªããšã¯ããã®ææ¡ãããšã©ãŒã¯å€ã§ããããšããã«ãŒã«ã«éåããŠããããšã§ãã ãããGoã®èšèšæ¹æ³ã§ãã ãããŠããã®ææ¡ã¯èŠåã«çŽæ¥åããŸãã
try(errors.Wrap(err, ...))
ã¯ããã®ææ¡ãšçŸåšã®Goèšèšã®äž¡æ¹ãšççŸãããããå¥ã®ã²ã©ãã³ãŒãã§ãã
ç§ã¯@lestrratã«åæããåŸåããããŸã
éåžžãfooïŒïŒãšbarïŒïŒã¯å®éã«ã¯æ¬¡ã®ãšããã§ãã
SomeFunctionWithGoodNameïŒParm1ãParms2ïŒ
ãã®å Žåãææ¡ããã@mattnæ§æã¯å®éã«ã¯æ¬¡ã®ããã«ãªããŸãã
if try(SomeFunctionWithGoodName(Parm1, Parms2)) == 1 && try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) == 2 {
}
èªã¿ãããã¯éåžžæ··ä¹±ããŸãã
æ»ãå€ãæ€èšããŸãã
someRetVal, err := SomeFunctionWithGoodName(Parm1, Parms2)
1ã2ãªã©ã®å®æ°ãšæ¯èŒãããããé »ç¹ã«äœ¿çšãããŠãããæªåããããšã¯ãããŸããããäºé代å
¥æ©èœãå¿
èŠã§ãã
if a := try(SomeFunctionWithGoodName(Parm1, Parms2)) && b:= try(package.SomeOtherFunction(Parm1, Parms2,Parm3))) {
}
ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠïŒãtryhardã¯ã©ãã ãç§ãå©ããŠãããŸããããïŒïŒ
$find /path/to/repo -name '*.go' -exec cat {} \; | grep "err :=" | wc -l
@makhov
ãã®ææ¡ã¯ããšã©ãŒã¯äŸ¡å€èŠ³ã§ããããšããã«ãŒã«ã«éåããŠããŸã
ããŸãã ãã®ææ¡ã§ã¯ããšã©ãŒã¯äŸç¶ãšããŠå€ã§ãã try()
ã¯ã if err != nil { return ...,err }
ã®ã·ã§ãŒãã«ããã«ãªãããšã§ãå¶åŸ¡ãããŒãåçŽåããŠããŸãã error
åã¯ãçµã¿èŸŒã¿ã®ã€ã³ã¿ãŒãã§ã€ã¹åã§ããããããã§ã«äœããã®åœ¢ã§ãç¹å¥ãã§ãã ãã®ææ¡ã¯ã error
ã¿ã€ããè£å®ããçµã¿èŸŒã¿é¢æ°ãè¿œå ããã ãã§ãã ããã«ç¹å¥ãªããšã¯äœããããŸããã
@ngrillyåçŽåïŒ ã©ã®ããã«ïŒ
func (req *Request) Decode(r Reader) error {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
ãšã©ãŒãã«ãŒãå
ã§è¿ãããããšãã©ã®ããã«ç解ããå¿
èŠããããŸããïŒ foo
ã§ã¯ãªãerr
varã«å²ãåœãŠãããã®ã¯ãªãã§ããïŒ
ãããèŠããŠãã³ãŒãã«å
¥ããªãã»ããç°¡åã§ããïŒ
@daved
æ¬åŒ§ã¯ç§ãäºæ³ããŠãããããããã«æªãã§ã[...]ããŒã¯ãŒãã¯ã¯ããã«èªã¿ãããããããä»ã®å€ãã®äººãç°ãªãç¹ã§ãããšããã®ã¯å°ãéçŸå®çã§ãã
ããŒã¯ãŒããšçµã¿èŸŒã¿é¢æ°ã®ã©ã¡ããéžæãããã¯ãäž»ã«çŸçããã³æ§æäžã®åé¡ã§ãã ãªããããããªãã®ç®ã«ãšãŠãéèŠãªã®ãç§ã¯æ£çŽã«ç解ããŠããŸããã
PSïŒçµã¿èŸŒã¿é¢æ°ã«ã¯ãäžäœäºææ§ããããå°æ¥çã«ä»ã®ãã©ã¡ãŒã¿ãŒã§æ¡åŒµå¯èœã§ãããæŒç®åã®åªå
é äœã«é¢ããåé¡ãåé¿ã§ãããšããå©ç¹ããããŸãã ããŒã¯ãŒãã«ã¯...ããŒã¯ãŒãã§ãããšããå©ç¹ãããã try
ã®ã·ã°ããªã³ã°ã¯ãç¹å¥ãã§ãã
@makhov
åçŽåïŒ
Okã æ£ããèšèã¯ãççž®ãã§ãã
try()
ã¯ããã¿ãŒã³if err != nil { return ..., err }
ãçµã¿èŸŒã¿ã®try()
é¢æ°ã®åŒã³åºãã«çœ®ãæããããšã§ãã³ãŒããççž®ããŸãã
ããã¯ãã³ãŒãã§ç¹°ãè¿ããã¿ãŒã³ãèå¥ãããããæ°ããé¢æ°ã§æœåºããå ŽåãšãŸã£ããåãã§ãã
ã¹ã©ã€ã¹ã«äœããè¿œå ããå¿
èŠããããã³ã«èªåã§ã³ãŒãããextensoãã§èšè¿°ããããšã§çœ®ãæããããšãã§ããappendïŒïŒã®ãããªçµã¿èŸŒã¿é¢æ°ããã§ã«ãããŸãã ããããç§ãã¡ã¯åžžã«ãããè¡ã£ãŠããã®ã§ãããã¯èšèªã«çµ±åãããŸããã try()
ãåãã§ãã
ãšã©ãŒãã«ãŒãå ã§è¿ãããããšãã©ã®ããã«ç解ããå¿ èŠããããŸããïŒ
ã«ãŒãå
ã®try()
ã¯ãã«ãŒãå€ã®æ®ãã®é¢æ°ã®try()
ãšãŸã£ããåãããã«æ©èœããŸãã readID()
ããšã©ãŒãè¿ãå Žåãé¢æ°ã¯ãšã©ãŒãè¿ããŸãïŒifãè£
食ããåŸïŒã
ãªããããfooã§ã¯ãªãerrvarã«å²ãåœãŠãããŠããã®ã§ããïŒ
ã³ãŒãäŸã«foo
å€æ°ã衚瀺ãããŸãã...
@makhovè¿ããããšã©ãŒã«ååãä»ããããŠããªããããã¹ããããã¯äžå®å
šã ãšæããŸãïŒææ¡ããã°ããèªã¿çŽããŸããããå€æ°åerr
ãèšå®ãããŠããªãå Žåãããã©ã«ãåã§ãããã©ããã確èªã§ããŸããã§ããïŒã
è¿ããããã©ã¡ãŒã¿ã®ååãå€æŽããªããã°ãªããªãããšã¯ããã®ææ¡ãæåŠãã人ã ãæ°ã«å ¥ããªãç¹ã®1ã€ã§ãã
func (req *Request) Decode(r Reader) (err error) {
defer func() { err = unexpected(err) }()
req.Type = try(readByte(r))
req.Body = try(readString(r))
req.ID = try(readID(r))
n := try(binary.ReadUvarint(r))
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i] = try(readID(r))
}
return nil
}
@pierrecååä»ããã©ã¡ãŒã¿ãŒã«ãªãå Žåã¯ã recover()
ã®ãããªé¢æ°ã䜿çšããŠãšã©ãŒãååŸã§ããŸããïŒ
defer func() {err = unexpected(tryError())}
@makhovããªãã¯ãããããæ確ã«ããããšãã§ããŸãïŒ
func (req *Request) Decode(r Reader) error {
req.Type, err := readByte(r)
try(err) // or add annotation like try(annotate(err, ...))
req.Body, err := readString(r)
try(err)
req.ID, err := readID(r)
try(err)
n, err := binary.ReadUvarint(r)
try(err)
req.SubIDs = make([]ID, n)
for i := range req.SubIDs {
req.SubIDs[i], err := readID(r)
try(err)
}
return nil
}
@pierrecããããŸãããå€æŽããŸãããïŒ
func (req *Request) Decode(r Reader) error {
var errOne, errTwo error
defer func() { err = unexpected(???) }()
req.Type = try(readByte(r))
âŠ
}
@reuseeãããŠããªããããããåªããŠããã®ã§ããïŒ
func (req *Request) Decode(r Reader) error {
req.Type, err := readByte(r)
if err != nil { return err }
âŠ
}
èªã¿ããããããçãã®æ¹ãåªããŠãããšç§ãã¡å šå¡ãå€æããã®ã¯ãã€ã§ããã
@flibustenetåé¡ãç解ããŠããã ãããããšãããããŸãã èŠãç®ã¯ã¯ããã«è¯ããªããŸããããã®å°ããªãæ¹åãã®ããã«äžäœäºææ§ãå£ãå¿ èŠããããã©ããã¯ãŸã ããããŸããã æ°ããããŒãžã§ã³ã®Goã§ãã«ããåæ¢ããã¢ããªã±ãŒã·ã§ã³ããããšãéåžžã«ç ©ããããªããŸãã
package main
func main() {
// ...
try("a", "b")
// ...
}
func try(a, b string) {
// ...
}
@makhovãããæ確ã«ããå¿
èŠãããããšã«åæããŸããå€æ°ãç解ã§ããªãå Žåãã³ã³ãã€ã©ã¯ãšã©ãŒã«ãªããŸããïŒ ããã ãšæããŸããã
ãã¶ããææ¡ã¯ãã®ç¹ãæ確ã«ããå¿
èŠããããŸããïŒ ãããšãç§ã¯ãããææžã§èŠéããŸãããïŒ
@flibustenetã¯ããããã¯tryïŒïŒã䜿çšãã1ã€ã®æ¹æ³ã§ãããtryã䜿çšããæ £çšçãªæ¹æ³ã§ã¯ãªãããã«æãããŸãã
@cespareããªããæžããããšãããdeferã®æ»ãå€ã®å€æŽã¯try
ã®æ©èœã®ããã§ããããã§ã«ãããè¡ãããšãã§ããŸãã
https://play.golang.com/p/ZMauFmt9ezJ
ïŒããªãã®èšã£ãããšã誀解ããŠãã¿ãŸããïŒ
@ jan-g https://github.com/golang/go/issues/32437#issuecomment -507961463ã«ã€ããŠïŒç®ã«èŠããªã圢ã§ãšã©ãŒãåŠçãããšããèããäœåºŠãåºãŠããŸããã ãã®ãããªæé»çãªã¢ãããŒãã®åé¡ã¯ãåŒã³åºãããé¢æ°ã«ãšã©ãŒãªã¿ãŒã³ãè¿œå ãããšãåŒã³åºãå ã®é¢æ°ããµã€ã¬ã³ãã«ãç®ã«èŠããªã圢ã§ç°ãªãåäœãããå¯èœæ§ãããããšã§ãã ãšã©ãŒããã§ãã¯ããããšãã¯ã絶察ã«æ瀺çã«ããããšæããŸãã æé»ã®ã¢ãããŒãã¯ããã¹ãŠãæ瀺çã§ãããšããGoã®äžè¬ååã«ãåããŸãã
@griesemer
ãããžã§ã¯ãã®1ã€ïŒhttps://github.com/komuw/meliïŒã§tryhand
ãè©ŠããŸããããå€æŽã¯ãããŸããã§ããã
gobin github.com/griesemer/tryhard
Installed github.com/griesemer/[email protected] to ~/go/bin/tryhard
`` `bash
ã/ go / bin / tryhard -err "" -r
0
most of my err handling looks like;
```Go
import "github.com/pkg/errors"
func CreateDockerVolume(volName string) (string, error) {
volume, err := VolumeCreate(volName)
if err != nil {
return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
}
return volume.Name, nil
}
@komuwãŸãããã¡ã€ã«åãŸãã¯ãã£ã¬ã¯ããªã®åŒæ°ãtryhard
ã«æå®ããŠãã ããã
tryhard -err="" -r . // <<< note the dot
tryhard -err="" -r filename
ãŸããã³ã¡ã³ãã«ãããããªã³ãŒãã¯ã if
ãããã¯ã§ç¹å®ã®ãšã©ãŒåŠçãè¡ããããæžãçŽãããŸããã é©çšãããææã«ã€ããŠã¯ã tryhard
ã®ããã¥ã¡ã³ãããèªã¿ãã ããã ããããšãã
func CreateDockerVolume(volName string) (string, error) {
volume, err := VolumeCreate(volName)
if err != nil {
return "", errors.Wrapf(err, "unable to create docker volume %v", volName)
}
return volume.Name, nil
}
ããã¯ããèå³æ·±ãäŸã§ãã ãããèŠããšãã®ç§ã®æåã®åå¿ã¯ãããã次ã®ãããªåé³ã®ãšã©ãŒæååãçæãããã©ãããå°ããããšã§ããã
unable to create docker volume: VolumeName: could not create volume VolumeName: actual problem
VolumeCreate
é¢æ°ïŒå¥ã®ãªããžããªããïŒã¯æ¬¡ã®ãšããã§ãããããçãã¯ããã§ã¯ãããŸããã
func (cli *Client) VolumeCreate(ctx context.Context, options volumetypes.VolumeCreateBody) (types.Volume, error) {
var volume types.Volume
resp, err := cli.post(ctx, "/volumes/create", nil, options, nil)
defer ensureReaderClosed(resp)
if err != nil {
return volume, err
}
err = json.NewDecoder(resp.body).Decode(&volume)
return volume, err
}
ã€ãŸããåºã«ãªãé¢æ°ããšã©ãŒãè£
食ããªãã£ãããããšã©ãŒã®è¿œå ã®è£
食ã圹ç«ã¡ãŸãã ãã®åºç€ãšãªãé¢æ°ã¯ã try
ã§å°ãç°¡ç¥åã§ããŸãã
ããããã VolumeCreate
é¢æ°ã¯å®éã«ãã®ãšã©ãŒãè£
食ããŠããã¯ãã§ãã ãã ãããã®å ŽåãæäŸããæ°ããæ
å ±ããªãããã CreateDockerVolume
é¢æ°ã§è£
食ãè¿œå ããå¿
èŠããããã©ããã¯ããããŸããã
@neild
VolumeCreate
ããšã©ãŒãè£
食ããå Žåã§ããä»ã®ããŸããŸãªé¢æ°ããVolumeCreate
ãåŒã³åºãããå¯èœæ§ããããããè£
食ãè¿œå ããã«CreateDockerVolume
ãå¿
èŠã§ãããã°ã«èšé²ãããïŒäœã倱æããããç¥ããã-ãã®å Žåã¯CreateDockerVolume
ã
ããã§ãã VolumeCreate
ãæ€èšããããšã¯APIclientã€ã³ã¿ãŒãã§ãŒã¹ã®äžéšã§ãã
åãããšãä»ã®ã©ã€ãã©ãªã«ãåœãŠã¯ãŸããŸã- os.Open
ã¯ãã¡ã€ã«åããšã©ãŒã®çç±ãªã©ãããŸã食ãããšãã§ããŸããã
func ReadConfigFile(...
func WriteDataFile(...
ãªã©- os.Open
ã®åŒã³åºãã¯ããšã©ãŒããã°ã«èšé²ããã¬ãŒã¹ãããã³åŠçããããã«ç¢ºèªãããå®éã®é害éšåã§ããç¹ã«ãæ¬çªç°å¢ã ãã§ã¯ãããŸããã
@neildããããšãã
ãã®ã¹ã¬ãããè±ç·ãããããªãã®ã§ãã...
ãããããVolumeCreateé¢æ°ã¯å®éã«ãã®ãšã©ãŒãè£ é£ŸããŠããã¯ãã§ãã
ãã ãããã®å Žåã
CreateDockerVolumeé¢æ°
è¿œå ã®è£ 食ãè¿œå ããå¿ èŠããããŸãã
åé¡ã¯ã CreateDockerVolume
é¢æ°ã®äœæè
ãšããŠãç§ã¯ããã§ã¯ãªããããããªããšããããšã§ã
VolumeCreate
ã®äœè
ããšã©ãŒãè£
食ãããã©ãããç¥ã£ãŠããã®ã§ãç§ã¯
ç§ã食ãå¿
èŠã¯ãããŸããã
ãããŠãç§ã圌ããæã£ãŠããããšãç¥ã£ãŠãããšããŠãã圌ãã¯åœŒãã®è£
食ãå€ãããšã決ããããšãã§ããŸãã
ãã以éã®ããŒãžã§ã³ã§æ©èœããŸãã ãããŠããã®å€æŽã¯APIãå€æŽãããã®ã§ã¯ãªãããã
ããã/ãã€ããŒããŒãžã§ã³ãšããŠãªãªãŒã¹ããä»ã§ã¯ç§ã®æ©èœã¯
è£
食ããããšã©ãŒãæã£ãŠãããããã®æ©èœã«äŸåããŠããã¹ãŠãæã£ãŠããããã§ã¯ãããŸãã
å¿
èŠãªæ
å ±ã
ã ããäžè¬çã«ç§ã¯èªåãå³æžé€šã ãšããŠã食ã£ããã©ããã³ã°ãããããŠããããšã«æ°ä»ã
åŒã³åºãã¯ãã§ã«çµäºããŠããŸãã
ååãštry
ã«ã€ããŠè©±ããŠãããšãã«èããŸããã ãã¶ãtry
ã¯1.14ã®æšæºã©ã€ãã©ãªã«å¯ŸããŠã®ã¿æå¹ã«ããå¿
èŠããããŸãã @crawshawãš@jimmyfrascheã¯ã©ã¡ãããããã€ãã®ã±ãŒã¹ãç°¡åã«èª¬æããããã€ãã®èŠç¹ã瀺ããŸããããå®éã«ã¯ãå¯èœãªéãtry
ã䜿çšããŠæšæºã©ã€ãã©ãªã³ãŒããæžãçŽãããšã¯äŸ¡å€ããããŸãã
ããã«ãããGoããŒã ã¯ããã䜿çšããŠéèŠãªãããžã§ã¯ããæžãçŽãæéãã§ããã³ãã¥ããã£ã¯ãããã©ã®ããã«æ©èœãããã«ã€ããŠã®çµéšã¬ããŒããæã€ããšãã§ããŸãã 䜿çšé »åºŠã defer
ãšãã¢ãªã³ã°ããå¿
èŠãããé »åºŠãã³ãŒãã®å¯èªæ§ãå€ããå Žåã tryhard
ã®æçšæ§ãªã©ãããããŸãã
ããã¯æšæºã©ã€ãã©ãªã®ç²Ÿç¥ã«å°ãåããŠãããéåžžã®Goã³ãŒãã§ã¯äœ¿çšã§ããªããã®ã䜿çšã§ããŸããã try
ãæ¢åã®ã³ãŒãããŒã¹ã«ã©ã®ããã«åœ±é¿ãããã確èªããããã®éã³å ŽãæäŸããŸãã
ä»ã®èª°ããããã«ã€ããŠãã§ã«èããŠããå Žåã¯ãè©«ã³ããŸãã ãããããªè°è«ãããŸãããã䌌ããããªææ¡ã¯èŠåœãããŸããã§ããã
@jonbodner https://go-review.googlesource.com/c/go/+/182717ã¯ããããã©ã®ããã«èŠãããã«ã€ããŠã®ããªãè¯ãã¢ã€ãã¢ãæäŸããŸãã
ãããŠãç§ã¯èšãã®ãå¿ããŸããïŒç§ã¯ããªãã®èª¿æ»ã«åå ããŸããããããŠç§ã¯ããã§ã¯ãªããããè¯ããšã©ãŒåŠçã«æ祚ããŸããã
ãšã©ãŒåŠçãå¿ããªãããã«ãã£ãšå³ããããããšããæå³ã§ããã
@jonbodner https://go-review.googlesource.com/c/go/+/182717ã¯ããããã©ã®ããã«èŠãããã«ã€ããŠã®ããªãè¯ãã¢ã€ãã¢ãæäŸããŸãã
ç·æ¬ããïŒ
if ... { return err }
ã䜿çšããå Žåã¯2è¡ïŒèŠãç®ã®å€æŽã®ããã«èŠãããã®ã®åèšã§çŽ6,000ã®äº€æïŒæ¢åã®ãšã©ãŒãå ¬éãããããããæ°ãããšã©ãŒãå°å ¥ããŸããïŒã©ã¡ãããééã£ãŠããå Žåã¯ä¿®æ£ããŠãã ããïŒã
ç§ã¯ãã¡ã³ããã®ç«å Žã§ãèªåã®ã³ãŒãã§ãã®ãããªããšãããããè¡ãã§ããããïŒ èªåã§äº€æããŒã«ãæžããªãéããããã§ã¯ãããŸããã ããã§ã golang/go
ãªããžããªã§åé¡ãããŸããã
PS CLã®èå³æ·±ãå 責äºé ïŒ
... Some transformations
may be incorrect
due to the limitations of the
tool (see https://github.com/griesemer/tryhard)...
xerrors
ã®ããã«ããµãŒãããŒãã£ã®ããã±ãŒãžãšããŠäœ¿çšããããã®æåã®äžæ©ãèžã¿åºããŠã¿ãŸãããïŒ
ããšãã°ã以äžã®ããã±ãŒãžã䜿çšããŠã¿ãŠãã ããã
https://github.com/junpayment/gotry
ãã ããã£ãŠã¿ãã®ãããã¢ã€ãã¢ã ãšæãã®ã§ãå®éã«äœ¿ã£ãŠåœ±é¿ãå°ãªãããã¢ãããŒãããããšæããŸãã
===
äœè«ã§ãããç§ãæ°ã«ãªã£ãŠããããšã2ã€ãããŸãã
1.ãã®è¡ã¯çç¥ã§ãããšããæèŠããããŸãããdeferïŒãŸãã¯handlerïŒå¥ã¯èæ ®ãããŠããªãããã§ãã
ããšãã°ããšã©ãŒåŠçã詳现ã§ããå Žåã
foo, err: = Foo ()
if err! = nil {
if err.Error () = "AAA" {
some action for AAA
} else if err.Error () = "BBB" {
some action for BBB
} else if err.Error () = "CCC" {
some action for CCC
} else {
return err
}
}
ãããåã«tryã«çœ®ãæãããšã次ã®ããã«ãªããŸãã
handler: = func (err error) {
if err.Error () = "AAA" {
some action for AAA
} else if err.Error () = "BBB" {
some action for BBB
} else if err.Error () = "CCC" {
some action for CCC
} else {
return err
}
}
foo: = try (Foo (), handler)
2.ãšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã誀ã£ãŠå®è£ ããä»ã®äžè¯ããã±ãŒãžãããå¯èœæ§ããããŸãã
type Bad struct {}
func (bad * Bad) Error () {
return "i really do not intend to be an error"
}
@junpayment gotry
ããã±ãŒãžãããããšã-ããã¯try
ã®æ觊ãã€ããããã®äžã€ã®æ¹æ³ã ãšæããŸããããã¹ãŠã®Try
ãå
¥åããªããã°ãªããªãã®ã¯å°ãé¢åã§ãinterface{}
ããçããŸãã
ããªãã®2ã€ã®è³ªåã«ã€ããŠïŒ
1ïŒããã§ã©ãã«è¡ãã®ãããããŸããã try
ãããªãã®äŸã®ããã«ãã³ãã©ãŒãåãå
¥ããã¹ãã ãšææ¡ããŠããŸããïŒ ïŒãããŠã以åã®å
éšããŒãžã§ã³ã®try
ã§æã£ãŠããããã«ïŒïŒ
2ïŒãšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã誀ã£ãŠå®è£
ããé¢æ°ã«ã€ããŠã¯ããŸãå¿é
ããŠããŸããã ãã®åé¡ã¯æ°ãããã®ã§ã¯ãªããç§ãã¡ã®ç¥ãéããæ·±å»ãªåé¡ãåŒãèµ·ãããŠããããã«ã¯èŠããŸããã
@jonbodner https://go-review.googlesource.com/c/go/+/182717ã¯ããããã©ã®ããã«èŠãããã«ã€ããŠã®ããªãè¯ãã¢ã€ãã¢ãæäŸããŸãã
ãã®æŒç¿ãããŠããã ãããããšãããããŸãã ããããããã¯ç§ãçã£ãããšãç§ã«ç¢ºèªããŸããgoãœãŒã¹ã³ãŒãèªäœã«ã¯ããšã©ãŒãæž¡ãããã°ãããªã®ã§ã try()
ã圹ç«ã€å ŽæããããããããŸãã ãã ããä»ã®äººãç§ãäžèšã§æåºããtryhard
ã®å®éšãããããããã«ãä»ã®å€ãã®ã³ãŒãããŒã¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããšã©ãŒã¯å®éã«ã¯åŠçãããªãåŸåãããããã try()
ã¯ããŸã圹ã«ç«ã¡ãŸãããæž¡ãããã°ããã§ãã
ããã¯ãGoã®èšèšè
ãèŠããŠããã¹ãããšã ãšæããŸããgoã³ã³ãã€ã©ãšå®è¡æéã¯ãGoã¢ããªã±ãŒã·ã§ã³ã³ãŒããšã¯ç°ãªããããããŠããŒã¯ãªãGoã³ãŒãã§ãã ãããã£ãŠã try()
ã¯ããšã©ãŒãå®éã«åŠçããå¿
èŠããããdeferã¹ããŒãã¡ã³ãã䜿çšããŠãšã©ãŒåŠçãè¡ãããšãå®éã«ã¯æãŸãããªãä»ã®å Žåã«ã圹ç«ã€ããã«æ¡åŒµããå¿
èŠããããšæããŸãã
@griesemer
å®éã®äœ¿çšã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹{}ãããã¹ãŠã®Tryçµæãã¿ã€ãã¢ãµãŒãããå¿ èŠãããã®ã¯å°ãé¢åã§ãã
ããªããæ£ããã ãã®ã¡ãœããã§ã¯ãåŒã³åºãå ãåããã£ã¹ãããå¿ èŠããããŸãã
ããã§ã©ãã«è¡ãã®ãããããŸããã ããªãã®äŸã®ããã«ãtryããã³ãã©ãŒãåãå ¥ããã¹ãã ãšææ¡ããŠããŸããïŒ ïŒãããŠã以åã®å éšããŒãžã§ã³ã®tryã§è¡ã£ãããã«ïŒïŒ
ç§ãééããŸããã ãã³ãã©ãŒã§ã¯ãªãdeferã䜿çšããŠèª¬æããå¿ èŠããããŸãã ããããªããã
ç§ãèšãããã£ãã®ã¯ãçç¥ããããšã©ãŒåŠçããã»ã¹ã®çµæãšããŠããããã³ãŒãã®éã«å¯äžããªãå Žåããããšããããšã§ãããšã«ãã延æã§èª¬æããå¿ èŠããããŸãã
ãšã©ãŒã詳现ã«åŠçãããå Žåã圱é¿ã¯ããé¡èã«ãªããšäºæ³ãããŸãã
ãããã£ãŠãã³ãŒãã®è¡æ°ãæžããã®ã§ã¯ãªãããšã©ãŒåŠçã®å ŽæãæŽçããææ¡ãç解ã§ããŸãã
é¢æ°ã誀ã£ãŠãšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããããšã«ã€ããŠã¯ããŸãå¿é ããŠããŸããã ãã®åé¡ã¯æ°ãããã®ã§ã¯ãªããç§ãã¡ã®ç¥ãéããæ·±å»ãªåé¡ãåŒãèµ·ãããŠããããã«ã¯èŠããŸããã
ãŸãã«ããã¯ãŸããªã±ãŒã¹ã§ãã
@beoran Go CorpusïŒhttps://github.com/rsc/corpusïŒã®åæåæãè¡ããŸããã çŸåšã®ç¶æ
ã®tryhard
ã¯ãã³ãŒãã¹å
ã®ãã¹ãŠã®err != nil
ãã§ãã¯ã®41.7ïŒ
ãæé€ã§ãããšæããŸãã ãã¿ãŒã³ã_test.goããé€å€ãããšããã®æ°å€ã¯51.1ïŒ
ã«äžæããŸãïŒ tryhard
ã¯ãšã©ãŒãè¿ãé¢æ°ã§ã®ã¿åäœãããã¹ãã§ãããã®å€ããæ€åºããªãåŸåããããŸãïŒã èŠåããããã®æ°å€ãäžç²ã®å¡©ã§ãšã£ãŠãã ããããããã³ã°ãããããŒãžã§ã³ã®tryhard
ã䜿çšããŠãåæ¯ïŒã€ãŸãã err != nil
ãã§ãã¯ãå®è¡ããã³ãŒãå
ã®å Žæã®æ°ïŒãååŸããŸãããçæ³çã«ã¯tryhard
ããããã®çµ±èšèªäœãå ±åãããŸã§åŸ
ã¡ãŸãã
ãŸãã tryhard
ãåèªèã«ãªããšãçè«çã«ã¯æ¬¡ã®ãããªå€æãå®è¡ã§ããŸãã
// Before.
a, err := foo()
if err != nil {
return 0, nil, errors.Wrapf(err, "some message %v", b)
}
// After.
a, err := foo()
try(errors.Wrapf(err, "some message %v", b))
ããã¯ãšã©ãŒãå©çšããŸããæž¡ããããšã©ãŒåŒæ°ãnil
$ã®å Žåã«nil
ãè¿ãWrapã®åäœã ïŒgithub.com/pkg/errorsããã®ç¹ã§äžæã§ã¯ãããŸããããšã©ãŒã®æãè¿ããè¡ãããã«äœ¿çšããå
éšã©ã€ãã©ãªãã nil
ãšã©ãŒãä¿æããã»ãšãã©ã®ãšã©ãŒåŠçã©ã€ãã©ãªãšåæ§ã«ããã®ãã¿ãŒã³ã§ãæ©èœããŸãããã¹ãtry
ãç§ã¯æ³åããŸãïŒã æ°äžä»£ã®ãµããŒãã©ã€ãã©ãªã¯ããããããããã®äŒæãã«ããŒã®ååãå°ãç°ãªããŸãã
ããããã¹ããããŠããªãerr != nil
ãã§ãã¯ã®50ïŒ
ã«é©çšãããããšãèãããšããã¿ãŒã³ããµããŒãããã©ã€ãã©ãªãé²åããåã¯ãGoã³ã³ãã€ã©ãšã©ã³ã¿ã€ã ãäžæã§ã¯ãªãããã§ãã ã
CreateDockerVolume
ã®äŸã«ã€ããŠhttps://github.com/golang/go/issues/32437#issuecomment -508199875
ç§ã¯ãŸã£ããåãçš®é¡ã®äœ¿çšæ³ãèŠã€ããŸããã libã§ã¯ãåãšã©ãŒã§ã³ã³ããã¹ãã䜿çšããŠãšã©ãŒãã©ããããŸããlibã®äœ¿çšã§ã¯ã try
ã䜿çšããé¢æ°å
šäœã§defer
ã«ã³ã³ããã¹ããè¿œå ããŸãã
æåã«ãšã©ãŒãã³ãã©é¢æ°ãè¿œå ããŠãããæš¡å£ããããšããŸããããæ£åžžã«æ©èœããŠããŸãã
func MyLib() error {
return errors.New("Error from my lib")
}
func MyOtherLib() error {
return errors.New("Error from my otherLib")
}
func Caller(a, b int) error {
eh := func(err error) error {
return fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, err)
}
err := MyLib()
if err != nil {
return eh(err)
}
err = MyOtherLib()
if err != nil {
return eh(err)
}
return nil
}
ããã¯try+defer
ã§ããŸããããŠæ
£çšçã«èŠããŸã
func Caller(a, b int) (err error) {
defer fmt.Errorf("From Caller with %d and %d i found this error: %v", a, b, &err)
try(MyLib())
try(MyOtherLib())
return nil
}
@griesemer
èšèšããã¥ã¡ã³ãã«ã¯çŸåšã次ã®ã¹ããŒãã¡ã³ãããããŸãã
å²ãã§ããé¢æ°ãä»ã®ååä»ãçµæãã©ã¡ãŒã¿ãŒã宣èšããŠããå Žåããããã®çµæãã©ã¡ãŒã¿ãŒã¯ãããããæã€å€ãä¿æããŸãã é¢æ°ãä»ã®ååã®ãªãçµæãã©ã¡ãŒã¿ãŒã宣èšããå Žåããããã¯å¯Ÿå¿ãããŒãå€ãæ³å®ããŸãïŒããã¯ãã§ã«æã£ãŠããå€ãä¿æããã®ãšåãã§ãïŒã
ããã¯ããã®ããã°ã©ã ã0ã§ã¯ãªã1ãåºåããããšãæå³ããŸãïŒhttpsïŒ //play.golang.org/p/KenN56iNVg7ã
Twitterã§ç§ã«ææãããããã«ãããã«ããtry
ã¯ãã€ããããªã¿ãŒã³ã®ããã«åäœããè¿ãããå€ã¯æé»çã§ãã è¿ãããå®éã®å€ãææ¡ããã«ã¯ã try
èªäœã®åŒã³åºãããããªãé¢ããå Žæã«ããã³ãŒãã調ã¹ãå¿
èŠãããå ŽåããããŸãã
ãã€ããããªã¿ãŒã³ïŒéå±ææ§ïŒã®ãã®ããããã£ã¯äžè¬çã«å«ãããŠããããšãèãããšã try
ãåžžã«éãšã©ãŒåŒæ°ã®ãŒãå€ãè¿ãããã«ããããšã«ã€ããŠã©ãæããŸããïŒãããæ»ã£ãå ŽåïŒïŒ
ããã€ãã®èæ ®äºé ïŒ
ããã«ãããååä»ãæ»ãå€ã®äœ¿çšãå«ãäžéšã®ãã¿ãŒã³ã§try
ã䜿çšã§ããªããªãå¯èœæ§ããããŸãã ããšãã°ã io.Writer
ã®å®è£
ã®å Žåãéšåçãªæžã蟌ã¿ã®ç¶æ³ã§ããæžã蟌ãŸãããã€ãæ°ãè¿ãå¿
èŠããããŸãã ãšã¯ããããã®å Žåã try
ã¯ãšã©ãŒãçºçããããããã§ãïŒããšãã°ããšã©ãŒãè¿ãããå Žåã n += try(wrappedWriter.Write(...))
ã¯n
ãæ£ããæ°å€ã«èšå®ããŸããïŒã ç§ã®çµéšã§ã¯ãå€ãšãšã©ãŒã®äž¡æ¹ãå¿
èŠãªã·ããªãªã¯ããªããŸãã§ããããã try
ããããã®çš®é¡ã®ãŠãŒã¹ã±ãŒã¹ã§äœ¿çšã§ããªããªãããšã¯ç§ã«ã¯åé¡ãªãããã§ãã
try
ãå€ã䜿çšããé¢æ°ãããå Žåãããã¯ã³ãŒãã®èšåŒµã«ã€ãªããå¯èœæ§ããããé¢æ°å
ã«åºåå€æ°ããŒãã«ããå¿
èŠã®ããå Žæãå€æ°ãããŸãã ãŸããæè¿ã®ã³ã³ãã€ã©ã¯äžèŠãªæžã蟌ã¿ãæé©åããã®ã«éåžžã«åªããŠããŸãã 次ã«ãå¿
èŠã§ããããšãå€æããå Žåã try
çæããããã¹ãŠã®ãããã¯goto
ãããšã©ãŒä»¥å€ã®åºåå€ããŒãã«ããå
±éã®å
±æé¢æ°å
šäœã®ã©ãã«ã«èšå®ããã®ã¯ç°¡åãªæé©åã®ããã§ãã
ãŸãããåç¥ã®ãšããã tryhard
ã¯ãã§ã«ãã®æ¹æ³ã§å®è£
ãããŠãããããå¯æ¬¡çãªå©ç¹ãšããŠãããã«ããtryhard
ãããæ£ç¢ºã«ãªããŸãã
@jonbodner https://go-review.googlesource.com/c/go/+/182717ã¯ããããã©ã®ããã«èŠãããã«ã€ããŠã®ããªãè¯ãã¢ã€ãã¢ãæäŸããŸãã
ãã®æŒç¿ãããŠããã ãããããšãããããŸãã ããããããã¯ç§ãçã£ãããšãç§ã«ç¢ºèªããŸããgoãœãŒã¹ã³ãŒãèªäœã«ã¯ããšã©ãŒãæž¡ãããã°ãããªã®ã§ã
try()
ã圹ç«ã€å ŽæããããããããŸãã ãã ããä»ã®äººãç§ãäžèšã§æåºããtryhard
ã®å®éšãããããããã«ãä»ã®å€ãã®ã³ãŒãããŒã¹ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã³ãŒããšã©ãŒã¯å®éã«ã¯åŠçãããªãåŸåããããããtry()
ã¯ããŸã圹ã«ç«ã¡ãŸãããæž¡ãããã°ããã§ãã
ç§ã¯ãããå¥ã®æ¹æ³ã§è§£éããŸãã
ç§ãã¡ã¯ãžã§ããªãã¯ãæã£ãŠããªãã£ãã®ã§ãæžãããã³ãŒãã«åºã¥ããŠãžã§ããªãã¯ããçŽæ¥å©çãåŸãã§ãããã³ãŒããå®éã«èŠã€ããã®ã¯é£ããã§ãããã ããã¯ãžã§ããªãã¯ã圹ã«ç«ããªããšããæå³ã§ã¯ãããŸããã
ç§ã®å Žåããšã©ãŒåŠçã®ã³ãŒãã§äœ¿çšãã2ã€ã®ãã¿ãŒã³ããããŸã
ãããã®ãã¿ãŒã³ã¯åºãæ®åããŠããŸããããæ©èœããŸãã 1ïŒãšã¯ã¹ããŒããããŠããªãé¢æ°ã®æšæºã©ã€ãã©ãªã§äœ¿çšããã2ïŒçŽäº€æ©èœã䜿çšããŠåçŽåããããšã©ãŒè£ 食ãè¡ãããã®åªããæ¹æ³ã§ãããšèãããããéå»æ°å¹Žéãã³ãŒãããŒã¹ã§åºã䜿çšãããŠããŸããã¢ãããŒããç¥çŠããŸããã ããããæ®åããŠããªããšããäºå®ã¯ãããããè¯ããªããšããæå³ã§ã¯ãããŸããã ãããããã¹ãŠã®å Žåãšåæ§ã«ãGoããŒã ãæšå¥šããã¬ã€ãã©ã€ã³ã¯ãå°æ¥ãããããããå®éã«äœ¿çšãããããã«ãªãã§ãããã
æåŸã®æ³šæç¹ã¯ãã³ãŒãã®ãã¹ãŠã®è¡ã®è£ 食ãšã©ãŒãå°ãå€ãããå¯èœæ§ãããããšã§ãã ãšã©ãŒãè£ é£Ÿããããšãçã«ããªã£ãŠããå Žæãšããã§ãªãå ŽæããããŸãã 以åã¯åªããã¬ã€ãã©ã€ã³ããªãã£ãããããšã©ãŒãåžžã«è£ 食ããããšãçã«ããªã£ãŠãããšäººã ã¯å€æããŸããã ãã ããããã±ãŒãžå ã§ããã¡ã€ã«ãéãããšãã§ããŸããïŒconf.jsonããšãããšã©ãŒã§ã¯ãªããããã¡ã€ã«ãéãããšãã§ããŸããïŒconf.jsonããšãããšã©ãŒãçºçããã ãã§ååãªå Žåãããããããã¡ã€ã«ãéããªããã³ã«åžžã«è£ 食ããããšã¯ããŸã䟡å€ããããŸããããŠãŒã¶ãŒåãååŸããã«ã¯ïŒdbæ¥ç¶ãååŸã§ããŸããïŒã·ã¹ãã ãã¡ã€ã«ãèªã¿èŸŒããŸããïŒãã¡ã€ã«ãéãããšãã§ããŸããïŒconf.json "ã
ãšã©ãŒå€ãšç°¡æœãªãšã©ãŒåŠçã®çµã¿åããã«ããããšã©ãŒã®åŠçæ¹æ³ã«é¢ããããè¯ãã¬ã€ãã©ã€ã³ãåŸãããããã«ãªããŸããã 奜ã¿ã¯æ¬¡ã®ããã§ãïŒ
ç§ã¯ãtryææ¡ã®ç®æšãšãããã解決ããããšããŠããé«ã¬ãã«ã®ããšãèŠèœãšããŠããããã«æããåŸåããããŸãã
å€ãã®äººã ã¯ãŸã 1ïŒãæã£ãŠããŸãã å€ãã®äººã ã1ïŒãåé¿ããŸãããããã¯ã以åã¯ããè¯ãã¬ã€ãã©ã€ã³ãååšããªãã£ãããã§ãã ããããããã¯åœŒããããã䜿ãå§ããåŸã圌ãã®åŠå®çãªåå¿ãããè¯å®çã«ãªãããã«å€ãããªããšããããšãæå³ããŸããã
å€ãã®äººã䜿çšã§ããŸã2ïŒã ã©ãã ãã®æèŠã®çžéããããããããŸãããããããç§ã®ã³ãŒããã¯ããã«ç°¡åã«ããäŸãæããŸããã
var u user = try(db.LoadUser(try(strconv.ParseInt(stringId)))
äŸå€ãæšæºã§ããJavaã§ã¯ã次ã®ããã«ãªããŸãã
User u = db.LoadUser(Integer.parseInt(stringId)))
誰ããã®ã³ãŒããèŠãŠã2è¡ã§å®è¡ããå¿ èŠããããšã¯èšããŸããã
int id = Integer.parseInt(stringId)
User u = db.LoadUser(id))
ããã§ãããè¡ãå¿ èŠã¯ãããŸãããã¬ã€ãã©ã€ã³ã®äžã§ã¯ãtryã¯ã€ã³ã©ã€ã³ãšåŒã°ããŠã¯ãªãããåžžã«ç¬èªã®è¡ã«ããå¿ èŠããããŸãã
ããã«ãä»æ¥ãã»ãšãã©ã®ã³ãŒãã¯æ¬¡ã®ãããªããšãè¡ããŸãã
var u user
var err error
var id int
id, err = strconv.ParseInt(stringId)
if err != nil {
return u, errors.Wrap("cannot load userid from string: %s: %v", stringId, err)
}
u, err = db.LoadUser(id)
if err != nil {
return u, errors.Wrap("cannot load user given user id: %d: %v", id, err)
}
// now work with u
ããŠããããèªãã§ãã人ã¯ããããã®10è¡ã解æããå¿ èŠããããŸããããã¯ãJavaã§ã¯1è¡ã§ãããããã§ã®ææ¡ã§ã¯1è¡ã«ãªãå¯èœæ§ããããŸãã ãã®ã³ãŒããèªããšããç§ã¯ããã®ã©ã®è¡ãæ¬åœã«é©åã§ããããèŠèŠçã«ç¢ºèªããå¿ èŠããããŸãã ãã€ã©ãŒãã¬ãŒãã¯ããã®ã³ãŒããèªã¿ã«ããããç解ãã«ããããŸãã
ç§ã¯éå»ã®äººçã§ãJavaã§ã¢ã¹ãã¯ãæåããã°ã©ãã³ã°ã«åãçµãã§ããããšãèŠããŠããŸãã ããã§ã®ç®æšã¯
ããã«ãããæ©èœã®äžæ žãšãªãã³ãŒããä¹±éã«ããããšãªããããžãã¹ããžãã¯ã®äžå¿ã§ã¯ãªãåäœïŒãã®ã³ã°ãªã©ïŒãããã°ã©ã ã«è¿œå ã§ããŸãã ïŒãŠã£ãããã£ã¢https://en.wikipedia.org/wiki/Aspect-Oriented_programmingããã®åŒçšïŒã
ãšã©ãŒåŠçã¯ããžãã¹ããžãã¯ã®äžå¿ã§ã¯ãããŸããããæ£ç¢ºãã®äžå¿ã§ãã èãæ¹ã¯åãã§ããããããããšã©ãŒåŠçã¯éåžžã«éèŠã§ããããããããžãã¹ããžãã¯ã®äžå¿ã§ã¯ãªããã®ã§ã³ãŒããä¹±éã«ããã¹ãã§ã¯ãããŸããã ã¯ããããã§ãããããŠã¯ããç§ãã¡ã¯ããã暪ã«çœ®ãããšãã§ããŸãã
4ïŒã«é¢ããŠã¯ãå€ãã®ææ¡ã§ãšã©ãŒãã³ãã©ãŒãææ¡ãããŠããŸããããã¯ããšã©ãŒãåŠçããåŽã®ã³ãŒãã§ãããããžãã¹ããžãã¯ãä¹±éã«ããããšã¯ãããŸããã æåã®ææ¡ã«ã¯ãã®ããã®handleããŒã¯ãŒããããã人ã ã¯ä»ã®ããšãææ¡ããŸããã ãã®ææ¡ã§ã¯ã延æã¡ã«ããºã ã掻çšããŠã以åã¯ã¢ãã¬ã¹è ±ã ã£ãé床ãäžããããšãã§ãããšè¿°ã¹ãŠããŸãã ç§ã¯ç¥ã£ãŠããŸã-ç§ã¯goããŒã ã«äœåºŠã延æã¡ã«ããºã ã®ããã©ãŒãã³ã¹ã«ã€ããŠéšããŸããã
tryhard
ã¯ããã®ã³ãŒããåçŽåã§ãããã®ãšããŠãã©ã°ãç«ãŠãªãããšã«æ³šæããŠãã ããã ãããã try
ãšæ°ããã¬ã€ãã©ã€ã³ã«ããã人ã
ã¯ãã®ã³ãŒãã1ã©ã€ããŒã«åçŽåãããšã©ãŒãã¬ãŒã ã«å¿
èŠãªã³ã³ããã¹ãããã£ããã£ãããããšæããããããŸããã
äŸå€ããŒã¹ã®èšèªã§éåžžã«ãã䜿çšãããŠããã³ã³ããã¹ãã¯ããŠãŒã¶ãŒIDãååšããªãã£ãããããŸãã¯stringIdãæŽæ°IDã®åœ¢åŒã§ã¯ãªãã£ãããã«ããŠãŒã¶ãŒã®ããŒãäžã«ãšã©ãŒãçºçããããšããã£ããã£ããŸãããããã解æãããŸããã
ãããErrorFormatterãšçµã¿åããããšããšã©ãŒãã¬ãŒã ãšãšã©ãŒèªäœãè±å¯ã«æ€æ»ããŠãå€ãã®äººãè¡ã£ãããŸãã¯è¡ã£ãŠããªãa: b: c: d: e: underlying error
ã¹ã¿ã€ã«ãèªã¿ã«ããããããšãªãããŠãŒã¶ãŒã«ãšã£ãŠã¡ãã»ãŒãžãé©åã«ãã©ãŒãããã§ããããã«ãªããŸããã®ããã®çŽ æŽãããã¬ã€ãã©ã€ã³ããããŸããã
ããããã¹ãŠã®ææ¡ãäžç·ã«ãªã£ãŠãç§ãã¡ãæã解決çãæäŸããããšãå¿ããªãã§ãã ãããäžèŠãªå®åæãªãã§ç°¡æœãªãšã©ãŒåŠçãè¡ãããŠãŒã¶ãŒã«ããè¯ã蚺æãšããè¯ããšã©ãŒãã©ãŒããããæäŸããŸãã ãããã¯çŽäº€ããæŠå¿µã§ãããäžç·ã«ãããšéåžžã«åŒ·åã«ãªããŸãã
æåŸã«ãäžèšã®3ïŒãèãããšãããã解決ããããã«ããŒã¯ãŒãã䜿çšããããšã¯å°é£ã§ãã å®çŸ©äžãããŒã¯ãŒãã¯ãæ¡åŒµæ©èœãå°æ¥ãã³ãã©ãŒãååã§æž¡ãããšããã®å Žã§ã®ãšã©ãŒè£
食ãèš±å¯ããããšããŸãã¯ïŒæ»ãã»ãã³ãã£ã¯ã¹ã®ä»£ããã«ïŒgotoã»ãã³ãã£ã¯ã¹ããµããŒãããããšãèš±å¯ããŸããã ããŒã¯ãŒãã䜿çšããå Žåã¯ãæåã«å®å
šãªãœãªã¥ãŒã·ã§ã³ã念é ã«çœ®ãå¿
èŠããããŸãã ãŸããããŒã¯ãŒãã«ã¯äžäœäºææ§ããããŸããã GoããŒã ã¯ãGo 2ã®éå§æã«ãå¯èœãªéãäžäœäºææ§ãç¶æããããã«åªããããšè¿°ã¹ãŸããã try
é¢æ°ã¯ãããç¶æããåŸã§æ¡åŒµæ©èœãå¿
èŠãªãããšãããã£ãå ŽåãåçŽãªgofixã§ã³ãŒããç°¡åã«å€æŽããŠã try
é¢æ°ãããŒã¯ãŒãã«å€æŽã§ããŸãã
åã³ç§ã®2ã»ã³ãïŒ
7/4/19ã«ã SanjayMenakurunotifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
@griesemer
[...]
Twitterã§ç§ã«ææãããããã«ãããã«ããtry
ã¯è£žã®ããã«æ¯ãèããŸã
returnãè¿ãããå€ã¯æé»çã§ãã äœãç解ãã
å®éã®å€ãè¿ãããŠããã®ã§ãã³ãŒãã確èªããå¿ èŠããããããããŸããã
åŒã³åºãããtry
èªäœãŸã§ã®ããªãã®è·é¢ããã€ããããªã¿ãŒã³ïŒéå±ææ§ïŒã®ãã®ããããã£ã¯ãäžè¬çã«
å«ããªäººãtry
ãåžžã«ãŒããè¿ãããã«ããããšã«ã€ããŠã©ãæããŸãã
ãšã©ãŒä»¥å€ã®åŒæ°ã®å€ïŒè¿ãããå ŽåïŒïŒãã€ããããªã¿ãŒã³ã¯ããªã¿ãŒã³åŒæ°ã«ååãä»ããããŠããå Žåã«ã®ã¿èš±å¯ãããŸãã ãã
tryã¯å¥ã®ã«ãŒã«ã«åŸã£ãŠããããã§ããïŒ
åé¡ã«å¯ŸåŠããããã«defer
ãåå©çšãããšããå
šäœçãªã¢ã€ãã¢ã奜ãã§ãã ãã ãã try
ããŒã¯ãŒããæ£ããæ¹æ³ãã©ããçåã«æã£ãŠããŸãã æ¢åã®ãã¿ãŒã³ãåå©çšã§ãããšãããã©ãã§ãããã 誰ãã茞å
¥åãããã§ã«ç¥ã£ãŠããããšïŒ
res, err := doSomething()
if err != nil {
return err
}
res, _ := doSomething()
try
ãå®è¡ããã®ãšåæ§ã®åäœã
res, . := doSomething()
@piotrkowalczuk
ããã¯ããè¯ãæ§æãããããŸããããGoãšæ§æãã€ã©ã€ã¿ãŒã®äž¡æ¹ã§ããããåæ³ã«ããããã«Goãé©å¿ãããããšãã©ãã»ã©ç°¡åãããããŸããã
@balasanjay ïŒããã³@lootchïŒïŒããã§ã®ã³ã¡ã³ãã«ãããšãã¯ããããã°ã©ã https://play.golang.org/p/KenN56iNVg7ã¯1ãåºåããŸãã
try
ã¯ãšã©ãŒçµæã«ã®ã¿é¢ä¿ããŠãããããä»ã®ãã¹ãŠã¯ãã®ãŸãŸã«ããŠãããŸãã ä»ã®æ»ãå€ããŒãå€ã«èšå®ããããšãã§ããŸããããªããããåªããŠããã®ãã¯æããã§ã¯ãããŸããã 1ã€ã¯ãçµæå€ã«ååãä»ãããšããŒãã«èšå®ããå¿
èŠããããããããå€ãã®äœæ¥ãçºçããå¯èœæ§ããããŸãã ããã§ãããšã©ãŒãçºçããå ŽåãåŒã³åºãå
ã¯ïŒããããïŒããããç¡èŠããŸãã ãã ããããã¯èšèšäžã®æ±ºå®ã§ãããæ£åœãªçç±ãããå Žåã¯å€æŽãããå¯èœæ§ããããŸãã
[ç·šéïŒãã®è³ªåïŒãšã©ãŒãçºçãããšãã«ãšã©ãŒä»¥å€ã®çµæãã¯ãªã¢ãããã©ããïŒã¯ã try
ææ¡ã«åºæã®ãã®ã§ã¯ãªãããšã«æ³šæããŠãã ããã æ瀺çãªreturn
ãå¿
èŠãšããªãææ¡ããã代æ¿æ¡ã¯ãåã質åã«çããå¿
èŠããããŸãã]
ã©ã€ã¿ãŒã®äŸã«ã€ããŠn += try(wrappedWriter.Write(...))
ïŒã¯ãããšã©ãŒãçºçããå Žåã§ãn
ãã€ã³ã¯ãªã¡ã³ãããå¿
èŠãããç¶æ³ã§ã¯ã try
ã䜿çšããããšã¯ã§ããŸãã-ããšãtry
ã§ãã£ãŠãtry
ããšã©ãŒããªãå Žåã«ã®ã¿äœãè¿ãããã§ãã try
ã¯é¢æ°ã®ããã«ãããã«åäœããŸãïŒãã ããé¢æ°ã¯åŒã³åºãå
ã«è¿ãããŸããããåŒã³åºãå
ã®åŒã³åºãå
ã«è¿ãããŸãïŒã try
ã®å®è£
ã§ã®äžæçãªäœ¿çšãåç
§ããŠãã ããã
ãã ããäŸã®ãããªå Žåã¯ã if
ã¹ããŒãã¡ã³ãã«ã泚æããè¿ããããã€ãæ°ãn
ã«çµã¿èŸŒãå¿
èŠããããŸãã
ããããããããç§ã¯ããªãã®æžå¿µã誀解ããŠããŸãã
@griesemer ïŒã³ãŒã«ãµã€ãã調ã¹ãã ãã§ã try
ãäœãããããæ確ã«ãªããããä»ã®æ»ãå€ããŒãå€ã«èšå®ããããšããå§ãããŸãã aïŒäœãããªãããbïŒãŒãå€ãšè©Šè¡ããåŒæ°ã䜿çšããŠé¢æ°ããæ»ããŸãã
æå®ãããŠããããã«ã try
ã¯ãšã©ãŒã®ãªãååä»ãæ»ãå€ã®å€ãä¿æãããããé¢æ°å
šäœã調ã¹ãŠã try
ãè¿ãå€ãæ確ã«ããå¿
èŠããããŸãã
ããã¯ããã€ããããªã¿ãŒã³ïŒè¿ãããå€ã確èªããããã«é¢æ°å
šäœãã¹ãã£ã³ããå¿
èŠãããïŒã®å Žåãšåãåé¡ã§ãããããããhttps://github.com/golang/go/issues/21291ãæåºããçç±ã§ããã ããã¯ãç§ã«ãšã£ãŠãååä»ãã®æ»ãå€ãæã€å€§ããªé¢æ°ã®try
ã¯ã裞ã®æ»ãå€ãšåãåºæºã§æšå¥šãããªãå¿
èŠãããããšãæå³ããŸãïŒhttps://github.com/golang/go/wiki/CodeReviewComments ïŒnamed-result-parametersïŒã 代ããã«ããšã©ãŒä»¥å€ã®åŒæ°ã®ãŒãå€ãåžžã«è¿ãããã«try
ãæå®ããããšããå§ãããŸãã
æè¿ããŽãŒããŒã ã«ãšã£ãŠå°æããæ°åãæªããªã£ãŠããŸãã try
ã¯ã解決ããããšããŠããç¹å®ã®åé¡ãã€ãŸããšã©ãŒåŠçã®åé·æ§ã«å¯Ÿããã¯ãªãŒã³ã§ç解ãããããœãªã¥ãŒã·ã§ã³ã§ãã
ææ¡ã«ã¯æ¬¡ã®ããã«æžãããŠããŸãã1幎ã«ãããè°è«ã®æ«ããã®ãã«ãã€ã³ãè¿œå ããŸãã åé·æ§ã®äœãã³ãŒããå¿ èŠãªå Žåã¯ããã䜿çšãããã以å€ã®å Žåã¯åŒãç¶ãå®è¡ããŸãã ãã®åå¿ã¯ãããŒã ã¡ã³ããŒãæ確ãªå©ç¹ã瀺ããŠãããªããã€ã³æ©èœã«å¯Ÿããå®å šã«ã¯æ£åœåãããŠããªãæµæã§ãã
ç°¡åã«ã§ããå Žåã¯ãgoããŒã ã«try
ãå¯å€ååŒæ°ã®çµã¿èŸŒã¿ã«ããããšãããã«ãå§ãããŸã
try(outf.Seek(linkstart, 0))
try(io.Copy(outf, exef))
ã«ãªããŸã
try(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))
次ã®åé·ãªããšã¯ã try
ãžã®é£ç¶ããåŒã³åºãã§ããå¯èœæ§ããããŸãã
try
ã®å¯å€ååŒæ°ãã©ã¡ãŒã¿ãŒãé€ããŠãã»ãšãã©ã®éšåã§nvictorã«åæããŸãã ç§ã¯ãŸã ããããã³ãã©ãŒã®ããã®å Žæãæã£ãŠããã¹ãã§ãããšä¿¡ããŠããŸãããããŠå¯å€ååŒæ°ã®ææ¡ã¯ç§èªèº«ã®ããã«èªã¿ãããã®éçãæŒãäžããããšãã§ããŸãã
@nvictor Goã¯ãéçŽäº€æ©èœã奜ãŸãªãèšèªã§ãã ã€ãŸããå°æ¥ã try
ã§ã¯ãªããããåªãããšã©ãŒåŠçãœãªã¥ãŒã·ã§ã³ãèŠã€ããå Žåãåãæ¿ãã¯ã¯ããã«è€éã«ãªããŸãïŒçŸåšã®è§£æ±ºçã¯ãååãã§ãïŒã
try
ãããåªãã解決çããããšæããŸããç§ã¯ããããã£ãããšåãããã®è§£æ±ºçã«èœã¡çãããããã®è§£æ±ºçãèŠã€ããããšæããŸãã
ãããããããè¿œå ãããŠãç§ã¯æããŸããã ããã¯æªã解決çã§ã¯ãããŸãããç§ãã¡ã¯ãã ããè¯ã解決çãèŠã€ããããšãã§ãããããããªããšæããŸãã
ç§ã®èŠè§£ã§ã¯ããããã¯ã³ãŒããè©ŠããŠã¿ãããšæããŸããä»åºŠã¯ãã³ãã«ã®ããã«try
err func
ãã®ãã£ã¹ã«ãã·ã§ã³ïŒããã³Redditã«é¢ãããã£ã¹ã«ãã·ã§ã³ïŒãèªãã ãšããç§ã¯ãã€ãå šå¡ãåãããŒãžã«ããããã«æããããã§ã¯ãããŸããã§ããã
ãããã£ãŠã try
ã®äœ¿çšæ¹æ³ã瀺ãå°ããªããã°æçš¿ãäœæããŸããïŒ httpsïŒ//faiface.github.io/post/how-to-use-try/ã
ç§ã¯ãã®ææ¡ã®è€æ°ã®åŽé¢ã瀺ããŠã誰ãããããäœãã§ããããèŠãŠãããå€ãã®æ å ±ã«åºã¥ããïŒããšãåŠå®çã§ãã£ãŠãïŒæèŠã圢æã§ããããã«ããŸããã
éèŠãªããšãèŠéããå Žåã¯ããç¥ãããã ããã
@faifaceç§ã¯ããªãã眮ãæããããšãã§ãããšããªã確信ããŠããŸã
if err != nil {
return resps, err
}
try(err)
ã
ãã以å€-çŽ æŽãããèšäºã§ãïŒ
@DmitriyMV TrueïŒ ããããç§ã¯ããããã®ãŸãŸã«ããŠãããšæããŸãããã®ãããããŸãè¯ãäŸã§ã¯ãããŸããããå€å
žçãªif err != nil
ã®äŸãå°ãªããšã1ã€ãããŸãã
ç§ã«ã¯2ã€ã®æžå¿µããããŸãïŒ
- ååä»ãã®è¿åã¯éåžžã«æ··ä¹±ãæããããã«ãããæ°ããéèŠãªãŠãŒã¹ã±ãŒã¹ã奚å±ãããŸãã
- ããã«ããããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšããå§ãããŸãã
ç§ã®çµéšã§ã¯ãååŒã³åºããµã€ãã®çŽåŸã«ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã¯ãç°¡åã«ãããã°ã§ããã³ãŒããçšæããããã«éèŠã§ãã ãããŠãååä»ãã®è¿åã¯ãããæç¹ã§ç§ãç¥ã£ãŠããã»ãŒãã¹ãŠã®Goéçºè ã«æ··ä¹±ãåŒãèµ·ãããŸããã
ãããã€ããŒã§ã¹ã¿ã€ã«äžã®æžå¿µã¯ãæ®å¿µãªãããã³ãŒãã®äœè¡ã
try(actualThing())
ã§ã©ãããããããšããããšã§ããtry()
ã§ã©ãããããã³ãŒãããŒã¹ã®ã»ãšãã©ã®è¡ã衚瀺ãããããšãæ³åã§ããŸãã ããã¯æ®å¿µãªããšã§ãããããã®æžå¿µã¯åŸ®èª¿æŽã§å¯ŸåŠããããšæããŸãã
a, b, err := myFunc() check(err, "calling myFunc on %v and %v", a, b)
check()
ã¯try()
ãšã»ãšãã©åãããã«åäœããŸãããé¢æ°ã®æ»ãå€ãäžè¬çã«æž¡ãåäœããããããã代ããã«ã³ã³ããã¹ããè¿œå ããæ©èœãæäŸããŸãã ããã§ããªã¿ãŒã³ãããªã¬ãŒãããŸããããã«ããã
try()
ã®å©ç¹ã®å€ããä¿æãããŸãã
- ãã«ãã€ã³ã§ã
- æ¢åã®å¶åŸ¡ãããŒWRTã«åŸã£ãŠå»¶æããŸã
- ããã¯ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ãããšããæ¢åã®æ £è¡ãšããäžèŽããŠããŸãã
errors.Wrap(err, "context message")
ãªã©ã®ãšã©ãŒã©ããã³ã°ã®çŸåšã®ææ¡ãã©ã€ãã©ãªãšé£æºããŸã- ãã®çµæãã¯ãªãŒã³ãªã³ãŒã«ãµã€ãã«ãªããŸãã
a, b, err := myFunc()
è¡ã«å®åæã¯ãããŸããdefer fmt.HandleError(&err, "msg")
ã§ãšã©ãŒã説æããããšã¯åŒãç¶ãå¯èœã§ãããæšå¥šããå¿ èŠã¯ãããŸãããcheck
ã®ã·ã°ããã£ã¯ãã©ããããŠããé¢æ°ããä»»æã®æ°ã®åŒæ°ãè¿ãå¿ èŠããªããããå°ãåçŽã§ãã
ããã¯è¯ãããšã§ããç§ã¯è¡ãããŒã ãæ¬åœã«ãããåãã¹ãã ãšæããŸãã ããã¯è©ŠããŠã¿ããããåªããŠããŸããããæ確ã«!!!
@buchanae try
ã¯ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšãæããšã©ãŸããããšããªãã䞻匵ããã®ã§ãç§ã®ããã°æçš¿ã«ã€ããŠããªããã©ãæããèå³ããããŸãããå°ãªããšãç§ã®èšäºã§ã¯éåžžãããç°¡åã ãšäž»åŒµããŸãã
çŸæ®µéã§ãããæšãŠãã€ããã§ãã ããå°ãèããŠã¿ãŸãããããã«æçš¿ããŠãããªãã®èããèŠãŠã¿ãããšæããŸããã å€åç§ã¯ããã®ããã«æ°ããåé¡ãéãã¹ãã§ããïŒ ïŒ32811ã«ãæçš¿ããŸãã
ã§ã¯ãæè»æ§ãé«ããããã«ã代ããã«ããçš®ã®æ±çšCãã¯ãã®ãããªããšãè¡ãã®ã¯ã©ãã§ããããã
ãã®ãããªïŒ
define returnIf(err error, desc string, args ...interface{}) {
if (err != nil) {
return fmt.Errorf("%s: %s: %+v", desc, err, args)
}
}
func CopyFile(src, dst string) error {
r, err := os.Open(src)
:returnIf(err, "Error opening src", src)
defer r.Close()
w, err := os.Create(dst)
:returnIf(err, "Error Creating dst", dst)
defer w.Close()
...
}
åºæ¬çã«returnIfã¯ãäžèšã§å®çŸ©ããããã®ã«çœ®ãæã/ã€ã³ã©ã€ã³åãããŸãã ããã«ããæè»æ§ã¯ããããäœããããã¯ããªã次第ã ãšããããšã§ãã ããããããã°ããã®ã¯ããšãã£ã¿ãŒããšãã£ã¿ãŒå ã§äœããã®æ¹æ³ã§çœ®ãæããªãéããå°ãå¥åŠãããããŸããã ããã«ãããå®çŸ©ãæ確ã«èªã¿åãããšãã§ãããããéæ³ãå°ãªããªããŸãã ãŸããããã«ããããšã©ãŒæã«è¿ãããå¯èœæ§ã®ãã1è¡ãäœæã§ããŸãã ãŸããçºçããå ŽæïŒã³ã³ããã¹ãïŒã«å¿ããŠç°ãªããšã©ãŒã¡ãã»ãŒãžã衚瀺ã§ããŸãã
ç·šéïŒãŸãããã¯ãã®åã«ã³ãã³ãè¿œå ããŠãããããã¯ãã§ãããé¢æ°åŒã³åºãã§ã¯ãªãããšãæ確ã«ããããã«å®è¡ã§ããå¯èœæ§ãããããšã瀺åããŠããŸãã
@nvictor
ããã«ãgoããŒã ã«
try
ãå¯å€ååŒæ°ã®çµã¿èŸŒã¿ã«ããããšããå§ãããŸã
foo
ãšbar
ãåããã®ãè¿ããªãå Žåãã©ã®try(foo(), bar())
ãè¿ãããŸããïŒ
çŸæ®µéã§ãããæšãŠãã€ããã§ãã ããå°ãèããŠã¿ãŸãããããã«æçš¿ããŠãããªãã®èããèŠãŠã¿ãããšæããŸããã å€åç§ã¯ããã®ããã«æ°ããåé¡ãéãã¹ãã§ããïŒ ïŒ32811ã«ãæçš¿ããŸãã
ã§ã¯ãæè»æ§ãé«ããããã«ã代ããã«ããçš®ã®æ±çšCãã¯ãã®ãããªããšãè¡ãã®ã¯ã©ãã§ããããã
@ Chillance ãIMHOãRustïŒããã³ä»ã®å€ãã®èšèªïŒã®ãããªè¡ççãªãã¯ãã·ã¹ãã ã¯ã人ã
ã«try
ããžã§ããªãã¯ãªã©ã®ã¢ã€ãã¢ã§éã¶æ©äŒãäžããçµéšãç©ãã åŸãæé«ã®ã¢ã€ãã¢ã¯æ¬¡ã®ããã«ãªããšæããŸãèšèªãšã©ã€ãã©ãªã®äžéšã ãããããã®ãããªãã®ãGoã«è¿œå ãããå¯èœæ§ã¯ã»ãšãã©ãªããšæããŸãã
@jonbodnerçŸåšãGoã«è¡ççãªãã¯ããè¿œå ããææ¡ããããŸãã ææ¡ãããæ§æãªã©ã¯ãŸã ãããŸããããè¡ççãªãã¯ããè¿œå ãããšããã¢ã€ãã¢ã¯ããŸããããŸããã ïŒ32620
@Allenyn ãããªããåŒçšããã°ããã®@buchanaeã®ä»¥åã®ææ¡ã«é¢ããŠïŒ
a, b, err := myFunc()
check(err, "calling myFunc on %v and %v", a, b)
ç§ãè°è«ã«ã€ããŠèŠãŠããããšããã fmt
ã®ã»ãã³ãã£ã¯ã¹ãçµã¿èŸŒã¿é¢æ°ã«åŒã蟌ãŸããããšã¯ãããã§ã¯ããããããªãçµæã«ãªããšæããŸãã ïŒããšãã°ã @ josharianã®å¿çãåç
§ããŠãã ããïŒã
ãšã¯ããããã³ãã©ãŒé¢æ°ãèš±å¯ãããšã fmt
ã»ãã³ãã£ã¯ã¹ããã«ãã€ã³ã«çŽæ¥ãã«ããããšãåé¿ã§ãããããå®éã«ã¯å¿
èŠãããŸããã ãã®ãããªã¢ãããŒãã®1ã€ã¯ãããã§ã®ãã£ã¹ã«ãã·ã§ã³ã®åæ¥ããããã§@eihighã«ãã£ãŠææ¡ãããŸãããããã¯ã @ buchanaeã®ææ¡ã«äŒŒãŠããã代ããã«æ¬¡ã®çœ²åãæã€ããã«çµã¿èŸŒã¿ã®try
ã調æŽããããšãææ¡ããŸããã
func try(error, optional func(error) error)
ãã®ä»£æ¿ã®try
ã¯äœãè¿ããªãããããã®çœ²åã¯æ¬¡ã®ããšãæå³ããŸãã
ååã®ãã€ã¯ã·ã§ãããããªã¬ãŒããããããŸãããããã®åœ¢åŒã®try
ã¯ã check
ãªã©ã®ä»£æ¿åã䜿çšããæ¹ãèªã¿ããããªãå¯èœæ§ããããŸãã ãªãã·ã§ã³ã®ã€ã³ãã¬ãŒã¹ã¢ãããŒã·ã§ã³ã䟿å©ã«ããæšæºã©ã€ãã©ãªãã«ããŒãæ³åã§ããŸããã defer
ã¯ãå¿
èŠã«å¿ããŠåäžãªã¢ãããŒã·ã§ã³ã®ãªãã·ã§ã³ã®ãŸãŸã«ããããšãã§ããŸãã
åŸã§ïŒ32811ïŒçµã¿èŸŒã¿ãšããŠcatch
ïŒãšïŒ32611ïŒ$ïŒ on err, <statement>
ãèš±å¯ããããã®$ on
ããŒã¯ãŒãïŒã§äœæãããããã€ãã®é¢é£ããææ¡ããããŸããã ãããã¯ãããã«è°è«ããããè³æãŸãã¯å察ã®è³æãè¿œå ãããããããã®ææ¡ã«å¯èœãªèª¿æŽãææ¡ãããããã®ã«é©ããå ŽæãããããŸããã
@jonbodnerçŸåšãGoã«è¡ççãªãã¯ããè¿œå ããææ¡ããããŸãã ææ¡ãããæ§æãªã©ã¯ãŸã ãããŸããããè¡ççãªãã¯ããè¿œå ãããšããã¢ã€ãã¢ã¯ããŸããããŸããã ïŒ32620
ææ¡ãããã®ã¯çŽ æŽãããããšã§ãããã³ã¢ã®GoããŒã ã¯ãã¯ããè¿œå ããã€ããã¯ãªããšæããŸãã ãã ããçŸåšèšèªã³ã¢ã®å€æŽãå¿ èŠãªå€æŽã«é¢ãããã¹ãŠã®è°è«ãçµäºãããããããã«ã€ããŠééã£ãŠããããšãå¬ããæããŸãã æåãªäººåœ¢ãåŒçšãããšãããããããªãããè©ŠããŠã¯ãããªããã
@jonbodnerè¡ççãªãã¯ããè¿œå ããŠããè°è«ãçµãããšã¯æããŸããã ãŸã£ããéã§ãã äžè¬çãªæ¹å€ã¯ã try
ããªã¿ãŒã³ããé ãããšãããã®ã§ãã ãã¯ãã§ã¯äœã§ãå¯èœã§ããããããã®èŠ³ç¹ããã¯ãã¯ãã¯å³å¯ã«æªåããŸãã ãŸããGoã§ãŠãŒã¶ãŒå®çŸ©ã®è¡ççãªãã¯ããèš±å¯ããå Žåã§ãã try
ããŠãããŒã¹ãããã¯ã§äºåã«å®£èšãããçµã¿èŸŒã¿ãã¯ãã«ãããã©ããã«ã€ããŠã¯ããŸã è°è«ã®äœå°ããããŸãã try
ã«å察ãã人ã
ããè¡ççãªãã¯ãã«ããã«å察ããããšã¯è«ççã§ã;-)
@ngrillyãã¯ããç®ç«ã¡ãèŠãããããšã確èªããæ¹æ³ã¯ããã€ããããŸãã Rustã®ããæ¹ã§ã¯ããã¯ãã¯åžžã«!
ïŒã€ãŸãã try!(...)
ãšprintln!(...)
ïŒã§åŠçãããŸãã
è¡ççãªãã¯ããæ¡çšãããŠèŠããããéåžžã®é¢æ°åŒã³åºãã®ããã«èŠããªãå Žåã¯ãã¯ããã«é©ããŠãããšæããŸãã åã ã®åé¡ãä¿®æ£ããã®ã§ã¯ãªããããæ±çšçãªãœãªã¥ãŒã·ã§ã³ãéžæããå¿ èŠããããŸãã
@thepuddsã¿ã€ãfunc(error) error
ã®ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãè¿œå ãããšäŸ¿å©ãªå Žåãããããšã«åæããŸãïŒãã®å¯èœæ§ã«ã€ããŠã¯ææ¡ã§èª¬æãããŠããŸããã解決ããå¿
èŠã®ããåé¡ãããã€ããããŸãïŒãã try
ã®ãã€ã³ãã¯ããããŸããã try
ã¯ãããäžè¬çãªããŒã«ã§ãã
@deanveloperã¯ããRustã®ãã¯ãã®æåŸã«ãã!
ã¯è³¢ãã§ãã Goã®å€§æåã§å§ãŸããšã¯ã¹ããŒããããèå¥åãæãåºãããŸã:-)
ã³ã³ãã€ã«é床ãç¶æããããŒã«ã«é¢ããè€éãªåé¡ã解決ã§ããå Žåã«ã®ã¿ãGoã«è¡ççãªãã¯ããå«ããããšã«åæããŸãïŒãªãã¡ã¯ã¿ãªã³ã°ããŒã«ã¯ãã³ãŒãã®ã»ãã³ãã£ã¯ã¹ãç解ããããã«ãã¯ããæ¡åŒµããå¿
èŠããããŸããããã¯ããæ¡åŒµããã«ã³ãŒããçæããå¿
èŠããããŸãïŒ ã ããã¯é£ããã ãããŸã§ã®éã try
ã®ååtry!
ã«å€æŽã§ããŸããïŒ ;-)
軜éãªã¢ã€ãã¢ïŒif / forã³ã³ã¹ãã©ã¯ãã®æ¬äœã«åäžã®ã¹ããŒãã¡ã³ããå«ãŸããŠããå Žåããã®ã¹ããŒãã¡ã³ããif
ãŸãã¯for
ãšåãè¡ã«ããå Žåã¯ãäžæ¬åŒ§ã¯å¿
èŠãããŸããã äŸïŒ
fd, err := os.Open("foo")
if err != nil return err
çŸåšã error
åã¯åãªãéåžžã®ã€ã³ã¿ãŒãã§ãŒã¹åã§ããããšã«æ³šæããŠãã ããã ã³ã³ãã€ã©ã¯ãããç¹å¥ãªãã®ãšããŠæ±ããŸããã try
ã¯ãããå€ããŸãã ã³ã³ãã€ã©ãerror
ãç¹å¥ãªãã®ãšããŠæ±ãããšãèš±å¯ãããŠããå Žåã¯ã /bin/sh
ã«è§Šçºããã||
ããå§ãããŸãã
fd, err := os.Open("foo") || return err
ãã®ãããªã³ãŒãã®æå³ã¯ã»ãšãã©ã®ããã°ã©ããŒã«ãšã£ãŠããªãæçœã§ãããé ããå¶åŸ¡ãããŒã¯ãªããçŸåšãã®ã³ãŒãã¯éæ³ã§ãããããåäœäžã®ã³ãŒãã«å®³ã¯ãããŸããã
ç§ã¯ããªãã®äœäººããææã§ååããŠãããšæ³åããããšãã§ããŸããã
@bakul if err != nil return err
ã§ãåŒerr != nil
ãã©ãã§çµãããã¹ããŒãã¡ã³ãreturn err
ãã©ãã§å§ãŸãããã©ããã£ãŠç¥ãã®ã§ããïŒ ããªãã®ã¢ã€ãã¢ã¯ãèšèªææ³ã®å€§ããªå€æŽã§ããã try
ã§ææ¡ãããŠãããã®ãããã¯ããã«å€§ãããªããŸãã
2çªç®ã®ã¢ã€ãã¢ã¯Zigã®catch |err| return err
ã®ããã«èŠããŸãã å人çã«ã¯ãç§ã¯ãææã§ååãããããã§ã¯ãªãã®ã§ããªãã ãšæããŸããïŒ ãã ããZigã«ã¯try
ããŒã¯ãŒãããããŸããããã¯ã catch |err| return err
ã®ã·ã§ãŒãã«ããã§ãããGoããŒã ãçµã¿èŸŒã¿é¢æ°ãšããŠããã§ææ¡ããŠãããã®ãšã»ãŒåãã§ãã ã§ã¯ãããããtry
ã§ååã§ããã catch
ããŒã¯ãŒãã¯å¿
èŠãããŸãããïŒ ;-)
@ngrilly ãçŸåš<expr> <statement>
ã¯ç¡å¹ã§ããããããã®å€æŽã«ãã£ãŠææ³ããããŸãã«ãªãããšã¯ãªããšæããŸãããããå°ãå£ããããå¯èœæ§ããããŸãã
ããã«ãããtryããããŒã¶ã«ãšãŸã£ããåãã³ãŒããçæãããŸãããaïŒããã§ã®æ»ãã¯æ瀺çã§ãbïŒtryã®å Žåã®ããã«ãã¹ãã¯äžå¯èœã§ãcïŒããã¯ã·ã§ã«ãŠãŒã¶ãŒïŒãžã°ãŠãŒã¶ãŒãã¯ããã«äžåã£ãŠããŸãïŒã«ã¯ããªãã¿ã®æ§æã§ãã ããã«ã¯catch
ã¯ãããŸããã
ç§ã¯ããã代æ¿æ¡ãšããŠåãäžããŸããããççŽã«èšã£ãŠãã³ã¢ãŽãŒèšèªã®èšèšè ã決å®ãããã®ã¯äœã§ãå®å šã«åé¡ãããŸããã
tryhard
ã®å°ãæ¹åãããããŒãžã§ã³ãã¢ããããŒãããŸããã å
¥åãã¡ã€ã«ã«é¢ãããã詳现ãªæ
å ±ãå ±åããããã«ãªããŸããã ããšãã°ãGoãªããžããªã®å
端ã«å¯ŸããŠå®è¡ãããšã次ã®ããã«å ±åãããŸãã
$ tryhard $HOME/go/src
...
--- stats ---
55620 (100.0% of 55620) function declarations
14936 ( 26.9% of 55620) functions returning an error
116539 (100.0% of 116539) statements
27327 ( 23.4% of 116539) if statements
7636 ( 27.9% of 27327) if <err> != nil statements
119 ( 1.6% of 7636) <err> name is different from "err" (use -l flag to list file positions)
6037 ( 79.1% of 7636) return ..., <err> blocks in if <err> != nil statements
1599 ( 20.9% of 7636) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
17 ( 0.2% of 7636) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
5907 ( 77.4% of 7636) try candidates (use -l flag to list file positions)
ããã¹ãããšã¯ãŸã ãããããããŸãããããã«ãããããæ確ãªç¶æ³ãåŸãããŸãã å
·äœçã«ã¯ããã¹ãŠã®if
ã¹ããŒãã¡ã³ãã®28ïŒ
ããšã©ãŒãã§ãã¯çšã§ããããã«èŠããŸãã ããã¯ãããªãã®éã®å埩ã³ãŒããããããšã確èªããŸãã ãããã®ãšã©ãŒãã§ãã¯ã®ãã¡ã77ïŒ
ã¯try
ã«é©ããŠããŸãã
$ tryhardã
---çµ±èš---
2930ïŒ2930ã®100.0ïŒ
ïŒé¢æ°å®£èš
ãšã©ãŒãè¿ã1408ïŒ2930ã®48.1ïŒ
ïŒé¢æ°
10497ïŒ10497ã®100.0ïŒ
ïŒã¹ããŒãã¡ã³ã
2265ïŒ10497ã®21.6ïŒ
ïŒifã¹ããŒãã¡ã³ã
1383ïŒ2265ã®61.1ïŒ
ïŒif
0ïŒ1383ã®0.0ïŒ
ïŒ
ãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯ïŒ
645ïŒ1383ã®46.6ïŒ
ïŒãªã¿ãŒã³...ã
ã¹ããŒãã¡ã³ã
738ïŒ1383ã®53.4ïŒ
ïŒããè€éãªãšã©ãŒãã³ãã©
ã¹ããŒãã¡ã³ã; tryã®äœ¿çšãé²æ¢ããŸãïŒãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŸãïŒ
1ïŒ1383ã®0.1ïŒ
ïŒç©ºã§ãªãelseã¯ifã§ãããã¯ããŸã
ã¹ããŒãã¡ã³ã; tryã®äœ¿çšãé²æ¢ããŸãïŒãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŸãïŒ
638ïŒ1383ã®46.1ïŒ
ïŒåè£ãè©ŠããŠãã ããïŒãã¡ã€ã«ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŠãã ããïŒ
ããžã·ã§ã³ïŒ
$ gomodãã³ããŒ
$ tryhardãã³ããŒ
---çµ±èš---
37757ïŒ37757ã®100.0ïŒ
ïŒé¢æ°å®£èš
12557ïŒ37757ã®33.3ïŒ
ïŒé¢æ°ããšã©ãŒãè¿ã
88919ïŒ88919ã®100.0ïŒ
ïŒã¹ããŒãã¡ã³ã
20143ïŒ88919ã®22.7ïŒ
ïŒifã¹ããŒãã¡ã³ã
6555ïŒ20143ã®32.5ïŒ
ïŒif
109ïŒ6555ã®1.7ïŒ
ïŒ
ãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯ïŒ
5545ïŒ6555ã®84.6ïŒ
ïŒãªã¿ãŒã³...ã
ã¹ããŒãã¡ã³ã
1010ïŒ6555ã®15.4ïŒ
ïŒããè€éãªãšã©ãŒãã³ãã©
ã¹ããŒãã¡ã³ã; tryã®äœ¿çšãé²æ¢ããŸãïŒãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŸãïŒ
12ïŒ6555ã®0.2ïŒ
ïŒç©ºã§ãªãelseã¯ifã§ãããã¯ããŸã
ã¹ããŒãã¡ã³ã; tryã®äœ¿çšãé²æ¢ããŸãïŒãã¡ã€ã«ã®äœçœ®ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŸãïŒ
5427ïŒ6555ã®82.8ïŒ
ïŒåè£ãè©ŠããŠãã ããïŒãã¡ã€ã«ãäžèŠ§è¡šç€ºããã«ã¯-lãã©ã°ã䜿çšããŠãã ããïŒ
ããžã·ã§ã³ïŒ
ãã®ããããã¯ãã®äŸã§ã³ãã³ãè¿œå ããã®ã§ãé¢æ°åŒã³åºãã®ããã«ã¯èŠãããçªãåºãŠããŸããã ãã¡ãããã³ãã³ã§ããå¿ èŠã¯ãããŸããã ããã¯åãªãäŸã§ãã ãŸãããã¯ãã¯äœãé ããŸããã ãã¯ããäœãããããèŠãã ãã§ãããã«è¡ããŸãã é¢æ°ã®ããã§ãããã€ã³ã©ã€ã³åãããŸãã ããã¯ãæ€çŽ¢ãå®è¡ãããã¯ãã®ã³ãŒãéšåãããã¯ãã®äœ¿çšãè¡ãããé¢æ°ã«çœ®ãæãããããªãã®ã§ãã åœç¶ã®ããšãªããã人ã ããã¯ãã®ãã¯ããäœæããç©äºãè€éã«ãå§ããå Žåã¯ãã³ãŒããããè€éã«ããããšã§èªåã責ããŸãããã :)
@mirtchovski
$ tryhard .
--- stats ---
2930 (100.0% of 2930) function declarations
1408 ( 48.1% of 2930) functions returning an error
10497 (100.0% of 10497) statements
2265 ( 21.6% of 10497) if statements
1383 ( 61.1% of 2265) if <err> != nil statements
0 ( 0.0% of 1383) <err> name is different from "err" (use -l flag to list file positions)
645 ( 46.6% of 1383) return ..., <err> blocks in if <err> != nil statements
738 ( 53.4% of 1383) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
1 ( 0.1% of 1383) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
638 ( 46.1% of 1383) try candidates (use -l flag to list file
positions)
$ go mod vendor
$ tryhard vendor
--- stats ---
37757 (100.0% of 37757) function declarations
12557 ( 33.3% of 37757) functions returning an error
88919 (100.0% of 88919) statements
20143 ( 22.7% of 88919) if statements
6555 ( 32.5% of 20143) if <err> != nil statements
109 ( 1.7% of 6555) <err> name is different from "err" (use -l flag to list file positions)
5545 ( 84.6% of 6555) return ..., <err> blocks in if <err> != nil statements
1010 ( 15.4% of 6555) more complex error handler in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
12 ( 0.2% of 6555) non-empty else blocks in if <err> != nil statements; prevent use of try (use -l flag to list file positions)
5427 ( 82.8% of 6555) try candidates (use -l flag to list file
positions)
$
@ av86743 ã
ç³ãèš³ãããŸãããããã¡ãŒã«ã®è¿ä¿¡ã¯ããŒã¯ããŠã³ããµããŒãããŠããŸããããšã¯èããŠããŸããã§ãã
tryhard
ã®çµæã§ãã³ããŒã³ãŒããæ°ããã®ã¯å
¬å¹³ã§ã¯ãªããšã³ã¡ã³ããã人ãããŸãã ããšãã°ãstdã©ã€ãã©ãªã®ãã³ããŒã³ãŒãã«ã¯ãçæãããsyscall
ããã±ãŒãžãå«ãŸããŠããŸãããã®ããã±ãŒãžã«ã¯ãå€ãã®ãšã©ãŒãã§ãã¯ãå«ãŸããŠãããå
šäœåãæªãå¯èœæ§ããããŸãã tryhard
ã®ææ°ããŒãžã§ã³ã§ã¯ãããã©ã«ã"vendor"
ãå«ããã¡ã€ã«ãã¹ãé€å€ãããããã«ãªããŸããïŒããã¯ãæ°ãã-ignore
ãã©ã°ã§å¶åŸ¡ããããšãã§ããŸãïŒã ãã³ãã§stdã©ã€ãã©ãªã«é©çšïŒ
tryhard $HOME/go/src
/Users/gri/go/src/cmd/go/testdata/src/badpkg/x.go:1:1: expected 'package', found pkg
/Users/gri/go/src/cmd/go/testdata/src/notest/hello.go:6:1: expected declaration, found Hello
/Users/gri/go/src/cmd/go/testdata/src/syntaxerror/x_test.go:3:11: expected identifier
--- stats ---
45424 (100.0% of 45424) func declarations
8346 ( 18.4% of 45424) func declarations returning an error
71401 (100.0% of 71401) statements
16666 ( 23.3% of 71401) if statements
4812 ( 28.9% of 16666) if <err> != nil statements
86 ( 1.8% of 4812) <err> name is different from "err" (-l flag lists details)
3463 ( 72.0% of 4812) return ..., <err> blocks in if <err> != nil statements
1349 ( 28.0% of 4812) complex error handler in if <err> != nil statements; cannot use try (-l flag lists details)
17 ( 0.4% of 4812) non-empty else blocks in if <err> != nil statements; cannot use try (-l flag lists details)
3345 ( 69.5% of 4812) try candidates (-l flag lists details)
çŸåšããã¹ãŠã®if
ã¹ããŒãã¡ã³ãã®29ïŒ
ïŒ28.9ïŒ
ïŒããšã©ãŒãã§ãã¯çšã§ããããã«èŠãïŒä»¥åãããããã«å€ãïŒããããã®çŽ70ïŒ
ãtry
ã®åè£ã§ããããã«èŠããŸãïŒå°ã以åãããå°ãªãïŒã
å€æŽhttps://golang.org/cl/185177ã¯ãã®åé¡ã«èšåããŠããŸãïŒ src: apply tryhard -err="" -ignore="vendor" -r $GOROOT/src
@griesemerã¯ãè€éãªãšã©ãŒãã³ãã©ãŒããã«ãŠã³ãããŸãããããåäžã¹ããŒãã¡ã³ãã®ãšã©ãŒãã³ãã©ãŒãã¯ã«ãŠã³ãããŸããã§ããã
ã»ãšãã©ã®ãè€éãªããã³ãã©ãŒãåäžã®ã¹ããŒãã¡ã³ãã§ããå Žåã on err
ïŒ32611ã¯ã try()
ãšã»ãŒåããããã®å®åçãªç¯çŽã«ãªããŸã-2è¡å¯Ÿ3è¡x 70ïŒ
ã ãŸãã on err
ã¯ããšã©ãŒã®å€§éšåã«å¯ŸããŠäžè²«ãããã¿ãŒã³ã®å©ç¹ãè¿œå ããŸãã
@nvictor
try
ã¯ã解決ããããšããŠããç¹å®ã®åé¡ã«å¯Ÿããã¯ãªãŒã³ã§ç解ãããããœãªã¥ãŒã·ã§ã³ã§ãã
ãšã©ãŒåŠçã®åé·æ§ã
ãšã©ãŒåŠçã®åé·æ§ã¯_åé¡_ã§ã¯ãªããGoã®åŒ·ã¿ã§ãã
ææ¡ã«ã¯æ¬¡ã®ããã«æžãããŠããŸãã1幎ã«ãããè°è«ã®æ«ããã®ãã«ãã€ã³ãè¿œå ããŸãã åé·æ§ã®äœãã³ãŒããå¿ èŠãªå Žåã¯ããã䜿çšãããã以å€ã®å Žåã¯åŒãç¶ãå®è¡ããŸãã ãã®åå¿ã¯ãããŒã ã¡ã³ããŒãæ確ãªå©ç¹ã瀺ããŠãããªããã€ã³æ©èœã«å¯Ÿããå®å šã«ã¯æ£åœåãããŠããªãæµæã§ãã
å·çæã®ããªãã®_opt-in_ã¯ãfuture-youãå«ããã¹ãŠã®èªè ã«ãšã£ãŠ_å¿ é _ã§ãã
æ確ãªå©ç¹
æ³¥ã ããã®å¶åŸ¡ãããŒããå©ç¹ããšåä»ããããšãã§ããã°ãããã§ãã
try
ã¯ãJavaããã³C ++ã®é§åšå¡ã®ç¿æ
£ã®ããã«ããã¹ãŠã®Gopherãç解ããå¿
èŠã®ããéæ³ãå°å
¥ããŸãã ãã®éãå°æ°ã®è¡ãæ°è¡ã«æ®ããŠãããã€ãã®å Žæã«æžã蟌ã¿ãŸãïŒ tryhard
ã®å®è¡ã瀺ããŠããããã«ïŒã
ç§ã®æ¹æ³ã§ããåçŽãªonErrãã¯ãã䜿çšãããšãããå€ãã®è¡ãæžã蟌ãå¿ èŠããªããªãã倧å€æ°ã®äººã«ãšã£ãŠã¯æ¬¡ã®ããã«ãªããŸãã
x, err = fa()
onErr break
r, err := fb(x)
onErr return 0, nil, err
if r, err := fc(x); onErr && triesleft > 0 {
triesleft--
continue retry
}
_ïŒç§ã¯ã if err!= nil
ãæŸã£ãŠããããã£ã³ãã«ããããšã«æ³šæããŠãã ãããäžèšã®å察ææ¡ã¯ãããå€ãã®æ³£ãèšãåã°ããããšãã§ããããç°¡åãªè§£æ±ºçã瀺ãããã«å
¬éãããŸãããïŒ_
ç·šéïŒ
ç°¡åã«ã§ããå Žåã¯ãgoããŒã ã«
try
ãå¯å€ååŒæ°ã®çµã¿èŸŒã¿ã«ããããšãããã«ãå§ãããŸãtry(outf.Seek(linkstart, 0)), io.Copy(outf, exef)))
ãæžãã®ãçããèªãã®ãé·ããã¹ãªããã誀解ãæãããããã¡ã³ããã³ã¹æ®µéã§äžå®å®ã§å±éºã§ããã
ç§ã¯ééã£ãŠããã å®éã«ã¯ãå¯å€ååŒæ°ã®try
ã¯ã次ã®è¡ã§èšè¿°ã§ããããããã¹ããããã¯ããã«åªããŠããŸãã
try( outf.Seek(linkstart, 0),
io.Copy(outf, exef),
)
ãããŠãæåã®ãšã©ãŒã®åŸã«try(âŠ)
ãè¿ãããŸãã
ç¹ã«è€æ°ã®é¢æ°ãé çªã«å®è¡ããå¿ èŠãããå Žåã¯ãè€æ°ã®ãšã©ãŒãçŽæçã«åŠçã§ããªããããtryã®ãããªãã®æé»ã®ãšã©ãŒãã³ãã«ïŒæ§æã·ã¥ã¬ãŒïŒã¯é©åã§ã¯ãªããšæããŸãã
ç§ã¯Elixirã®withã¹ããŒãã¡ã³ãã®ãããªãã®ãææ¡ããŸãïŒ https ïŒ//www.openmymind.net/Elixirs-With-Statement/
以äžã®golangã®ãããªãã®ïŒ
switch a, b, err1 := go_func_01(),
apple, banana, err2 := go_func_02(),
fans, dissman, err3 := go_func_03()
{
normal_func()
else
err1 -> handle_err1()
err2 -> handle_err2()
_ -> handle_other_errs()
}
ãã®çš®ã®ãGoã¯ããå°ãªãæ©èœã奜ããããã³ãGoã«æ©èœãè¿œå ããŠããããã¯ããè¯ããªãã®ã§ã¯ãªãããã倧ãããªãããšããéåã§ããïŒ ç§ã¯ããããŸãã...
ç§ã¯ãã èšãããã§ããå人çã«ç§ã¯å€ãæ¹æ³ã«å®å šã«æºè¶³ããŠããŸã
if err != nil {
return âŠ, err
}
ãããŠééããªãç§ã¯try
ã䜿ã£ãŠä»ã®äººãæžããã³ãŒããèªã¿ãããããŸãã...çç±ã¯2ã€ãããŸãïŒ
try
ã¯ãã¹ãã§ããŸããã€ãŸãã try( ... try( ... try ( ... ) ... ) ... )
ã¯èªã¿ã«ããã§ãããšã©ãŒãæž¡ãããã«å€ãæ¹æ³ã§ã³ãŒããæžãã®ãé¢åã ãšæããªãã圌ãã¯åžžã«åãä»äºãããŠããã®ã§ãã³ããŒã¢ã³ãããŒã¹ãããŠã¿ãŸãããïŒ
ããŠãããªãã¯ç§ãã¡ããã€ãåãä»äºãããããšã¯éããªããšæããããããŸãããããããªãããªãã¯ããªãã®ããã³ãã©ãŒãé¢æ°ãæžããªããã°ãªããªãã§ãããã ã§ããããå€ãããæ¹ã§æžããŠããã°ãããããäœã倱ãããšã¯ãããŸããã
ããã©ãŒãã³ã¹ã¯ããã®ææ¡ããããœãªã¥ãŒã·ã§ã³ã®åé¡ã§ã¯ãããŸãããïŒ å»¶æã®æç¡ã«ãããããé¢æ°ã®ãã³ãããŒã¯ãè¡ããŸããããããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ããããŸããã ç§ã¯ã¡ããã©ãã®ãããªãã³ãããŒã¯ãããŠã16åã®ã³ã¹ããèŠã€ããä»ã®èª°ããã°ãŒã°ã«ã§æ€çŽ¢ããŸããã ç§ããããªã«æªãã®ãèŠããŠããŸãããã4åé ããšãã«ã鳎ããŸãã å€ãã®é¢æ°ã®å®è¡æéã2åãŸãã¯æªåãããå¯èœæ§ã®ãããã®ããå®è¡å¯èœãªäžè¬çãªãœãªã¥ãŒã·ã§ã³ãšèŠãªãã«ã¯ã©ãããã°ããã§ããããã
@ eric-hawthorneããã©ãŒãã³ã¹ã®å»¶æã¯å¥ã®åé¡ã§ãã Tryã¯æ¬è³ªçã«å»¶æãå¿ èŠãšããã延æãªãã§ãšã©ãŒãåŠçããæ©èœãåé€ããŸããã
@ fabian-fãããããã®ææ¡ã¯ã誰ããif errïŒ= nilãããã¯ã®ã¹ã³ãŒãå ã§ã€ã³ã©ã€ã³ããšã«ãšã©ãŒãåå¥ã«è£ 食ããŠããã³ãŒãã眮ãæããããšã奚å±ããå¯èœæ§ããããŸãã ããã¯ãããã©ãŒãã³ã¹ã«å€§ããªéãããããŸãã
@ eric-hawthorneãã¶ã€ã³ããã¥ã¡ã³ãã®åŒçšïŒ
QïŒã©ããã³ã°ãšã©ãŒã«deferã䜿çšãããšé ããªããŸãããïŒ
AïŒçŸåšãdeferã¹ããŒãã¡ã³ãã¯ãéåžžã®å¶åŸ¡ãããŒãšæ¯èŒããŠæ¯èŒçã³ã¹ããããããŸãã ãã ãããšã©ãŒåŠçã®å»¶æã®äžè¬çãªãŠãŒã¹ã±ãŒã¹ã®ããã©ãŒãã³ã¹ãçŸåšã®ãæåãã¢ãããŒããšåçã«ããããšã¯å¯èœã§ãããšèããŠããŸãã 延æã®ããã©ãŒãã³ã¹ãçŽ30ïŒ åäžãããããšãæåŸ ãããCL171758ãåç §ããŠãã ããã
Redditã«ãªã³ã¯ãããŠããRustããã®èå³æ·±ã話ããããŸããã æãé¢é£æ§ã®é«ãéšåã¯47:55ã«å§ãŸããŸã
æ倧ã®å ¬éãªããžããªhttps://github.com/dpinela/mflgã§tryhardãè©ŠããŠã¿ããšããã次ã®ããã«ãªããŸããã
--- stats ---
309 (100.0% of 309) func declarations
36 ( 11.7% of 309) func declarations returning an error
305 (100.0% of 305) statements
73 ( 23.9% of 305) if statements
29 ( 39.7% of 73) if <err> != nil statements
0 ( 0.0% of 29) <err> name is different from "err"
19 ( 65.5% of 29) return ..., <err> blocks in if <err> != nil statements
10 ( 34.5% of 29) complex error handler in if <err> != nil statements; cannot use try
0 ( 0.0% of 29) non-empty else blocks in if <err> != nil statements; cannot use try
15 ( 51.7% of 29) try candidates
ãã®ãªããžããªå
ã®ã»ãšãã©ã®ã³ãŒãã¯å
éšãšãã£ã¿ãŒã®ç¶æ
ã管çããŠãããI / Oãå®è¡ããªãããããšã©ãŒãã§ãã¯ãã»ãšãã©ãããŸããããããã£ãŠãtryã䜿çšã§ããå Žæã¯æ¯èŒçéãããŠããŸãã ç§ã¯å
ã«é²ã¿ãå¯èœãªå Žåã¯tryã䜿çšããããã«ã³ãŒããæåã§æžãçŽããŸããã git diff --stat
ã¯æ¬¡ãè¿ããŸãã
application.go | 42 +++++++++++-------------------------------
internal/atomicwrite/write.go | 35 ++++++++++++++---------------------
internal/clipboard/clipboard.go | 17 +++--------------
internal/config/config.go | 15 +++++++--------
internal/termesc/term.go | 5 +----
render.go | 8 ++------
6 files changed, 38 insertions(+), 84 deletions(-)
ïŒããã§å®å šãªå·®åãïŒ
tryhardããè€éããšå ±åãã10åã®ãã³ãã©ãŒã®ãã¡ã5åã¯internal / atomicwrite /write.goã®ãã©ãŒã«ã¹ãã¬ãã£ãã§ãã 圌ãã¯pkg / errors.WithMessageã䜿çšããŠãšã©ãŒãã©ããããŠããŸããã ã©ããã³ã°ã¯ããããã¹ãŠã§ãŸã£ããåãã ã£ãã®ã§ãtryãã³ãã©ãŒãšdeferedãã³ãã©ãŒã䜿çšããããã«ãã®é¢æ°ãæžãçŽããŸããã ç§ã¯ãã®å·®åïŒ+ 14ã-21è¡ïŒã«ãªããŸããïŒ
@@ -20,21 +20,20 @@ const (
// The file is created with mode 0644 if it doesn't already exist; if it does, its permissions will be
// preserved if possible.
// If some of the directories on the path don't already exist, they are created with mode 0755.
-func Write(filename string, contentWriter func(io.Writer) error) error {
+func Write(filename string, contentWriter func(io.Writer) error) (err error) {
+ defer func() { err = errors.WithMessage(err, errString(filename)) }()
+
dir := filepath.Dir(filename)
- if err := os.MkdirAll(dir, defaultDirPerms); err != nil {
- return errors.WithMessage(err, errString(filename))
- }
- tf, err := ioutil.TempFile(dir, "mflg-atomic-write")
- if err != nil {
- return errors.WithMessage(err, errString(filename))
- }
+ try(os.MkdirAll(dir, defaultDirPerms))
+ tf := try(ioutil.TempFile(dir, "mflg-atomic-write"))
name := tf.Name()
- if err = contentWriter(tf); err != nil {
- os.Remove(name)
- tf.Close()
- return errors.WithMessage(err, errString(filename))
- }
+ defer func() {
+ if err != nil {
+ tf.Close()
+ os.Remove(name)
+ }
+ }()
+ try(contentWriter(tf))
// Keep existing file's permissions, when possible. This may race with a chmod() on the file.
perms := defaultPerms
if info, err := os.Stat(filename); err == nil {
@@ -42,14 +41,8 @@ func Write(filename string, contentWriter func(io.Writer) error) error {
}
// It's better to save a file with the default TempFile permissions than not save at all, so if this fails we just carry on.
tf.Chmod(perms)
- if err = tf.Close(); err != nil {
- os.Remove(name)
- return errors.WithMessage(err, errString(filename))
- }
- if err = os.Rename(name, filename); err != nil {
- os.Remove(name)
- return errors.WithMessage(err, errString(filename))
- }
+ try(tf.Close())
+ try(os.Rename(name, filename))
return nil
}
ãšã©ãŒã«æ³šéãä»ããæåã®å»¶æã«æ³šæããŠãã ãããWithMessageãnilãšã©ãŒã«å¯ŸããŠnilãè¿ããããã§ã1è¡ã«å¿«é©ã«åããããšãã§ããŸããã ãã®çš®ã®ã©ãããŒã¯ãææ¡ã§ææ¡ãããŠãããã®ãšåæ§ã«ããã®ã¢ãããŒãã§ãæ©èœããããã§ãã
ä»ã®ãè€éãªããã³ãã©ãŒã®ãã¡ã®2ã€ã¯ãReadFromãšWriteToã®å®è£ ã«ãããŸããã
var line string
line, err = br.ReadString('\n')
b.lines = append(b.lines, line)
if err != nil {
if err == io.EOF {
err = nil
}
return
}
func (b *Buffer) WriteTo(w io.Writer) (int64, error) {
var n int64
for _, line := range b.lines {
nw, err := w.Write([]byte(line))
n += int64(nw)
if err != nil {
return n, err
}
}
return n, nil
}
ãããã¯å®éã«è©Šãã®ã«é©ããŠããªãã£ãã®ã§ãç§ã¯ããããæŸã£ãŠãããã
ä»ã®2ã€ã¯ãã®ãããªã³ãŒãã§ããã§ãã¯ãããã®ãšã¯ãŸã£ããç°ãªããšã©ãŒãè¿ããŸãïŒåã«ã©ããããã ãã§ã¯ãããŸããïŒã ç§ãããããå€æŽããã«æ®ããŸããïŒ
n, err := strconv.ParseInt(s[1:], 16, 32)
if err != nil {
return Color{}, errors.WithMessage(err, fmt.Sprintf("color: parse %q", s))
}
æåŸã®ãã®ã¯ãèšå®ãã¡ã€ã«ãããŒãããé¢æ°ã«ãããŸãããããã¯ããšã©ãŒãçºçããå Žåã§ãåžžã«ïŒãŒã以å€ã®ïŒèšå®ãè¿ããŸãã ãã®ãšã©ãŒãã§ãã¯ã¯1ã€ãããªãã£ãã®ã§ãè©ŠããŠã¿ãŠãããŸãã¡ãªããã¯ãããŸããã§ããã
-func Load() (*Config, error) {
- c := Config{
+func Load() (c *Config, err error) {
+ defer func() { err = errors.WithMessage(err, "error loading config file") }()
+
+ c = &Config{
TabWidth: 4,
ScrollSpeed: 1,
Lang: make(map[string]LangConfig),
}
- f, err := basedir.Config.Open(filepath.Join("mflg", "config.toml"))
- if err != nil {
- return &c, errors.WithMessage(err, "error loading config file")
- }
+ f := try(basedir.Config.Open(filepath.Join("mflg", "config.toml")))
defer f.Close()
- _, err = toml.DecodeReader(f, &c)
+ _, err = toml.DecodeReader(f, c)
if c.TextStyle.Comment == (Style{}) {
c.TextStyle.Comment = Style{Foreground: &color.Color{R: 0, G: 200, B: 0}}
}
if c.TextStyle.String == (Style{}) {
c.TextStyle.String = Style{Foreground: &color.Color{R: 0, G: 0, B: 200}}
}
- return &c, errors.WithMessage(err, "error loading config file")
+ return c, err
}
å®éããªã¿ãŒã³ãã©ã¡ãŒã¿ã®å€ãä¿æãããšããtryã®åäœã«äŸåããããšã¯ã裞ã®ãªã¿ãŒã³ã®ããã«ãç§ã®æèŠã§ã¯ãåŸãã®ãå°ãé£ãããšæããŠããŸãã ããã«ãšã©ãŒãã§ãã¯ãè¿œå ããªãéãããã®ç¹å®ã®ã±ãŒã¹ã§ã¯if err != nil
ã«åºå·ããŸãã
TL; DRïŒtryã¯ããã®ã³ãŒãã®ããªãå°ããªå²åïŒè¡æ°ã«ããïŒã§ã®ã¿åœ¹ç«ã¡ãŸããã圹ç«ã€å Žåã¯ãæ¬åœã«åœ¹ç«ã¡ãŸãã
ïŒããã§ã¯NoobïŒã è€æ°ã®åŒæ°ã®å¥ã®ã¢ã€ãã¢ã ã©ãã§ããïŒ
package trytest
import "fmt"
func errorInner() (string, error) {
return "", fmt.Errorf("inner error")
}
func errorOuter() (string, error) {
tryreturn errorInner()
return "", nil
}
func errorOuterWithArg() (string, error) {
var toProcess string
tryreturn toProcess, _ = errorOuter()
return toProcess + "", nil
}
func errorOuterWithArgStretch() (bool, string, error) {
var toProcess string
tryreturn false, ( toProcess,_ = errorOuterWithArg() )
return true, toProcess + "", nil
}
ã€ãŸããtryreturnã¯ãæåŸã«ãšã©ãŒãçºçããå Žåã«ãã¹ãŠã®å€ã®æ»ããããªã¬ãŒããŸã
å€ããã以å€ã®å Žåã¯å®è¡ãç¶è¡ãããŸãã
ç§ãåæããååïŒ
-
try
ã®ããã«ïŒæ»ããã«ãã€ã³ã¯ãå°ãªããšãã¹ããŒãã¡ã³ãã§ããå¿
èŠããããçæ³çã«ã¯ãreturnãšããåèªãå«ãŸããŠããå¿
èŠããããŸãã ç¹°ãè¿ãã«ãªããŸãããGoã®å¶åŸ¡ãããŒã¯æ瀺çã§ããå¿
èŠããããšæããŸãããµããŒãããæ§æïŒ
-
reterr _x_
ã¹ããŒãã¡ã³ãïŒ if err != nil { return _x_ }
ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãè¿ãããããšã瀺ãããã«æ瀺çã«ååãä»ããããŠããŸãïŒãããã£ãŠãäžè¬çãªã±ãŒã¹ã¯ã1ã€ã®çãæ瀺çãªè¡ã§ããå¯èœæ§ããããŸãã
func foo() error {
a, err := bar()
reterr err
b, err := baz(a)
reterr fmt.Errorf("getting the baz of %v: %v", a, err)
return nil
}
3è¡ã®ä»£ããã«ã次ã®ããã«ãªããŸãã
func foo() error {
a, err := bar()
if err != nil {
return err
}
b, err := baz()
if err != nil {
return fmt.Errorf("getting the baz of %v: %v", a, err)
}
return nil
}
ç§ãåæããªãããšïŒ
reterr
ã®ãããªç¹å®ã®éåžžã«åºã䜿çšãããŠãããã¯ããæäŸããå¿
èŠããããŸãïŒGoãäœæãããã¹ãŠã®äººãreterrã®æ©æµãåããŸãïŒã@Qheszããã¯tryãšå€§å·®ãããŸããïŒ
func foo() error {
a, err := bar()
try(err)
b, err := baz(a)
try(wrap(err, "getting the baz of %v", a))
return nil
}
@reuseeãã®ææ¡ã«æè¬ããŸããç§ã¯ããããã®ããã«äœ¿ãããããšãã§ãããšã¯æããŸããã§ããã ããã¯ç§ã«ã¯å°ãæ Œåã®ããã«èŠããŸãããç§ã¯ãã®çç±ã«æã眮ããŠããã®ã§ãã
ãã®ããã«äœ¿ãã®ã¯ããã£ãŠã¿ãããšããã®ã¯å€ãªèšèã ãšæããŸãã ãtryïŒactionïŒïŒïŒãã¯è±èªã§ã¯æå³ããããŸããããtryïŒvalueïŒãã¯å®éã«ã¯æå³ããããŸããã å¥ã®èšèã ã£ãããã£ãšå€§äžå€«ã ããã
ãŸãtry(wrap(...))
ã¯wrap(...)
æåã«è©äŸ¡ããŸããïŒ ãã®ã©ãã ããã³ã³ãã€ã©ã«ãã£ãŠæé©åããããšæããŸããïŒ ïŒ if err != nil
ãå®è¡ããã ããšæ¯èŒããŠïŒïŒ
ãŸããïŒ32611ãæŒ ç¶ãšäŒŒãææ¡ã§ãããã³ã¡ã³ãã«ã¯ãç¹ã«ããŒã¯ãŒããšçµã¿èŸŒã¿é¢æ°ã®éãã«ã€ããŠãGoããŒã ãšã³ãã¥ããã£ã¡ã³ããŒã®äž¡æ¹ããããã€ãã®åçºçãªæèŠããããŸãã
@Qheszåœåã«ã€ããŠã¯åæããŸãã ãcheckïŒactionïŒïŒïŒããŸãã¯ãcheckïŒerrïŒãã®ã©ã¡ãããããèªããã®ã§ãããããcheck
ã®æ¹ãé©åã§ãã
@reuseeå
ã®ãã©ãããã¶ã€ã³ã§ã¯check
ã䜿çšãããŠãããããããã¯å°ãç®èãªããšã§ãã
7/6/19ã«ã mirtchovskinotifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
$ tryhardã
---çµ±èš---
2930ïŒ2930ã®100.0ïŒ ïŒé¢æ°å®£èš
ãšã©ãŒãè¿ã1408ïŒ2930ã®48.1ïŒ ïŒé¢æ°
[...]
ç§ã¯ããã§ãããããããªããã°ãªããŸããïŒããã¯ãé¢æ°ã
æåŸã®åŒæ°ãšããŠã®ãšã©ãŒãïŒ
ã«ã·ãªã
äžèšã®ç§ã®è³ªåã®æçµçãªèãã¯ãerrãnilã§ãªãå Žåã«ã®ã¿wrapïŒïŒãå®è¡ãããæ§ætry(err, wrap("getting the baz of %v: %v", a, err))
ã奜ãããšã§ãã try(wrap(err, "getting the baz of %v", a))
ã®ä»£ããã«ã
@Qhesz wrap
ã®å¯èœãªå®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
func wrap(err error, format string, args ...interface{}) error {
if err == nil {
return nil
}
return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err)
}
ã³ã³ãã€ã©ãwrap
ãã€ã³ã©ã€ã³åã§ããå Žåã wrap
ïŒ$å¥ãšif err != nil
å¥ã®éã«ããã©ãŒãã³ã¹ã®éãã¯ãããŸããã
@reuseeããªãã¯if err == nil
ãæå³ãããšæããŸã;ïŒ
@Qhesz
wrap
ã®å¯èœãªå®è£ ã¯æ¬¡ã®ããã«ãªããŸããfunc wrap(err error, format string, args ...interface{}) error { if err == nil { return nil } return fmt.Errorf("%s: %w", fmt.Sprintf(format, args...), err) }
ã³ã³ãã€ã©ã
wrap
ãã€ã³ã©ã€ã³åã§ããå Žåãwrap
ïŒ$å¥ãšif err != nil
å¥ã®éã«ããã©ãŒãã³ã¹ã®éãã¯ãããŸããã
%w
ã¯ç¡å¹ã§ãgo
åè©
ïŒç§ã¯åœŒãïŒ vãæå³ãããšæããŸã...ïŒ
ãããã£ãŠãããŒã¯ãŒããäœæããããšããå§ãããŸãããçµã¿èŸŒã¿ããããå®è£ ããããã®å¥œãŸããæ¹æ³ã§ããããšãç解ããŠããŸãã
ããç§ããã®ææ¡ã«åå ããã ãããšæããŸã
check
try
panic()
ã®ããã«ãåŒå
ã§ã¯æå¹ã«ãªããŸããã§ãããcheck!(...)
ã§ãããç¹å®ã®æ§æã«ã€ããŠã¯åŒ·ãæèŠããããŸããïŒãæ°ãå€ãã£ããããªãããã¯çŽ æŽãããããšã§ããç§ãè¡ããã¹ãŠã®é¢æ°åŒã³åºãã§ããã䜿çšããŸãã
ãããŠãã¹ã¬ãããžã®ãã€ããŒãªè¬çœªãç§ã¯ä»ãç§ãä»èšã£ãããšã®ã»ãšãã©ãæŠèª¬ããŠããäžèšã®ã³ã¡ã³ããèŠã€ããŸããã
@deanveloperãä¿®æ£ãããŸãããããããšãã
@olekukonko @ Qhesz ïŒ wãtipã«æ°ããè¿œå ãããŸããïŒ https ïŒ//tip.golang.org/pkg/fmt/#Errorf
ãã®ãããã¯ã®ãã¹ãŠãèªãã§ããªãããšããè©«ã³ããŸãããç§ãèŠãããšã®ãªãããšã«ã€ããŠèšåããããšæããŸãã
Go1ã®ãšã©ãŒåŠçãç ©ããã2ã€ã®å¥ã ã®ã±ãŒã¹ããããŸããæ£ãããå°ãå埩çãªãè¯ããã³ãŒãã ééã£ãŠãããã»ãšãã©ã¯æ©èœãããæªããã³ãŒãã
æåã®ã±ãŒã¹ã§ã¯ãif-errãããã¯ã«ããžãã¯ãå®éã«ååšããå¿ èŠããããtryã¹ã¿ã€ã«ã®æ§æã«ç§»è¡ãããšãããžãã¯ãè¿œå ãã«ããããããããã®åªãããã©ã¯ãã£ã¹ãæããšã©ãŸãããŸãã
2çªç®ã®ã±ãŒã¹ã§ã¯ãäžæ£ãªã³ãŒãã¯æ¬¡ã®åœ¢åŒã§ããããšããããããŸãã
..., _ := might_error()
ãããã¯åã«
might_error()
ãããçºçããã®ã¯ãéåžžãäœæè ããšã©ãŒåŠçã«æéãè²»ããã»ã©éèŠã§ãããšã¯èããŠãããããã¹ãŠãæ©èœããããšãæãã§ããããã§ãã ãã®ã±ãŒã¹ã¯ã次ã®ããã«ããŒããšãã©ãŒãã«éåžžã«è¿ããã®ã«ãã£ãŠæ¹åãããå¯èœæ§ããããŸãã
..., XXX := might_error()
ããã§ãXXXã¯ããããã«ãããã®ã¯ããªãããã®æ¹æ³ã§å®è¡ãåæ¢ããå¿ èŠãããããšããæå³ã®èšå·ã§ãã ããã«ããããããæ¬çªç°å¢ã«å¯Ÿå¿ããã³ãŒãã§ã¯ãªãããšãæããã«ãªããŸããäœæè ã¯ãšã©ãŒã±ãŒã¹ãèªèããŠããŸãããäœããã¹ããã決å®ããããã«æéãè²»ãããŠããŸããã
ãã¡ãããããã¯returnif handle(err)
ã¿ã€ãã®ãœãªã¥ãŒã·ã§ã³ãæé€ãããã®ã§ã¯ãããŸããã
ç§ã¯ããã©ã³ã¹ã®åãããçŽ æµãªãããã«ãªãã¶ã€ã³ã®è²¢ç®è ãžã®è€ãèšèã§ãè©ŠããŠã¿ãããšã«å察ããŠããŸãã ç§ã¯Goã®å°é家ã§ã¯ãããŸããããåæã®æ¡çšè ã§ããããã¡ãã¡ã§ã³ãŒããéçšããŠããŸãã ç§ã¯AWSã®ãµãŒããŒã¬ã¹ã°ã«ãŒãã§åããŠããŸãããä»å¹Žã®åŸåã«GoããŒã¹ã®ãµãŒãã¹ããªãªãŒã¹ããäºå®ã§ããæåã®ãã§ãã¯ã€ã³ã¯å®è³ªçã«ç§ãäœæãããã®ã§ãã ç§ã¯æ¬åœã«å¹Žé ã®äººã§ãCãPerlãJavaãRubyãçµç±ããéãæ©ãã§ããŸãã ç§ã®åé¡ã¯ä»¥åã«éåžžã«æçšãªèšè«ã®èŠçŽã«çŸããŸããããããã§ãç¹°ãè¿ã䟡å€ããããšæããŸãã
if err != nil { return }
ãšã»ãŒåçã§ãïŒç§ã¯æããŸããïŒïŒç§ã¯å人çã«ååä»ãæ»ãå€ã奜ãã§ããšã©ãŒãã³ã¬ãŒã¿ã®å©ç¹ãèãããšãååä»ãerræ»ãå€ã®å²åã¯å調ã«å¢å ããŸãã ããã¯ãè©Šè¡ã®å©ç¹ã匱ããŸããç¹°ãè¿ãã«ãªããŸãããããŠããªã¯ãªãŒã³ãªææ¡ãšå»ºèšçãªè°è«ã«ã€ããŠãã³ãã¥ããã£ã«ããã§ãšãããããŸãã
éå»æ°å¹Žéãç§ã¯ããªãã®æéãè²»ãããŠããªãã¿ã®ãªãã©ã€ãã©ãªãã³ãŒãã®æçã«é£ã³èŸŒãã§èªãã§ããŸãã éå±ãªäœæ¥ã«ããããããã if err != nil
ã¯ãåçŽæ¹åã«åé·ã§ã¯ãããŸãããéåžžã«èªã¿ãããã€ãã£ãªã ãæäŸããŸãã try()
ãéæããããšããŠããããšã®ç²Ÿç¥ã¯é«è²Žã§ãããããã¹ãããšããããšæããŸããããã®æ©èœã¯åªå
é äœãäœããææ¡ãæ©ãããïŒã€ãŸããæ¥ãã¹ãã§ããïŒãšæããŠããŸãã xerr
ãšãžã§ããªãã¯å»è¬åãã6ã12ãæã®å®å®ãããªãªãŒã¹ã§ããªããããã£ã³ã¹ããã£ãåŸïŒã
try()
ã®çŽ¹ä»ã¯ãé«è²Žã§äŸ¡å€ã®ããææ¡ã®ããã§ãïŒããšãã°ã if
ã¹ããŒãã¡ã³ãã®29ïŒ
ã40ïŒ
ã¯$ if err != nil
ãã§ãã¯çšã§ãïŒã è¡šé¢çã«ã¯ããšã©ãŒåŠçã«é¢é£ããå®åæãæžããããšã§ãéçºè
ã®ãšã¯ã¹ããªãšã³ã¹ãåäžããããã«èŠããŸãã try()
ã®å°å
¥ã«ãããã¬ãŒããªãã¯ãå埮åŠãªç¹æ®ãªã±ãŒã¹ããã®èªç¥çè² è·ã®åœ¢ã§ããããããŸãã Goã®æ倧ã®é·æã®1ã€ã¯ããããåçŽã§ãããäœããæãéããããã«å¿
èŠãªèªç¥çè² è·ãã»ãšãã©ãªãããšã§ãïŒèšèªä»æ§ã倧ãã埮åŠãªC ++ãšæ¯èŒããŠïŒã 粟ç¥çãªè€éãã®å®éçãªæž¬å®åºæºãå¢ããããšãšåŒãæãã«ã1ã€ã®å®éçãªæž¬å®åºæºïŒ if err != nil
ã®LoCïŒãæžããããšã¯ã飲ã¿èŸŒãã®ãé£ããè¬ã§ãïŒã€ãŸããç§ãã¡ãæã£ãŠããæã貎éãªãªãœãŒã¹ã§ããè³åã«å¯Ÿãã粟ç¥çãªçšéïŒã
ç¹ã«ã try()
ãgo
ã defer
ã§åŠçãããæ¹æ³ã®æ°ããç¹æ®ãªã±ãŒã¹ãããã³ååä»ãã®æ»ãå€æ°ã«ããã try()
ã¯ã³ãŒããå°ãªãããã®ã«ååãªéæ³ã«ãªããŸãGoã³ãŒãã®ãã¹ãŠã®äœæè
ãŸãã¯èªè
ã¯ãGoãé©åã«èªã¿æžãããããã«ããããã®æ°ããç¹æ®ãªã±ãŒã¹ãç¥ãå¿
èŠãããããã®ãããªè² æ
ã¯ä»¥åã¯ååšããªãã£ããããæ瀺çã§ãã ãããã®ç¶æ³ã«ã¯æ確ãªç¹æ®ãªã±ãŒã¹ãããã®ã奜ãã§ããç¹ã«ãäœããã®åœ¢ã®æªå®çŸ©ã®åäœãå°å
¥ããå Žåãšã¯ç°ãªããŸãããããããããããååšããå¿
èŠããããšããäºå®ã¯ãçŸæç¹ã§ã¯ãããäžå®å
šã§ããããšã瀺ããŠããŸãã ç¹æ®ãªã±ãŒã¹ããšã©ãŒåŠç以å€ã®ãã®ã§ããå Žåãããã¯èš±å®¹ã§ããå¯èœæ§ããããŸããããã¹ãŠã®LoCã®æ倧40ïŒ
ã«åœ±é¿ãäžããå¯èœæ§ã®ãããã®ã«ã€ããŠãã§ã«è©±ããŠããå Žåããããã®ç¹æ®ãªã±ãŒã¹ã¯ã³ãã¥ããã£å
šäœã«ãã¬ãŒãã³ã°ããå¿
èŠããããŸããããã¯ããã®ææ¡ã®èªç¥çè² è·ã®ã³ã¹ãããæžå¿µãæ£åœåããã®ã«ååãªã¬ãã«ãŸã§åŒãäžããŸãã
Goã«ã¯ãç¹æ®ãªã±ãŒã¹ã®ã«ãŒã«ããã§ã«æ»ããããèªç¥ã¹ããŒããã€ãŸããã³çããããå€æ°ãšãã³çããããŠããªãå€æ°ã§ããå¥ã®äŸããããŸãã å€æ°ãåºå®ããå¿
èŠãããããšã¯å®éã«ã¯ç解ããã®ã¯é£ããããšã§ã¯ãããŸããããããã«ã¯æé»ã®åäœããããããã«ããäœæè
ããªãŒããŒãããã³å®è¡æã«ã³ã³ãã€ã«ãããå®è¡å¯èœãã¡ã€ã«ã§äœãèµ·ããããäžèŽããªããããèŠéãããŸãã scopelint
ã®ãããªãªã³ã¿ãŒã䜿çšããŠããå€ãã®éçºè
ã¯ãŸã ãã®èœãšãç©Žãç解ããŠããªãããã§ãïŒããã«æªãããšã«ããã®èœãšãç©Žã¯æ°ãçããããç¥ã£ãŠããŸããèŠéããŠããŸãïŒã æ©èœããŠããããã°ã©ã ããã®å®è¡æã®ãã°ã蚺æããã®ã«æãäºæ³å€ã§å°é£ãªãã®ã®ããã€ãã¯ããã®ç¹å®ã®åé¡ã«èµ·å ããŸãïŒããšãã°ãNåã®ãªããžã§ã¯ãã¯ãã¹ã©ã€ã¹ãç¹°ãè¿ããŠæåŸ
ãããåå¥ã®å€ãååŸãã代ããã«ããã¹ãŠåãå€ã§å
¥åãããŸãïŒã try()
ã®å€±æãã¡ã€ã³ã¯åºå®ãããå€æ°ãšã¯ç°ãªããŸãããçµæãšããŠäººã
ãã³ãŒããæžãæ¹æ³ã«åœ±é¿ããããŸãã
IMNSHOã xerr
ããã³ãžã§ããªãã¯å»è¬åã®ææ¡ã§ã¯ã if err != nil
ããå®åæãåŸæããããšããåã«ã6ã12ãæéæ¬çªç°å¢ã§çŒãäžããæéãå¿
èŠã§ãã ãžã§ããªãã¯ã¹ã¯ãããè±å¯ãªãšã©ãŒåŠçãšæ°ããæ
£çšçãªãšã©ãŒåŠçã®æ¹æ³ãžã®éãéãå¯èœæ§ããããŸãã ãžã§ããªãã¯ã¹ã䜿çšããæ
£çšçãªãšã©ãŒåŠçãåºçŸãå§ãããããã®ãšãã ãã try()
ãªã©ã«é¢ããè°è«ãåæ€èšããããšã¯çã«ããªã£ãŠããŸãã
ãžã§ããªãã¯ããšã©ãŒåŠçã«ã©ã®ããã«åœ±é¿ããããç¥ã£ãŠãããµãã¯ããŸãããããžã§ããªãã¯ããšã©ãŒåŠçã§ã»ãŒç¢ºå®ã«äœ¿çšããããªããã¿ã€ããäœæããããã«äœ¿çšãããããšã¯ç¢ºããªããã§ãã ãžã§ããªãã¯ã¹ãã©ã€ãã©ãªã«æµžéãããšã©ãŒåŠçã«è¿œå ããããšã try()
ãåå©çšããŠããšã©ãŒåŠçã«é¢ããéçºè
ã®ãšã¯ã¹ããªãšã³ã¹ãåäžãããæãããªæ¹æ³ããããããããŸããã
ç§ãæã£ãŠããæžå¿µäºé ã¯æ¬¡ã®ãšããã§ãã
try()
ã¯ãåç¬ã§ã¯è€éã§ã¯ãããŸãããã以åã¯ååšããŠããªãã£ãèªç¥çãªãŒããŒãããã§ããerr != nil
ãtry()
ã®æ³å®ãããåäœã«çµã¿èŸŒãããšã«ãããèšèªã¯ã¹ã¿ãã¯ã®ç¶æ
ãéä¿¡ããæ¹æ³ãšããŠerr
ã䜿çšããããšãé²ããŸããtry()
ã¯åŒ·å¶çãªè³¢ãã®ããã«æããŸãããGoèšèªã®ã»ãšãã©ã享åããŠããæ瀺çã§æçœãªãã¹ããæºããã«ã¯ååè³¢ããããŸããã 䞻芳çãªåºæºãå«ãã»ãšãã©ã®ãã®ãšåæ§ã«ãããã¯å人ã®è¶£å³ãšçµéšã®åé¡ã§ãããå®éåããã®ã¯å°é£ã§ããswitch
/ case
ã¹ããŒãã¡ã³ããšãšã©ãŒã©ããã³ã°ã«ãããšã©ãŒåŠçã¯ããã®ææ¡ã§ã¯åœ±é¿ãåããŠããªãããã§ãããæ©äŒãéããããããã®ææ¡ã¯æªç¥ã®ãã®ãäœãã®ãæ¥ãããããå±ã§ãããšç§ã¯ä¿¡ããŠããŸã-æªç¥ã®æ¢ç¥-æ¢ç¥ïŒãŸãã¯ææªã®å Žåãæ¢ç¥-æªç¥ïŒãæåŸã«ã try()
ã®ææ¡ã¯ãC ++ãæ®ããŠéãããããªãèšèªåºæã®ãã¥ã¢ã³ã¹ã®æŽªæ°ŽãæããŠãããã ã®æ°ããäŒæ©ã®ããã«æããŸãã
TL; DRïŒ #nevertry
ã®å¿çã§ã¯ãããŸãããããä»ã¯ãŸã ã§ãã xerr
ãšãžã§ããªãã¯ããšã³ã·ã¹ãã ã§æçããåŸããããå°æ¥ããäžåºŠèããŠã¿ãŸãããã ãã
äžã«ãªã³ã¯ãããŠããïŒ32968ã¯ãå®å
šãªå察ææ¡ã§ã¯ãããŸãããã try
ãã¯ããæã€å±éºãªãã¹ãæ©èœãšã®ç§ã®æèŠã®çžéã«åºã¥ããŠããŸãã ïŒ32946ãšã¯ç°ãªããããã¯æ·±å»ãªææ¡ã§ãããæ·±å»ãªæ¬ é¥ããªãããšãé¡ã£ãŠããŸãïŒãã¡ãããããªããèŠãŠãè©äŸ¡ããã³ã¡ã³ãããããšã§ãïŒã æç²ïŒ
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
ã®Goå®è£
ãä»ã®èšèªã®å®è£
ãšç°ãªãå Žåãããã«æ··ä¹±ãçããŸãã
ç§ã®ææ¡ã¯ããšã©ãŒåŠçããã®ãŸãŸã«ããŠããããšã§ãã
å€ãã®æ¹ã«ãåå ããã ããŠããããšã¯æ¿ç¥ããŠãããŸãããä»æ§ã«å¯Ÿããæ¹å€ããã®ãŸãŸä»ãå ããããšæããŸãã
ç§ãæãå°ã£ãŠããä»æ§ã®äžéšã¯ã次ã®2ã€ã®èŠæ±ã§ãã
ãããã£ãŠãgoã¹ããŒãã¡ã³ãã§åŒã³åºãããé¢æ°ãšããŠã®tryãçŠæ¢ããããšããå§ãããŸãã
..ã
ãããã£ãŠãdeferã¹ããŒãã¡ã³ãã§ãåŒã³åºãããé¢æ°ãšããŠã®tryãçŠæ¢ããããšããå§ãããŸãã
ããã¯ãçµæãç Žæ£ããå¿
èŠããªãã£ãããããããåœãŠã¯ãŸãæåã®çµã¿èŸŒã¿é¢æ°ã«ãªããŸãïŒ defer
ããã³go
panic
ãå¯èœã§ãïŒã ã³ã³ãã€ã©ãç¹å¥ãªå¶åŸ¡ãããŒãèæ
®ããå¿
èŠãããæ°ããçµã¿èŸŒã¿é¢æ°ãäœæããããšã¯ã倧ããªè³ªåã®ããã«æãããgoã®ã»ãã³ãã£ãã¯ã³ããŒã¬ã³ã¹ãå£ããŸãã goå
ã®ä»ã®ãã¹ãŠã®å¶åŸ¡ãããŒããŒã¯ã³ã¯é¢æ°ã§ã¯ãããŸããã
ç§ã®äžæºã«å¯Ÿããåè«ã¯ã defer
ãšgo
ãpanic
ã«ã§ããããšã¯ããããå¶ç¶ã§ãããããŸã圹ã«ç«ããªããšããããšã§ãã ãã ããç§ã®ãã€ã³ãã¯ãgoã®é¢æ°ã®ã»ãã³ãã£ãã¯ã³ããŒã¬ã³ã¹ããã®ææ¡ã«ãã£ãŠç ŽãããŠãããšããããšã§ãã defer
ãšgo
ãåžžã«äœ¿çšããããšãéèŠã§ãããšããããšã§ã¯ãããŸããã defer
ãŸãã¯go
ãäžç·ã«äœ¿çšããŠãæå³ããªããçµã¿èŸŒã¿ã§ãªãé¢æ°ã¯ãããããããããããŸãããæå³çã«ã¯ã䜿çšã§ããªãæ確ãªçç±ã¯ãããŸããã ãªããã®ãã«ãã€ã³ã¯ãgoã®æ©èœã®ã»ãã³ãã£ãã¯ã³ã³ãã©ã¯ãããããèªäœãå
é€ããã®ã§ããïŒ
@griesemerã¯ããã®ææ¡ã«ã€ããŠã®å¯©çŸçãªæèŠãè°è«ã«æ³šå ¥ãããããšãæãã§ããªãããšã¯ç¥ã£ãŠããŸããã人ã ããã®ææ¡ã審çŸçã«åæããŠãããšæããŠããçç±ã®1ã€ã¯ããããæ©èœãšããŠå®å šã«è¶³ãåããªããšæããããšãã§ããããã ãšæããŸãã
ææ¡ã¯èšãïŒ
眲åä»ãã®tryïŒæ¬äŒŒã³ãŒãïŒãšåŒã°ããçµã¿èŸŒã¿ã®ãããªæ°ããé¢æ°ãè¿œå ããããšãææ¡ããŸã
func try(expr) (T1, T2, ⊠Tn)
ãããæ©èœã§ã¯ãªãããšãé€ããŠïŒææ¡ã¯åºæ¬çã«èªããŠããŸãïŒã ããã¯ãäºå®äžãèšèªä»æ§ã«çµã¿èŸŒãŸããŠãã1åéãã®ãã¯ãã§ãïŒåãå ¥ããããå ŽåïŒã ãã®çœ²åã«ã¯ããã€ãã®åé¡ããããŸãã
åŒã³åºãããåŒã¯èšããŸã§ããªããé¢æ°ãåŒæ°ãšããŠäžè¬çãªåŒãåãå
¥ãããšã¯ã©ãããæå³ã§ããã ä»æ§ã§ãåŒããšããèšèã䜿çšããããã³ã«ãããã¯åŒã³åºãããŠããªãé¢æ°ã®ãããªãã®ãæå³ããŸãã ä»ã®ãã¹ãŠã®ã³ã³ããã¹ãã§ãã®æ»ãå€ãæå³çã«ã¢ã¯ãã£ããªãã®ã§ããå ŽåããåŒã³åºããããé¢æ°ãåŒãšèŠãªãããšãã§ããã®ã¯ã©ãããŠã§ããã IEã¯ãåŒã³åºãããé¢æ°ããã®æ»ãå€ãšèŠãªããŸãã èšããŸã§ããªããäŸå€ã¯go
ãšdefer
ã§ãã©ã¡ããçµã¿èŸŒã¿é¢æ°ã§ã¯ãªãçã®ããŒã¯ã³ã§ãã
ãŸãããã®ææ¡ã§ã¯ãç¬èªã®é¢æ°ã·ã°ããã£ãæ£ãããªãããå°ãªããšãæå³ããããŸãããå®éã®ã·ã°ããã£ã¯æ¬¡ã®ãšããã§ãã
func try(R1, R2, ... Rn) ((R|T)1, (R|T)2, ... (R|T)(n-1), ?Rn)
// where T is the return params of the function that try is being called from
// where `R` is a return value from a function, `Rn` must be an error
// try will return the R values if Rn is nil and not return Tn at all
// if Rn is not nil then the T values will be returned as well as Rn at the end
try
ãåŒæ°ãæå®ããŠåŒã³åºãããå Žåã¯ã©ããªããŸããïŒtry(arg1, arg2,..., err)
ããã察åŠãããŠããªãçç±ã¯ã try
ãexpr
åŒæ°ãåãå
¥ããããšããŠããããã ãšæããŸããããã¯ãå®éã«ã¯é¢æ°ããã®nåã®æ»ãåŒæ°ãšä»ã®äœããè¡šããŸãããã®ææ¡ã¯ãé¢æ°ãäœã§ããããšããæå³è«çäžè²«æ§ãç Žãããšã
ãã®ææ¡ã«å¯Ÿããç§ã®æåŸã®äžæºã¯ãçµã¿èŸŒã¿é¢æ°ã®ã»ãã³ãã£ãã¯ãªæå³ãããã«å£ãããšã§ãã çµã¿èŸŒã¿é¢æ°ããéåžžã®ãé¢æ°ã®ã»ãã³ãã£ãã¯ã«ãŒã«ããå é€ãããå¿ èŠãããå Žåããããšããèãã«ç§ã¯ç¡é¢å¿ã§ã¯ãããŸãããïŒå€æ°ã«å²ãåœãŠãããšãã§ããªããªã©ïŒããã®ææ¡ã¯ã golangå ã®é¢æ°ã管çããŠããããã«èŠãããéåžžã®ãã«ãŒã«ã
ãã®ææ¡ã¯ã try
ãå¹æçã«æ°ãããã®ã«ããŸããããã¯ãããŒã¯ã³ã§ã¯ãªããæ©èœã§ããããŸãããäž¡æ¹ãšããã»ãã³ãã£ãã¯ã³ããŒã¬ã³ã¹ãäœæãããšããç¹ã§èšå®ããåäŸãšããŠã¯äžååãªããã§ããèšèªã
æ°ããå¶åŸ¡ãããŒã®ãã®ãè¿œå ããå Žåã¯ã goto
ãªã©ã®çã®ããŒã¯ã³ã«ããæ¹ãçã«ããªã£ãŠãããšæããŸãã ãã®è°è«ã§ææ¡ãè¡ãããšã«ãªã£ãŠããªãããšã¯ç¥ã£ãŠããŸãããç°¡åãªäŸãšããŠããã®ãããªãã®ã®æ¹ãã¯ããã«çã«ããªã£ãŠãããšæããŸãã
f, err := os.Open("/dev/stdout")
throw err
ããã«ããã³ãŒããè¿œå ãããŸãããç§ãæèµ·ãããã¹ãŠã®åé¡ã«å¯ŸåŠãã try
ã«ããã代æ¿ãé¢æ°ã·ã°ããã£ã®æ¬ é¥å
šäœãæé€ã§ãããšæããŸãã
edit1 ïŒçµæãç¡èŠãããããããã«ãã€ã³ã䜿çšã§ããªãdefer
ããã³go
ã®å Žåã®äŸå€ã«ã€ããŠæ³šæããŠãã ãããäžæ¹ã try
ã§ã¯ãå®éã«ã¯äœ¿çšã§ããŸãããé¢æ°ã«ã¯çµæããããšèšã£ãã
@nathanjsweetããªããæ±ããææ¡ã¯ïŒ32611ã§ã:-)
@nathanjsweetããªãã®èšãããšã®ããã€ãã¯ããã§ã¯ãªãããšãå€æããŸããã ãã®èšèªã§ã¯ãäºåã«å®£èšãããé¢æ°append cap complex imag len make new real
ã§defer
ãŸãã¯go
ã䜿çšããããšã¯èš±å¯ãããŠããŸããã ãŸããä»æ§ã§å®çŸ©ãããé¢æ°unsafe.Alignof unsafe.Offsetof unsafe.Sizeof
ã§defer
ãŸãã¯go
ãèš±å¯ããŸããã
åºç¯ãªã³ã¡ã³ããããããšã@ nathanjsweet- @ ianlancetaylorã¯ãããªãã®è°è«ãæè¡çã«ééã£ãŠããããšããã§ã«ææããŠããŸãã å°ãæ¡åŒµãããŠãã ããïŒ
1ïŒ try
ãæåã®çµã¿èŸŒã¿ã§ããããã try
ãšgo
ããã³defer
ãèš±å¯ããªãä»æ§ã®éšåãæãåé¡ã«ãªããšãã£ããããŸããããããçå®ã§ãããšããã ããã¯æ£ãããããŸããã ã³ã³ãã€ã©ã¯ãããšãã°defer append(a, 1)
ããã§ã«èš±å¯ããŠããŸããã åãããšããçµæãçæããŠåºã«ããããããä»ã®ãã«ãã€ã³ã«ãåœãŠã¯ãŸããŸãã ãã®éåžžã«å¶éã¯ããã®ããšã«ã€ããŠtry
ã«ãé©çšãããŸãïŒ try
ãçµæãè¿ããªãå Žåãé€ãïŒã ïŒèšèšããã¥ã¡ã³ãã§ãããã®å¶éã«ã€ããŠèšåããçç±ã¯ãå¯èœãªéã培åºããããã§ããå®éã«ã¯ãŸã£ããé¢ä¿ãããŸããããŸããèšèšããã¥ã¡ã³ããæ£ç¢ºã«èªãã å Žåã try
ãäœæã§ããªããšã¯èšããŸããã go
ãŸãã¯defer
ã§åäœããŸã-ããã¯åã«ãããèš±å¯ããªãããšã瀺åããŠããŸã;äž»ã«å®çšçãªæ段ãšããŠãããã¯ã倧ããªè³ªåãã§ã-ããªãã®èšèã䜿ã- try
ãäœãgo
ããã³defer
ã§æ©èœããŸããïŒ
2ïŒ try
ãæè¡çã«æ©èœã§ã¯ãªãããã«ãçŸçã«åæçãã§ãããšæãã人ãããããšã瀺åãã眲åã®ç¹å¥ãªã«ãŒã«ã«éäžããŸãã new
ã make
ã append
ã unsafe.Offsetof
ãèããŠã¿ãŸãããããããã¯ãã¹ãŠãéåžžã®Goé¢æ°ã§ã¯è¡šçŸã§ããªãç¹æ®ãªã«ãŒã«ãæã£ãŠããŸãã try
ïŒã¿ã€ãã®åäžã®å€ã§ããå¿
èŠããããŸãïŒã®åŒæ°ã«å¿
èŠãªåŒæ°ïŒæ§é äœãã£ãŒã«ãã§ããå¿
èŠããããŸãïŒïŒã®æ§æèŠä»¶ã®çš®é¡ãæ£ç¢ºã«æã£ãŠããunsafe.Offsetof
ãèŠãŠãã ããã error
ãŸãã¯æåŸã®çµæãšããŠerror
ãè¿ãé¢æ°åŒã³åºãïŒã ãããã®çœ²åã¯ãæ¢åã®åœ¢åŒã«é©åããªããããä»æ§ã§ã¯æ£åŒã«è¡šçŸãããŠããŸãããçµã¿èŸŒã¿ã®å Žåãçµã¿èŸŒã¿ã§ããå¿
èŠã¯ãããŸããã 代ããã«ãç§ãã¡ã¯åœŒãã®ã«ãŒã«ãæ£æã§è¡šçŸããŸãã ããããèšèšäžãåæ¥ããGoã®ãšã¹ã±ãŒããããã§ãããã«ãã€ã³ã§ããçç±ã§ãã ãŸããèšèšããã¥ã¡ã³ãã¯ããã«ã€ããŠéåžžã«æ確ã§ããããšã«æ³šæããŠãã ããã
3ïŒãã®ææ¡ã¯ã try
ãåŒæ°ïŒè€æ°ïŒã§åŒã³åºããããšãã«äœãèµ·ãããã«ã€ããŠãåãäžããŠããŸããããã¯èš±å¯ãããŠããŸããã èšèšããã¥ã¡ã³ãã«ã¯ã try
ãïŒ1ã€ã®ïŒå
¥ååŒæ°åŒãåãå
¥ãããšæ瀺çã«èšèŒãããŠããŸãã
4ïŒããªãã¯ããã®ææ¡ã¯çµã¿èŸŒã¿é¢æ°ã®æå³è«çæå³ãå£ãããšè¿°ã¹ãŠããŸãã Goã¯ããã«ãã€ã³ãå®è¡ã§ããããšãšå®è¡ã§ããªãããšãå¶éããŸããã ããã«ã¯å®å šãªèªç±ããããŸãã
ããããšãã
@griesemer
ãŸããèšèšããã¥ã¡ã³ãã¯ããã«ã€ããŠéåžžã«æ確ã§ããããšã«æ³šæããŠãã ããã
ãããææããŠããã ããŸããã ãããèªãã§ã³ã£ããããŸããã
ããªãã¯ããã®ææ¡ã¯çµã¿èŸŒã¿é¢æ°ã®æå³è«çæå³ãå£ãããšè¿°ã¹ãŠããŸãã Goã¯ããã«ãã€ã³ãå®è¡ã§ããããšãšå®è¡ã§ããªãããšãå¶éããŸããã ããã«ã¯å®å šãªèªç±ããããŸãã
ããã¯ãã§ã¢ãã€ã³ãã ãšæããŸãã ãã ããèšèšããã¥ã¡ã³ãã«è©³ãã説æãããŠãããã®ãšããgoãã®ããã«æãããã®ïŒRob Pikeããã話ããŠããããšïŒããããšæããŸãã try
ã®ææ¡ã¯ãçµã¿èŸŒã¿é¢æ°ãé¢æ°ã®åäœãæåŸ
ããã«ãŒã«ãç Žãæ¹æ³ãæ¡åŒµãããšèšã£ãŠãéèšã§ã¯ãªããšæããŸããä»ã®çµã¿èŸŒã¿é¢æ°ã§ãããå¿
èŠãªçç±ãç解ããŠããããšãèªèããŸããã ããããããã®å Žåãã«ãŒã«éåã®æ¡å€§ã¯æ¬¡ã®ããã«ãªããŸãã
panic
ãos.Exit
ã®ããã«ïŒunsafe.Offsetof
ã®äŸãæããŸãããïŒãããã³ã³ãã€ã«æãšã©ãŒãåŒãèµ·ããããšã¯å®éã«ã¯é©ãã¹ãããšã§ãããããã¯å¥ã®åé¡ã§ãïŒãæ§æèŠä»¶ããã®å Žåãããªããè¿°ã¹ããã®ãšã¯ç°ãªãæ§æèŠä»¶ã§ãã unsafe.Offsetof
ã«ã¯1ã€ã®åŒæ°ãå¿
èŠã§ããã try
ã«ã¯ãä»ã®ãã¹ãŠã®ã³ã³ããã¹ãã§ãé¢æ°ããè¿ãããå€ïŒã€ãŸãã try(os.Open("/dev/stdout"))
ïŒã®ããã«èŠããå®å
šã«æ³å®ã§ããåŒãå¿
èŠã§ããä»ã®ãã¹ãŠã®ã³ã³ããã¹ãã§ã¯ã1ã€ã®å€ã®ã¿ãè¿ããŸãïŒåŒãtry(os.Open("/dev/stdout")...)
ã®ããã«èŠããå Žåãé€ãïŒã@nathanjsweetã¯æžããïŒ
ãŸããèšèšããã¥ã¡ã³ãã¯ããã«ã€ããŠéåžžã«æ確ã§ããããšã«æ³šæããŠãã ããã
ãããææããŠããã ããŸããã ãããèªãã§ã³ã£ããããŸããã
ããã¯ãææ¡ã®ãçµè«ãã»ã¯ã·ã§ã³ã«ãããŸãã
Goã§ã¯ããã«ãã€ã³ã¯ãäœããã®åœ¢ã§äžèŠåã§ããããç¹å¥ãªæ§æãæ£åœåããªãæäœã«æé©ãªèšèªãšã¹ã±ãŒãã¡ã«ããºã ã§ãã
ç§ã¯ããªãããããéããããšã«é©ããŠããŸã;-)
@ngrillyç§ã¯ãã®ææ¡ã§ã¯æå³ããŸãããç§ã¯goèšèªä»æ§ã§æå³ããŸãã @griesemerã¯ãgoèšèªä»æ§ãçµã¿èŸŒã¿é¢æ°ãåŒã³åºããŠãæ§æèŠåãç Žãã®ã«ç¹ã«äŸ¿å©ãªã¡ã«ããºã ã§ãããšèšã£ãŠãããããªå°è±¡ãåããŸããã
@nathanjsweet
ããã€ãã®ç¹ã§çŽæã«åããŸãã ããã¯ãã¹ã¿ãã¯ãå·»ãæ»ããªãæ¹æ³ã§å¶åŸ¡ãããŒããžãã¯ãå€æŽããæåã®é¢æ°ã§ãïŒãããã¯ãos.Exitã®ããã«ïŒ
os.Exit
ãæçšãªæå³ã§ã¹ã¿ãã¯ãå·»ãæ»ããšã¯æããŸããã é
延é¢æ°ãå®è¡ããã«ãããã°ã©ã ããã ã¡ã«çµäºããŸãã panic
ãštry
ã®äž¡æ¹ãé
延é¢æ°ãå®è¡ããã¹ã¿ãã¯ãäžã«ç§»åããããã os.Exit
ã¯ããã§ã¯å¥åŠãªãã®ã®ããã§ãã
os.Exit
ãå¥åŠãªãã®ã§ããããšã«åæããŸãããããããªããã°ãªããŸããã os.Exit
ã¯ãã¹ãŠã®ãŽã«ãŒãã³ãåæ¢ããŸãã os.Exit
ãåŒã³åºããŽã«ãŒãã³ã ãã®é
延é¢æ°ãå®è¡ããã ãã§ã¯æå³ããããŸããã ãã¹ãŠã®é
延é¢æ°ãå®è¡ããããå®è¡ããªãå¿
èŠããããŸãã ãããŠãäœãå®è¡ããªãæ¹ãã¯ããã«ç°¡åã§ãã
ã³ãŒãããŒã¹ã§tryhard
ãå®è¡ãããšã次ã®ããã«ãªããŸãã
--- stats ---
15298 (100.0% of 15298) func declarations
3026 ( 19.8% of 15298) func declarations returning an error
33941 (100.0% of 33941) statements
7765 ( 22.9% of 33941) if statements
3747 ( 48.3% of 7765) if <err> != nil statements
131 ( 3.5% of 3747) <err> name is different from "err"
1847 ( 49.3% of 3747) return ..., <err> blocks in if <err> != nil statements
1900 ( 50.7% of 3747) complex error handler in if <err> != nil statements; cannot use try
19 ( 0.5% of 3747) non-empty else blocks in if <err> != nil statements; cannot use try
1789 ( 47.7% of 3747) try candidates
ãŸããGoïŒ1.13ããåïŒã«ã¯ãšã©ãŒã®ã³ã³ããã¹ãããªãããã error
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããç¬èªã®ãšã©ãŒåãå®è£
ããäžéšã®é¢æ°ã¯$ã§ã¯ãªãerror
foo.Error
ãè¿ãããã«å®£èšãããŠããããšãæ確ã«ããŸãã error
ããããŠãã®ã¢ãã©ã€ã¶ãŒã¯ããããã£ããããªãã£ãããã«èŠããã®ã§ããããã®çµæã¯ãå
¬å¹³ãã§ã¯ãããŸããã
ç§ã¯ãã¯ãïŒãããããããã®é£å¶ã«ããŸããã1.13ãŸãã¯1.14ããŒã¿çã®èå³æ·±ãå®éšã«ãªããšæããŸããã_ã 47.7ïŒ
...åè£è
ãè©ŠããŠãã ããã_ãå¿é
ã§ãã ããã¯ãç§ã奜ãã§ã¯ãªãããšãè¡ã2ã€ã®æ¹æ³ãããããšãæå³ããŸãã ãã ãããã€ã³ã¿ãäœæãã2ã€ã®æ¹æ³ïŒ new(Foo)
ãš&Foo{}
ïŒãããã³make([]Foo)
ãš[]Foo{}
ã䜿çšããŠã¹ã©ã€ã¹ãŸãã¯ããããäœæãã2ã€ã®æ¹æ³ããããŸãã ã
ä»ãç§ã¯ãããã_è©ŠããŠã¿ãããã®ãã£ã³ãã«ããŸãïŒ^ïŒãããŠã³ãã¥ããã£ãã©ãæããèŠãŠã¿ãŸãããã ãããããã³ãŒãã£ã³ã°ãã¿ãŒã³ãæ æ°ã«å€æŽããŠã³ã³ããã¹ãã®è¿œå ãåæ¢ããŸããããšã«ããæ¥ãxerrors
implãããšã©ãŒãããè¯ãã³ã³ããã¹ããååŸããå Žåã¯ãããã§åé¡ãããŸããã
ããå ·äœçãªããŒã¿ãæäŸããŠããã@Goodwineã«æè¬ããŸãïŒ
ïŒäœè«ã§ãããæšå€tryhard
ã«å°ããªå€æŽãå ããã®ã§ããè€éãªãšã©ãŒãã³ãã©ãŒãã®ã«ãŠã³ãã2ã€ã®ã«ãŠã³ãã«åå²ãããŸããè€éãªãã³ãã©ãŒãšreturn ..., expr
ã®åœ¢åŒã®æ»ãå€ã§ããçµæã®å€ã¯<err>
ã§ã¯ãããŸãããããã«ãããè¿œå ã®æŽå¯ãåŸãããã¯ãã§ããïŒ
ãã®å¥åŠãªè¡šçŸã®è°è«ã®ä»£ããã«å¯å€ååŒæ°ã«ãªãããã«ææ¡ãä¿®æ£ããã®ã¯ã©ãã§ããïŒ
ããã¯å€ãã®åé¡ã解決ããã§ãããã 人ã
ããšã©ãŒãè¿ãããã ãã®å Žåãå€æŽãããã®ã¯æ瀺çãªå¯å€ååŒæ°...
ã ãã§ãã äŸãã°ïŒ
try(os.Open("/dev/stdout")...)
ãã ããããæè»ãªç¶æ³ãå¿ èŠãªå Žåã¯ã次ã®ãããªããšãã§ããŸãã
f, err := os.Open("/dev/stdout")
try(WrapErrorf(err, "whatever wrap does: %v"))
ãã®ã¢ã€ãã¢ãè¡ãããšã®1ã€ã¯ã try
ãšããåèªã®é©åæ§ãäœãããããšã§ãããäžäœäºææ§ã¯ç¶æãããŸãã
@nathanjsweetã¯æžããïŒ
ç§ã¯ãã®ææ¡ã§ã¯æå³ããŸãããç§ã¯goèšèªä»æ§ã§æå³ããŸãã
èšèªä»æ§ã§æ¢ããŠããæç²ã¯æ¬¡ã®ãšããã§ãã
ãåŒã¹ããŒãã¡ã³ããã»ã¯ã·ã§ã³ïŒ
次ã®çµã¿èŸŒã¿é¢æ°ã¯ãã¹ããŒãã¡ã³ãã³ã³ããã¹ãã§ã¯èš±å¯ãããŠããŸããïŒ
append cap complex imag len make new real unsafe.Alignof unsafe.Offsetof unsafe.Sizeof
ãGoã¹ããŒãã¡ã³ããããã³ãDeferã¹ããŒãã¡ã³ããã»ã¯ã·ã§ã³ïŒ
çµã¿èŸŒã¿é¢æ°ã®åŒã³åºãã¯ãåŒã¹ããŒãã¡ã³ãã«é¢ããŠå¶éãããŠããŸãã
ãçµã¿èŸŒã¿é¢æ°ãã»ã¯ã·ã§ã³ïŒ
çµã¿èŸŒã¿é¢æ°ã«ã¯æšæºã®Goã¿ã€ãããªããããåŒã³åºãåŒã«ã®ã¿è¡šç€ºã§ããŸãã é¢æ°å€ãšããŠäœ¿çšããããšã¯ã§ããŸããã
@nathanjsweetã¯æžããïŒ
@griesemerã¯ãgoèšèªä»æ§ãçµã¿èŸŒã¿é¢æ°ãåŒã³åºããŠãæ§æèŠåãç Žãã®ã«ç¹ã«äŸ¿å©ãªã¡ã«ããºã ã§ãããšèšã£ãŠãããããªå°è±¡ãåããŸããã
çµã¿èŸŒã¿é¢æ°ã¯ãGoã®æ§æèŠåïŒæ¬åŒ§ãåŒæ°éã®ã³ã³ããªã©ïŒã«éåããŸããã ãããã¯ãŠãŒã¶ãŒå®çŸ©é¢æ°ãšåãæ§æã䜿çšããŸããããŠãŒã¶ãŒå®çŸ©é¢æ°ã§ã¯å®è¡ã§ããªãããšãèš±å¯ããŸãã
@nathanjsweetããã¯ãã§ã«èæ
®ãããŠããŸãããïŒå®éã«ã¯èŠèœãšãã§ããïŒã try
ãæ¡åŒµã§ããªããªããŸãã https://go-review.googlesource.com/c/proposal/+/181878ãåç
§ããŠãã ããã
ããäžè¬çã«ã¯ãããªãã¯ééã£ãããšã«æ¹å€ãéäžããŠãããšæããŸãã try
åŒæ°ã®ç¹å¥ãªã«ãŒã«ã¯å®éã«ã¯åé¡ã§ã¯ãããŸãããäºå®äžããã¹ãŠã®ãã«ãã€ã³ã«ã¯ç¹å¥ãªã«ãŒã«ããããŸãã
@griesemerã¯ããã«åãçµã¿ãã³ãã¥ããã£ã®æžå¿µã«å¯Ÿå¿ããããã«æéãå²ããŠãããŠããããšãã ãã®æç¹ã§ãããªãã¯åã質åã®å€ãã«çãããšç¢ºä¿¡ããŠããŸãã ãããã®åé¡ã解決ããåæã«äžäœäºææ§ãç¶æããããšã¯éåžžã«é£ããããšãèªèããŠããŸãã ããããšãïŒ
@nathanjsweetããã§ã®ã³ã¡ã³ãã«ã€ããŠïŒ
Goã§ã®çµã¿èŸŒã¿ã®åœ¹å²ã«ã€ããŠç®ç«ã€ããã«èª¬æããŠããçµè«ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ãã«ãã€ã³ãããŸããŸãªæ¹æ³ã§æ¡åŒµããtry
ã«é¢ããã³ã¡ã³ãã«ã€ããŠïŒã¯ãã unsafe.Offsetof
ãåŒæ°ãæå®ããèŠä»¶ã¯ã$ïŒ$ try
$ã®èŠä»¶ãšã¯ç°ãªããŸãã ããããã©ã¡ããæ§æçã«åŒãæåŸ
ããŠããŸãã ã©ã¡ããããã®åŒã«ããã€ãã®è¿œå ã®å¶éããããŸãã try
ã®èŠä»¶ã¯ãGoã®æ§æã«éåžžã«ç°¡åã«é©åããŠãããããããã³ããšã³ãã®è§£æããŒã«ã調æŽããå¿
èŠã¯ãããŸããã ç§ã¯ããªãã«ãšã£ãŠçãããšæããŠããããšãç解ããŠããŸãããããã¯ããã«å¯Ÿããæè¡çãªçç±ãšåãã§ã¯ãããŸããã
@griesemerã®ææ°ã®_tryhard_ã¯ããè€éãªãšã©ãŒãã³ãã©ãŒããã«ãŠã³ãããŸããããåäžã¹ããŒãã¡ã³ãã®ãšã©ãŒãã³ãã©ãŒãã¯ã«ãŠã³ãããŸããã ãããè¿œå ã§ããŸããïŒ
@networkimprovã·ã³ã°ã«ã¹ããŒãã¡ã³ããšã©ãŒãã³ãã©ãšã¯äœã§ããïŒ åäžã®éæ»ãã¹ããŒãã¡ã³ããå«ãif
ãããã¯ïŒ
@griesemer ãåäžã¹ããŒãã¡ã³ãã®ãšã©ãŒãã³ãã©ãŒã¯ãæ»ãå€ãå«ã_any_åäžã¹ããŒãã¡ã³ããå«ãif err != nil
ãããã¯ã§ãã
@networkimprovå®äºã ãè€éãªãã³ãã©ãŒãã¯ããåäžã®ã¹ããŒãã¡ã³ãã次ã«åå²ããšãè€éãªæ¬¡ã«åå²ãã«åå²ãããããã«ãªããŸããã
ãã ãããããã®ã«ãŠã³ãã¯èª€è§£ãæãå¯èœæ§ãããããšã«æ³šæããŠãã ãããããšãã°ããããã®ã«ãŠã³ãã«ã¯ãå€æ°ãnilã«å¯ŸããŠãã§ãã¯ããif
ã¹ããŒãã¡ã³ããå«ãŸããŸãïŒ -err=""
ãtryhard
ã®ããã©ã«ãã«ãªã£ãŠããå ŽåïŒ tryhard
ã¯ãè€éãªãŸãã¯åäžã¹ããŒãã¡ã³ãã®ãã³ãã©ãŒã®æ©äŒã®æ°ã倧å¹
ã«é倧è©äŸ¡ããŠããŸãã äŸã«ã€ããŠã¯ã archive/tar/common.go
ãè¡701ãåç
§ããŠãã ããã
@networkimprov tryhard
ã¯ããšã©ãŒãã§ãã¯ãtry
åè£ã§ã¯ãªãçç±ãããæ£ç¢ºã«ã«ãŠã³ãããããã«ãªããŸããã try
ã«ãŠã³ãã®ç·æ°ã¯å€æŽãããŠããŸããããããå€ãã®åäžããã³è€éãªãã³ãã©ãŒã®æ©äŒã®æ°ãããæ£ç¢ºã«ãªããŸããïŒè€éãªthen
ã®åã§ããããã以åãããçŽ50ïŒ
å°ãªããªããŸããif
ã¹ããŒãã¡ã³ãã®ãã©ã³ãã¯ããšã©ãŒãã§ãã¯ãå«ãŸããŠãããã©ããã«é¢ä¿ãªãã if
ã«<varname> != nil
ãã§ãã¯ãå«ãŸããŠããéãèæ
®ãããŸããã
誰ããããå°ãå®éã«try
ãè©ŠããŠã¿ããå Žåã¯ããããã¿ã€ãã®å®è£
ã䜿çšããŠãããã«WASMãã¬ã€ã°ã©ãŠã³ããäœæããŸããã
https://ccbrown.github.io/wasm-go-playground/experimental/try-builtin/
ãããŠã誰ããå®éã«tryã䜿çšããŠããŒã«ã«ã§ã³ãŒããã³ã³ãã€ã«ããããšã«èå³ãããå Žåã¯ãå®å šã«æ©èœãã/ææ°ã®å®è£ ã§ãããšç§ãä¿¡ããŠãããã®ãåããGoãã©ãŒã¯ããããŸãïŒ https ïŒ//github.com/ccbrown/go/pull/1
ç§ã¯ããã£ãŠã¿ããã奜ãã§ãã errã®ããŒã«ã«ç¶æ ã管çããé¢é£ããã€ã³ããŒããšãšãã«ïŒ= vs = errã䜿çšãããšãéåžžã®æ³šææ£æŒ«ã«ãªãããšãããããŸãã ãŸããããã¯åãããšãè¡ã2ã€ã®æ¹æ³ãäœæããŠãããšã¯èããŠããŸãããããšãã°ã2ã€ã®ã±ãŒã¹ã®ããã«ããšã©ãŒãå®è¡ããã«ãšã©ãŒãæž¡ãããå ŽåãšãåŒã³åºãå ã®é¢æ°ã§ãšã©ãŒãæ瀺çã«åŠçãããå Žåã§ããäŸãã°ã ãã®ã³ã°ã
1幎以äžåã«åãçµãã å°ããªå
éšãããžã§ã¯ãã«å¯ŸããŠtryhard
ãå®è¡ããŸããã åé¡ã®ãã£ã¬ã¯ããªã«ã¯ã3å°ã®ãµãŒããŒïŒããã€ã¯ããµãŒãã¹ããããããïŒã®ã³ãŒããcronãžã§ããšããŠå®æçã«å®è¡ãããã¯ããŒã©ãŒãããã³ããã€ãã®ã³ãã³ãã©ã€ã³ããŒã«ãå«ãŸããŠããŸãã ãŸããããªãå
æ¬çãªåäœãã¹ãããããŸãã ïŒFWIWãããŸããŸãªéšåã1幎以äžã¹ã ãŒãºã«å®è¡ãããŠãããçºçããåé¡ããããã°ããŠè§£æ±ºããã®ã¯ç°¡åã§ããããšã蚌æãããŠããŸãïŒ
çµ±èšã¯æ¬¡ã®ãšããã§ãã
--- stats ---
370 (100.0% of 370) func declarations
115 ( 31.1% of 370) func declarations returning an error
1159 (100.0% of 1159) statements
258 ( 22.3% of 1159) if statements
123 ( 47.7% of 258) if <err> != nil statements
64 ( 52.0% of 123) try candidates
0 ( 0.0% of 123) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
54 ( 43.9% of 123) { return ... zero values ..., expr }
2 ( 1.6% of 123) single statement then branch
3 ( 2.4% of 123) complex then branch; cannot use try
1 ( 0.8% of 123) non-empty else branch; cannot use try
ããã€ãã®è§£èª¬ïŒ
1ïŒãã®ã³ãŒãããŒã¹ã®ãã¹ãŠã®if
ã¹ããŒãã¡ã³ãã®50ïŒ
ããšã©ãŒãã§ãã¯ãè¡ã£ãŠããã try
ããããã®çŽååã眮ãæããå¯èœæ§ããããŸãã ããã¯ããã®ïŒå°ããªïŒã³ãŒãããŒã¹ã®ãã¹ãŠã®if
ã¹ããŒãã¡ã³ãã®4åã®1ããã¿ã€ãã¢ãŠããããããŒãžã§ã³ã®try
ã§ããããšãæå³ããŸãã
2ïŒããã¯ç§ã«ãšã£ãŠé©ãã»ã©é«ãããšã«æ³šæããå¿
èŠãããstatus.Annotate
ããã®ãããžã§ã¯ããéå§ããæ°é±éåã«ããšã©ãŒã¡ãã»ãŒãžã«æ³šéãä»ããªããã gRPCã¹ããŒã¿ã¹ã³ãŒãã ããšãã°ãRPCãåŒã³åºããŠãé¢é£ããã¹ããŒã¿ã¹ã³ãŒãPERMISSION_DENIEDã§ãšã©ãŒãè¿ãããå Žåããã®ãã«ããŒé¢æ°ããè¿ããããšã©ãŒã«ã¯ãé¢é£ããã¹ããŒã¿ã¹ã³ãŒãPERMISSION_DENIEDãå«ãŸããŸãïŒçè«çã«ã¯ãé¢é£ããã¹ããŒã¿ã¹ã³ãŒãããã¹ãŠã®RPCãã³ãã©ãŒã«å°éãããšãRPCã¯é¢é£ããã¹ããŒã¿ã¹ã³ãŒãã§å€±æããŸãïŒã ç§ã¯ããã®æ°ãããããžã§ã¯ãã®ãã¹ãŠã«ãããã®é¢æ°ã䜿çšããããšã決å¿ããŸããã ããããæããã«ããã¹ãŠã®ãšã©ãŒã®50ïŒ
ã«ã€ããŠã泚éãªãã§ãšã©ãŒãäŒæããã ãã§ãã ïŒ tryhard
ãå®è¡ããåã«ãç§ã¯10ïŒ
ãäºæž¬ããŠããŸããïŒã
3ïŒ status.Annotate
ã¯ããŸããŸnil
ãšã©ãŒãä¿æããŸãïŒã€ãŸãstatus.Annotatef(err, "some message: %v", x)
ã¯err == nil
$ã®å Žåã$ nil
$ãè¿ããŸãïŒã ç§ã¯æåã®ã«ããŽãªãŒã®ãã¹ãŠã®éè©Šè¡åè£ã調ã¹ãŸãããããã¹ãŠã次ã®æžãçŽãã«é©ããŠããããã§ãã
```
// Before
enc, err := keymaster.NewEncrypter(encKeyring)
if err != nil {
return status.Annotate(err, "failed to create encrypter")
}
// After
enc, err := keymaster.NewEncrypter(encKeyring)
try(status.Annotate(err, "failed to create encrypter"))
```
To be clear, I'm not saying this transformation is always necessarily a good idea, but it seemed worth mentioning since it boosts the count significantly to a bit under half of all `if` statements.
4ïŒ defer
ããŒã¹ã®ãšã©ãŒæ³šéã¯ã try
ã®æç¡ã«ãããããæ©èœãããããæ£çŽãªãšããã try
ã«ããããçŽäº€ããŠããããã«èŠããŸãã ãããããã®ãããžã§ã¯ãã®ã³ãŒãã調ã¹ãŠãããšããšã©ãŒåŠçã詳ãã調ã¹ãŠããã®ã§ãåŒã³åºãå
ãçæãããšã©ãŒã®æ¹ãçã«ããªã£ãŠããããã€ãã®äŸã«æ°ã¥ããŸããã äžäŸãšããŠãç§ã¯æ¬¡ã®ãããªgRPCã¯ã©ã€ã¢ã³ããåŒã³åºãã³ãŒãã®ããã€ãã®ã€ã³ã¹ã¿ã³ã¹ã«æ°ã¥ããŸããã
```
resp, err := s.someClient.SomeMethod(ctx, req)
if err != nil {
return ..., status.Annotate(err, "failed to call SomeMethod")
}
```
This is actually a bit redundant in retrospect, since gRPC already prefixes its errors with something like "/Service.Method to [ip]:port : ".
There was also code that called standard library functions using the same pattern:
```
hreq, err := http.NewRequest("GET", targetURL, nil)
if err != nil {
return status.Annotate(err, "http.NewRequest failed")
}
```
In retrospect, this code demonstrates two issues: first, `http.NewRequest` isn't calling a gRPC API, so using `status.Annotate` was unnecessary, and second, assuming the standard library also return errors with callee context, this particular use of error annotation was unnecessary (although I am fairly certain the standard library does not consistently follow this pattern).
ãããã«ããããã®ãããžã§ã¯ãã«æ»ã£ãŠããšã©ãŒã®åŠçæ¹æ³ã泚ææ·±ãèŠãã®ã¯èå³æ·±ãæŒç¿ã ãšæããŸããã
1ã€ã @ griesemer ïŒ tryhard
ã«ã¯ããéè©Šè¡åè£ãã®æ£ããåæ¯ããããŸããïŒ
ç·šéïŒä»¥äžã«çããŸãããç§ã¯çµ±èšãèªã¿ééããŸããã
ç·šéïŒãã£ãŒãããã¯ã®æå³ã¯ææ¡ã«å§è²ãããŸããããããã§ã¯è¡ããªãããã«æ瀺çã«æ±ããããŸããã ã³ã¡ã³ããèŠç¹ã«ç§»ããŸããã
@balasanjayäºå®ã«åºã¥ãã³ã¡ã³ããããããšãã ããã¯ãšãŠã圹ã«ç«ã¡ãŸãã
tryhard
ã«é¢ãã質åã«ã€ããŠïŒãè©ŠããŠããªãåè£è
ãïŒã¿ã€ãã«ã®ææ¡ãæè¿ïŒã¯ãåã«if
ã¹ããŒãã¡ã³ããããšã©ãŒãã§ãã¯ãã®ãã¹ãŠã®åºæºãæºãããå Žåã®æ°ã§ãïŒã€ãŸãã ããšã©ãŒå€æ°<err>
ãžã®å²ãåœãŠã®ããã«èŠãããã®åŸã«ãœãŒã¹ã§if <err> != nil
ãã§ãã¯ãç¶ããŸãïŒãã try
ãç°¡åã«äœ¿çšã§ããªãå Žåif
ãããã¯ã®ã³ãŒãã å
·äœçã«ã¯ããéè©Šè¡åè£ãã®åºåã«è¡šç€ºãããé åºã§ããããã¯if
ã¹ããŒãã¡ã³ãã§ãããæåŸã«<err>
以å€ã®ãã®ãè¿ãreturn
ã¹ããŒãã¡ã³ãããããŸãã if
ã¹ããŒãã¡ã³ããš1ã€ã®ããè€éãªreturn
ïŒãŸãã¯ãã®ä»ã®ïŒã¹ããŒãã¡ã³ãã if
ã¹ããŒãã¡ã³ããšè€æ°ã®ã¹ããŒãã¡ã³ãã "then"ãã©ã³ãã«ããã if
ã¹ããŒãã¡ã³ããšç©ºã§ãªãelse
ãã©ã³ãã ãããã®if
ã¹ããŒãã¡ã³ãã®äžã«ã¯ããããã®æ¡ä»¶ã®è€æ°ãåæã«æºããããå Žåãããããããããã®æ°å€ãåèšãããã ãã§ã¯ãããŸããã ãããã¯ã try
ã䜿çšå¯èœã«ãªãããã«äœãæªãã£ãã®ããç¥ãããšãç®çãšããŠããŸãã
ä»æ¥ãããã«ææ°ã®èª¿æŽãå ããŸããïŒææ°ããŒãžã§ã³ãå®è¡ããŸããïŒã æåŸã®å€æŽã®åã¯ããšã©ãŒãã§ãã¯ãå«ãŸããŠããªããŠãã«ãŠã³ãããããããã®æ¡ä»¶ã®äžéšã¯ãå®éã«try
ã§ããã«ããããããã try
ã䜿çšã§ããªãã£ãããã«èŠãããããããŸãæå³ããªãããã«èŠããŸããã try
ã¯ããããããã®ãããªå Žåã«ã¯æå³ããããŸããã§ããã
ãã ããæãéèŠãªã®ã¯ãç¹å®ã®ã³ãŒãããŒã¹ã«ã€ããŠã try
ã«é¢é£ããæ¡ä»¶ãåããŸãŸã§ãã£ãããã try
åè£ã®ç·æ°ããããã®æ¹è¯ã«ãã£ãŠå€æŽãããŠããªãããšã§ãã
ã©ã®ããã«ããããŠ/ãŸãã¯äœã枬å®ãããã«ã€ããŠããè¯ãææ¡ãããã°ãç§ã¯ãããèããŠããããã§ãã ã³ãã¥ããã£ã®ãã£ãŒãããã¯ã«åºã¥ããŠãããã€ãã®èª¿æŽãè¡ããŸããã ããããšãã
@subfuzionã³ã¡ã³ãããããšãããããŸããã代æ¿æ¡ãæ¢ããŠããŸããã https://github.com/golang/go/issues/32437#issuecomment-501878888ãåç §ããŠãã ããã ããããšãã
çµæã«é¢ä¿ãªããã«ãŠã³ããããããã«ïŒ
ç§ã¯ãç§ã®ããŒã ãšãšãã«ãRobã«ãã£ãŠææ¡ãããtry
ãã¬ãŒã ã¯ãŒã¯ã¯åççã§èå³æ·±ãã¢ã€ãã¢ã§ãããçµã¿èŸŒã¿ãšããŠé©åãªã¬ãã«ã«ã¯éããŠããªããšããèŠè§£ãæã£ãŠããŸãã å®éã«äœ¿çšãã¿ãŒã³ã確ç«ããããŸã§ã¯ãæšæºã©ã€ãã©ãªããã±ãŒãžã®æ¹ãã¯ããã«é©åãªã¢ãããŒãã§ãã try
ããã®èšèªã«ãªã£ãããããŸããŸãªå Žæã§äœ¿çšããŸãã
ããäžè¬çãªæ³šæç¹ãšããŠãGoã®éåžžã«å®å®ããã³ã¢èšèªãšéåžžã«è±å¯ãªæšæºã©ã€ãã©ãªã®çµã¿åããã¯ä¿åãã䟡å€ããããŸãã èšèªããŒã ãã³ã¢èšèªã®å€æŽã«ç§»è¡ããã®ãé
ãã»ã©ãè¯ãçµæãåŸãããŸãã x -> stdlib
ãã€ãã©ã€ã³ã¯ããã®çš®ã®ãã®ã«å¯Ÿãã匷åãªã¢ãããŒãã®ãŸãŸã§ãã
@griesemerãããããããªããã çµ±èšãèªã¿ééããŸãããåæ¯ãšããŠãåè£ãè©Šããã«ãŠã³ã¿ãŒïŒ64ïŒã§ã¯ãªããåæ¯ãšããŠãif errïŒ= nilã¹ããŒãã¡ã³ããã«ãŠã³ã¿ãŒïŒ123ïŒã䜿çšããŠããŸãã ç§ã¯ãã®è³ªåãããŸãã
ããããšãïŒ
@mattpalmer䜿çšãã¿ãŒã³ã¯ãçŽ10幎é確ç«ãããŠããŸãã try
ã®èšèšã«çŽæ¥åœ±é¿ãäžããã®ã¯ããããã®æ£ç¢ºãªäœ¿çšãã¿ãŒã³ã§ãã ã©ã®ãããªäœ¿çšãã¿ãŒã³ãåç
§ããŠããŸããïŒ
@griesemerç³ãèš³ãããŸããããããã¯ç§ã®ããã§ãtry
ã«ã€ããŠç§ãæ©ãŸããããšã説æããããšããå§ãŸã£ãã®ã¯ããããè¿œå ããªãããšã«ã€ããŠã®ç§ã®äž»åŒµãæ確ã«ããããã®ç¬èªã®ææ¡ã«ç§»ããŸããã ããã¯æããã«èŠå®ãããåºæ¬ã«ãŒã«ã«åããŠããŸããïŒæ°ããçµã¿èŸŒã¿é¢æ°ã®ãã®ææ¡ãšã¯ç°ãªããæ°ããæŒç®åãå°å
¥ããããšã¯èšããŸã§ããããŸããïŒã ã³ã¡ã³ããåé€ããŠäŒè©±ãåçåããã®ã«åœ¹ç«ã¡ãŸããïŒãŸãã¯ããã¯è²§åŒ±ãªåœ¢åŒãšèŠãªãããŸããïŒïŒ
@subfuzionç§ã¯ããã«ã€ããŠå¿é ããŸããã ããã¯ç©è°ãéžãææ¡ã§ãããå€ãã®ææ¡ããããŸãã å€ãã¯é¢šå€ããã§ã
ãã®èšèšãäœåºŠãç¹°ãè¿ããå€ãã®äººãããã£ãŒãããã¯ãæ±ããŠãããæçš¿ããŠå®éã®å®éšæ®µéã«é²ããããšããå§ãããŸãããããŸã å®éšãè¡ã£ãŠããŸããã å®éšã倱æããå ŽåããŸãã¯ãã£ãŒãããã¯ã«ãã£ãŠå®éšãæããã«å€±æããããšãäºåã«éç¥ãããå Žåã¯ãèšèšå³ã«æ»ãããšã¯çã«ããªã£ãŠããŸãã
@griesemerã¯ãå®éšã®æåãŸãã¯å€±æã確ç«ããããã«ããŒã ã䜿çšããç¹å®ã®ã¡ããªãã¯ã«ã€ããŠè©³ãã説æã§ããŸããïŒ
@ç§ãš
å°ãåã«@rscã«è³ªåããŸããïŒhttps://github.com/golang/go/issues/32437#issuecomment-503245958ïŒïŒ
@rsc
ãã®äŸ¿å©ããé 眮ã§ããå Žæã«äºæ¬ ããŸããã ãã以å€ã®ã¡ã«ããºã ã®å®äœã蚌æããããã«ãã©ã®ãããªæž¬å®åºæºãæ±ããããŠããŸããïŒ åé¡ããããšã©ãŒåŠçã±ãŒã¹ã®ãªã¹ãã¯ãããŸããïŒ å ¬éããã»ã¹ã®å€ããææ ã«ãã£ãŠæšé²ãããŠããå ŽåãããŒã¿ããã©ã®ããã«äŸ¡å€ãå°ãåºãããŸããïŒ
çãã¯æå³ããããã®ã§ããããåºæ¿çã§ãªããå®äœãæ¬ ããŠããŸããïŒhttps://github.com/golang/go/issues/32437#issuecomment-503295558ïŒïŒ
決å®ã¯ããããå®éã®ããã°ã©ã ã§ã©ãã ãããŸãæ©èœãããã«åºã¥ããŠããŸãã ã³ãŒãã®å€§éšåã§è©Šè¡ãå¹æçã§ãªãããšã人ã ã瀺ããå Žåãããã¯éèŠãªããŒã¿ã§ãã ããã»ã¹ã¯ããã®çš®ã®ããŒã¿ã«ãã£ãŠé§åãããŸãã ããã¯ææ ã«ãã£ãŠåããããŸããã
è¿œå ã®ææ ãæäŸãããŸããïŒhttps://github.com/golang/go/issues/32437#issuecomment-503408184ïŒïŒ
try
ãããããŸã§è°è«ãããŠããªãã£ãæ¹æ³ã§ãæããã«åªããã³ãŒãã«ã€ãªããã±ãŒã¹ãèŠã€ããŠé©ããã
æçµçã«ãç§ã¯èªåã®è³ªåãåé¡ããããšã©ãŒåŠçã±ãŒã¹ã®ãªã¹ãã¯ãããŸããïŒãã«çããŸããã äºå®äžããšã©ãŒåŠçã«ã¯6ã€ã®ã¢ãŒãããããŸããæåçŽæ¥ãæåãã¹ã¹ã«ãŒãæåéæ¥ãèªåçŽæ¥ãèªåãã¹ã¹ã«ãŒãèªåéæ¥ã§ãã çŸåšããããã®ã¢ãŒãã®ãã¡2ã€ã®ã¿ã䜿çšããã®ãäžè¬çã§ãã ãã¡ã·ãªããŒã·ã§ã³ã«å€å€§ãªåŽåãè²»ãããŠããéæ¥ã¢ãŒãã¯ãã»ãšãã©ã®ããã©ã³Gopherã«ãšã£ãŠéåžžã«çŠæ¢ãããŠããããã«èŠãããã®æžå¿µã¯ç¡èŠãããŠããããã§ãã ïŒhttps://github.com/golang/go/issues/32437#issuecomment-507332843ïŒã
ããã«ãçµæã®äŸ¡å€ã確èªããããã«ãå€æã®åã«èªåå€æã粟æ»ããããšãææ¡ããŸããïŒhttps://github.com/golang/go/issues/32437#issuecomment-507497656ïŒã ãããããããšã«ãæéã®çµéãšãšãã«ãæäŸãããçµæã®å€ãã¯ããè¯ãå顧ãæã£ãŠããããã«èŠããŸãããããã¯äŸç¶ãšããŠãå·éã§å調çãªæ¹æ³ã§éæ¥çãªæ¹æ³ã®åœ±é¿ã«å¯ŸåŠããŠããŸããã çµå±ã®ãšããïŒç§ã®æèŠã§ã¯ïŒããŠãŒã¶ãŒãæµå¯ŸçãšããŠæ±ãããã¹ãã§ããããã«ãéçºè ã¯æ æ°ãªãã®ãšããŠæ±ãããã¹ãã§ãã
貎éãªåè£è ãèŠéããšããçŸåšã®ã¢ãããŒãã®å€±æãææãããŸããïŒhttps://github.com/golang/go/issues/32437#issuecomment-507505243ïŒã
ãã®ããã»ã¹ãäžè¬çã«æ¬ ããŠããŠãç¹ã«é³ãèãããªãããšã«ã€ããŠéšãããããšã¯äŸ¡å€ããããšæããŸãã
@ iand @ rscã«ãã£ãŠäžããããçãã¯ãŸã æå¹ã§ãã ãã®çãã®ã©ã®éšåããç©è³ªãäžè¶³ããŠãããã®ããããããåºæ¿ãäžãããããã«äœãå¿ èŠãªã®ãã¯ããããŸããã ãããããã£ãšãç©è³ªããè¿œå ããŠã¿ãŸãããã
ææ¡è©äŸ¡ããã»ã¹ã®ç®çã¯ãæçµçã«ãå€æŽã«ãã£ãŠæåŸ ãããå©çãããããããããäºæããªãã³ã¹ããçºçãããããç¹å®ããããšã§ãïŒããã»ã¹ã®ã¹ããã5ïŒã
ã¹ããã1ã«åæ ŒããŸãããGoããŒã ã¯ãåãå ¥ãã䟡å€ããããšæãããç¹å®ã®ææ¡ãéžæããŸããã ãã®ææ¡ã¯ãã®1ã€ã§ãã ããªãäžçæžåœèããŠã䟡å€ããããšèããŠããªãã£ãããç§ãã¡ã¯ãããéžæããªãã£ãã ããã å ·äœçã«ã¯ãGoã³ãŒãã«ã¯ããšã©ãŒåŠçã®ã¿ã«é¢é£ããããªãã®éã®å®åæããããšç¢ºä¿¡ããŠããŸãã ææ¡ã¯ãŸããèæ°å³æªããã®ã§ã¯ãããŸãã-ç§ãã¡ã¯ãããããŸããŸãªåœ¢ã§1幎以äžè°è«ããŠããŸããã
çŸåšãã¹ããã2ã«ãããããæçµæ±ºå®ããã¯ãŸã ããªãé¢ããŠããŸãã ã¹ããã2ã¯ããã£ãŒãããã¯ãæžå¿µäºé
ãåéããããã®ãã®ã§ããããã¯ããããããããã§ãã ãã ããããã§æ確ã«ããããã«ããããŸã§ã®ãšãããèšèšã®_æè¡ç_æ¬ é¥ãææããã³ã¡ã³ãã¯1ã€ãããããŸããã§ãããããããä¿®æ£ããŸããã ãŸããå®éã®ã³ãŒãã«åºã¥ãå
·äœçãªããŒã¿ã«ã€ããŠã¯ã try
ãå®éã«å®åæãæžãããã³ãŒããç°¡çŽ åããããšã瀺ãã³ã¡ã³ããããªããããŸããã ãŸããå®éã®ã³ãŒãã®ããŒã¿ã«åºã¥ããŠã try
ãããŸã圹ã«ç«ããªãããšã瀺ãã³ã¡ã³ããããã€ããããŸããã å®éã®ããŒã¿ã«åºã¥ããããŸãã¯æè¡çãªæ¬ é¥ãææãããã®ãããªå
·äœçãªãã£ãŒãããã¯ã¯ãå®çšçã§éåžžã«åœ¹ç«ã¡ãŸãã ããã絶察ã«èæ
®ããŸãã
ãããŠãæ¬è³ªçã«å人çãªææ ã§ããèšå€§ãªéã®ã³ã¡ã³ãããããŸããã ããã¯ããŸãå®çšçã§ã¯ãããŸããã ããã¯ãç§ãã¡ããããç¡èŠããŠãããšããããšã§ã¯ãããŸããã ããããç§ãã¡ãããã»ã¹ã«åºå·ããŠãããããšãã£ãŠãç§ãã¡ããè³ãèãããªãããšããæå³ã§ã¯ãããŸããã
ãããã®ã³ã¡ã³ãã«é¢ããŠïŒãã®ææ¡ã«ã¯ãããã2人ããããã3ããŒã¹ã®å£°ã®å察è ãããŸã-ããªãã¯ããªãã誰ã§ããããç¥ã£ãŠããŸãã 圌ãã¯é »ç¹ãªæçš¿ã§ãã®è°è«ãæ¯é ããŠãããæã«ã¯1æ¥ã«è€æ°åæçš¿ãããŸãã ããããåŸãããæ°ããæ å ±ã¯ã»ãšãã©ãããŸããã æçš¿æ°ã®å¢å ã¯ãã³ãã¥ããã£ã«ããããã匷ããææ ãåæ ããŠããŸããã ããã¯ããããã®äººã ãä»ã®äººã ããã声ã倧ããããšãæå³ããŸãã
@ iand @ rscã«ãã£ãŠäžããããçãã¯ãŸã æå¹ã§ãã ãã®çãã®ã©ã®éšåããç©è³ªãäžè¶³ããŠãããã®ããããããåºæ¿ãäžãããããã«äœãå¿ èŠãªã®ãã¯ããããŸããã ãããããã£ãšãç©è³ªããè¿œå ããŠã¿ãŸãããã
@griesemeræå³çã§ã¯ãªãã£ããšæããŸãããããªããåŒçšããèšèã¯ã©ããç§ã®ãã®ã§ã¯ãªããåŸã®ã³ã¡ã³ãè ã®ãã®ã§ããããšã«æ³šæããããšæããŸãã
ããã¯ããŠããããã€ã©ãŒãã¬ãŒããæžãããŠtry
ã®æåãåçŽåããããšã«å ããŠããããããè¯ããããæ確ãªã³ãŒããæžãããšãã§ãããã©ããã§å€æãããããšãé¡ã£ãŠããŸãã
@iand確ãã«-ããã¯ç§ã®èŠèœãšãã§ããã è¬çœªããããŸãã
try
ã䜿çšãããšãããèªã¿ãããã³ãŒããèšè¿°ã§ãããšç¢ºä¿¡ããŠããŸããå®éã®ã³ãŒããštryhard
ã䜿çšããç¬èªã®å®éšããåŸã蚌æ ã®å€ãã¯ã倧å¹
ãªã¯ãªãŒã³ã¢ããã瀺ããŠããŸãã ããããèªã¿ãããã¯ãã䞻芳çã§ãããå®éåããã®ãå°é£ã§ãã
@griesemer
ã©ã®ãããªäœ¿çšãã¿ãŒã³ãåç §ããŠããŸããïŒ
ãšã©ãŒãåŠçããããã®æ¢åã®nil-checkãã¿ãŒã³ã§ã¯ãªããæéã®çµéãšãšãã«çŽtry
ã«çºå±ãã䜿çšãã¿ãŒã³ãåç
§ããŠããŸãã 誀çšãä¹±çšã®å¯èœæ§ã¯ãç¹ã«ä»ã®èšèªã§æå³çã«ç°ãªãããŒãžã§ã³ã®try-catchã䜿çšããŠããããã°ã©ããŒã®ç¶ç¶çãªæµå
¥ã«ããã倧ããªæªç¥æ°ã§ãã
ããããã¹ãŠãšã³ã¢èšèªã®é·æçãªå®å®æ§ã«é¢ããèæ
®äºé
ããããã®æ©èœãxããã±ãŒãžãŸãã¯æšæºã©ã€ãã©ãªïŒããã±ãŒãžerrors/try
ãŸãã¯errors.Try()
ã®ããããïŒã®ã¬ãã«ã§å°å
¥ããããšãèããããã«ãªããŸããã
@mattparlmerééã£ãŠããå Žåã¯èšæ£ããŠãã ããããã ããgãmïŒå®è¡ãããŒããªãŒããŒã©ã€ãããããã«å¿ èŠïŒã䜿çšããã«ã¯ããã®ææ¡ãGoã©ã³ã¿ã€ã ã«å«ããå¿ èŠããããšæããŸãã
@ fabian-f
@mattparlmerééã£ãŠããå Žåã¯èšæ£ããŠãã ããããã ããgãmïŒå®è¡ãããŒããªãŒããŒã©ã€ãããããã«å¿ èŠïŒã䜿çšããã«ã¯ããã®ææ¡ãGoã©ã³ã¿ã€ã ã«å«ããå¿ èŠããããšæããŸãã
ããã§ã¯ãããŸããã ãã¶ã€ã³ããã¥ã¡ã³ãã«èšèŒãããŠããããã«ãã³ã³ãã€ã«æã®æ§æããªãŒå€æãšããŠå®è£ ã§ããŸãã
ãããå¯èœãªã®ã¯ã try
if
ãšreturn
ã§å®å
šã«è¡šçŸã§ããããã§ãã if
ãšreturn
ãè¡ã以äžã«ãå®éã«ã¯ãå®è¡ãããŒããªãŒããŒã©ã€ããããããšã¯ãããŸããã
ãããç§ã®äŒç€Ÿã®300kè¡ã®Goã³ãŒãããŒã¹ããã®tryhard
ã¬ããŒãã§ãã
åæå®è¡ïŒ
--- stats ---
13879 (100.0% of 13879) func declarations
4381 ( 31.6% of 13879) func declarations returning an error
38435 (100.0% of 38435) statements
8028 ( 20.9% of 38435) if statements
4496 ( 56.0% of 8028) if <err> != nil statements
453 ( 10.1% of 4496) try candidates
4 ( 0.1% of 4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
3066 ( 68.2% of 4496) { return ... zero values ..., expr }
356 ( 7.9% of 4496) single statement then branch
345 ( 7.7% of 4496) complex then branch; cannot use try
63 ( 1.4% of 4496) non-empty else branch; cannot use try
jujuã®errgoããã±ãŒãžïŒhttps://godoc.org/github.com/juju/errgoïŒã䜿çšããŠãšã©ãŒããã¹ã¯ããã¹ã¿ãã¯ãã¬ãŒã¹æ
å ±ãè¿œå ãããšããæ
£ç¿ããããŸããããã«ãããã»ãšãã©ã®æžãæããçºçããªããªããŸãã ããã¯ãç§ãã¡ãäžè¬çã«è£žã®ãšã©ãŒãªã¿ãŒã³ãé¿ããŠããã®ãšåãçç±ã§ã try
ãæ¡çšããå¯èœæ§ãäœãããšãæå³ããŸãã
æçšãªã¡ããªãã¯ã®ããã«æãããã®ã§ã errgo.Mask()
åŒã³åºãïŒã¢ãããŒã·ã§ã³ãªãã§ãšã©ãŒãè¿ãïŒãåé€ãã tryhard
ãåå®è¡ããŸããã ããã¯ãerrgoã䜿çšããªãã£ãå Žåã«æžãæããããå¯èœæ§ã®ãããšã©ãŒãã§ãã¯ã®æ°ã®èŠç©ããã§ãã
--- stats ---
13879 (100.0% of 13879) func declarations
4381 ( 31.6% of 13879) func declarations returning an error
38435 (100.0% of 38435) statements
8028 ( 20.9% of 38435) if statements
4496 ( 56.0% of 8028) if <err> != nil statements
3114 ( 69.3% of 4496) try candidates
7 ( 0.2% of 4496) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
381 ( 8.5% of 4496) { return ... zero values ..., expr }
358 ( 8.0% of 4496) single statement then branch
345 ( 7.7% of 4496) complex then branch; cannot use try
63 ( 1.4% of 4496) non-empty else branch; cannot use try
ãããã£ãŠããšã©ãŒãªã¿ãŒã³ã®çŽ70ïŒ
ã¯ãããã§ãªããã°try
ãšäºææ§ããããšæããŸãã
æåŸã«ãææ¡ã«é¢ããç§ã®äž»ãªé¢å¿äºã¯ãç§ãèªãã ã³ã¡ã³ãããã£ã¹ã«ãã·ã§ã³ã®èŠçŽã®ãããã«ãå«ãŸããŠããªãããã§ãã
ãã®ææ¡ã¯ããšã©ãŒã«æ³šéãä»ããããã®çžå¯Ÿçãªã³ã¹ããå€§å¹ ã«å¢å ãããŸãã
çŸåšããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããã®éçè²»çšã¯éåžžã«äœãã§ãã ãã©ãŒãããæååãå
¥åããã ãã§ãã ãã®ææ¡ãæ¡çšãããå Žåããšã³ãžãã¢ãtry
ã«ãã£ãŠæäŸãããçŸåŠããŸããŸã奜ãããã«ãªãã®ã§ã¯ãªãããšå¿é
ããŠããŸããããã¯ãã³ãŒãããããæŽç·Žããããããã«èŠããããã§ãïŒããã¯ãäžéšã®äººã
ã«ãšã£ãŠã¯èæ
®äºé
ã§ãããç§ã®çµéšã§ã¯ïŒãã³ã³ããã¹ããè¿œå ããããã«è¿œå ã®ãããã¯ãå¿
èŠã«ãªããŸããã 圌ãã¯ããèªã¿ããããã®è°è«ã«åºã¥ããŠãããæ£åœåããããšãã§ããŸããã³ã³ããã¹ããè¿œå ãããšãã¡ãœãããããã«3è¡æ¡åŒµãããèªè
ã®æ³šæããããããŸãã äŒæ¥ã®ã³ãŒãããŒã¹ã¯ãæ£ããããšãç°¡åã«å®è¡ã§ããããã«ããããšããçµæã®ã³ãŒãå質ã«æž¬å®å¯èœãªåœ±é¿ãäžããå¯èœæ§ããããã³ãŒãã¬ãã¥ãŒã®å質ãç°ãªããããŒã ãã©ã¯ãã£ã¹ãäºãã«ç¬ç«ããŠãããšããæå³ã§ãGoæšæºã©ã€ãã©ãªãšã¯ç°ãªããŸãã ã ãšã«ãããããªããåã«èšã£ãããã«ãç§ãã¡ã¯åžžã«ã³ãŒãããŒã¹ã«try
ãæ¡çšããããšã¯ã§ããŸããã§ããã
æ€èšããŠããã ãããããšãããããŸã
@mattparlmer
ããããã¹ãŠãšã³ã¢èšèªã®é·æçãªå®å®æ§ã«é¢ããèæ ®äºé ããããã®æ©èœãxããã±ãŒãžãŸãã¯æšæºã©ã€ãã©ãªïŒããã±ãŒãž
errors/try
ãŸãã¯errors.Try()
ã®ããããïŒã®ã¬ãã«ã§å°å ¥ããããšãèããããã«ãªããŸããã
try
ã¯ã©ã€ãã©ãªé¢æ°ãšããŠå®è£
ã§ããŸããã é¢æ°ãåŒã³åºãå
ããæ»ãæ¹æ³ã¯ãªãïŒïŒ32473ãšããŠææ¡ãããŠããæå¹åïŒãä»ã®ã»ãšãã©ã®çµã¿èŸŒã¿é¢æ°ãšåæ§ã«ãGoã§try
ã®çœ²åãè¡šçŸããæ¹æ³ããããŸããã ãžã§ããªãã¯å»è¬åã䜿çšããŠãããããå¯èœã«ãªãå¯èœæ§ã¯äœãã§ãã çµããè¿ãã«ãããã¶ã€ã³ããã¥ã¡ã³ãã®FAQãåç
§ããŠãã ããã
ãŸããã©ã€ãã©ãªé¢æ°ãšããŠtry
ãå®è£
ããã«ã¯ããã詳现ãªååãä»ããå¿
èŠããããŸããããã¯ãããã䜿çšããæå³ãéšåçã«ç¡å¹ã«ããŸãã
ãã ãããœãŒã¹ã³ãŒãããªããã»ããµãšããŠå®è£ ããããšãã2åå®è£ ããããšãã§ããŸããhttpsïŒ //github.com/rhysd/trygoããã³https://github.com/lunixbochs/ogãåç §ããŠãã ããã
tegolaã®ã³ãŒãããŒã¹ã®çŽ60ïŒ ããã®æ©èœãå©çšã§ããããã§ãã
tegolaãããžã§ã¯ãã®tryhardã®åºåã¯æ¬¡ã®ãšããã§ãïŒïŒhttp://github.com/go-spatial/tegolaïŒ
--- try candidates ---
1 tegola/atlas/atlas.go:84
2 tegola/atlas/map.go:232
3 tegola/atlas/map.go:238
4 tegola/atlas/map.go:248
5 tegola/atlas/map.go:253
6 tegola/basic/geometry_math.go:248
7 tegola/basic/geometry_math.go:251
8 tegola/basic/geometry_math.go:268
9 tegola/basic/geometry_math.go:276
10 tegola/basic/json_marshal.go:33
11 tegola/basic/json_marshal.go:153
12 tegola/basic/json_marshal.go:276
13 tegola/cache/azblob/azblob.go:54
14 tegola/cache/azblob/azblob.go:61
15 tegola/cache/azblob/azblob.go:67
16 tegola/cache/azblob/azblob.go:74
17 tegola/cache/azblob/azblob.go:80
18 tegola/cache/azblob/azblob.go:105
19 tegola/cache/azblob/azblob.go:109
20 tegola/cache/azblob/azblob.go:204
21 tegola/cache/azblob/azblob.go:259
22 tegola/cache/file/file.go:42
23 tegola/cache/file/file.go:56
24 tegola/cache/file/file.go:110
25 tegola/cache/file/file.go:116
26 tegola/cache/file/file.go:129
27 tegola/cache/redis/redis.go:41
28 tegola/cache/redis/redis.go:46
29 tegola/cache/redis/redis.go:51
30 tegola/cache/redis/redis.go:56
31 tegola/cache/redis/redis.go:70
32 tegola/cache/redis/redis.go:79
33 tegola/cache/redis/redis.go:84
34 tegola/cache/s3/s3.go:85
35 tegola/cache/s3/s3.go:102
36 tegola/cache/s3/s3.go:112
37 tegola/cache/s3/s3.go:118
38 tegola/cache/s3/s3.go:123
39 tegola/cache/s3/s3.go:138
40 tegola/cache/s3/s3.go:164
41 tegola/cache/s3/s3.go:172
42 tegola/cache/s3/s3.go:179
43 tegola/cache/s3/s3.go:284
44 tegola/cache/s3/s3.go:340
45 tegola/cmd/tegola/cmd/cache/format.go:97
46 tegola/cmd/tegola/cmd/cache/seed_purge.go:94
47 tegola/cmd/tegola/cmd/cache/seed_purge.go:103
48 tegola/cmd/tegola/cmd/cache/seed_purge.go:170
49 tegola/cmd/tegola/cmd/cache/tile_list.go:51
50 tegola/cmd/tegola/cmd/cache/tile_list.go:64
51 tegola/cmd/tegola/cmd/cache/tile_name.go:35
52 tegola/cmd/tegola/cmd/cache/tile_name.go:43
53 tegola/cmd/tegola/cmd/root.go:58
54 tegola/cmd/tegola/cmd/root.go:61
55 tegola/cmd/xyz2svg/cmd/draw.go:62
56 tegola/cmd/xyz2svg/cmd/draw.go:70
57 tegola/cmd/xyz2svg/cmd/draw.go:214
58 tegola/config/config.go:96
59 tegola/internal/env/parse.go:30
60 tegola/internal/env/parse.go:69
61 tegola/internal/env/parse.go:116
62 tegola/internal/env/parse.go:174
63 tegola/internal/env/parse.go:221
64 tegola/internal/env/types.go:67
65 tegola/internal/env/types.go:86
66 tegola/internal/env/types.go:105
67 tegola/internal/env/types.go:124
68 tegola/internal/env/types.go:143
69 tegola/maths/makevalid/main.go:189
70 tegola/maths/makevalid/main.go:207
71 tegola/maths/makevalid/main.go:221
72 tegola/maths/makevalid/main.go:295
73 tegola/maths/makevalid/main.go:504
74 tegola/maths/makevalid/makevalid.go:77
75 tegola/maths/makevalid/makevalid.go:89
76 tegola/maths/makevalid/makevalid.go:118
77 tegola/maths/makevalid/makevalid_test.go:93
78 tegola/maths/makevalid/makevalid_test.go:163
79 tegola/maths/makevalid/plyg/ring.go:518
80 tegola/maths/triangle.go:1023
81 tegola/mvt/layer.go:73
82 tegola/mvt/layer.go:79
83 tegola/mvt/vector_tile/vector_tile.pb.go:64
84 tegola/provider/gpkg/gpkg.go:138
85 tegola/provider/gpkg/gpkg.go:223
86 tegola/provider/gpkg/gpkg_register.go:46
87 tegola/provider/gpkg/gpkg_register.go:51
88 tegola/provider/gpkg/gpkg_register.go:186
89 tegola/provider/gpkg/gpkg_register.go:227
90 tegola/provider/gpkg/gpkg_register.go:240
91 tegola/provider/gpkg/gpkg_register.go:245
92 tegola/provider/gpkg/gpkg_register.go:256
93 tegola/provider/gpkg/gpkg_register.go:377
94 tegola/provider/postgis/postgis.go:112
95 tegola/provider/postgis/postgis.go:117
96 tegola/provider/postgis/postgis.go:122
97 tegola/provider/postgis/postgis.go:127
98 tegola/provider/postgis/postgis.go:136
99 tegola/provider/postgis/postgis.go:142
100 tegola/provider/postgis/postgis.go:148
101 tegola/provider/postgis/postgis.go:153
102 tegola/provider/postgis/postgis.go:158
103 tegola/provider/postgis/postgis.go:163
104 tegola/provider/postgis/postgis.go:181
105 tegola/provider/postgis/postgis.go:198
106 tegola/provider/postgis/postgis.go:264
107 tegola/provider/postgis/postgis.go:441
108 tegola/provider/postgis/postgis.go:446
109 tegola/provider/postgis/postgis.go:529
110 tegola/provider/postgis/postgis.go:559
111 tegola/provider/postgis/postgis.go:603
112 tegola/provider/postgis/util.go:31
113 tegola/provider/postgis/util.go:36
114 tegola/provider/postgis/util.go:200
115 tegola/server/bindata/bindata.go:89
116 tegola/server/bindata/bindata.go:109
117 tegola/server/bindata/bindata.go:129
118 tegola/server/bindata/bindata.go:149
119 tegola/server/bindata/bindata.go:169
120 tegola/server/bindata/bindata.go:189
121 tegola/server/bindata/bindata.go:209
122 tegola/server/bindata/bindata.go:229
123 tegola/server/bindata/bindata.go:370
124 tegola/server/bindata/bindata.go:374
125 tegola/server/bindata/bindata.go:378
126 tegola/server/bindata/bindata.go:382
127 tegola/server/bindata/bindata.go:386
128 tegola/server/bindata/bindata.go:402
129 tegola/server/middleware_gzip.go:71
130 tegola/server/middleware_gzip.go:78
131 tegola/server/server_test.go:85
--- <err> name is different from "err" ---
1 tegola/basic/json_marshal.go:276
--- { return ... zero values ..., expr } ---
1 tegola/basic/geometry_math.go:214
2 tegola/basic/geometry_math.go:222
3 tegola/basic/geometry_math.go:230
4 tegola/cache/azblob/azblob.go:131
5 tegola/cache/azblob/azblob.go:140
6 tegola/cache/azblob/azblob.go:149
7 tegola/cache/azblob/azblob.go:171
8 tegola/cache/file/file.go:47
9 tegola/cache/s3/s3.go:92
10 tegola/cmd/internal/register/maps.go:108
11 tegola/cmd/tegola/cmd/cache/flags.go:20
12 tegola/cmd/tegola/cmd/cache/tile_name.go:51
13 tegola/cmd/tegola/cmd/cache/worker.go:112
14 tegola/cmd/tegola/cmd/cache/worker.go:123
15 tegola/cmd/tegola/cmd/root.go:73
16 tegola/cmd/tegola/cmd/root.go:78
17 tegola/cmd/xyz2svg/cmd/root.go:60
18 tegola/provider/gpkg/gpkg.go:90
19 tegola/provider/gpkg/gpkg.go:95
20 tegola/provider/gpkg/gpkg_register.go:264
21 tegola/provider/gpkg/gpkg_register.go:297
22 tegola/provider/gpkg/gpkg_register.go:302
23 tegola/provider/gpkg/gpkg_register.go:313
24 tegola/provider/gpkg/gpkg_register.go:328
25 tegola/provider/postgis/postgis.go:193
26 tegola/provider/postgis/postgis.go:208
27 tegola/provider/postgis/postgis.go:222
28 tegola/provider/postgis/postgis.go:228
29 tegola/provider/postgis/postgis.go:234
30 tegola/provider/postgis/postgis.go:243
31 tegola/provider/postgis/postgis.go:249
32 tegola/provider/postgis/postgis.go:255
33 tegola/provider/postgis/postgis.go:304
34 tegola/provider/postgis/postgis.go:315
35 tegola/provider/postgis/postgis.go:319
36 tegola/provider/postgis/postgis.go:364
37 tegola/provider/postgis/postgis.go:456
38 tegola/provider/postgis/postgis.go:520
39 tegola/provider/postgis/postgis.go:534
40 tegola/provider/postgis/postgis.go:565
41 tegola/provider/postgis/util.go:108
42 tegola/provider/postgis/util.go:113
43 tegola/server/bindata/bindata.go:29
44 tegola/server/bindata/bindata.go:245
45 tegola/server/bindata/bindata.go:271
46 tegola/server/bindata/bindata.go:396
--- single statement then branch ---
1 tegola/cache/azblob/azblob.go:241
2 tegola/cache/file/file.go:87
3 tegola/cache/s3/s3.go:321
4 tegola/cmd/internal/register/caches.go:18
5 tegola/cmd/internal/register/providers.go:43
6 tegola/cmd/internal/register/providers.go:62
7 tegola/cmd/internal/register/providers.go:75
8 tegola/config/config.go:192
9 tegola/config/config.go:207
10 tegola/config/config.go:217
11 tegola/internal/env/dict.go:43
12 tegola/internal/env/dict.go:121
13 tegola/internal/env/dict.go:197
14 tegola/internal/env/dict.go:273
15 tegola/internal/env/dict.go:348
16 tegola/internal/env/parse.go:79
17 tegola/internal/env/parse.go:126
18 tegola/internal/env/parse.go:184
19 tegola/internal/env/parse.go:231
20 tegola/maths/makevalid/plyg/ring.go:541
21 tegola/maths/maths.go:239
22 tegola/maths/validate/validate.go:49
23 tegola/maths/validate/validate.go:53
24 tegola/maths/validate/validate.go:59
25 tegola/maths/validate/validate.go:69
26 tegola/mvt/feature.go:94
27 tegola/mvt/feature.go:99
28 tegola/mvt/feature.go:592
29 tegola/mvt/feature.go:603
30 tegola/mvt/layer.go:90
31 tegola/mvt/tile.go:48
32 tegola/provider/postgis/postgis.go:570
33 tegola/provider/postgis/postgis.go:586
34 tegola/tile.go:172
--- complex then branch; cannot use try ---
1 tegola/cache/azblob/azblob.go:226
2 tegola/cache/file/file.go:78
3 tegola/cache/file/file.go:122
4 tegola/cache/s3/s3.go:195
5 tegola/cache/s3/s3.go:206
6 tegola/cache/s3/s3.go:219
7 tegola/cache/s3/s3.go:307
8 tegola/provider/gpkg/gpkg.go:39
9 tegola/provider/gpkg/gpkg.go:45
10 tegola/provider/gpkg/gpkg.go:131
11 tegola/provider/gpkg/gpkg.go:154
12 tegola/provider/gpkg/gpkg_register.go:171
13 tegola/provider/gpkg/gpkg_register.go:195
--- stats ---
1294 (100.0% of 1294) func declarations
246 ( 19.0% of 1294) func declarations returning an error
2693 (100.0% of 2693) statements
551 ( 20.5% of 2693) if statements
238 ( 43.2% of 551) if <err> != nil statements
131 ( 55.0% of 238) try candidates
1 ( 0.4% of 238) <err> name is different from "err"
--- non-try candidates ---
46 ( 19.3% of 238) { return ... zero values ..., expr }
34 ( 14.3% of 238) single statement then branch
13 ( 5.5% of 238) complex then branch; cannot use try
0 ( 0.0% of 238) non-empty else branch; cannot use try
ãããŠã³ã³ãããªã³ãããžã§ã¯ãïŒïŒhttp://github.com/go-spatial/geomïŒ
--- try candidates ---
1 geom/bbox.go:202
2 geom/encoding/geojson/geojson.go:152
3 geom/encoding/geojson/geojson.go:157
4 geom/encoding/wkb/internal/tcase/symbol/symbol.go:73
5 geom/encoding/wkb/internal/tcase/tcase.go:161
6 geom/encoding/wkb/internal/tcase/tcase.go:172
7 geom/encoding/wkb/wkb.go:50
8 geom/encoding/wkb/wkb.go:110
9 geom/encoding/wkt/internal/token/token.go:176
10 geom/encoding/wkt/internal/token/token.go:252
11 geom/internal/parsing/parsing.go:44
12 geom/internal/parsing/parsing.go:85
13 geom/internal/rtreego/rtree_test.go:110
14 geom/multi_line_string.go:34
15 geom/multi_polygon.go:35
16 geom/planar/clip/linestring.go:82
17 geom/planar/clip/linestring.go:181
18 geom/planar/clip/point.go:23
19 geom/planar/intersect/xsweep.go:106
20 geom/planar/makevalid/makevalid.go:92
21 geom/planar/makevalid/makevalid.go:191
22 geom/planar/makevalid/setdiff/polygoncleaner.go:283
23 geom/planar/makevalid/setdiff/polygoncleaner.go:345
24 geom/planar/makevalid/setdiff/polygoncleaner.go:543
25 geom/planar/makevalid/setdiff/polygoncleaner.go:554
26 geom/planar/makevalid/setdiff/polygoncleaner.go:572
27 geom/planar/makevalid/setdiff/polygoncleaner.go:578
28 geom/planar/simplify/douglaspeucker.go:84
29 geom/planar/simplify/douglaspeucker.go:88
30 geom/planar/simplify.go:13
31 geom/planar/triangulate/constraineddelaunay/triangle.go:186
32 geom/planar/triangulate/constraineddelaunay/triangulator.go:134
33 geom/planar/triangulate/constraineddelaunay/triangulator.go:138
34 geom/planar/triangulate/constraineddelaunay/triangulator.go:142
35 geom/planar/triangulate/constraineddelaunay/triangulator.go:173
36 geom/planar/triangulate/constraineddelaunay/triangulator.go:176
37 geom/planar/triangulate/constraineddelaunay/triangulator.go:203
38 geom/planar/triangulate/constraineddelaunay/triangulator.go:248
39 geom/planar/triangulate/constraineddelaunay/triangulator.go:396
40 geom/planar/triangulate/constraineddelaunay/triangulator.go:466
41 geom/planar/triangulate/constraineddelaunay/triangulator.go:553
42 geom/planar/triangulate/constraineddelaunay/triangulator.go:583
43 geom/planar/triangulate/constraineddelaunay/triangulator.go:667
44 geom/planar/triangulate/constraineddelaunay/triangulator.go:672
45 geom/planar/triangulate/constraineddelaunay/triangulator.go:677
46 geom/planar/triangulate/constraineddelaunay/triangulator.go:814
47 geom/planar/triangulate/constraineddelaunay/triangulator.go:818
48 geom/planar/triangulate/constraineddelaunay/triangulator.go:823
49 geom/planar/triangulate/constraineddelaunay/triangulator.go:865
50 geom/planar/triangulate/constraineddelaunay/triangulator.go:870
51 geom/planar/triangulate/constraineddelaunay/triangulator.go:875
52 geom/planar/triangulate/constraineddelaunay/triangulator.go:897
53 geom/planar/triangulate/constraineddelaunay/triangulator.go:901
54 geom/planar/triangulate/constraineddelaunay/triangulator.go:907
55 geom/planar/triangulate/constraineddelaunay/triangulator.go:1107
56 geom/planar/triangulate/constraineddelaunay/triangulator.go:1146
57 geom/planar/triangulate/constraineddelaunay/triangulator.go:1157
58 geom/planar/triangulate/constraineddelaunay/triangulator.go:1202
59 geom/planar/triangulate/constraineddelaunay/triangulator.go:1206
60 geom/planar/triangulate/constraineddelaunay/triangulator.go:1216
61 geom/planar/triangulate/delaunaytriangulationbuilder.go:66
62 geom/planar/triangulate/incrementaldelaunaytriangulator.go:46
63 geom/planar/triangulate/incrementaldelaunaytriangulator.go:78
64 geom/planar/triangulate/quadedge/lastfoundquadedgelocator.go:65
65 geom/planar/triangulate/quadedge/quadedgesubdivision.go:976
66 geom/slippy/tile.go:133
--- { return ... zero values ..., expr } ---
1 geom/internal/parsing/parsing.go:125
2 geom/planar/triangulate/constraineddelaunay/triangulator.go:428
3 geom/planar/triangulate/constraineddelaunay/triangulator.go:447
4 geom/planar/triangulate/constraineddelaunay/triangulator.go:460
--- single statement then branch ---
1 geom/bbox.go:259
2 geom/encoding/wkb/internal/decode/decode.go:29
3 geom/encoding/wkb/internal/decode/decode.go:55
4 geom/encoding/wkb/internal/decode/decode.go:63
5 geom/encoding/wkb/internal/decode/decode.go:70
6 geom/encoding/wkb/internal/decode/decode.go:79
7 geom/encoding/wkb/internal/decode/decode.go:84
8 geom/encoding/wkb/internal/decode/decode.go:93
9 geom/encoding/wkb/internal/decode/decode.go:99
10 geom/encoding/wkb/internal/decode/decode.go:105
11 geom/encoding/wkb/internal/decode/decode.go:114
12 geom/encoding/wkb/internal/decode/decode.go:119
13 geom/encoding/wkb/internal/decode/decode.go:135
14 geom/encoding/wkb/internal/decode/decode.go:140
15 geom/encoding/wkb/internal/decode/decode.go:149
16 geom/encoding/wkb/internal/decode/decode.go:155
17 geom/encoding/wkb/internal/decode/decode.go:161
18 geom/encoding/wkb/internal/decode/decode.go:170
19 geom/encoding/wkb/internal/decode/decode.go:176
20 geom/encoding/wkb/internal/tcase/token/token.go:162
21 geom/encoding/wkt/internal/token/token.go:136
--- complex then branch; cannot use try ---
1 geom/encoding/wkb/internal/tcase/tcase.go:74
2 geom/encoding/wkt/internal/symbol/symbol.go:125
3 geom/planar/intersect/xsweep.go:165
4 geom/planar/makevalid/makevalid.go:85
5 geom/planar/makevalid/makevalid.go:172
6 geom/planar/makevalid/triangulate.go:19
7 geom/planar/makevalid/triangulate.go:28
8 geom/planar/makevalid/triangulate.go:36
9 geom/planar/makevalid/triangulate.go:58
10 geom/planar/triangulate/constraineddelaunay/triangulator.go:358
11 geom/planar/triangulate/constraineddelaunay/triangulator.go:373
12 geom/planar/triangulate/constraineddelaunay/triangulator.go:453
13 geom/planar/triangulate/constraineddelaunay/triangulator.go:1237
14 geom/planar/triangulate/constraineddelaunay/triangulator.go:1243
15 geom/planar/triangulate/constraineddelaunay/triangulator.go:1249
--- stats ---
820 (100.0% of 820) func declarations
146 ( 17.8% of 820) func declarations returning an error
1715 (100.0% of 1715) statements
391 ( 22.8% of 1715) if statements
111 ( 28.4% of 391) if <err> != nil statements
66 ( 59.5% of 111) try candidates
0 ( 0.0% of 111) <err> name is different from "err"
--- non-try candidates ---
4 ( 3.6% of 111) { return ... zero values ..., expr }
21 ( 18.9% of 111) single statement then branch
15 ( 13.5% of 111) complex then branch; cannot use try
0 ( 0.0% of 111) non-empty else branch; cannot use try
äºæ³å€ã®è²»çšã«ã€ããŠã¯ãïŒ32611ããåæçš¿ããŸã...
ã³ã¹ãã«ã¯æ¬¡ã®3ã€ã®ã¯ã©ã¹ããããŸãã
çªå· 1ãš2ã try()
ã®ã³ã¹ãã¯æ§ããã§ãã
ããããåçŽåããããŸãã 3ãã»ãšãã©ã®ã³ã¡ã³ãæäŸè
ã¯ã try()
ãã³ãŒããäŸåããã³ãŒãã®ãšã³ã·ã¹ãã ã«æ害ãäžããããã«ãã£ãŠè£œåã®çç£æ§ãšå質ãäœäžããããšèããŠããŸãã ãã®åºç¯ã§çã«ããªã£ãèªèã¯ããéäºå®çããŸãã¯ãçŸçããšããŠè»œèãããã¹ãã§ã¯ãããŸããã
ãšã³ã·ã¹ãã ã®ã³ã¹ãã¯ãä»æ§ãããŒã«ã®ã³ã¹ããããã¯ããã«éèŠã§ãã
@griesemer ã3ããŒã¹ã®ããŒã«ã«å¯ŸæŠçžæããå察掟ã®å€§éšåã§ãããšäž»åŒµããããšã¯æããã«äžå
¬å¹³ã§ãã äœçŸäººãã®äººã
ããããšïŒ32825ã§ã³ã¡ã³ãããŠããŸãã 6æ12æ¥ããåçè
ã®çŽ2/3ãææ¡ã«æºè¶³ããŠããªãããšãèªèããŠããŸãããšãã£ããããŸããã ãã以æ¥ã2,000人以äžãã err != nil
ãæŸã£ãŠãããã«90ïŒ
ã®è³æ祚ãæããŸããã
@gdeyæçš¿ãä¿®æ£ããŠã_statsãšéè©Šè¡åè£_ã®ã¿ãå«ããããšãã§ããŸããïŒ
@ robfig ã @ gdeyãã®ããŒã¿ãç¹ã«ååŸã®æ¯èŒãæäŸããŠããã ãããããšãããããŸãã
@griesemer
ããªãã¯ç¢ºãã«ãç§ã®ïŒãããŠä»ã®äººã®ïŒæžå¿µãçŽæ¥å¯ŸåŠããããããããªãããšãæ確ã«ããããã€ãã®å®äœãè¿œå ããŸããã ããã§ãç§ã®è³ªåã¯ãGoããŒã ããéæ¥ã¢ãŒãã®æªçšã®å¯èœæ§ïŒã€ãŸãã裞ã®ãªã¿ãŒã³ããã³/ãŸãã¯å»¶æã«ããé¢æ°ã¹ã³ãŒããšã©ãŒã®å€æŽïŒããã¹ããã5ã§è°è«ãã䟡å€ã®ããã³ã¹ããšèŠãªããŠãããã©ããããããŠæœåšçã«äŸ¡å€ããããã©ããã§ãããã®ç·©åã«åããŠè¡åãèµ·ããã çŸåšã®ã ãŒãã¯ãææ¡ã®ãã®æãåä»ãªåŽé¢ãGoããŒã ã«ãã£ãŠå·§åŠã§æ¬æ°ãªæ©èœãšèŠãªãããŠããããšã§ãïŒãã®æžå¿µã¯èªåå€æã®è©äŸ¡ã§ã¯å¯ŸåŠãããŠããããç©æ¥µçã«å¥šå±/ãµããŒããããŠããããã§ãerrd
ãäŒè©±äžãªã©ïŒã
ç·šéããŠè¿œå ...ããã©ã³ã®GophersãçŠæ¢ããŠãããšèŠãªããã®ã奚å±ããGoããŒã ã®æžå¿µã¯ãå
倩æ§å€±é³æ¥œã«é¢ããŠç§ãæå³ããããšã§ãã
...éæ¥åã¯ãçµéšçãªèŠçã®åé¡ãšããŠç§ãã¡ã®å€ããæ·±ãæžå¿µããŠããã³ã¹ãã§ãã ç°¡åã«ãã³ãããŒã¯ã§ãããã®ã§ã¯ãªããããããŸãããïŒåççã§ãããšããŠãïŒããã®æžå¿µãæå·çãªãã®ãšèŠãªãããšã¯äžèª å®ã§ãã ãããã確ããªæèçå€æãªãã«åçŽãªæ°åãæ¯æããŠå
±æãããçµéšã®ç¥æµãç¡èŠããããšã¯ãç§/ç§ãã¡ãå察ããããšããŠããäžçš®ã®ææ
ã§ãã
@networkimprovååã«æ確ã§ã¯ãªãããšããè©«ã³ããŸãã ç§ãèšã£ãããšã¯ïŒ
ãã®ææ¡ã«ã¯ãããã2人ããããã3ããŒã¹ã®å£°ã®å察è ãããŸã-ããªãã¯ããªãã誰ã§ããããç¥ã£ãŠããŸãã 圌ãã¯é »ç¹ãªæçš¿ã§ãã®è°è«ãæ¯é ããŠãããæã«ã¯1æ¥ã«è€æ°åæçš¿ãããŸãã
ç§ã¯çµµæåã§ã¯ãªããå®éã®ã³ã¡ã³ãïŒãé »ç¹ãªæçš¿ãã®ããã«ïŒã«ã€ããŠè©±ããŠããŸããã ããã«_ç¹°ãè¿ã_æçš¿ãã人ã¯æ¯èŒçå°æ°ã§ãããããã§ãæ£ãããšæããŸãã ç§ãïŒ32825ã«ã€ããŠè©±ããŠããŸããã§ããã ç§ã¯ãã®ææ¡ã«ã€ããŠè©±ããŠããŸããã
çµµæåãèŠããšãç¶æ³ã¯1ãæåãšã»ãšãã©å€ãããŸãããçµµæåã®1/3ã¯å¥œæçãªæèŠã瀺ãã2/3ã¯åŠå®çãªæèŠã瀺ããŠããŸãã
@griesemer
äžèšã®ã³ã¡ã³ããæžããŠãããšãã«äœããæãåºããŸãããèšèšããã¥ã¡ã³ãã«ã¯ã try
ã¯åçŽãªæ§æããªãŒå€æãšããŠå®è£
ã§ãããšæžãããŠããŸãããå€ãã®å Žåãæããã«ããã§ã¯ãããŸããããããè¡ãç°¡åãªæ¹æ³ãåç
§ããŠãã ããã ããšãã°ã次ã®ãããªãã®ããããšããŸãã
switch x {
case rand.Int():
a()
case 5, try(strconv.Atoi(y)):
b()
}
switch
ã®è©äŸ¡é åºãèãããšãæå³ããã»ãã³ãã£ã¯ã¹ãç¶æããªããã strconv.Atoi(y)
ãcase
å¥ããç°¡åã«æã¡äžããæ¹æ³ãããããŸããã ç§ãæãã€ãããšãã§ããæåã®æ¹æ³ã¯ã switch
ãif
/ else
ã¹ããŒãã¡ã³ãã®åçã®ãã§ãŒã³ãšããŠæ¬¡ã®ããã«æžãçŽãããšã§ãã
if x == rand.Int() {
a()
} else if x == 5 {
b()
} else if _v, _err := strconv.Atoi(y); _err != nil {
return _err
} else if x == _v {
b()
}
ïŒãããçºçããå¯èœæ§ã®ããç¶æ³ã¯ä»ã«ããããŸãããããã¯æãåçŽãªäŸã®1ã€ã§ãããæåã«æãæµ®ãã³ãŸããïŒ
å®éããã®ææ¡ãå
¬éããåã¯ãèšèšãã©ããããcheck
æŒç®åãå®è£
ããããã«ãASTãã©ã³ã¹ã¬ãŒã¿ã«åãçµãã§ããŠããã®åé¡ã«ééããŸããã ãã ãããããã³ã°ãããããŒãžã§ã³ã®go/*
stdlibããã±ãŒãžã䜿çšããŠããŸããã ãããããã³ã³ãã€ã©ã®ããã³ããšã³ãã¯ããããç°¡åã«ããæ¹æ³ã§æ§é åãããŠããŸããïŒ ãŸãã¯ç§ã¯äœããéããŸããããããŠãããããããã®æ¬åœã«ç°¡åãªæ¹æ³ããããŸããïŒ
https://github.com/rhysd/trygo;ãåç
§ããŠãã ããã READMEã«ãããšã try
åŒã¯å®è£
ãããŠããããããã§æèµ·ããŠããã®ãšæ¬è³ªçã«åãæžå¿µäºé
ã«æ³šæããŠãã ããã ããããäœè
ããã®æ©èœãå®è£
ããªãã£ãçç±ãããããªããšæããŸãã
@daved Professionalã³ãŒãã¯ãç空äžã§éçºãããŠããŸãã-ããŒã«ã«ã®èŠåãã¹ã¿ã€ã«ã®æšå¥šäºé ãã³ãŒãã¬ãã¥ãŒãªã©ããããŸãïŒããã¯åã«èšããŸããïŒã ãããã£ãŠããªãèåŸ ããèµ·ããããããªã®ãããããŸããïŒããã¯å¯èœã§ãããããã¯ã©ã®èšèªæ§æã«ãåœãŠã¯ãŸããŸãïŒã
defer
ã䜿çšããŠãšã©ãŒãè£
食ããããšã¯ã try
ã®æç¡ã«ãããããå¯èœã§ããããšã«æ³šæããŠãã ããã å€ãã®ãšã©ãŒãã§ãã¯ãå«ãé¢æ°ã«ã¯ç¢ºãã«æ£åœãªçç±ããããŸãããããã¯ãã¹ãŠåãæ¹æ³ã§ãšã©ãŒãè£
食ããããšãã°defer
ã䜿çšããŠãã®è£
食ã1åå®è¡ããŸãã ãŸãã¯ãè£
食ãè¡ãã©ãããŒé¢æ°ã䜿çšããããšãã§ããŸãã ãŸãã¯ãæ³æ¡ãšããŒã«ã«ã³ãŒãã£ã³ã°ã®æšå¥šäºé
ã«é©åãããã®ä»ã®ã¡ã«ããºã ã çµå±ã®ãšãããããšã©ãŒã¯åãªãå€ãã§ããããšã©ãŒãåŠçããã³ãŒããèšè¿°ããŠå æ°å解ããããšã¯å®å
šã«çã«ããªã£ãŠããŸãã
裞ã®è¿åã¯ãèŠåŸã®ãªãæ¹æ³ã§äœ¿çšãããšåé¡ã«ãªãå¯èœæ§ããããŸãã ããã¯åœŒããäžè¬çã«æªããšããæå³ã§ã¯ãããŸããã ããšãã°ãé¢æ°ã®çµæããšã©ãŒããªãã£ãå Žåã«ã®ã¿æå¹ã§ããå Žåããšã©ãŒã®å Žåã«ãã€ããããªã¿ãŒã³ã䜿çšããããšã¯å®å
šã«åé¡ãªãããã§ã-ãšã©ãŒã®èšå®ã«èšç·ŽãããŠããéãïŒä»ã®æ»ãå€ã¯ããã§ã¯ãããŸããïŒãã®å Žåã¯åé¡ãããŸããïŒã try
ã¯ãŸãã«ãããä¿èšŒããŸãã ããã«ã¯ãèåŸ
ãã¯èŠãããŸããã
@dpinelaã³ã³ãã€ã©ã¯ãã§ã«ããªãã®ãããªswitch
ã¹ããŒãã¡ã³ããif-else-if
ã®ã·ãŒã±ã³ã¹ãšããŠå€æããŠããã®ã§ãããã§ã¯åé¡ã¯èŠãããŸããã ãŸããã³ã³ãã€ã©ã䜿çšããŠãããæ§ææšãã¯ãgo / astãæ§ææšã§ã¯ãããŸããã ã³ã³ãã€ã©ã®å
éšè¡šçŸã«ãããå¿
ãããGoã«æ»ãããšãã§ããªãã¯ããã«æè»ãªã³ãŒããå¯èœã«ãªããŸãã
@griesemer
ã¯ãããã¡ãããããªããèšã£ãŠããããšã®ãã¹ãŠã«æ ¹æ ããããŸãã ãã ããç°è²ã®é åã¯ããã¬ãŒãã³ã°ããŠããã»ã©åçŽã§ã¯ãããŸããã 裞ã®ãªã¿ãŒã³ã¯éåžžãä»ã®äººã«æããç§ãã¡ïŒã³ãã¥ããã£ã®æé·/ä¿é²ã«åªããç§ãã¡ïŒã«ãã£ãŠçŽ°å¿ã®æ³šæãæã£ãŠæ±ãããŸãã stdlibãå
šäœã«æ£ããã£ãŠããããšã«æè¬ããŸãã ããããä»ã®äººã«æãããšãã¯ãæ瀺çãªãªã¿ãŒã³ãåžžã«åŒ·èª¿ãããŸãã å人ãèªåã®æç床ã«å°éãããŠãããã空æ³çãªãã¢ãããŒãã«ç®ãåããããŸãããæåããããã奚å±ããããšã¯ã確ãã«èªã¿ã«ããã³ãŒãïŒã€ãŸãæªãç¿æ
£ïŒãå©é·ããã§ãããã ããããŸããç§ãæããã«ããããšããŠããå
倩æ§å€±é³æ¥œã§ãã
å人çã«ã¯ã裞ã®è¿åã延æããã䟡å€ã®æäœãçŠæ¢ããããããŸããã ããããæ¬åœã«é©ããŠããå Žåããããã®æ©èœãå©çšã§ããããšãå¬ããæããŸãïŒãã ããä»ã®çµéšè±å¯ãªãŠãŒã¶ãŒã¯ããå³æ Œãªã¹ã¿ã³ã¹ãåãå¯èœæ§ããããŸãïŒã ããã«ããããããããããã®ããŸãäžè¬çã§ã¯ãªãäžè¬çã«å£ããããæ©èœããã®ããã«æ®åãããŠé©çšããããšã奚å±ããããšã¯ãç§ãä»ãŸã§æ³åããŠããã®ãšã¯ãŸã£ããéã®æ¹åã§ãã åé¿éæ³ãšäžå®å®ãªåœ¢ã®éæ¥åç §ã®æ§æ Œã®é¡èãªå€åã¯ãæå³çãªå€åã§ããïŒ ãŸããDICããã®ä»ã®ãããã°ãé£ããã¡ã«ããºã ã®äœ¿çšã匷調ãå§ããå¿ èŠããããŸããïŒ
psãæéãããã ãããããšãããããŸãã ããªãã®ããŒã ãšèšèªã«ã¯ç§ã®æ¬æãšé æ ®ããããŸãã 誰ããçºèšããããšã«æ²ãã¿ãæãããã¯ãããŸããã ç§/ç§ãã¡ã®æžå¿µã®æ¬è³ªãèããŠãç§ãã¡ã®ãæåç·ãã®èŠç¹ããç©äºãèŠãŠã¿ãŠãã ããã
ç§ã®å察祚ã«ããã€ãã®ã³ã¡ã³ããè¿œå ããŸãã
æå ã«ããç¹å®ã®ææ¡ã«ã€ããŠïŒ
1ïŒå¶åŸ¡ãããŒãšã³ãŒãã®å¯èªæ§ã®çç±ããããããããŒã¯ãŒããšçµã¿èŸŒã¿é¢æ°ã®ã©ã¡ãã«ãããã匷ããå§ãããŸãã
2ïŒæå³çã«ã¯ããtryãã¯é¿é·éã§ãã ãŸããäŸå€ãã¹ããŒãããªãéãããtryãã®ååã¯guard
ãensure
ãªã©ã«å€æŽããããšããå§ãããŸãã
3ïŒãã®2ã€ã®ç¹ãé€ãã°ãããã¯ç§ããã®çš®ã®ããšã«ã€ããŠèŠãäžã§æé«ã®ææ¡ã ãšæããŸãã
try/guard/ensure
ã®æŠå¿µãè¿œå ããããšãšã$ if err != nil
ããã®ãŸãŸã«ããããšã«å¯Ÿããç§ã®å察ãæ確ã«ãããããã«ããã€ãã®ã³ã¡ã³ãïŒ
1ïŒããã¯ããéæ³ããã»ãšãã©ãªããæ瀺çã§ãèªã¿ããããç解ãããããšãããgolangã®åœåã®çŸ©åã®1ã€ïŒå°ãªããšãç§ãèªèãããšããïŒã«åããŸãã
2ïŒããã¯ãæèãå¿ èŠãªæ£ç¢ºãªç¬éã«æ æ°ãå©é·ããŸãïŒããã®ãšã©ãŒã®å Žåã«ç§ã®ã³ãŒããè¡ãæåã®ããšã¯äœã§ããïŒãã ãã¡ã€ã«ãéãããããã¯ãŒã¯ãä»ããŠããŒã¿ã転éãããªã©ã®ãå®åæãã®å®è¡äžã«çºçããå¯èœæ§ã®ãããšã©ãŒã¯å€æ°ãããŸããäžè¬çã§ãªãé害ã·ããªãªãç¡èŠããäžé£ã®ãè©Šè¡ãããå§ããå ŽåããããŸãããæçµçã«ã¯ãããã®å€ããç¬èªã®ããã¯ãªã/åè©Šè¡ããã®ã³ã°/ãã¬ãŒã¹ãããã³/ãŸãã¯ã¯ãªãŒã³ã¢ããã¿ã¹ã¯ãå®è£ ããå¿ èŠãããå Žåãããããããè©Šè¡ãã¯ãªããªããŸãã ãäœç¢ºçã€ãã³ããã¯å€§èŠæš¡ã«ä¿èšŒãããŠããŸãã
ããã«ããã€ãã®çã®tryhard
çµ±èšããããŸãã ããã¯ãããã«æ€èšŒãããŠããã ããªã®ã§ããšã©ãŒãææããŠãã ããã ;-)
ãããã¯ã httpsïŒ //godoc.orgã®æåã®20ã®äººæ°ã®ããããã±ãŒãžã«å¯Ÿå¿ãããªããžããªã§ãããè©Šè¡åè£ã®å²åã§ãœãŒããããŠããŸãã ããã¯ããã©ã«ãã®tryhard
èšå®ã䜿çšããŠãããçè«çã«ã¯vendor
ãã£ã¬ã¯ããªãé€å€ããå¿
èŠããããŸãã
ãããã®20ã®ãªããžããªå šäœã®è©Šè¡åè£ã®äžå€®å€ã¯58ïŒ ã§ãã
| ãããžã§ã¯ã| loc | stmtsã®å Žå| ifïŒ= nilïŒifã®ïŒ
ïŒ| åè£ãè©ŠãïŒïŒ
of ifïŒ= nilïŒ|
| --------- | ----- | --------------- | ----------------- ----- | ---------------
| github.com/google/uuid | 1714 | 12 | 16.7ïŒ
| 0.0ïŒ
|
| github.com/pkg/errors | 1886幎| 10 | 0.0ïŒ
| 0.0ïŒ
|
| github.com/aws/aws-sdk-go | 1911309 | 32015 | 9.4ïŒ
| 8.9ïŒ
|
| github.com/jinzhu/gorm | 15246 | 44 | 11.4ïŒ
| 20.0ïŒ
|
| github.com/robfig/cron | 1911 | 20 | 35.0ïŒ
| 28.6ïŒ
|
| github.com/gorilla/websocket | 6959 | 212 | 32.5ïŒ
| 39.1ïŒ
|
| github.com/dgrijalva/jwt-go | 3270 | 118 | 29.7ïŒ
| 40.0ïŒ
|
| github.com/gomodule/redigo | 7119 | 187 | 34.8ïŒ
| 41.5ïŒ
|
| github.com/unixpickle/kahoot-hack | 1743 | 52 | 75.0ïŒ
| 43.6ïŒ
|
| github.com/lib/pq | 13396 | 239 | 30.1ïŒ
| 55.6ïŒ
|
| github.com/sirupsen/logrus | 5063 | 29 | 17.2ïŒ
| 60.0ïŒ
|
| github.com/prometheus/client_golang | 17791 | 194 | 49.0ïŒ
| 62.1ïŒ
|
| github.com/go-redis/redis | 21182 | 326 | 42.6ïŒ
| 73.4ïŒ
|
| github.com/mongodb/mongo-go-driver | 86605 | 2097 | 37.8ïŒ
| 73.9ïŒ
|
| github.com/uber-go/zap | 15363 | 84 | 36.9ïŒ
| 74.2ïŒ
|
| github.com/golang/protobuf | 42959 | 685 | 22.9ïŒ
| 77.1ïŒ
|
| github.com/gin-gonic/gin | 14574 | 96 | 53.1ïŒ
| 86.3ïŒ
|
| github.com/go-pg/pg | 26369 | 831 | 37.7ïŒ
| 86.9ïŒ
|
| github.com/Shopify/sarama | 36427 | 1369 | 68.2ïŒ
| 91.0ïŒ
|
| github.com/stretchr/testify | 13496 | 32 | 43.8ïŒ
| 92.9ïŒ
|
ã ifstmts ãåã¯ããšã©ãŒãè¿ãé¢æ°ã®if
ã¹ããŒãã¡ã³ãã®ã¿ãéèšããŸããããã¯ã tryhard
ããããå ±åããæ¹æ³ã§ããã gorm
ã®ãããªãã®ã«å¯ŸããŠãªãããã»ã©äœãã®ãã説æãããã®ã§ãã
godoc.orgã§äººæ°ã®ããããã±ãŒãžã¯ã©ã€ãã©ãªããã±ãŒãžã§ããåŸåããããããããã€ãã®å€§èŠæš¡ãªãããžã§ã¯ãã®çµ±èšã確èªããããšæããŸããã
ãããã¯ãã®ä»ã§ãã ããŸããŸç§ã«ãšã£ãŠæéèŠäºé ã ã£ã倧èŠæš¡ãªãããžã§ã¯ãïŒã€ãŸãããããã®10ã®èåŸã«ããå®éã®ããžãã¯ã¯ãããŸããïŒã ããããè©Šè¡åè£ã®ããŒã»ã³ããŒãžã§ãœãŒããããŸãã
ãããã®10ã®ãªããžããªå šäœã®è©Šè¡åè£ã®äžå€®å€ã¯59ïŒ ã§ãã
| ãããžã§ã¯ã| loc | stmtsã®å Žå| ifïŒ= nilïŒifã®ïŒ
ïŒ| åè£ãè©ŠãïŒïŒ
of ifïŒ= nilïŒ|
| --------- | ----- | --------------- | ----------------- ----- | --------------------------------- |
| github.com/juju/juju | 1026473 | 26904 | 51.9ïŒ
| 17.5ïŒ
|
| github.com/go-kit/kit | 38949 | 467 | 57.0ïŒ
| 51.9ïŒ
|
| github.com/boltdb/bolt | 12426 | 228 | 46.1ïŒ
| 53.3ïŒ
|
| github.com/hashicorp/consul | 249369 | 5477 | 47.6ïŒ
| 54.5ïŒ
|
| github.com/docker/docker | 251152 | 8690 | 48.7ïŒ
| 56.8ïŒ
|
| github.com/istio/istio | 429636 | 7564 | 40.4ïŒ
| 61.9ïŒ
|
| github.com/gohugoio/hugo | 94875 | 1853幎| 42.4ïŒ
| 64.8ïŒ
|
| github.com/etcd-io/etcd | 209603 | 4657 | 38.3ïŒ
| 65.5ïŒ
|
| github.com/kubernetes/kubernetes | 1789172 | 40289 | 43.3ïŒ
| 66.5ïŒ
|
| github.com/cockroachdb/cockroach | 1038529 | 22018 | 39.9ïŒ
| 74.0ïŒ
|
ãã¡ãããããã2ã€ã®è¡šã¯ããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ãµã³ãã«ã§ãããããªãããç¥ãããŠãããã®ã ãã§ãã ãã©ã€ããŒãã³ãŒãããŒã¹ã¯ããå€æ§æ§ã瀺ããšäººã ãçè«ä»ããŠããã®ãèŠãŠããŸããããããŸããŸãªäººã ãæçš¿ããŠããããã€ãã®æ°å€ã«åºã¥ããŠãå°ãªããšãããã€ãã®èšŒæ ããããŸãã
@thepudds ãããã¯ãéè©Šè¡åè£ããäžããææ°ã®_tryhard_ã®ããã«ã¯èŠããŸããã
@networkimprovå°ãªããšãgorm
ã®å Žåããããã¯ææ°ã®tryhard
ã®çµæã§ããããšã確èªã§ããŸãã ãéè©Šè¡åè£ãã¯ãäžèšã®è¡šã§ã¯åçŽã«å ±åãããŠããŸããã
@davedãŸããç§/ç§ãã¡ã¯ããªãã®å£°ãã¯ã£ãããšèãããããšãä¿èšŒããŸãã ç§ãã¡ã¯ãŸã ããã»ã¹ã®åæ段éã«ãããå€ãã®ããšãå€ããå¯èœæ§ããããŸããã éããžã£ã³ãããªãããã«ããŸãããã
Goãæãããšãã¯ããã£ãšä¿å®çãªã¢ãããŒããéžæããããšæããããããªãããšãç解ããŠããŸãïŒãããŠæè¬ããŠããŸãïŒã ããããšãã
@griesemeråèãŸã§ã«ãç§ãé¢ãã£ã233kè¡ã®ã³ãŒãã§ææ°ããŒãžã§ã³ã®tryhardãå®è¡ããçµæã§ããããã®å€ãã¯ãªãŒãã³ãœãŒã¹ã§ã¯ãããŸããã
--- stats ---
8760 (100.0% of 8760) functions (function literals are ignored)
2942 ( 33.6% of 8760) functions returning an error
22991 (100.0% of 22991) statements in functions returning an error
5548 ( 24.1% of 22991) if statements
2929 ( 52.8% of 5548) if <err> != nil statements
163 ( 5.6% of 2929) try candidates
0 ( 0.0% of 2929) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
2213 ( 75.6% of 2929) { return ... zero values ..., expr }
167 ( 5.7% of 2929) single statement then branch
253 ( 8.6% of 2929) complex then branch; cannot use try
14 ( 0.5% of 2929) non-empty else branch; cannot use try
ã³ãŒãã®å€ãã¯ã次ã®ãããªã€ãã£ãªã ã䜿çšããŠããŸãã
if err != nil {
return ... zero values ..., errors.Wrap(err)
}
tryhard
ããé¢æ°å
ã®ãã®ãããªãã¹ãŠã®åŒãåãåŒã䜿çšããå Žåãã€ãŸããåäžã®å
±éã®defer
ãã³ãã©ãŒã䜿çšããŠé¢æ°ãæžãæããããšãã§ããå Žåãèå¥ã§ãããšèå³æ·±ããããããŸããã
ãŠãŒã¶ãŒãšãããžã§ã¯ãã®äœæãèªååããããã®å°ããªGCPãã«ããŒããŒã«ã®çµ±èšã¯æ¬¡ã®ãšããã§ãã
$ tryhard -r .
--- stats ---
129 (100.0% of 129) functions (function literals are ignored)
75 ( 58.1% of 129) functions returning an error
725 (100.0% of 725) statements in functions returning an error
164 ( 22.6% of 725) if statements
93 ( 56.7% of 164) if <err> != nil statements
64 ( 68.8% of 93) try candidates
0 ( 0.0% of 93) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
17 ( 18.3% of 93) { return ... zero values ..., expr }
7 ( 7.5% of 93) single statement then branch
1 ( 1.1% of 93) complex then branch; cannot use try
0 ( 0.0% of 93) non-empty else branch; cannot use try
ãã®åŸãç§ã¯å
ã«é²ãã§ããŸã err
å€æ°ãåŠçããŠããã³ãŒãå
ã®ãã¹ãŠã®å Žæããã§ãã¯ããŠãæå³ã®ãããã¿ãŒã³ãèŠã€ããããšãã§ãããã©ããã確èªããŸããã
err
åéããããã€ãã®å Žæã§ã¯ãæåã®ãšã©ãŒã§å®è¡ãåæ¢ããã®ã§ã¯ãªããå®è¡ã®æåŸã«1åçºçãããã¹ãŠã®ãšã©ãŒã確èªã§ããããã«ããŸãã ãã¶ãããããè¡ãå¥ã®æ¹æ³ããããããã¯try
ãšããŸãçµ±åããããããã«ããšã©ãŒã®ãµããŒãã®äœããã®åœ¢åŒãGoèªäœã«è¿œå ãããŸãã
var errs []error
for _, p := range toDelete {
fmt.Println("delete:", p.ProjectID)
if err := s.DeleteProject(ctx, p.ProjectID); err != nil {
errs = append(errs, err)
}
}
ãã®ã³ã¡ã³ããããäžåºŠèªãã åŸãçªç¶å€ãã®æœåšçãªtry
ã±ãŒã¹ãç§ã®æ³šæãåŒããã ãããã¯ãã¹ãŠãåŒã³åºãå
ã®é¢æ°ããåŒã³åºãããé¢æ°ã®ãšã©ãŒããåŒã³åºãããé¢æ°ããã§ã«ãšã©ãŒã«è¿œå ããŠããå¯èœæ§ã®ããæ
å ±ã§è£
食ããŠãããšããç¹ã§é¡äŒŒããŠããŸãã
func run() error {
key := "MY_ENV_VAR"
client, err := ClientFromEnvironment(key)
if err != nil {
// "github.com/pkg/errors"
return errors.Wrap(err, key)
}
// do something with `client`
}
func ClientFromEnvironment(key string) (*http.Client, error) {
filename, ok := os.LookupEnv(key)
if !ok {
return nil, errors.New("environment variable not set")
}
return ClientFromFile(filename)
}
æ確ã«ããããã«ãããã§ãGoããã°ããéèŠãªéšåãåŒçšããŸãã
ã³ã³ããã¹ããèŠçŽããã®ã¯ãšã©ãŒå®è£ ã®è²¬ä»»ã§ãã os.Openã«ãã£ãŠè¿ããããšã©ãŒã¯ããpermissiondeniedãã ãã§ãªããopen / etc / passwdïŒpermissiondeniedããšããŠãã©ãŒããããããŸãã Sqrtã«ãã£ãŠè¿ããããšã©ãŒã«ã¯ãç¡å¹ãªåŒæ°ã«é¢ããæ å ±ããããŸããã
ããã念é ã«çœ®ããŠãäžèšã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func run() error {
key := "MY_ENV_VAR"
client := try(ClientFromEnvironment(key))
// do something with `client`
}
func ClientFromEnvironment(key string) (*http.Client, error) {
filename, ok := os.LookupEnv(key)
if !ok {
return nil, fmt.Errorf("environment variable not set: %s", key)
}
return ClientFromFile(filename)
}
äžèŠãããã¯å°ããªå€æŽã®ããã«èŠããŸãããç§ã®èŠç©ããã§ã¯ã try
ãå®éã«ãé¢æ°ãã§ãŒã³ãããé©åã«ãããäžè²«æ§ã®ãããšã©ãŒåŠçããœãŒã¹ãŸãã¯ããã±ãŒãžã«è¿ã¥ããããã«ä¿ããŠããããšãæå³ããŸãã
å
šäœãšããŠã try
ãé·æçã«ãããã䟡å€ã¯ãç§ãçŸåšèŠãŠããæœåšçãªåé¡ãããé«ããšæããŸãã
try
ãå¶åŸ¡ãããŒãå€æŽããŠãããããããŒã¯ãŒãã®æ¹ããæ°åãè¯ããå ŽåããããŸããtry
ã䜿çšãããšã return err
ã®å Žåã«ãããã°ã¹ããããŒãé
眮ã§ããªããªããŸãããããã®æžå¿µã¯GoããŒã ã«ãã§ã«ç¥ãããŠããã®ã§ããããããçŸå®ã®äžçãã§ã©ã®ããã«æ©èœããããç¥ããããšæããŸãã ãã¹ãŠã®ã¡ãã»ãŒãžãèªãã§è¿ä¿¡ããŠããã ããããããšãããããŸãã
以åerror
ãè¿ããªãã£ãé¢æ°ã·ã°ããã£ãä¿®æ£ããŸããã ãããèŠã€ããŠãããŠããããšã@magical ïŒ
func main() { key := "MY_ENV_VAR" client := try(ClientFromEnvironment(key)) // do something with `client` }
@mrkanister Nitpickingã§ããã main
ã¯error
ãè¿ããªãããããã®äŸã§ã¯å®éã«ã¯try
ã䜿çšã§ããŸããã
ããã¯æè¬ã®ã³ã¡ã³ãã§ãã
ã¬ãŒããã³ã°ãšä»ã®ãã¹ãŠã®äººã«@griesemerã«æè¬ããŸããããªãã¯ãã®åé¡ãšä»ã®å Žæã§ãã£ãŠããŸãã
ãã®ãããªè¡ãå€æ°ããå ŽåïŒhttps://github.com/golang/go/issues/32437#issuecomment-509974901ããïŒïŒ
if !ok {
return nil, fmt.Errorf("environment variable not set: %s", key)
}
ããã€ãã®æ¡ä»¶ãçã®å Žåã«ã®ã¿énilãšã©ãŒãè¿ããã«ããŒé¢æ°ã䜿çšã§ããŸãã
try(condErrorf(!ok, "environment variable not set: %s", key))
äžè¬çãªãã¿ãŒã³ãç¹å®ãããã°ãæåã¯ããã±ãŒãžã¬ãã«ã§ãæçµçã«ã¯æšæºã©ã€ãã©ãªã«å°éãããŸã§ãããããªãã«ããŒã§ãããã®å€ããåŠçã§ããããã«ãªããšæããŸãã ãã©ã€ããŒãã¯çŽ æŽãããã§ããããã¯çŽ æŽãããä»äºãããŠããŠãããããã®èå³æ·±ãæ å ±ãäžããŠããŸããããããã£ãšãããããããŸãã
@zeeboãªã©ã«ããåäžè¡ã®ifææ¡ã«å ããŠãifã¹ããŒãã¡ã³ãã¯!= nil
ãšäžæ¬åŒ§ãåé€ããã³ã³ãã¯ããªåœ¢åŒã«ããããšãã§ããŸãã
if err return err
if err return errors.Wrap(err, "foo: failed to boo")
if err return fmt.Errorf("foo: failed to boo: %v", err)
ããã¯ã·ã³ãã«ã§è»œéã§èªã¿ããããšæããŸãã 2ã€ã®éšåããããŸãïŒ
if variable return ...
ã®ãµããŒããè¿œå ããŸãã return
ã¯å·ŠåŽã«éåžžã«è¿ãã®ã§ãã³ãŒããã¹ããã³ã°ããã®ã¯ãŸã éåžžã«ç°¡åãªããã§ã-ããããããšã®äœåãªé£ããã¯ãåäžè¡ã®ifïŒïŒïŒã«å¯Ÿããäž»ãªè°è«ã®1ã€ã§ãã Goã«ã¯ãããšãã°ifã¹ããŒãã¡ã³ãããæ¬åŒ§ãåé€ãããªã©ããŠæ§æãåçŽåããåäŸããã§ã«ãããŸããçŸåšã®ã¹ã¿ã€ã«ïŒ
a, err := BusinessLogic(state)
if err != nil {
return nil, err
}
1è¡ã®å ŽåïŒ
a, err := BusinessLogic(state)
if err != nil { return nil, err }
次ã®å Žåã®1è¡ã³ã³ãã¯ãïŒ
a, err := BusinessLogic(state)
if err return nil, err
a, err := BusinessLogic(state)
if err return nil, errors.Wrap(err, "some context")
func (c *Config) Build() error {
pkgPath, err := c.load()
if err return nil, errors.WithMessage(err, "load config dir")
b := bytes.NewBuffer(nil)
err = templates.ExecuteTemplate(b, "main", c)
if err return nil, errors.WithMessage(err, "execute main template")
buf, err := format.Source(b.Bytes())
if err return nil, errors.WithMessage(err, "format main template")
target := fmt.Sprintf("%s.go", filename(pkgPath))
err = ioutil.WriteFile(target, buf, 0644)
if err return nil, errors.WithMessagef(err, "write file %s", target)
// ...
}
@ eug48 ïŒ32611ãåç §
ã¢ãã¬ãã®ãã©ã€ããŒãçµ±èšã¯æ¬¡ã®ãšããã§ãïŒãã³ããŒã®ã³ãŒããé€ãgoã³ãŒãã®è¡ïŒ2,282,731ïŒïŒ
--- stats ---
117551 (100.0% of 117551) functions (function literals are ignored)
35726 ( 30.4% of 117551) functions returning an error
263725 (100.0% of 263725) statements in functions returning an error
50690 ( 19.2% of 263725) if statements
25042 ( 49.4% of 50690) if <err> != nil statements
12091 ( 48.3% of 25042) try candidates
36 ( 0.1% of 25042) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
3561 ( 14.2% of 25042) { return ... zero values ..., expr }
3304 ( 13.2% of 25042) single statement then branch
4966 ( 19.8% of 25042) complex then branch; cannot use try
296 ( 1.2% of 25042) non-empty else branch; cannot use try
人ã ããŸã 代æ¿æ¡ãææ¡ããŠããããšãèãããšãææ¡ãããæ°ãããšã©ãŒåŠçæ©èœã«å¯ŸããŠãããåºç¯ãªGoã³ãã¥ããã£ãå®éã«æãã§ããæ©èœãäœã§ãããããã詳现ã«ç¥ããããšæããŸãã
ããŸããŸãªæ©èœã人ã ãææ¡ããŠãããšã©ãŒåŠçæ©èœã®äžéšããªã¹ããã調æ»ããŸãšããŸããã ç§ã¯æ éã«_ææ¡ãããåœåãŸãã¯æ§æãçç¥ããŸãã_ããããŠãã¡ãããç§èªèº«ã®æèŠãæ¯æããã®ã§ã¯ãªãã調æ»ãäžç«ã«ããããã«åªããŸããã
åå ãåžæããå Žåã¯ãå ±æçšã«ççž®ããããªã³ã¯ã次ã«ç€ºããŸãã
https://forms.gle/gaCBgxKRE4RMCz7c7
åå ãããã¹ãŠã®äººãèŠçŽçµæãèŠãããšãã§ããã¯ãã§ãã ããããããã¯è°è«ã«éäžããã®ã«åœ¹ç«ã€ãããããŸãããïŒ
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
ãã®å Žåãã³ã³ããã¹ããè¿œå ããé 延ãã³ãã©ãŒã¯æ©èœããŸãããããããšãæ©èœããŸããïŒ ããã§ãªãå Žåã¯ãå¯èœã§ããã°ãéåžžã«é«éã«çºçãããããç¹ã«ãããŸã§ã®æšæºçãªæ¹æ³ã§ãããããããèŠãããããããšããå§ãããŸãã
ããããããŠtry
ã玹ä»ããŠãã ãããããã«ãããããã®ãŠãŒã¹ã±ãŒã¹ãèŠã€ãããŸããã
--- stats ---
929 (100.0% of 929) functions (function literals are ignored)
230 ( 24.8% of 929) functions returning an error
1480 (100.0% of 1480) statements in functions returning an error
320 ( 21.6% of 1480) if statements
206 ( 64.4% of 320) if <err> != nil statements
109 ( 52.9% of 206) try candidates
2 ( 1.0% of 206) <err> name is different from "err"
--- non-try candidates (-l flag lists file positions) ---
53 ( 25.7% of 206) { return ... zero values ..., expr }
18 ( 8.7% of 206) single statement then branch
17 ( 8.3% of 206) complex then branch; cannot use try
2 ( 1.0% of 206) non-empty else branch; cannot use try
@lpar代æ¿æ¡ã«ã€ããŠè©±ãåãããšã¯å€§æè¿ã§ããããã®å·ã§ã¯ãããè¡ããªãã§ãã ããã ããã¯try
ã®ææ¡ã«ã€ããŠã§ãã æé©ãªå Žæã¯ãå®éã«ã¯ã¡ãŒãªã³ã°ãªã¹ãã®1ã€ãããšãã°go-nutsã§ãã 課é¡ãã©ãã«ãŒã¯ãäžè¬çãªè°è«ã§ã¯ãªããç¹å®ã®åé¡ã远跡ããŠè°è«ããã®ã«æé©ã§ãã ããããšãã
@fabstu defer
ãã³ãã©ãŒã¯ã try
ã®æç¡ã«ãããããããã®äŸã§ã¯åé¡ãªãæ©èœããŸãã å²ã¿é¢æ°ã䜿çšããŠã³ãŒããæ¡åŒµããïŒ
func f() (err error) {
defer func() {
if err != nil {
err = decorate(err, "msg") // here you can modify the result error as you please
}
}()
...
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
...
}
ïŒçµæerr
ã¯return err
ã«ãã£ãŠèšå®ããã return
ã«ãã£ãŠäœ¿çšãããerr
$ã¯ã if
ã§ããŒã«ã«ã«å®£èšããããã®ã§ããããšã«æ³šæããŠãã ããã
ãŸãã¯ã try
ã䜿çšãããšãããŒã«ã«ã®err
å€æ°ãäžèŠã«ãªããŸãã
func f() (err error) {
defer func() {
if err != nil {
err = decorate(err, "msg") // here you can modify the result error as you please
}
}()
...
try(os.Setenv("GO111MODULE", "on"))
...
}
ãããŠããããããææ¡ãããerrors/errd
é¢æ°ã®1ã€ã䜿çšããããšæãã§ãããã
func f() (err error) {
defer errd.Wrap(&err, ... )
...
try(os.Setenv("GO111MODULE", "on"))
...
}
ãããŠãã©ããã³ã°ããå¿ èŠããªãå Žåã¯ã次ã®ããã«ãªããŸãã
func f() error {
...
try(os.Setenv("GO111MODULE", "on"))
...
}
@fastuãããŠæåŸã«ã try
ãªãã§ãerrors/errd
ã䜿çšã§ãã次ã®ããã«ãªããŸãã
func f() (err error) {
defer errd.Wrap(&err, ... )
...
if err := os.Setenv("GO111MODULE", "on"); err != nil {
return err
}
...
}
èããã°èããã»ã©ããã®ææ¡ã奜ãã«ãªããŸãã
ç§ãéªéããå¯äžã®ããšã¯ãã©ãã§ãååä»ããªã¿ãŒã³ã䜿çšããããšã§ãã ããã¯æçµçã«è¯ãç¿æ
£ã§ãããç§ã¯ããã䜿ãã¹ãã§ããïŒè©Šããããšã¯ãããŸããïŒïŒ
ãšã«ãããç§ã®ãã¹ãŠã®ã³ãŒããå€æŽããåã«ãããã¯ãã®ããã«æ©èœããŸããïŒ
func f() error {
var err error
defer errd.Wrap(&err,...)
try(...)
}
@flibustenetååä»ãçµæãã©ã¡ãŒã¿ãŒèªäœã¯æªãç¿æ
£ã§ã¯ãããŸããã ååä»ãçµæã«é¢ããéåžžã®æžå¿µã¯ãããããnaked returns
ãæå¹ã«ããããšã§ãã ã€ãŸããå®éã®çµæã_ return
_ã§æå®ããå¿
èŠãªãã«ã return
ãšç°¡åã«æžãããšãã§ããŸãã äžè¬ã«ïŒåžžã«ã§ã¯ãããŸãããïŒããã®ãããªæ¹æ³ã§ã¯ã return
ã¹ããŒãã¡ã³ããåçŽã«èŠãŠçµæãçµè«ä»ããããšãã§ããªããããã³ãŒããèªãã ãæšè«ãããããã®ãé£ãããªããŸãã çµæãã©ã¡ãŒã¿ã«ã€ããŠã³ãŒããã¹ãã£ã³ããå¿
èŠããããŸãã çµæå€ã®èšå®ãªã©ãèŠéãå¯èœæ§ããããŸãã ãã®ãããäžéšã®ã³ãŒãããŒã¹ã§ã¯ããã€ããããªã¿ãŒã³ã¯åã«æšå¥šãããŠããŸããã
ãã ããåè¿°ããããã«ããšã©ãŒãçºçããå Žåã«çµæãç¡å¹ã§ããå Žåã¯ããšã©ãŒãèšå®ããŠæ®ããç¡èŠããŠãåé¡ãããŸããã ãã®ãããªå Žåã®ãã€ããããªã¿ãŒã³ã¯ããšã©ãŒçµæãäžè²«ããŠèšå®ãããŠããéããå®å
šã«åé¡ãããŸããã try
ã¯ãŸãã«ãããä¿èšŒããŸãã
æåŸã«ãååä»ãçµæãã©ã¡ãŒã¿ãŒã¯ããšã©ãŒãªã¿ãŒã³ãdefer
ã§æ¡åŒµããå Žåã«ã®ã¿å¿
èŠã§ãã èšèšããã¥ã¡ã³ãã§ã¯ããšã©ãŒçµæã«ã¢ã¯ã»ã¹ããããã®å¥ã®ãã«ãã€ã³ãæäŸããå¯èœæ§ã«ã€ããŠãç°¡åã«èª¬æããŠããŸãã ããã«ãããååä»ãè¿åãå®å
šã«äžèŠã«ãªããŸãã
ã³ãŒãäŸã«ã€ããŠïŒ try
_always_ã¯_resultãšã©ãŒ_ïŒãã®å Žåã¯ååãªãïŒãèšå®ãããããããã¯æåŸ
ã©ããã«æ©èœããŸããã ããããããªãã¯å¥ã®ããŒã«ã«å€æ°err
ã宣èšããŠããŠã errd.Wrap
ã¯ãã®å€æ°ã§åäœããŸãã try
ã§ã¯èšå®ãããŸããã
ã¯ã€ãã¯ãšã¯ã¹ããªãšã³ã¹ã¬ããŒãïŒæ¬¡ã®ãããªHTTPãªã¯ãšã¹ããã³ãã©ãŒãäœæããŠããŸãã
func Handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
id := chi.URLParam(r, "id")
var err error
// starts as bad request, then it's an internal server error after we parse inputs
var statusCode = http.StatusBadRequest
defer func() {
if err != nil {
wrap := xerrors.Errorf("handler fail: %w", err)
logger.With(zap.Error(wrap)).Error("error")
http.Error(w, wrap.Error(), statusCode)
}
}()
var c Thingie
err = unmarshalBody(r, &c)
if err != nil {
return
}
statusCode = http.StatusInternalServerError
s, err := DoThing(ctx, c)
if err != nil {
return
}
d, err := DoThingWithResult(ctx, id, s)
if err != nil {
return
}
data, err := json.Marshal(detail)
if err != nil {
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
_, err = w.Write(data)
if err != nil {
return
}
}
äžèŠãããšãããã¯try
ã®çæ³çãªåè£ã®ããã«èŠããŸããããã¯ãã¡ãã»ãŒãžãè¿ã以å€ã«äœãããããšããªããšã©ãŒåŠçãããããããããã§ãããããã¯ãã¹ãŠå»¶æã§ããŸãã ãã ãããªã¯ãšã¹ããã³ãã©ã¯error
ãè¿ããªãããã try
ã䜿çšããããšã¯ã§ããŸããã ããã䜿çšããã«ã¯ã眲åfunc() error
ã§æ¬äœãã¯ããŒãžã£ãŒã§å
ãå¿
èŠããããŸãã ããã¯...éæ³ã ãšæããŸãããã®ããã«èŠããã³ãŒãã¯ãããäžè¬çãªãã¿ãŒã³ã ãšæããŸãã
@jonbodner
ããã¯æ©èœããŸãïŒhttps://play.golang.org/p/NaBââZe-QShpuïŒïŒ
package main
import (
"errors"
"fmt"
"golang.org/x/xerrors"
)
func main() {
var err error
defer func() {
filterCheck(recover())
if err != nil {
wrap := xerrors.Errorf("app fail (at count %d): %w", ct, err)
fmt.Println(wrap)
}
}()
check(retNoErr())
n, err := intNoErr()
check(err)
n, err = intErr()
check(err)
check(retNoErr())
check(retErr())
fmt.Println(n)
}
func check(err error) {
if err != nil {
panic(struct{}{})
}
}
func filterCheck(r interface{}) {
if r != nil {
if _, ok := r.(struct{}); !ok {
panic(r)
}
}
}
var ct int
func intNoErr() (int, error) {
ct++
return 0, nil
}
func retNoErr() error {
ct++
return nil
}
func intErr() (int, error) {
ct++
return 0, errors.New("oops")
}
func retErr() error {
ct++
return errors.New("oops")
}
ãããæåã®åå¯Ÿç¥šïŒ è¯ãã å®çšäž»çŸ©ãããªããéããŠæµããããã«ããŸãããã
äžéšã®ã³ãŒãããŒã¹ã§tryhard
ãå®è¡ããŸããã æ®å¿µãªãããç§ã®ããã±ãŒãžã®äžã«ã¯ãã¡ãœãããã«ã¹ã¿ã ãšã©ãŒå®è£
ã䜿çšããŠãããããããªã倧ããã«ããããããã 0
è©Šè¡åè£ãå«ãŸããŠãããã®ããããŸãã ããšãã°ããµãŒããŒãæ§ç¯ãããšãããã¡ã€ã«ã·ã¹ãã ãã¹ãã·ã¹ãã æ
å ±ãªã©ãã³ã³ãã€ã«æã«çºçããªãããã«ãããžãã¹ããžãã¯ã¬ã€ã€ãŒã¡ãœãããerror
ã§ã¯ãªãSanitizedError
ã®ã¿ãåºåããã®ã奜ãã§ãããšã©ãŒã¡ãã»ãŒãžã§ãŠãŒã¶ãŒã«ãªãŒã¯ããŸãã
ããšãã°ããã®ãã¿ãŒã³ã䜿çšããã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
func (a *App) GetFriendsOfUser(userId model.Id) ([]*model.User, SanitizedError) {
if user, err := a.GetUserById(userId); err != nil {
// (*App).GetUserById returns (*model.User, SanitizedError)
// This could be a try() candidate.
return err
} else if user == nil {
return NewUserError("The specified user doesn't exist.")
}
friends, err := a.Store.GetFriendsOfUser(userId)
// (*Store).GetFriendsOfUser returns ([]*model.User, error)
// This could be a SQL error or a network error or who knows what.
return friends, NewInternalError(err)
}
å²ãã§ããé¢æ°ãštryé¢æ°åŒã®äž¡æ¹ã®æåŸã®æ»ãå€ããšã©ãŒãå®è£ ããåãã¿ã€ãã§ããéããçŸåšã®ææ¡ãç·©åããŠæ©èœãããããšãã§ããªãçç±ã¯ãããŸããïŒ ããã«ãããå ·äœçãªnil->ã€ã³ã¿ãŒãã§ã€ã¹ã®æ··ä¹±ãåé¿ã§ããŸãããäžèšã®ãããªç¶æ³ã§ã®è©Šè¡ãå¯èœã«ãªããŸãã
@jonbodner ãããªãã®äŸã«æè¬ããŸãã ç§ã¯ãã®ã³ãŒãã次ã®ããã«æžããŸãïŒç¿»èš³ãšã©ãŒã«ããããããïŒïŒ
func Handler(w http.ResponseWriter, r *http.Request) {
statusCode, err := internalHandler(w, r)
if err != nil {
wrap := xerrors.Errorf("handler fail: %w", err)
logger.With(zap.Error(wrap)).Error("error")
http.Error(w, wrap.Error(), statusCode)
}
}
func internalHandler(w http.ResponseWriter, r *http.Request) (statusCode int, err error) {
ctx := r.Context()
id := chi.URLParam(r, "id")
// starts as bad request, then it's an internal server error after we parse inputs
statusCode = http.StatusBadRequest
var c Thingie
try(unmarshalBody(r, &c))
statusCode = http.StatusInternalServerError
s := try(DoThing(ctx, c))
d := try(DoThingWithResult(ctx, id, s))
data := try(json.Marshal(detail))
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
try(w.Write(data))
return
}
ããã¯2ã€ã®é¢æ°ã䜿çšããŸãããã¯ããã«çãïŒ29è¡å¯Ÿ40è¡ïŒ-ãããŠç§ã¯é©åãªééã䜿çšããŸãã-ãããŠãã®ã³ãŒãã¯defer
ãå¿
èŠãšããŸããã ç¹ã«defer
ã¯ãéäžã§statusCodeãå€æŽããã defer
ã§äœ¿çšããããããå
ã®ã³ãŒããå¿
èŠä»¥äžã«è¿œè·¡ããã®ãé£ãããªããŸãã æ°ããã³ãŒãã¯ãååä»ãã®çµæãšãã€ããããªã¿ãŒã³ïŒå¿
èŠã«å¿ããŠreturn statusCode, nil
ã«ç°¡åã«çœ®ãæããããšãã§ããŸãïŒã䜿çšããŸããããšã©ãŒåŠçããããžãã¹ããžãã¯ãããæ確ã«åé¢ãããããããã·ã³ãã«ã§ãã
å¥ã®åé¡ã«ã³ã¡ã³ããåæçš¿ããŠãã ããhttps://github.com/golang/go/issues/32853#issuecomment-510340544
å¥ã®ãã©ã¡ãŒã¿ãŒfuncname
ãæäŸã§ããã°ãããã¯çŽ æŽãããããšã ãšæããŸããããã§ãªããã°ãã©ã®é¢æ°ãããšã©ãŒãè¿ããããã¯ããããŸããã
func foo() error {
handler := func(err error, funcname string) error {
return fmt.Errorf("%s: %v", funcname, err) // wrap something
//return nil // or dismiss
}
a, b := try(bar1(), handler)
c, d := try(bar2(), handler)
}
@ccbrownããªãã®äŸã¯äžèšãšåãæ±ãã«é©ããŠããã®ã ãããã ã€ãŸããå éšãšã©ãŒãïŒã©ãã§ãã©ããããã®ã§ã¯ãªãïŒåºãåã«ïŒå²ã¿é¢æ°ã«ãã£ãŠïŒäžåºŠã©ãããããããã«ã³ãŒããå æ°å解ããããšãçã«ããªã£ãŠããå Žåã§ãã ãšã©ãŒã©ããã³ã°ãã©ãã§ãã§ã¯ãªã1ã€ã®å Žæã«éäžãããã®ã§ãïŒã·ã¹ãã ã«ã€ããŠããŸãç¥ããªããŠãïŒãããæãŸããããã«æããŸãã
ããããããªãã®è³ªåã«é¢ããŠïŒç§ã¯try
ãããäžè¬çãªãšã©ãŒã¿ã€ããåãå
¥ããããã«ããããšãèããªããã°ãªããŸããïŒãããŠ1ã€ãè¿ããŸãïŒã çŸæç¹ã§ã¯åé¡ã¯ãããŸãããïŒèª¬æãããè€éãªå Žåãé€ããŠïŒãçµå±åé¡ãããå¯èœæ§ããããŸãã
ãããã®ç·ã«æ²¿ã£ãŠã try
ãäžè¬åããŠã error
ã¿ã€ãã ãã§ãªããä»»æã®ã¿ã€ãã§æ©èœãããã¹ãerr != nil
ãæ©èœãããã©ãããæ©ã段éã§çåã«æããŸããã x != zero
ã«ãªããŸããããã§ã x
ã¯err
ïŒæåŸã®çµæïŒã«çžåœãã zero
ã¯x
ã®ã¿ã€ãã®ããããã®ãŒãå€ã§ãã bool
ã®ãŒãå€ã¯false
ã§ããã ok != false
ã¯æ£ç¢ºã«ãã¹ãããããã®ã®å察ã§ãã
@lunnyææ¡ãããããŒãžã§ã³ã®try
ã¯ããã³ãã©ãŒé¢æ°ãåãå
¥ããŸããã
@griesemerããã æ®å¿µãªããšã§ãïŒ ãã以å€ã®å Žåã¯ã github.com/pkg/errors
ãšãã¹ãŠã®errors.Wrap
ãåé€ã§ããŸãã
@ccbrownããªãã®äŸã¯äžèšãšåãæ±ãã«é©ããŠããã®ã ãããã ã€ãŸããå éšãšã©ãŒãïŒã©ãã§ãã©ããããã®ã§ã¯ãªãïŒåºãåã«ïŒå²ã¿é¢æ°ã«ãã£ãŠïŒäžåºŠã©ãããããããã«ã³ãŒããå æ°å解ããããšãçã«ããªã£ãŠããå Žåã§ãã ãšã©ãŒã©ããã³ã°ãã©ãã§ãã§ã¯ãªã1ã€ã®å Žæã«éäžãããã®ã§ãïŒã·ã¹ãã ã«ã€ããŠããŸãç¥ããªããŠãïŒãããæãŸããããã«æããŸãã
@griesemerå²ãã§ããé¢æ°ã®ä»£ããã«error
ãè¿ããšãåãšã©ãŒãå
éšãšã©ãŒããŠãŒã¶ãŒãšã©ãŒãæ¿èªãšã©ãŒãªã©ã«åé¡ããã®ãå¿ããããšãã§ããŸãããã®ãŸãŸã§ã¯ãã³ã³ãã€ã©ã¯ããããã£ãããã try
ã䜿çšããŸãã
try
ã®ãã¶ã€ã³ã奜ãã ãšèšãããã®ã§ããã try
ã䜿çšããŠããéã defer
ãã³ãã©ãŒã«ã¯ãŸã if
ã¹ããŒãã¡ã³ãããããŸãã try
ãšdefer
ãã³ãã©ãŒããªãif
ã¹ããŒãã¡ã³ããããç°¡åã ãšã¯æããŸããã ãã¶ãã try
ã ãã䜿çšããæ¹ãã¯ããã«è¯ãã§ãããã
@ccbrownäºè§£ããŸããã æ¯ãè¿ã£ãŠã¿ããšãããªããææ¡ãããªã©ã¯ãŒãŒã·ã§ã³ã¯åé¡ãªããšæããŸãã é¢é£ãããã¹ããx != nil
ã®ãŸãŸã§ããéãã try
ãç·©åããŠã error
ã ãã§ãªããä»»æã®ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãïŒããã³äžèŽããçµæã¿ã€ãïŒã§åäœã§ãããšæããŸãã ã èããã¹ãããšã ããã¯ãäžäœäºææ§ã®ããå€æŽã§ãããšç§ãä¿¡ããŠãããããæ©æã«ããŸãã¯é¡åçã«è¡ãããšãã§ããŸãã
@jonbodnerã®äŸãããã³@griesemerããããæžãçŽããæ¹æ³ã¯ããŸãã«ç§ãæ¬åœã«try
ã䜿çšãããã³ãŒãã®çš®é¡ã§ãã
誰ããã®ã¿ã€ãã®tryã®äœ¿çšã«æ©ãŸãããŠããŸããïŒ
ããŒã¿ïŒ= tryïŒjson.MarshalïŒdetailïŒïŒ
ããŒã·ã£ãªã³ã°ãšã©ãŒãèšè¿°ãããã³ãŒãã§æ£ããè¡ãèŠã€ããçµæã«ãªãå¯èœæ§ããããšããäºå®ã«ããããããããããè¡çªå·/åŒã³åºãå æ å ±ãå«ãŸããŠããªã裞ã®ãšã©ãŒãè¿ãããããšãç¥ã£ãŠããã ãã§äžå¿«ã«æããŸãã ãœãŒã¹ãã¡ã€ã«ãé¢æ°åãããã³è¡çªå·ãç¥ãããšã¯ãéåžžããšã©ãŒãåŠçãããšãã«ç§ãå«ãããã®ã§ãã å€åç§ã¯äœãã誀解ããŠããŸãã
@griesemerããã§ä»£æ¿æ¡ã«ã€ããŠè©±ãåãäºå®ã¯ãããŸããã§ããã 誰ãã代æ¿æ¡ãææ¡ãç¶ããŠãããšããäºå®ã¯ã人ã ãå®éã«äœãæãã§ããã®ãã調ã¹ãããã®èª¿æ»ãè¯ãèãã§ãããšç§ãæãçç±ã§ãã Goãšã©ãŒåŠçã®æ¹åã®å¯èœæ§ã«é¢å¿ã®ããã§ããã ãå€ãã®äººã ãæãŸããããã«ãããã«æçš¿ããŸããã
@ trende-jpç§ã¯æ¬åœã«ãã®ã³ãŒãè¡ã®ã³ã³ããã¹ãã«äŸåããŠããŸã-ããèªäœã§ã¯ãæå³ã®ããæ¹æ³ã§å€æããããšã¯ã§ããŸããã ãããjson.Marshal
ãžã®å¯äžã®åŒã³åºãã§ããããšã©ãŒãå¢ããããå Žåã¯ã if
ã¹ããŒãã¡ã³ããæé©ãªå ŽåããããŸãã json.Marshal
ã®åŒã³åºããããããããå Žåããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããã«ã¯ã defer
ã䜿çšãããšããŸãããå¯èœæ§ããããŸãã ãŸãã¯ããšã©ãŒãè¿ãããŒã«ã«ã¯ããŒãžã£å
ã«ããããã¹ãŠã®åŒã³åºããã©ããããããšã«ãã£ãŠã å¿
èŠã«å¿ããŠïŒã€ãŸããåãé¢æ°ã«ãã®ãããªåŒã³åºããå€æ°ããå ŽåïŒããããã©ã®ããã«å æ°å解ã§ãããã«ã€ããŠã¯ãããŸããŸãªæ¹æ³ããããŸãã ããšã©ãŒã¯å€ã§ããã¯ããã§ãåœãŠã¯ãŸããŸããã³ãŒãã䜿çšããŠãšã©ãŒåŠçã管çããããããŸãã
try
ã¯ããã¹ãŠã®ãšã©ãŒåŠçã®åé¡ã解決ããããã§ã¯ãããŸãããããã¯æå³ããããšã§ã¯ãããŸããã ããã¯ãããŒã«ããã¯ã¹å
ã®åãªãå¥ã®ããŒã«ã§ãã ãããŠãããã¯å®éã«ã¯æ°ããæ©æ¢°ã§ããããŸãããããã¯ãã»ãŒ10幎ã®éã«é »ç¹ã«èŠ³å¯ããããã¿ãŒã³ã®æ§æç³è¡£ã®äžçš®ã§ãã äžéšã®ã³ãŒãã§ã¯éåžžã«ããŸãæ©èœããä»ã®ã³ãŒãã§ãããŸã圹ã«ç«ããªããšãã蚌æ ãããã€ããããŸãã
@ trende-jp
defer
ã§è§£æ±ºã§ããŸãããïŒ
defer fmt.HandleErrorf(&err, "decoding %q", path)
ãšã©ãŒã¡ãã»ãŒãžã®è¡çªå·ã¯ãããã°ã§ç€ºããããã«è§£æ±ºããããšãã§ããŸãïŒ ãtryãã®äœ¿çšæ¹æ³ã
@ trende-jp @faifaceè¡çªå·ã«å ããŠããã³ã¬ãŒã¿æååãå€æ°ã«æ ŒçŽã§ããŸãã ããã«ããã倱æããŠããç¹å®ã®é¢æ°åŒã³åºããåé¢ã§ããŸãã
ããã¯çµ¶å¯Ÿã«çµã¿èŸŒã¿é¢æ°ã§ãã£ãŠã¯ãªããªããšæ¬åœã«æããŸãã
panic()
ãšrecover()
ãå¶åŸ¡ãããŒãå€æŽããããšãäœåºŠãèšåãããŠããŸãã ããŠããã以äžè¿œå ããªãããã«ããŸãããã
@networkimprovã¯https://github.com/golang/go/issues/32437#issuecomment-498960081ãæžã蟌ã¿ãŸããïŒ
Goã®ããã«ã¯èªããŸããã
ãã以äžåæã§ããŸããã§ããã
ã©ã¡ãããšããã°ãæ ¹æ¬çãªåé¡ã«å¯ŸåŠããããã®ã¡ã«ããºã ããããšæããŸãïŒãããŠãããããããã©ããã¯ããããŸããïŒãããã¯ããŒã¯ãŒãïŒãŸãã¯ããŒèšå·ïŒïŒã«ãã£ãŠããªã¬ãŒãããå¿ èŠããããŸãã
go func()
ãgo(func())
ã«ãªããšããããã©ãæããŸããïŒ
try
é¢æ°ã®ä»£ããã«bangïŒïŒïŒã䜿çšããŠã¯ã©ãã§ããããã ããã«ãããé¢æ°ãã§ãŒã³ãå¯èœã«ãªããŸãã
func foo() {
f := os.Open!("")
defer f.Close()
// etc
}
func bar() {
count := mustErr!().Read!()
}
@sylr
go funcïŒïŒãgoïŒfuncïŒïŒïŒã«ãªã£ããšãããã©ãæããŸããïŒ
ãããããã¯ããªãåãå ¥ããããã§ãããã
@sylrããããšãããããŸããããã®ã¹ã¬ããã§ä»£æ¿æ¡ãåéããŠããŸããã éäžåãç¶æããæ¹æ³ã«ã€ããŠã¯ããã¡ããã芧ãã ããã
ããªãã®ã³ã¡ã³ãã«ã€ããŠïŒGoã¯èªçšè«çãªèšèªã§ã-ããã«çµã¿èŸŒã¿ã䜿çšããããšã¯èªçšè«çãªéžæã§ãã ãã¶ã€ã³ããã¥ã¡ã³ãã§è©³çŽ°ã«èª¬æãããŠããããã«ãããŒã¯ãŒãã䜿çšãããããããã€ãã®å©ç¹ããããŸãã try
ã¯ã$ïŒ$ 2 append
ïŒ$ã®ããã«ãäžè¬çãªãã¿ãŒã³ã®åãªãæ§æç³è¡£ã§ããããšã«æ³šæããŠãã ããïŒGoã®äž»èŠãªæ©èœãå®è£
ããä»ã®Goã¡ã«ããºã ã§ã¯å®è£
ã§ããªãgo
ãšã¯å¯Ÿç
§çã§ãïŒã ã copy
ãªã©ãçµã¿èŸŒã¿ã䜿çšããããšã¯è¯ãéžæã§ãã
ïŒããããåã«èšã£ãããã«ã try
ãåãå
¥ããããªãã®ã劚ããå¯äžã®ãã®ã_that_ã§ããå ŽåããããããŒã¯ãŒãã«ããããšãæ€èšã§ããŸããïŒ
ç§ã¯èªåã®ã³ãŒãã®äžéšã«ã€ããŠçèããŠããŸããããããŠãããtry
ã§ã©ã®ããã«èŠãããïŒ
slurp, err := ioutil.ReadFile(path)
if err != nil {
return err
}
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)
ãªãå¯èœæ§ããããŸãïŒ
return ioutil.WriteFile(path, append(copyrightText, try(ioutil.ReadFile(path))...), 0666)
ãããè¯ããã©ããã¯ããããŸããã ã³ãŒããèªã¿ã«ãããªãããã§ãã ããããããã¯ããã«æ £ããã ãã®åé¡ãããããŸããã
@gbbrããã§éžæã§ããŸãã ããªãã¯ããã次ã®ããã«æžãããšãã§ããŸãïŒ
slurp := try(ioutil.ReadFile(path))
return ioutil.WriteFile(path, append(copyrightText, slurp...), 0666)
ããã§ããã€ã©ãŒãã¬ãŒãã倧å¹
ã«ç¯çŽã§ããŸãããããã§ãã¯ããã«æ確ã«ãªããŸãã ããã¯try
ã«åºæã®ãã®ã§ã¯ãããŸããã ãã¹ãŠã1ã€ã®åŒã«çµã蟌ãããããšãã£ãŠãããããå¿
èŠããããšã¯éããŸããã ããã¯äžè¬çã«åœãŠã¯ãŸããŸãã
@griesemerãã®äŸã¯è©Šè¡ã«åºæã®ãã®ã§ãããä»æ¥å€±æããå¯èœæ§ã®ããã³ãŒãããã¹ãããããšã¯ã§ããŸãããå¶åŸ¡ãããŒã§ãšã©ãŒãåŠçããå¿ èŠããããŸãã https://github.com/golang/go/issues/32825#issuecomment -507099786 / https://github.com/golang/go/issues/32825#issuecomment-507136111ããäœããçä»ãããã®ã§ããhttps://github.com/golang/go/issues/32825#issuecomment-507358397ãšè¿ä¿¡ããŸããã ãã®åŸãåãåé¡ãhttps://github.com/golang/go/issues/32825#issuecomment-508813236ããã³https://github.com/golang/go/issues/32825#issuecomment-508937177ã§åã³è°è«ãããŸãã-æåŸç§ãè¿°ã¹ãŠããã®ã¯ïŒ
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ã¯é¢æ°ãšããŠå®è£ ãããŠããã®ã§ããšããã®ãå§åçãªã¡ãªããã ãšã¯æããŸããã ãã®çç±ãæããŠãã ããã
äžèšã倱æããå Žæã瀺ãã¹ã¿ãã¯ãã¬ãŒã¹ããããšäŸ¿å©ã§ããããããããã®é¢æ°ãåŒã³åºããã£ãŒã«ããæã€è€åãªãã©ã«ãããã¯ã¹ã«è¿œå ããŸããïŒ ã¹ã¿ãã¯ãã¬ãŒã¹ããã®ã¿ã€ãã®åé¡ã«å¯ŸããŠä»æ¥ã©ã®ããã«èŠããããç¥ã£ãŠããã®ã§ããããæ±ããŠããŸããGoã¯ãã¹ã¿ãã¯æ å ±ã§ç°¡åã«æ¶åã§ããåæ å ±ãæäŸããã16é²é¢æ°ã®ãšã³ããªã¢ãã¬ã¹ã®ã¿ãæäŸããŸãã ã¢ãŒããã¯ãã£éã®ã¹ã¿ãã¯ãã¬ãŒã¹ã®äžè²«æ§ãªã©ãããã«ã€ããŠå¿é ããããšãããã€ããããŸããããšãã°ã次ã®ã³ãŒãã«ã€ããŠèããŠã¿ãŸãã
package main
import "fmt"
func dopanic(b bool) int { if b { panic("panic") }; return 1 }
type bar struct { a, b, d int; b *bar }
func main() {
fmt.Println(&bar{
a: 1,
c: 1,
d: 1,
b: &bar{
a: 1,
c: 1,
d: dopanic(true) + dopanic(false),
},
})
}
æåã®éã³å Žãå·ŠåŽã®ããããã¯ã§å€±æãã2çªç®ã®éã³å Žãå³åŽã§å€±æããããšã«æ³šæããŠãã ããããã ããã©ã¡ããåãã¹ã¿ãã¯ãã¬ãŒã¹ãåºåããŸãã
https://play.golang.org/p/SYs1r4hBS7O
https://play.golang.org/p/YMKkflcQuav
panic: panic
goroutine 1 [running]:
main.dopanic(...)
/tmp/sandbox709874298/prog.go:7
main.main()
/tmp/sandbox709874298/prog.go:27 +0x40
2çªç®ã®ãã®ã¯+ 0x41ãŸãã¯0x40ã®åŸã®ãªãã»ããã§ãããšäºæ³ããŠããŸãããããã¯ããããã¯å ã§å€±æããå®éã®åŒã³åºããå€å¥ããããã«äœ¿çšã§ããŸãã æ£ãã16é²ãªãã»ãããååŸãããšããŠããè¿œå ã®ãããã°ãªãã§ã¯ãé害ãçºçããå Žæãç¹å®ããããšã¯ã§ããŸããã ä»æ¥ãããã¯ãšããžã±ãŒã¹ã§ããã人ã ããã£ãã«çŽé¢ããããšã¯ãããŸããã ãã¹ãå¯èœãªããŒãžã§ã³ã®tryããªãªãŒã¹ãããšããããæšæºã«ãªããŸããææ¡ã«ãtryïŒïŒ+ tryïŒïŒstrconvãå«ãŸããŠããããããã®æ¹æ³ã§tryã䜿çšããããšãå¯èœã§ãã蚱容ã§ããããšã瀺ããŠããŸãã
1ïŒäžèšã®æ å ±ãèžãŸããŠãã³ãŒããã©ãã§å€±æããããåŒãç¶ã確èªã§ããããã«ãã¹ã¿ãã¯ãã¬ãŒã¹ã«ã©ã®ãããªå€æŽãå ããäºå®ã§ããïŒããå ŽåïŒã
2ïŒå
¥ãåã«ããå¿
èŠããããšæãããã®ã§ãå
¥ãåã«ããããšã¯èš±å¯ãããŠããŸããïŒ ãããããªãããã¹ãã£ã³ã°ãè©Šãããšã®å©ç¹ã¯äœã ãšæããŸããïŒãŸããèåŸ
ãã©ã®ããã«é²ããŸããïŒ ãã¹ããããtryãå®è¡ããããã«èª¿æŽããå¿
èŠããããšæããŸããããã«ãããçŸåšãæè¯/æãå³å¯ãªäœ¿çšäŸããåŸãããŠããªããããã³ãŒããžã®åœ±é¿ã«ã€ããŠããå€ãã®æ
å ±ã«åºã¥ããŠæ±ºå®ã§ããããã«ãªããŸãã ããã«ãããã©ã®ã¿ã€ãã®vet
å¶éã課ããããããããããŸããçŸæç¹ã§ã¯ãç£å»ãäžåœãªè©Šã¿ã«å¯Ÿããé²åŸ¡ã«ãªããšãã£ããã£ãŠããŸãããããã¯ã©ã®ããã«å®çŸããã®ã§ããããã
3ïŒå®è£ ã®çµæã§ããããããã¹ããè©Šã¿ãŸããïŒ ãããããªããããã¯GoããªãªãŒã¹ãããŠããã®æã泚ç®ãã¹ãèšèªå€æŽã«å¯Ÿããéåžžã«åŒ±ãè°è«ã®ããã«æãããŸãããïŒ
ãã®å€æŽã¯ããã¹ããè©Šãéã«ããã«æ€èšããå¿ èŠããããšæããŸãã ããã«ã€ããŠèãããã³ã«ãã©ããã§ããã€ãã®æ°ããåé¡ç¹ãçŸããã®ã§ããããéçã§æããã«ãªããŸã§ããã¹ãŠã®æœåšçãªãã¬ãã£ããçŸããªãã®ã§ã¯ãªãããšéåžžã«å¿é ããŠããŸãã https://github.com/golang/go/issues/32825#issuecomment -506882164ã§èª¬æãããŠããããã«ããã¹ãã¯ãªãœãŒã¹ããªãŒã¯ããç°¡åãªæ¹æ³ãæäŸããŸãããããã¯çŸåšã¯äžå¯èœã§ãã ãvetãã¹ããŒãªãŒã«ã¯ãããã§ç€ºããæ害ãªtryïŒïŒã®äŸã«å¯Ÿããé²åŸ¡ãšããŠäœ¿çšããå ŽåããŸãã¯å®è£ ã§ã³ã³ãã€ã«æãšã©ãŒãçºçããå Žåã«ãã£ãŒãããã¯ãæäŸããæ¹æ³ã®äŸãå«ããããå ·äœçãªèšç»ãå¿ èŠã ãšæããŸããçæ³çãªãã¹ããã©ã¯ãã£ã¹ä»¥å€ã®äœ¿çšæ³ã
ç·šéïŒç§ã¯gophersã§play.golang.orgã¢ãŒããã¯ãã£ã«ã€ããŠå°ããŸãããã誰ãããããNaClãä»ããŠã³ã³ãã€ã«ããããšèšã£ãã®ã§ãããããããã®çµæ/ãã°ã§ãã ããããããã¯ä»ã®ã¢ãŒãã®åé¡ã§ããããšãããããŸãããã»ãšãã©ã®äœ¿çšæ³ã¯æ£æ°ã§ã¯ãªãŒã³ãªåäžè¡ã®äœ¿çšæ³ã«éäžããŠãããããè¡ããšã«è€æ°ã®è¿åãå°å ¥ããããšããçºçããå¯èœæ§ã®ããå€ãã®åé¡ã¯ååã«èª¿æ»ãããŠããªããšæããŸãã
ãããããã®ãéæ³ããèšèªã«è¿œå ããªãã§ãã ããã
ãããã¯ãæ®ãã®èšèªã®ããã«èŠãããæãããããããšã¯ãããŸããã
ç§ã¯ãã§ã«ãã®ãããªã³ãŒããããããšããã«çŸããŠããã®ãèŠãŠããŸãã
a, b := try( f() )
if a != 0 && b != "" {
...
}
...
ãã以å€ã®
a,b,err := f()
if err != nil {
...
}
...
ãŸã
a,b,_:= f()
call if err....
ã®ãã¿ãŒã³ã¯ãæåã¯å°ãäžèªç¶ã§ããããä»ã§ã¯æ
£ããŠããŸã
ãšã©ãŒã¯ãçºçãããšãã«åäœããããã«äœããã®ç¶æ
ã远跡ããå¿
èŠãããã©ãããŒ/ãã³ãã©ãŒãäœæãã代ããã«ãå®è¡ãããŒã«å°çããå¯èœæ§ããããããããç°¡åã«å¯ŸåŠã§ããŸãã
ãŸããããŒããŒãã®åœãæãããã«ãšã©ãŒãç¡èŠããããšã«ããå Žåããã€ããããã¯ã«ãªãããšãèªèããŠããŸãã
ç§ã¯vbscriptã®ç¿æ £ã次ã®ããã«å€æŽããŸããïŒ
on error resume next
a = f()
if er.number <> 0 then
...
end if
...
ç§ã¯ãã®ææ¡ã奜ãã§ã
ç§ãæã£ãŠãããã¹ãŠã®æžå¿µïŒããšãã°ãçæ³çã«ã¯ãçµã¿èŸŒã¿ã§ã¯ãªãããŒã¯ãŒãã§ããå¿ èŠããããŸãïŒã¯ã詳现ãªããã¥ã¡ã³ãã§å¯ŸåŠãããŠããŸã
100ïŒ å®ç§ãšããããã§ã¯ãããŸããããaïŒå®éã®åé¡ã解決ããbïŒå€ãã®åŸæ¹äºææ§ããã®ä»ã®åé¡ãèæ ®ããªãã解決ããã®ã«ååãªè§£æ±ºçã§ãã
確ãã«ããã¯ããã€ãã®ãéæ³ããå®è¡ããŸãããããããdefer
ãå®è¡ããŸãã å¯äžã®éãã¯ããŒã¯ãŒããšçµã¿èŸŒã¿ã§ãããããã§ããŒã¯ãŒããé¿ãããšããéžæã¯çã«ããªã£ãŠããŸãã
try()
ã®ææ¡ã«å¯ŸããéèŠãªãã£ãŒãããã¯ã¯ãã¹ãŠãã§ã«è¡šæãããŠããããã«æããŸãã ããããèŠçŽããŠã¿ãŸãããã
1ïŒtryïŒïŒã¯ãåçŽã³ãŒãã®è€é床ãæ°Žå¹³ã«ç§»åããŸã
2ïŒãã¹ããããtryïŒïŒåŒã³åºãã¯ãäžé
æŒç®åãšåããããèªã¿ã«ããã§ã
3ïŒèŠèŠçã«åºå¥ã§ããªãé衚瀺ã®ãreturnãå¶åŸ¡ãããŒãå°å
¥ããŸãïŒ return
ããŒã¯ãŒãã§å§ãŸãã€ã³ãã³ãããããããã¯ãšæ¯èŒããŠïŒ
4ïŒãšã©ãŒã©ããã³ã°ã®ç·Žç¿ãæªåãããŸãïŒç¹å®ã®ã¢ã¯ã·ã§ã³ã§ã¯ãªãé¢æ°ã®ã³ã³ããã¹ãïŒ
5ïŒ#golangã³ãã¥ããã£ãšã³ãŒãã¹ã¿ã€ã«ãåå²ããŸãïŒanti-gofmtïŒ
6ïŒéçºè
ãtryïŒïŒãif-err-nilã«ããŸãã¯ãã®éã«é »ç¹ã«æžãæããããã«ããŸãïŒtryhardãšã¯ãªãŒã³ã¢ããããžãã¯ã®è¿œå /è¿œå ã®ãã°/ããè¯ããšã©ãŒã³ã³ããã¹ãïŒ
@VojtechVitekããªãã®ææã¯äž»èŠ³çãªãã®ã§ããã人ã ãçå£ã«äœ¿ãå§ããŠåããŠè©äŸ¡ã§ãããšæããŸãã
ããããããŸãè°è«ãããŠããªãæè¡çãªãã€ã³ãã1ã€ãããšæããŸãã ãšã©ãŒã®ã©ããã³ã°/è£
食ã«defer
ã䜿çšãããã¿ãŒã³ã¯ã defer
ã䜿çšããé¢æ°ãã€ã³ã©ã€ã³åã§ããªãããã defer
èªäœã®åçŽãªã³ã¹ããè¶
ããããã©ãŒãã³ã¹ãžã®åœ±é¿ããããŸãã
ããã¯ããšã©ãŒã©ããã³ã°ã§try
ãæ¡çšãããšã err != nil
ãã§ãã¯ã®çŽåŸã«ã©ããããããšã©ãŒãè¿ãå Žåãšæ¯èŒããŠã2ã€ã®æœåšçãªã³ã¹ããçºçããããšãæå³ããŸãã
defer
ã®ããã©ãŒãã³ã¹ã倧å¹
ã«æ¹åãããäºå®ã§ãããã³ã¹ãã¯ãŒãã§ã¯ãããŸããã
try
ã«ã¯å€ãã®å¯èœæ§ããããããGoããŒã ãèšèšãåæ€èšããŠã defer
ãä»ããŠå
å¶ããã®ã§ã¯ãªããé害ã®æç¹ã§äœããã®ã©ããã³ã°ãå®è¡ã§ããããã«ãããšããã§ãããã ã
ç£å»ãã®è©±ã«ã¯ãã£ãšå ·äœçãªèšç»ãå¿ èŠã§ã
ç£å»ã®è©±ã¯ããšã話ã§ãã æ¢ç¥ã®ã¿ã€ãã§ã®ã¿æ©èœããã«ã¹ã¿ã ã¿ã€ãã§ã¯åœ¹ã«ç«ã¡ãŸããã
çããããã«ã¡ã¯ã
ãã®ãããªææ¡ã§ã®ç§ãã¡ã®ç®æšã¯ã圱é¿ããã¬ãŒããªããããã³é²ãæ¹ã«ã€ããŠã³ãã¥ããã£å šäœã§è°è«ãããã®è°è«ã䜿çšããŠä»åŸã®éçã決å®ããããšã§ãã
å§åçãªã³ãã¥ããã£ã®åå¿ãšããã§ã®åºç¯ãªè°è«ã«åºã¥ããŠããã®ææ¡ã¯äºå®ããæ©ãæåŠããããšããŒã¯ããŠããŸãã
æè¡çãªãã£ãŒãããã¯ã«é¢ããéãããã®è°è«ã¯ãç§ãã¡ãèŠéããããã€ãã®éèŠãªèæ ®äºé ãç¹ã«ãããã°å°å·ã®è¿œå ãšã³ãŒãã«ãã¬ããžã®åæãžã®åœ±é¿ãæçã«ç¹å®ããŸããã
ããã«éèŠãªããšã«ããã®ææ¡ã¯äŸ¡å€ã®ããåé¡ã察象ãšããŠããªããšäž»åŒµããå€ãã®äººã ã®å£°ãã¯ã£ãããšèããŠããŸãã Goã§ã®ãšã©ãŒåŠçã¯å®å šã§ã¯ãªããææ矩ã«æ¹åã§ãããšç§ãã¡ã¯ä¿¡ããŠããŸãããã³ãã¥ããã£ãšããŠããšã©ãŒåŠçã®ã©ã®ç¹å®ã®åŽé¢ã察åŠãã¹ãåé¡ã§ãããã«ã€ããŠãã£ãšè©±ãåãå¿ èŠãããããšã¯æããã§ãã
解決ãã¹ãåé¡ã«ã€ããŠã¯ãæšå¹Ž8æã®ã Go2ãšã©ãŒåŠçåé¡æŠèŠãã§ããžã§ã³ãæ瀺ããããšããŸããããæ¯ãè¿ã£ãŠã¿ããšããã®éšåã«ååãªæ³šæãåããŠããããååã«å±ãŸããŠããŸããã§ãããç¹å®ã®åé¡ãæ£ããåé¡ã§ãã£ããã©ããã«ã€ããŠã®è°è«ã try
ã®ææ¡ã¯ãããã§æŠèª¬ãããŠããåé¡ã®åªãã解決çãããããŸããããå€ãã®äººã«ãšã£ãŠã¯ã解決ããåé¡ã§ã¯ãããŸããã å°æ¥çã«ã¯ããããã®åæã®åé¡ã¹ããŒãã¡ã³ãã«æ³šæãåãã解決ãå¿
èŠãªåé¡ã«ã€ããŠåºãåæãããŠããããšã確èªããããã«ãããè¯ãä»äºãããå¿
èŠããããŸãã
ïŒåãæ¥ã«ãžã§ããªãã¯èšèšãã©ãããå ¬éããããšã«ããããšã©ãŒåŠçã®åé¡ã¹ããŒãã¡ã³ããå®å šã«ã¢ããã¹ããŒãžãããå¯èœæ§ããããŸããïŒ
Goã®ãšã©ãŒåŠçã«ã€ããŠäœãæ¹åããããšããããåºããããã¯ã«ã€ããŠã¯ãGoã§ã®ãšã©ãŒåŠçã®ã©ã®åŽé¢ããç¬èªã®ã³ãŒãããŒã¹ãšäœæ¥ç°å¢ã§æãåé¡ããããåªãããœãªã¥ãŒã·ã§ã³ãã©ã®çšåºŠã®åœ±é¿ãäžãããã«ã€ããŠã®çµéšã¬ããŒããèŠãããšãã§ããã°å¹žãã§ããããªãèªèº«ã®éçºã«ãããŸãã ãã®ãããªã¬ããŒããäœæããå Žåã¯ã Go2ErrorHandlingFeedbackããŒãžã«ãªã³ã¯ãæçš¿ããŠãã ããã
ãããä»ã®å Žæã§ããã®è°è«ã«åå ãããã¹ãŠã®äººã«æè¬ããŸãã Russ Coxã以åã«ææããããã«ããã®ãããªã³ãã¥ããã£å šäœã®è°è«ã¯ãæé«ã®ç¶æ ã§ãªãŒãã³ãœãŒã¹ã§ãã ãã®ç¹å®ã®ææ¡ãæ€èšããããäžè¬çã«ã¯Goã§ã®ãšã©ãŒåŠçã®ç¶æ ãæ¹åããããã®æè¯ã®æ¹æ³ã«ã€ããŠè°è«ããéã«ãçæ§ã®ãååã«å¿ããæè¬ããããŸãã
ææ¡å¯©æ»å§å¡äŒã®RobertGriesemeræ°ã
Go Teamããã©ã€ããããŒã¶ã«ã«åå ããŠãããäœæ¥ã«æè¬ããŸãã ãããŠãããã«èŠåŽãã代æ¿æ¡ãææ¡ããŠãããã³ã¡ã³ãæäŸè ã«æè¬ããŸãã æã ããããã®ãã®ã¯åœŒãèªèº«ã®äººçãåããŸãã èããŠé©åã«å¯Ÿå¿ããŠãããGoTeamã«æè¬ããŸãã
ããŒãïŒ
æé«ã®çµæãåŸãããããã«ããããããã·ã¥ããŠãããŠããããšãïŒ
Goã®ãšã©ãŒåŠçã«é¢ããåé¡ãšãã¬ãã£ããªçµéšã®ãªã¹ããå¿
èŠã§ãã ãããã
ç§èªèº«ãšããŒã ã¯ãæ¬çªç°å¢ã§ã®xerrors.Asãxerrors.Isãããã³xerrors.Errorfã«éåžžã«æºè¶³ããŠããŸãã ãããã®æ°ããè¿œå ã¯ãå€æŽãå®å
šã«åãå
¥ããã®ã§ããšã©ãŒåŠçãçŽ æŽãããæ¹æ³ã§å®å
šã«å€æŽããŸãã çŸæç¹ã§ã¯ã察åŠãããŠããªãåé¡ãããŒãºã¯çºçããŠããŸããã
@griesemerããªãã®å¿èãšåªåã«æè¬ããŸãïŒãããŠããããããªããšäžç·ã«åããä»ã®å€ãã®äººãã¡ïŒã
è¯ãïŒ
@griesemer GoããŒã ã®ä»ã®ãã¹ãŠã®äººã«ããã¹ãŠã®ãã£ãŒãããã¯ã«ç²Ÿåçã«è³ãåŸããããŸããŸãªæèŠãææ ¢ããŠãããŠããããšãã
ããã§ãå€åä»ã¯ãã®ã¹ã¬ãããéããŠãå°æ¥ã®ãã®ã«ç§»ãè¯ãææã§ããïŒ
@griesemer @rscãš@all ããã£ããããããããšãã ç§ã«ãšã£ãŠãããã¯çŽ æŽãããè°è«/ç¹å®/æ確åã§ãã goã®ããšã©ãŒãåé¡ã®ãããªããã€ãã®éšåã®åŒ·åã¯ãæåã«ã³ã¢åé¡ãç¹å®/æ確åããããã«ïŒææ¡ãšã³ã¡ã³ãã§...ïŒãããªãŒãã³ãªè°è«ãå¿ èŠã§ãã
psãx / xerrorsã¯ä»ã®ãšããè¯ãã§ãã
ïŒãã®ã¹ã¬ãããããã¯ããã®ãçã«ããªã£ãŠãããããããŸãã...ïŒ
ããã«æºãã£ãŠãããããŒã ãšã³ãã¥ããã£ã«æè¬ããŸãã äœäººã®äººãå²ç¢ãæ°ã«ãããŠãããã倧奜ãã§ãã
ã³ãã¥ããã£ãæåã«ãã©ã€ææ¡ã«åãå ¥ããããåªåãšã¹ãã«ãæåã«èŠãŠã次ã«ãã®åŸã®ãšã³ã²ãŒãžã¡ã³ãã®ç²Ÿç¥ããã®æ±ºå®ã«å°éããã®ã«åœ¹ç«ã£ãããšãæ¬åœã«æãã§ããŸãã ç§ãã¡ããããç¶æã§ããã°ãç¹ã«ç§ãã¡å šå¡ãååããªå§¿å¢ãç¶æã§ããã°ãå²ç¢ã®æªæ¥ã¯éåžžã«æããã§ãã
func MïŒïŒïŒããŒã¿ããšã©ãŒïŒ{
aãerr1ïŒ= AïŒïŒ
bãerr2ïŒ= BïŒïŒ
bãnilãè¿ã
} =>ïŒerr1ïŒ= nilã®å ŽåïŒ{return aãerr1}ã
ïŒerr2ïŒ= nilã®å ŽåïŒ{return bãerr2}
ããããŸãã...ç§ã¯ãã®ææ¡ã奜ãã§ããããã³ãã¥ããã£ãšGoããŒã ãåå¿ãã建èšçãªè°è«ã«åå ããæ¹æ³ã奜ãã§ãã
ãã®çµæã«é¢ããŠ2ã€ã®è³ªåããããŸãã
1 /ããšã©ãŒåŠçãã¯ãŸã ç 究åéã§ããïŒ
2 /延æã®æ¹åã¯åªå
é äœãä»ãçŽãããŸããïŒ
ããã¯ãGoã³ãã¥ããã£ãè³ãåŸããç©è°ãéžããŠããèšèªå€æŽã®ææ¡ã«ã€ããŠè©±ãåãããšãã§ããããšãããäžåºŠèšŒæããŠããŸãã èšèªã«ãããäœãå€æŽã®ããã«ãããã§ãªãå€æŽã¯æ¹åã§ãã GoããŒã ãšã³ãã¥ããã£ããã®ææ¡ã«é¢ããããŒãã¯ãŒã¯ãšææçãªè°è«ã«æè¬ããŸãïŒ
åªããïŒ
çŽ æŽãããããšãŠã圹ã«ç«ã¡ãŸãã
å²ç¢ã«å·çããããŠããã®ãããããŸããããããã«ãã€ã³ãã瀺ãããŠãããšæããŸãã
ã©ã¹ã¯èª¬æããŸããïŒã³ãã¥ããã£ãåãªã
éŠãªãé¶ãããã¯èæ
®ãããã¹ãåã§ã
ããèªèº«ã®å©çã®ããã«å©çšãããŸãã
GoããŒã ãæäŸãã調æŽã®ãããã§ãç§ãã¡ã¯æ¬¡ã®ããšãã§ããŸã
ç§ãã¡ãäžç·ã«æ®ãããçµè«ã«å°éããããšãèªãã«æããŸã
æ¡ä»¶ãããçããŠãããšããééããªãå蚪ããŸãã
ããã§æããçã¿ãå°æ¥ç§ãã¡ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸã
ïŒããã§ãªããã°ãããã¯æ²ããããšã§ã¯ãªãã§ããããïŒïŒã
ã«ã·ãªã
ç§ã¯ãã®æ±ºå®ã«åæããŸããã ããããç§ã¯ãŽãŒããŒã ãè¡ã£ãã¢ãããŒãã絶察ã«æ¯æããŸãã ã³ãã¥ããã£å šäœã§è°è«ããéçºè ããã®ãã£ãŒãããã¯ãæ€èšããããšãããªãŒãã³ãœãŒã¹ã®ç®çã§ãã
延ææé©åãæ¥ãã®ã ãããã ãšã©ãŒãšxerrorãäžç·ã«æ³šéããã®ããšãŠã奜ãã§ãä»ã¯ã³ã¹ããããããããŸãã
@pierrecãšã©ãŒåŠçã®ã©ã®å€æŽã圹ç«ã€ããããæ確ã«ç解ããå¿ èŠããããšæããŸãã ãšã©ãŒå€ã®å€æŽã®äžéšã¯ã次ã®1.13ãªãªãŒã¹ïŒhttps://tip.golang.org/doc/go1.13#errorsïŒã§è¡ãããäºå®ã§ãããçµéšãç©ãäºå®ã§ãã ãã®è°è«ã®éçšã§ãå€ãã®æ§æãšã©ãŒåŠçã®ææ¡ãèŠãŠããŸããã人ã ãç¹ã«æçšãšæããããã®ã«æ祚ããŠã³ã¡ã³ãã§ãããšäŸ¿å©ã§ãã ããäžè¬çã«ã¯ã @ griesemerãèšã£ãããã«ãçµéšã¬ããŒãã圹ç«ã€ã§ãããã
ãŸããèšèªã«äžæ £ããªäººã«ãšã£ãŠãšã©ãŒåŠçæ§æãã©ã®çšåºŠåé¡ã«ãªãããããããç解ããããšã圹ç«ã¡ãŸããããããå€æããã®ã¯å°é£ã§ãã
https://golang.org/cl/183677ã§defer
ã®ããã©ãŒãã³ã¹ãæ¹åããããã®ç©æ¥µçãªäœæ¥ãããã倧ããªé害ãçºçããªãéãã1.14ãªãªãŒã¹ã«ãªããšæåŸ
ããŠããŸãã
@griesemer @ianlancetaylor @rscããã§æèµ·ãããåé¡ã®äžéšãŸãã¯ãã¹ãŠã解決ããå¥ã®ææ¡ã§ããšã©ãŒåŠçã®åé·æ§ã«å¯ŸåŠããäºå®ã¯ãããŸããïŒ
ããã§ãããŒãã£ãŒã«é ããŠãããã¯ãã§ã«æåŠãããŠããã®ã§ãããããã®ãããã¯ã«é¢ããå°æ¥ã®è°è«ã®ããã«ãäžå ã®ãããªæ¡ä»¶ä»ãæ»ãæ§æã¯ã©ãã§ããïŒ ïŒãããã¯ãã¹ãã£ã³ããããRuss CoxãTwitterã«æçš¿ãããããã¯ã®ãã¥ãŒãèŠããããŠããããã«äŒŒããã®ã¯èŠåœãããŸããã§ãããïŒäŸïŒ
f, err := Foo()
return err != nil ? nil, err
errãnil以å€ã®å Žåã¯nil, err
è¿ããerrãnilã®å Žåã¯å®è¡ãç¶è¡ããŸãã ã¹ããŒãã¡ã³ããã©ãŒã ã¯
return <boolean expression> ? <return values>
ããã¯ã次ã®ç³è¡£æ§æã«ãªããŸãã
if <boolean expression> {
return <return values>
}
äž»ãªå©ç¹ã¯ããããcheck
ããŒã¯ãŒããtry
çµã¿èŸŒã¿é¢æ°ãããæè»æ§ãããããšã§ããããã¯ããšã©ãŒãããå€ãã®ãšã©ãŒïŒããšãã°ã return err != nil || f == nil ? nil, fmt.Errorf("failed to get Foo")
ãªã©ïŒã§ããªã¬ãŒã§ããããã§ãããšã©ãŒãnil以å€ïŒäŸïŒ return err != nil && err != io.EOF ? nil, err
ïŒã§ããã ãã§ãªããïŒç¹ã«ä»ã®èšèªã§äžé
æŒç®åãèªãããšã«æ
£ããŠãã人ã«ãšã£ãŠã¯ïŒèªããšãã«ããªãçŽæçã«ç解ã§ããŸãã
ãŸãããšã©ãŒåŠçããããã€ãã®deferã¹ããŒãã¡ã³ãã«åºã¥ããŠèªåçã«çºçããã®ã§ã¯ãªããåŒã³åºãå Žæã§çºçããããšãä¿èšŒããŸãã ç§ãæåã®ææ¡ã§æã£ãŠããæ倧ã®äžæºã®1ã€ã¯ãäœããã®æ¹æ³ã§ããšã©ãŒã®å®éã®_åŠç_ãããšã©ãŒããŒãã§ãªããšãã«èªåçã«çºçããæé»ã®ããã»ã¹ã«ããããšããå¶åŸ¡ãããŒãæ確ã«ç€ºãããªãããšã§ããé¢æ°åŒã³åºããnil以å€ã®ãšã©ãŒãè¿ããå Žåã«æ»ããŸãã äŸå€ã®ãããªã·ã¹ãã ã®ä»£ããã«æ瀺çãªãšã©ãŒãªã¿ãŒã³ã䜿çšããGoã®å šäœã®_point_ã¯ãçè«çã«ã¯ãããæç¹ã§åŠçãããããã«åã«ãšã©ãŒãã¹ã¿ãã¯ã«äŒæãããã®ã§ã¯ãªããéçºè ããšã©ãŒãæ瀺çãã€æå³çã«ãã§ãã¯ããŠåŠçããããšã奚å±ããããšã§ããäžã å°ãªããšããæ¡ä»¶ä»ãã®å Žåãæ瀺çãªreturnã¹ããŒãã¡ã³ãã¯ãäœãèµ·ãã£ãŠããããæ確ã«ç€ºããŸãã
@ngrilly @griesemerãèšã£ãããã«ãGoããã°ã©ããŒãæãåé¡ããããšæãããšã©ãŒåŠçã®åŽé¢ãããããç解ããå¿ èŠããããšæããŸãã
å人çã«èšãã°ãå°ãåé·æ§ãæé€ããææ¡ããã䟡å€ã¯ãªããšæããŸãã çµå±ã®ãšããããã®èšèªã¯ä»æ¥ã§ã¯ååã«æ©èœããŸãã ãã¹ãŠã®å€æŽã«ã¯ã³ã¹ããããããŸãã å€æŽãå ããå Žåã¯ã倧ããªã¡ãªãããå¿ èŠã§ãã ãã®ææ¡ã¯åé·æ§ã®åæžã«å€§ããªã¡ãªãããããããããšæããŸãããæããã«ãè¿œå ã³ã¹ããé«ããããšæããŠããGoããã°ã©ããŒã®ããªãã®éšåãããŸãã ããã«åŠ¥åç¹ããããã©ããã¯ããããŸããã ãããŠããã®åé¡ã«åãçµã䟡å€ããããã©ããã¯ãŸã£ããããããŸããã
@kaedysãã®éããéåžžã«åé·ãªåé¡ã¯ããšã©ãŒåŠçã®ç¹å®ã®ä»£æ¿æ§æã«ã€ããŠèª¬æããã®ã«é©åãªå Žæã§ã¯ãããŸããã
@ianlancetaylor
ãã®ææ¡ã¯åé·æ§ã®åæžã«å€§ããªã¡ãªãããããããããšæããŸãããæããã«ãè¿œå ã³ã¹ããé«ããããšæããŠããGoããã°ã©ããŒã®ããªãã®éšåãããŸãã
èªå·±éžæã®åããããã®ã§ã¯ãªãããšæããŸãã Goã¯ãåé·ãªãšã©ãŒåŠçãšãžã§ããªãã¯ã¹ã®æ¬ åŠã§ç¥ãããŠããŸãã ããã¯åœç¶ãããã2ã€ã®åé¡ãæ°ã«ããªãéçºè ãåŒãä»ããŸãã ãã®éãä»ã®éçºè ã¯çŸåšã®èšèªïŒJavaãC ++ãCïŒãPythonãRubyãªã©ïŒã䜿ãç¶ããããããæ°ããèšèªïŒRustãTypeScriptãKotlinãSwiftãElixirãªã©ïŒã«åãæ¿ãããããŸãã ã ç§ã¯ãäž»ã«ãã®çç±ã§Goãåé¿ããå€ãã®éçºè ãç¥ã£ãŠããŸãã
ãŸãã確蚌ãã€ã¢ã¹ããããšæããŸãã Gopherã¯ã人ã ãGoãæ¹å€ãããšãã«ãåé·ãªãšã©ãŒåŠçãšãšã©ãŒåŠçã®æ¬ åŠãé²åŸ¡ããããã«äœ¿çšãããŠããŸããã ããã«ãããtryã®ãããªææ¡ã客芳çã«è©äŸ¡ããããšãé£ãããªããŸãã
Steve Klabnikã¯ãæ°æ¥åã«Redditã«é¢ããèå³æ·±ãã³ã¡ã³ããå
¬éããŸããã 圌ã¯Rustã«?
ãå°å
¥ããããšã«å察ããŸããããªããªããããã¯ãåããã®ãæžã2ã€ã®æ¹æ³ãã§ããããæé»çããããããã§ãã ãããä»ã§ã¯ãã§æ°è¡ä»¥äžã®ã³ãŒããèšè¿°ããåŸã ?
ã¯åœŒã®ãæ°ã«å
¥ãã®æ©èœã®1ã€ã§ãã
@ngrillyç§ã¯ããªãã®ã³ã¡ã³ãã«åæããŸãã ãããã®ãã€ã¢ã¹ãåé¿ããããšã¯éåžžã«å°é£ã§ãã éåžžã«åœ¹ç«ã€ã®ã¯ãåé·ãªãšã©ãŒåŠçã®ããã«Goãåé¿ãã人ã®æ°ãããæ確ã«ç解ããããšã§ãã æ°åã¯ãŒãã§ã¯ãªããšæããŸããã枬å®ããã®ã¯é£ããã§ãã
ãšã¯èšããã®ã®ã try
ãå¶åŸ¡ãããŒã«æ°ããå€æŽãå°å
¥ããããšãäºå®ã§ãããããã¯èŠã¥ãããã®ã§ããããŸãã try
ã¯ãšã©ãŒã®åŠçãæ¯æŽããããšãç®çãšããŠããŸãããããšã©ãŒã®æ³šéä»ãã«ã¯åœ¹ç«ã¡ãŸããã§ããã ã
ã¹ãã£ãŒãã¯ã©ããã¯ããã®åŒçšãããããšãã ç§ã¯ãã®ææ ã«æè¬ããåæããŸãããèšèªãšããŠRustã¯ãGoãããæ§æã®è©³çŽ°ã«äŸåããããšãããããæãã§ããããã«æãããããšãèæ ®ãã䟡å€ããããŸãã
ãã®ææ¡ã®æ¯æè ãšããŠãç§ã¯åœç¶ãGoããŒã ãç¶æ³ã«å¿ããŠæ£ããããšããããšæããŸãããçŸåšåãäžããããŠããããšã«å€±æããŠããŸãã
çŸåšéåžžã«æ確ã«æãããããšã®1ã€ã¯ãGoãŠãŒã¶ãŒã®å€§å€æ°ããšã©ãŒåŠçã®åé·æ§ãåé¡ãšèŠãªããŠããªãããšã§ããããã¯ãæœåšçãªæ°èŠãŠãŒã¶ãŒãå éãã«ãããšããŠããä»ã®ãŠãŒã¶ãŒãäžç·ã«æ®ãããªããã°ãªããªãããšã ãšæããŸãã ã
ç§ãèªãã 代æ¿æ¡ã®æ°ãæ°ãåããŸããã§ãããããã€ãã¯ããªãè¯ããã®ã§ããã try
ãã»ãããããå Žåã«æ¡çšãã䟡å€ããããšæã£ããã®ã¯èŠåœãããŸããã§ããã ã§ããããäžéå端ãªææ¡ãåºãŠããå¯èœæ§ã¯ç§ã«ã¯é ãããã§ãã
ããã«ååããªç¹ãšããŠãçŸåšã®è°è«ã§ã¯ãé¢æ°å
ã®ãã¹ãŠã®æœåšçãªãšã©ãŒãåãæ¹æ³ã§åãå Žæã«ïŒ defer
ãŸãã¯goto
ã䜿çšããŠïŒè£
食ã§ããæ¹æ³ãææããŠããŸãããããŸã§ã¯æ€èšããŠããŸããã§ããããGoããŒã ãå°ãªããšãgo fmt
ãå€æŽããŠãåäžã®ã¹ããŒãã¡ã³ãif
ã1è¡ã«èšè¿°ã§ããããã«ããå°ãªããšããšã©ãŒåŠçãè¡ãããšãæ€èšããŠã»ãããšæããŸãããã€ã©ãŒãã¬ãŒããå®éã«åãå€ããªããŠãã _èŠãç®_ããã³ã³ãã¯ãã«ãªããŸãã
@pierrec
1 /ããšã©ãŒåŠçãã¯ãŸã ç 究åéã§ããïŒ
ããã¯ã50幎以äžåããã§ãïŒ äžè²«æ§ã®ããäœç³»çãªãšã©ãŒåŠçã®ããã®å šäœçãªçè«ãå®çšçãªã¬ã€ããããªãããã§ãã ãŽãŒã©ã³ãã§ã¯ïŒä»ã®èšèªã«é¢ããŠã¯ïŒããšã©ãŒãäœã§ãããã«ã€ããŠããæ··ä¹±ããããŸãã ããšãã°ãEOFã¯ãã¡ã€ã«ãèªã¿èŸŒãããšãããšãã«äŸå€çãªç¶æ ã«ãªãå¯èœæ§ããããŸããããªãããããšã©ãŒãªã®ã§ããïŒ ãããå®éã®ãšã©ãŒã§ãããã©ããã¯ãå®éã«ã¯ã³ã³ããã¹ãã«ãã£ãŠç°ãªããŸãã ãããŠãä»ã«ããã®ãããªåé¡ããããŸãã
ãããããããé«ãã¬ãã«ã®è°è«ãå¿ èŠã§ãïŒãã ããããã§ã¯ãããŸããïŒã
@ griesemer @ rscãšææ¡ã«æºãã£ãä»ã®ãã¹ãŠã®äººã«æè¬ããŸãã ä»ã®å€ãã®äººãäžã§ãããèšã£ãŠãããåé¡ãèããææ¡ãæžããèª æãæã£ãŠè°è«ããããªãã®åªåã«æè¬ããŠããããšãç¹°ãè¿ãè¿°ã¹ãŸãã ããããšãã
@ianlancetaylor
ã¹ãã£ãŒãã¯ã©ããã¯ããã®åŒçšãããããšãã ç§ã¯ãã®ææ ã«æè¬ããåæããŸãããèšèªãšããŠRustã¯ãGoãããæ§æã®è©³çŽ°ã«äŸåããããšãããããæãã§ããããã«æãããããšãèæ ®ãã䟡å€ããããŸãã
Rustãæ§æã®è©³çŽ°ã«äŸåããããšä»¥äžã«äŸåããŠããããšã«ã€ããŠã¯äžè¬çã«åæããŸãããããã¯ãšã©ãŒåŠçã®åé·æ§ã«é¢ãããã®ç¹å®ã®è°è«ã«ã¯åœãŠã¯ãŸããªããšæããŸãã
ãšã©ãŒã¯ãGoã®å Žåãšåæ§ã«Rustã®å€ã§ãã Goã®ããã«ãæšæºã®å¶åŸ¡ãããŒã䜿çšããŠããããåŠçã§ããŸãã Rustã®æåã®ããŒãžã§ã³ã§ã¯ãGoã®ããã«ãšã©ãŒãåŠçããå¯äžã®æ¹æ³ã§ããã 次ã«ã圌ãã¯try!
ãã¯ããå°å
¥ããŸãããããã¯ãé©ãã¹ãããšã«try
çµã¿èŸŒã¿é¢æ°ã®ææ¡ã«äŒŒãŠããŸãã 圌ãã¯æçµçã«?
æŒç®åãè¿œå ããŸãããããã¯ãæ§æã®ããªãšãŒã·ã§ã³ã§ããã try!
ãã¯ãã®äžè¬åã§ãããããã¯try
ã®æçšæ§ãšäºå®ã瀺ãããã«å¿
èŠã§ã¯ãããŸããã Rustã³ãã¥ããã£ããããè¿œå ããããšãåŸæããŠããªãããšã
GoãšRustã®å€§ããªéãã¯ããç¥ã£ãŠããŸããããšã©ãŒåŠçã®åé·æ§ã«ã€ããŠã¯ã圌ãã®çµéšãGoã«çœ®ãæããããšãã§ãããšæããŸãã try!
ãš?
ã«é¢é£ããRFCãšè°è«ã¯æ¬åœã«èªã䟡å€ããããŸãã èšèªã®å€æŽã«å¯Ÿããè³åŠäž¡è«ã®åé¡ãšè°è«ãã©ãã»ã©äŒŒãŠãããã«æ¬åœã«é©ããŠããŸãã
@griesemer ãããªãã¯çŸåšã®åœ¢ã§try
ã®ææ¡ãæåŠãã決å®ãçºè¡šããŸããããGoããŒã ã次ã«äœãããäºå®ãã«ã€ããŠã¯èšããŸããã§ããã
ãã®ãã£ã¹ã«ãã·ã§ã³ã§æèµ·ãããåé¡ïŒå°å·ç©ã®ãããã°ãã³ãŒãã«ãã¬ããžããšã©ãŒè£ 食ã®æ¹åãªã©ïŒã解決ããå¥ã®ææ¡ã§ããšã©ãŒåŠçã®åé·æ§ã«å¯ŸåŠããäºå®ã¯ãããŸããïŒ
Rustãæ§æã®è©³çŽ°ã«äŸåããããšä»¥äžã«äŸåããŠããããšã«ã€ããŠã¯äžè¬çã«åæããŸãããããã¯ãšã©ãŒåŠçã®åé·æ§ã«é¢ãããã®ç¹å®ã®è°è«ã«ã¯åœãŠã¯ãŸããªããšæããŸãã
ä»ã®äººã¯ãŸã 2ã»ã³ããè¿œå ããŠããã®ã§ãç§ãåãããšãããäœå°ã¯ãŸã ãããšæããŸãã
ç§ã¯1987幎ããããã°ã©ãã³ã°ãããŠããŸãããGoãšäžç·ã«ä»äºãããŠããã®ã¯çŽ1幎ã§ãã çŽ18ãæåãç¹å®ã®ããŒãºãæºããæ°ããèšèªãæ¢ããŠãããšãã«ãGoãšRustã®äž¡æ¹ã調ã¹ãŸããã Goãéžæããã®ã¯ãGoã³ãŒãã®æ¹ãç¿åŸãšäœ¿çšãã¯ããã«ç°¡åã§ãããGoã¯ç°¡æœãªèšå·ã§ã¯ãªãåèªã奜ãã§æå³ãäŒãããããGoã³ãŒãã®æ¹ãã¯ããã«èªã¿ããããšæããããã§ãã
ã§ããããæåç¬ŠïŒ !
ïŒãçåç¬ŠïŒ ?
ïŒã䜿çšããŠæå³ã瀺ããªã©ã Goãããéã³ãããã«ãªãã®ãèŠãã®ã¯éåžžã«äžå¹žã§ãã
åæ§ã«ããã¯ãã®å°å ¥ã¯Goã®æ§è³ªãå€ããRubyã®å Žåãšåæ§ã«ãäœåãã®Goã®æ¹èšããããããšæããŸãã ã§ãããããã¯ããè¿œå ãããªãããšãé¡ã£ãŠããŸãã幞ããªããšã«ãIMOã¯ããã¯ããè¿œå ãããå¯èœæ§ã¯ã»ãšãã©ãªããšæããŸãã
@ianlancetaylor
éåžžã«åœ¹ç«ã€ã®ã¯ãåé·ãªãšã©ãŒåŠçã®ããã«Goãåé¿ãã人ã®æ°ãããæ確ã«ç解ããããšã§ãã æ°åã¯ãŒãã§ã¯ãªããšæããŸããã枬å®ããã®ã¯é£ããã§ãã
ããèªäœã¯ã察çãã§ã¯ãããŸãããããã®Hacker Newsã®ãã£ã¹ã«ãã·ã§ã³ã§ã¯ãåé·æ§ã®ããã«Goãšã©ãŒåŠçã«äžæºãæã£ãŠããéçºè ããã®ã³ã¡ã³ããæ°å件æäŸãããŠããŸãïŒäžéšã®ã³ã¡ã³ãã§ã¯ããã®çç±ã説æããã³ãŒãäŸã瀺ããŠããŸãïŒïŒ httpsïŒ//news.ycombinatorã com / itemïŒid = 20454966ã
ãŸã第äžã«ãããšããã®æ±ºå®ãå€ãã®äººã«ãšã£ãŠæºè¶³ã®ãããã®ã§ãªãã£ããšããŠããæçµæ±ºå®ã«ã€ããŠã®æ¯æçãªãã£ãŒãããã¯ãã¿ããªã«æè¬ããŸãã ããã¯æ¬åœã«ããŒã ã®åªåã§ãããç§ãã¡å šå¡ãå šäœçã«åžæ°çãã€æ¬æãæã£ãŠæ¿ããè°è«ãããéããããšãã§ããããšãæ¬åœã«å¬ããæããŸãã
@ngrillyç§èªèº«ã®ããã«èšãã°ãããæç¹ã§ãšã©ãŒåŠçã®åé·æ§ã«å¯ŸåŠããã®ã¯è¯ãããšã ãšæããŸãã ãšã¯èšããã®ã®ãç§ãã¡ã¯éå»å幎éãç¹ã«éå»3ãæéãããã«ããªãã®æéãšåŽåãè²»ãããŠããŸãããææ¡ã«ã¯éåžžã«æºè¶³ããŠããŸãããããã«å¯Ÿããèããããåå¿ãæããã«éå°è©äŸ¡ããŠããŸãã ä»ã§ã¯ãäžæ©äžãã£ãŠãã£ãŒãããã¯ãæ¶åããŠæœåºãã次ã®æåã®ã¹ãããã決å®ããããšã¯éåžžã«çã«ããªã£ãŠããŸãã
ãŸããçŸå®çã«ã¯ãç¡å¶éã®ãªãœãŒã¹ããªãããããšã©ãŒåŠçã®èšèªãµããŒãã«ã€ããŠèããããšã¯ãä»ã®é¢ã§ã®ãããªãé²æ©ãæ¯æããŠãå°ãåŸåãã«ãªã£ãŠãããšæããŸãã次ã®æ°ã¶æã if err != nil
ã¯ç
©ããããããããŸããããããã¯ç·æ¥ã®è¡åã®çç±ã§ã¯ãããŸããã
ãã£ã¹ã«ãã·ã§ã³ãç¶ç¶ãããå Žåã¯ãããããé¢ããŠãå¥ã®åé¡ïŒæ確ãªææ¡ãããå ŽåïŒããŸãã¯ãªãŒãã³ãã£ã¹ã«ãã·ã§ã³ã«é©ããä»ã®ãã©ãŒã©ã ã§ãã£ã¹ã«ãã·ã§ã³ãç¶è¡ããããšããå§ãããŸãã çµå±ããã®åé¡ã¯è§£æ±ºãããŸããã ããããšãã
èªå·±éžæã®åããããã®ã§ã¯ãªãããšæããŸãã
ä»ããã§æ°ããçšèªãã¯ãªãšãŒã¿ãŒãã€ã¢ã¹ããäœããããšæããŸãã 誰ããåãã§ä»äºããããªãã圌ãã¯çãã®å©çãäžããããã¹ãã§ãã
ããŒãããã®ã£ã©ãªãŒããé¢ä¿ã®ãªããã©ãŒã©ã ã§ãææ¡ãããåé¡ã®è§£æ±ºçãã©ã®ããã«å«ããã倧声ã§åºãå«ã¶ã®ã¯éåžžã«ç°¡åã§ãã ãŸãã誰ããå¥ã®è§£æ±ºçã«ã€ããŠ3段èœã®äžå®å šãªè©Šã¿ãæžãã®ã¯éåžžã«ç°¡åã§ãïŒå®éã®äœæ¥ã¯å芳è ã«æ瀺ãããŠããŸããïŒã çŸç¶ã«åæãããªããOKã ãã§ã¢ãã€ã³ãã å®å šãªææ¡ãªãã«è§£æ±ºçãšããŠä»ã®ãã®ãæ瀺ãããšã-10kãã€ã³ããåŸãããŸãã
ç§ã¯è©ŠããŠã¿ãããšãæ¯æãããå察ãããããŸããããGo Teamsã®å€æã¯ãããŸã§ã®ãšããåªããèšèã§æäŸãããŠãããšä¿¡ããŠããŸãããããã£ãŠã圌ãã決å®ãããã®ã¯äœã§ãç§ã«åœ¹ç«ã€ãšæããŸããç§ãã¡ã¯éšå€è ãšããŠãã¡ã³ãããåé¡ã«ã€ããŠããåºãèŠéãæã£ãŠããããšãç解ããå¿ èŠããããŸãã äžæ¥äžè©±ãåãããšãã§ããæ§æã çŸåšåãçµãã§ããããŸãã¯æ¹åããããšããŠãããã¹ãŠã®äººã«æè¬ããããšæããŸããèšèªã©ã€ãã©ãªãšã©ã³ã¿ã€ã ã®æ°ããïŒéè¡ããªãïŒæ¹åãããã°ãããã楜ãã¿ã«ããŠããŸããçããã«äŸ¿å©ã§ãã
ãŸãã誰ããå¥ã®è§£æ±ºçã«ã€ããŠ3段èœã®äžå®å šãªè©Šã¿ãæžãã®ã¯éåžžã«ç°¡åã§ãïŒå®éã®äœæ¥ã¯å芳è ã«æ瀺ãããŠããŸããïŒã
ç§ïŒããã³ä»ã®å€ãã®äººïŒãtry
æçšã«ãããã£ãã®ã¯ãå€æŽãããŠããªããšã©ãŒã§ã¯ãªããã©ãããããããŒãžã§ã³ã®ãšã©ãŒãè¿ãããšãã§ããããã«ãããªãã·ã§ã³ã®åŒæ°ã ãã§ããã ããã»ã©å€ãã®èšèšäœæ¥ã¯å¿
èŠãªããšæããŸãã
倧éã
åãããŸããã ä»ã®èšèªãšã¯éããã®ãäœããããšæã£ãŠãã ããã
å€å誰ãããã®åé¡ãããã¯ããå¿ èŠããããŸããïŒ è°è«ã¯ããããä»ã®å Žæã«é©ããŠããŸãã
ãã®åé¡ã¯ãã§ã«éåžžã«é·ããããããã¯ããŠãæå³ããªãããã§ãã
ã¿ãªããããã®åé¡ã¯ã¯ããŒãºãããŠãããããã§ã®ã³ã¡ã³ãã¯ã»ãŒééããªãæ°žä¹ ã«ç¡èŠãããããšã«æ³šæããŠãã ããã ããã§ãããã°ãã³ã¡ã³ãããŠãã ããã
誰ããJavaãC *èšèªãæãèµ·ããããtryåèªãå«ãå Žåã¯ããtryãã§ã¯ãªãããhelpãããmustãããcheckErrorããªã©ã®ä»ã®åèªã䜿çšããããšããå§ãããŸããïŒç¡èŠããŠãã ããïŒ
誰ããJavaãC *èšèªãæãèµ·ããããtryåèªãå«ãå Žåã¯ããtryãã§ã¯ãªãããhelpãããmustãããcheckErrorããªã©ã®ä»ã®åèªã䜿çšããããšããå§ãããŸããïŒç¡èŠããŠãã ããïŒ
ïŒCãã¡ããªãŒèšèªã®ããã«ïŒäºãã«é©åºŠã«è¿ãèšèªã§ã¯ãæå³ã®éããå°ãããŸãã¯å€§ãããéè€ããããŒã¯ãŒããšæŠå¿µãåžžã«ååšããŸãã èšèªæ©èœã¯ãèšèªèªäœã®å éšã§æ··ä¹±ãåŒãèµ·ãããŠã¯ãªããŸãããèšèªéã®éãã¯åžžã«çºçããŸãã
æªãã ããã¯ã¢ã³ããã¿ãŒã³ã§ããããã®ææ¡ã®äœè ã軜èŠããŸã
@alersenkevich瀌åæ£ããããŠãã ããã https://golang.org/conductãåç §ããŠãã ããã
ãã以äžå ã«é²ãŸãªããšãã決æãã§ããŠãããããšæããŸãã ç§ã«ãšã£ãŠãããã¯errïŒ= nilãè€æ°ã®è¡ã«ãããã©ããã«é¢ããå°ããªåé¡ã解決ããããã®ç°¡åãªããã¯ã®ããã«æããŸããã ãã®ãããªãã€ããŒãªããšã解決ããããã«ããã€ããŒãªããŒã¯ãŒãã§GoãèšããŸããããããŸãããïŒ ããããè¡ççãªãã¯ãhttps://github.com/golang/go/issues/32620ã䜿çšããææ¡ã®æ¹ãè¯ããšæããçç±ã§ãã ããã¯ãããå€ãã®ãã®ã§ããå€ãã®æè»æ§ãéãããã®ããäžè¬çãªãœãªã¥ãŒã·ã§ã³ã«ãªãããšããŠããŸãã ããã§ã¯æ§æãšäœ¿çšæ³ã®è°è«ãé²è¡äžã§ãããããC / C ++ãã¯ãã§ãããã©ããã ããèããªãã§ãã ããã éèŠãªã®ã¯ããã¯ããå®è¡ããããã®ããè¯ãæ¹æ³ã«ã€ããŠè°è«ããããšã§ãã ããã䜿çšããŠãç¬èªã®è©Šè¡ãå®è£ ã§ããŸãã
çŸåšã®ãšã©ãŒåŠçã«é¢ããåé¡ã«å¯ŸåŠããåæ§ã®ææ¡ã«ã€ããŠã®ãã£ãŒãããã¯ããåŸ ã¡ããŠããŸãhttps://github.com/golang/go/issues/33161ã
æ£çŽãªãšãããããã¯åéããå¿ èŠããããŸãããã¹ãŠã®ãšã©ãŒåŠçã®ææ¡ã®äžã§ãããã¯æãå¥å šãªææ¡ã§ãã
@OneOfOneæ¬æãè¡šããŠããããåéããå¿ èŠãããããšã«åæããŸããã ãã®ã¹ã¬ããã¯ãæ§æã«å®éã®å¶éãããããšã確ç«ããŸããã ããããããªãã¯ãããæããæ£æ°ã®ãææ¡ã§ãããšããããšã¯æ£ããã§ãããïŒãããç§ã¯çŸç¶ããŸã ãã£ãšæ£æ°ã§ãããšä¿¡ããŠããŸãã
if err != nil
ã¯Go-ã§é »ç¹ã«èšè¿°ãããããšã«åæããŸãããé¢æ°ããæ»ãããã®åäžã®æ¹æ³ããããšãèªã¿ãããã倧å¹
ã«åäžããŸãã ç§ã¯äžè¬çã«å®åã³ãŒããæžããææ¡ãåŸåãã«ããããšãã§ããŸãããã³ã¹ãã¯æ±ºããŠèªã¿ãããã®ç§èŠã§ãã£ãŠã¯ãªããŸããã
å€ãã®éçºè ããé·ãéããšã©ãŒãã§ãã¯ãè¡ã£ãŠããããšãåããŠããããšã¯ç¥ã£ãŠããŸãããæ£çŽãªãšãããç°¡æœãã¯èªã¿ããããšçžå®¹ããªãããšããããããŸãã Goã«ã¯ãç¹å®ã®æ¹æ³ã§ç©äºãè¡ãããšã奚å±ããå€ãã®ç¢ºç«ããããã¿ãŒã³ããããä»ã®å Žæã«ãããç§ã®çµéšã§ã¯ãçµæã¯ååã«å€ããªãä¿¡é Œã§ããã³ãŒãã§ãã ããã¯éåžžã«éèŠã§ããå®éã®ã³ãŒãã¯ããã®åç¶æéãéããŠäœåºŠãèªã¿åã£ãŠç解ããå¿ èŠããããŸãããèšè¿°ãããã®ã¯1åã ãã§ãã çµéšè±å¯ãªéçºè ã«ãšã£ãŠãããèªç¥çãªãŒããŒãããã¯å®éã®ã³ã¹ãã§ãã
ãã以å€ã®ïŒ
f := try(os.Open(filename))
ç§ã¯æåŸ ããŸãïŒ
f := try os.Open(filename)
ã¿ãªããããã®åé¡ã¯ã¯ããŒãºãããŠãããããã§ã®ã³ã¡ã³ãã¯ã»ãŒééããªãæ°žä¹ ã«ç¡èŠãããããšã«æ³šæããŠãã ããã ããã§ãããã°ãã³ã¡ã³ãããŠãã ããã
â @ianlancetaylor
ãšã©ãŒãåŠçããçŸåšã®æ¹æ³ãšäžç·ã«ã³ãŒãã®ãããã¯ãè©ŠããŠã¿ãããšãã§ããã°ãããã¯çŽ æŽãããããšã§ãã
ãã®ãããªãã®ïŒ
// Generic Error Handler
handler := func(err error) error {
return fmt.Errorf("We encounter an error: %v", err)
}
a := "not Integer"
b := "not Integer"
try(handler){
f := os.Open(filename)
x := strconv.Atoi(a)
y, err := strconv.Atoi(b) // <------ If you want a specific error handler
if err != nil {
panic("We cannot covert b to int")
}
}
äžèšã®ã³ãŒãã¯ãæåã®ã³ã¡ã³ãããããããã«èŠããŸãã ç§ã¯ãããç®çãšããããšãã§ããã°ããã®ã«ãšæããŸãã
æ°ããææ¡ãããŸããïŒ35179
valïŒ= try fïŒïŒïŒerrïŒ{
ãããã¯ïŒãšã©ãŒïŒ
}
ããã ãšããïŒ
i, err := strconv.Atoi("1")
if err {
println("ERROR")
} else {
println(i)
}
ãŸã
i, err := strconv.Atoi("1")
if err {
io.EOF:
println("EOF")
io.ErrShortWrite:
println("ErrShortWrite")
} else {
println(i)
}
@myroid 2çªç®ã®äŸãswitch-else
ã¹ããŒãã¡ã³ãã®åœ¢åŒã§ããå°ãäžè¬çã«ããŠãããŸããŸããã
`` `è¡ã
iãerrïŒ= strconv.AtoiïŒ "1"ïŒ
ã¹ã€ãããšã©ãŒïŒ= nil; ãšã©ãŒ{
ã±ãŒã¹io.EOFïŒ
printlnïŒ "EOF"ïŒ
ã±ãŒã¹io.ErrShortWriteïŒ
printlnïŒ "ErrShortWrite"ïŒ
} ããããªããš {
printlnïŒiïŒ
}
@piotrkowalczukããªãã®ã³ãŒãã¯ç§ã®ãã®ãããã£ãšè¯ãèŠããŸãã ã³ãŒãã¯ãã£ãšç°¡æœã«ã§ãããšæããŸãã
i, err := strconv.Atoi("1")
switch err {
case io.EOF:
println("EOF")
case io.ErrShortWrite:
println("ErrShortWrite")
} else {
println(i)
}
ããã¯ãç°ãªãã¿ã€ãã®ç®ããããªãã·ã§ã³ãèæ ®ããŠããŸãã
ããå¿
èŠããããŸã
ã±ãŒã¹ãšã©ãŒïŒ= nil
ãšã©ãŒã®å Žåãéçºè ã¯æ瀺çã«ãã£ããã£ããŸããã§ãã
2019幎11æ8æ¥éææ¥ã12ïŒ06ã€ã³ãã¡ã³ã notifications @ github.comã¯æ¬¡ã®ããã«æžããŠããŸãã
@piotrkowalczukhttps ïŒ//github.com/piotrkowalczukããªãã®ã³ãŒãã¯ããèŠããŸã
ç§ãããåªããŠããŸãã ã³ãŒãã¯ãã£ãšç°¡æœã«ã§ãããšæããŸããiãerrïŒ= strconv.AtoiïŒ "1"ïŒswitch err {case io.EOFïŒ
printlnïŒ "EOF"ïŒcase io.ErrShortWriteïŒ
printlnïŒ "ErrShortWrite"ïŒ
} ããããªããš {
printlnïŒiïŒ
}â
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/32437?email_source=notifications&email_token=ABNEY4VH4KS2OX4M5BVH673QSU24DA5CNFSM4HTGCZ72YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2
ãŸãã¯è³Œèªã解é€ãã
https://github.com/notifications/unsubscribe-auth/ABNEY4W4XIIHGUGIW2KXRPTQSU24DANCNFSM4HTGCZ7Q
ã
switch
ã¯else
ãå¿
èŠãšããã$ default
ããããŸãã
ç§ã¯https://github.com/golang/go/issues/39890ãéããŸãããããã¯ãSwiftã®guard
ã«äŒŒããã®ãææ¡ããŠããããã®ææ¡ã«é¢ããããã€ãã®æžå¿µã«å¯ŸåŠããå¿
èŠããããŸãã
ããã¯ããŸã泚ç®ãéããŠããŸããããããã§ã³ã¡ã³ããã人ã«ãšã£ãŠã¯èå³æ·±ããããããŸããã
æãåèã«ãªãã³ã¡ã³ã
çããããã«ã¡ã¯ã
ãã®ãããªææ¡ã§ã®ç§ãã¡ã®ç®æšã¯ã圱é¿ããã¬ãŒããªããããã³é²ãæ¹ã«ã€ããŠã³ãã¥ããã£å šäœã§è°è«ãããã®è°è«ã䜿çšããŠä»åŸã®éçã決å®ããããšã§ãã
å§åçãªã³ãã¥ããã£ã®åå¿ãšããã§ã®åºç¯ãªè°è«ã«åºã¥ããŠããã®ææ¡ã¯äºå®ããæ©ãæåŠããããšããŒã¯ããŠããŸãã
æè¡çãªãã£ãŒãããã¯ã«é¢ããéãããã®è°è«ã¯ãç§ãã¡ãèŠéããããã€ãã®éèŠãªèæ ®äºé ãç¹ã«ãããã°å°å·ã®è¿œå ãšã³ãŒãã«ãã¬ããžã®åæãžã®åœ±é¿ãæçã«ç¹å®ããŸããã
ããã«éèŠãªããšã«ããã®ææ¡ã¯äŸ¡å€ã®ããåé¡ã察象ãšããŠããªããšäž»åŒµããå€ãã®äººã ã®å£°ãã¯ã£ãããšèããŠããŸãã Goã§ã®ãšã©ãŒåŠçã¯å®å šã§ã¯ãªããææ矩ã«æ¹åã§ãããšç§ãã¡ã¯ä¿¡ããŠããŸãããã³ãã¥ããã£ãšããŠããšã©ãŒåŠçã®ã©ã®ç¹å®ã®åŽé¢ã察åŠãã¹ãåé¡ã§ãããã«ã€ããŠãã£ãšè©±ãåãå¿ èŠãããããšã¯æããã§ãã
解決ãã¹ãåé¡ã«ã€ããŠã¯ãæšå¹Ž8æã®ã Go2ãšã©ãŒåŠçåé¡æŠèŠãã§ããžã§ã³ãæ瀺ããããšããŸããããæ¯ãè¿ã£ãŠã¿ããšããã®éšåã«ååãªæ³šæãåããŠããããååã«å±ãŸããŠããŸããã§ãããç¹å®ã®åé¡ãæ£ããåé¡ã§ãã£ããã©ããã«ã€ããŠã®è°è«ã
try
ã®ææ¡ã¯ãããã§æŠèª¬ãããŠããåé¡ã®åªãã解決çãããããŸããããå€ãã®äººã«ãšã£ãŠã¯ã解決ããåé¡ã§ã¯ãããŸããã å°æ¥çã«ã¯ããããã®åæã®åé¡ã¹ããŒãã¡ã³ãã«æ³šæãåãã解決ãå¿ èŠãªåé¡ã«ã€ããŠåºãåæãããŠããããšã確èªããããã«ãããè¯ãä»äºãããå¿ èŠããããŸããïŒåãæ¥ã«ãžã§ããªãã¯èšèšãã©ãããå ¬éããããšã«ããããšã©ãŒåŠçã®åé¡ã¹ããŒãã¡ã³ããå®å šã«ã¢ããã¹ããŒãžãããå¯èœæ§ããããŸããïŒ
Goã®ãšã©ãŒåŠçã«ã€ããŠäœãæ¹åããããšããããåºããããã¯ã«ã€ããŠã¯ãGoã§ã®ãšã©ãŒåŠçã®ã©ã®åŽé¢ããç¬èªã®ã³ãŒãããŒã¹ãšäœæ¥ç°å¢ã§æãåé¡ããããåªãããœãªã¥ãŒã·ã§ã³ãã©ã®çšåºŠã®åœ±é¿ãäžãããã«ã€ããŠã®çµéšã¬ããŒããèŠãããšãã§ããã°å¹žãã§ããããªãèªèº«ã®éçºã«ãããŸãã ãã®ãããªã¬ããŒããäœæããå Žåã¯ã Go2ErrorHandlingFeedbackããŒãžã«ãªã³ã¯ãæçš¿ããŠãã ããã
ãããä»ã®å Žæã§ããã®è°è«ã«åå ãããã¹ãŠã®äººã«æè¬ããŸãã Russ Coxã以åã«ææããããã«ããã®ãããªã³ãã¥ããã£å šäœã®è°è«ã¯ãæé«ã®ç¶æ ã§ãªãŒãã³ãœãŒã¹ã§ãã ãã®ç¹å®ã®ææ¡ãæ€èšããããäžè¬çã«ã¯Goã§ã®ãšã©ãŒåŠçã®ç¶æ ãæ¹åããããã®æè¯ã®æ¹æ³ã«ã€ããŠè°è«ããéã«ãçæ§ã®ãååã«å¿ããæè¬ããããŸãã
ææ¡å¯©æ»å§å¡äŒã®RobertGriesemeræ°ã