Goã§ã®ãšã©ãŒåŠçãç°¡çŽ åããæ¹æ³ã«ã€ããŠã¯ãå€ãã®ææ¡ããããŸãããããã¯ãã¹ãŠãGoã³ãŒãã«è¡ãå€ããããšããäžè¬çãªèŠæ ã«åºã¥ããŠããŸãã
if err != nil {
return err
}
ããã§è§£æ±ºãã¹ãåé¡ããããã©ããã¯ããããŸããããåé¡ãçºçãç¶ããã®ã§ããã®ã¢ã€ãã¢ãåºããŸãã
ãšã©ãŒåŠçãåçŽåããããã®ã»ãšãã©ã®ææ¡ã«é¢ããäž»èŠãªåé¡ã®1ã€ã¯ããšã©ãŒåŠçã®2ã€ã®æ¹æ³ããåçŽåããªãããšã§ãããå®éã«ã¯3ã€ãããŸãã
ãšã©ãŒãç¡èŠããããšã¯ãã§ã«ç°¡åã§ãïŒããããç°¡åãããŸãïŒïŒïŒ20803ãåç §ïŒã ãšã©ãŒåŠçã«é¢ããæ¢åã®ææ¡ã®å€ãã¯ãå€æŽããã«ãšã©ãŒãè¿ãã®ã容æã«ããŸãïŒããšãã°ãïŒ16225ãïŒ18721ãïŒ21146ãïŒ21155ïŒã è¿œå æ å ±ã䜿çšããŠãšã©ãŒãç°¡åã«è¿ãããšãã§ãããã®ã¯ã»ãšãã©ãããŸããã
ãã®ææ¡ã¯ãèšèªã®ã¢ã€ãã¢ã®è¥æ²ãªæ
å ±æºã§ããPerlããã³Bourneã·ã§ã«èšèªã«å€§ãŸãã«åºã¥ããŠããŸãã åŒã¹ããŒãã¡ã³ãã«äŒŒãæ°ããçš®é¡ã®ã¹ããŒãã¡ã³ãã玹ä»ããŸããåŒã³åºãåŒã®åŸã«||
ç¶ããŸãã ææ³ã¯æ¬¡ã®ãšããã§ãã
PrimaryExpr Arguments "||" Expression
åæ§ã«ãæ°ããçš®é¡ã®ä»£å ¥ã¹ããŒãã¡ã³ããå°å ¥ããŸãã
ExpressionList assign_op PrimaryExpr Arguments "||" Expression
éå²ãåœãŠã®å Žåãææ³ã¯||
åŸã®ä»»æã®ã¿ã€ããåãå
¥ããŸãããèš±å¯ãããã¿ã€ãã¯ãäºåã«å®£èšãããã¿ã€ãerror
ã§ãã ||
ç¶ãåŒã«ã¯ã error
å²ãåœãŠå¯èœãªåãå¿
èŠã§ãã error
å²ãåœãŠå¯èœãªååä»ãããŒã«åã§ããããããŒã«åã§ã¯ãªãå¯èœæ§ããããŸãã ïŒãã®åŸè
ã®å¶éã¯ããã®ææ¡ãæ¢åã®èšèªãšäžäœäºææ§ãæãããããã«å¿
èŠã§ããïŒ
ãããã®æ°ããçš®é¡ã®ã¹ããŒãã¡ã³ãã¯ãå°ãªããšã1ã€ã®çµæãã©ã¡ãŒã¿ãŒãæã€é¢æ°ã®æ¬äœã§ã®ã¿èš±å¯ãããæåŸã®çµæãã©ã¡ãŒã¿ãŒã®ã¿ã€ãã¯ãäºåã«å®£èšãããã¿ã€ãerror
å¿
èŠããããŸãã åæ§ã«ãåŒã³åºãããé¢æ°ã«ã¯å°ãªããšã1ã€ã®çµæãã©ã¡ãŒã¿ãŒãå¿
èŠã§ãããæåŸã®çµæãã©ã¡ãŒã¿ãŒã®åã¯äºåã«å®£èšãããåerror
å¿
èŠããããŸãã
ãããã®ã¹ããŒãã¡ã³ããå®è¡ãããšãåŒã³åºãåŒã¯éåžžã©ããè©äŸ¡ãããŸãã 代å
¥æã®å ŽåãåŒã³åºãçµæã¯éåžžéãå·ŠåŽã®ãªãã©ã³ãã«ä»£å
¥ãããŸãã 次ã«ãäžèšã®ããã«ã¿ã€ãerror
ã§ããå¿
èŠãããæåŸã®åŒã³åºãçµæãã nil
ãšæ¯èŒãããŸãã æåŸã®åŒã³åºãçµæãnil
å Žåãreturnã¹ããŒãã¡ã³ããæé»çã«å®è¡ãããŸãã åŒã³åºãå
ã®é¢æ°ã«è€æ°ã®çµæãããå ŽåãæåŸã®çµæãé€ããã¹ãŠã®çµæã«å¯ŸããŠãŒãå€ãè¿ãããŸãã ||
ç¶ãåŒããæåŸã®çµæãšããŠè¿ãããŸãã äžèšã®ããã«ãåŒã³åºãå
ã®é¢æ°ã®æåŸã®çµæã¯ã¿ã€ãerror
ã§ããå¿
èŠããããåŒã¯ã¿ã€ãerror
å²ãåœãŠå¯èœã§ããå¿
èŠããããŸãã
éå²ãåœãŠã®å ŽåãåŒã¯ãæ°ããå€æ°err
ãå°å
¥ãããé¢æ°åŒã³åºãã®æåŸã®çµæã®å€ã«èšå®ãããã¹ã³ãŒãã§è©äŸ¡ãããŸãã ããã«ãããåŒã¯åŒã³åºãã«ãã£ãŠè¿ããããšã©ãŒãç°¡åã«åç
§ã§ããŸãã å²ãåœãŠã®å ŽåãåŒã¯åŒã³åºãã®çµæã®ã¹ã³ãŒãã§è©äŸ¡ãããããããšã©ãŒãçŽæ¥åç
§ã§ããŸãã
ãããå®å šãªææ¡ã§ãã
ããšãã°ã os.Chdir
é¢æ°ã¯çŸåš
func Chdir(dir string) error {
if e := syscall.Chdir(dir); e != nil {
return &PathError{"chdir", dir, e}
}
return nil
}
ãã®ææ¡ã®äžã§ã¯ã次ã®ããã«æžãããšãã§ããŸã
func Chdir(dir string) error {
syscall.Chdir(dir) || &PathError{"chdir", dir, err}
return nil
}
ç§ã¯äž»ã«ãGoãšã©ãŒåŠçãç°¡çŽ åããã人ã ã«ããšã©ãŒãå€æŽããã«è¿ãã ãã§ãªãããšã©ãŒã®åšãã«ã³ã³ããã¹ããç°¡åã«ã©ããã§ããããã«ããæ¹æ³ãèããããã«ä¿ãããã«ãã®ææ¡ãæžããŠããŸãã
syscall.Chdir(dir) || &PathError{"chdir", dir, e}
e
ã¯ããããã©ãããæ¥ãã®ã§ããïŒ æã¡ééãïŒ
ãŸãã¯ããªãã¯æå³ããŸããïŒ
func Chdir(dir string) (e error) {
syscall.Chdir(dir) || &PathError{"chdir", dir, e}
return nil
}
ïŒã€ãŸããæé»ã®errïŒ= nilãã§ãã¯ã¯æåã«çµæãã©ã¡ãŒã¿ãŒã«ãšã©ãŒãå²ãåœãŠãŸããïŒæé»ã®æ»ãã®åã«ãããå床å€æŽããããã«ååãä»ããããšãã§ããŸããïŒïŒ
ããæ¯ãç§èªèº«ã®äŸãå°ç¡ãã«ããã çŸåšä¿®æ£æžã¿ïŒ e
ã¯err
å¿
èŠããããŸãã ãã®ææ¡ã§ã¯ã err
ãã¹ã³ãŒãã«å
¥ããŠã代å
¥ã¹ããŒãã¡ã³ãã«ãªãå Žåã«é¢æ°åŒã³åºãã®ãšã©ãŒå€ãä¿æããŸãã
ã¢ã€ãã¢ãæ§æã«åæãããã©ããã¯ããããŸãããããšã©ãŒãè¿ãåã«ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšã«æ³šæãæã£ãããšãèªããªããã°ãªããŸããã
ããã¯ã httpsïŒ//github.com/pkg/errorsãæžãã@davecheneyã«ãšã£ãŠèå³æ·±ããããããŸããã
ãã®ã³ãŒãã§äœãèµ·ãããïŒ
if foo, err := thing.Nope() || &PathError{"chdir", dir, err}; err == nil || ignoreError {
}
ïŒ || &PathError{"chdir", dir, e}
éšåããªããšããããäžå¯èœãªå Žåã¯ãè©«ã³ããŸããããã¯æ¢åã®åäœã®çŽãããããªãŒããŒã©ã€ãã®ããã«æããããæé»ã®ãªã¿ãŒã³ã¯...åå£ã§ããïŒïŒ
@ object88 if
ãšfor
ãšswitch
ã¹ããŒãã¡ã³ãã§äœ¿çšãããSimpleStmtã§ãã®æ°ããã±ãŒã¹ãèš±å¯ããªããŠã倧äžå€«ã§ãã ææ³ãå°ãè€éã«ãªããŸããããããããããæåã§ãããã
ããããããããªããšã thing.Nope()
ãnil以å€ã®ãšã©ãŒãè¿ããå ŽåãåŒã³åºãå
ã®é¢æ°ã¯&PathError{"chdir", dir, err}
ïŒ err
ã¯thing.Nope()
ã®åŒã³åºãã«ãã£ãŠèšå®ãããå€æ°ïŒã thing.Nope()
ãnil
ãšã©ãŒãè¿ãå Žåã if
ã¹ããŒãã¡ã³ãã®æ¡ä»¶ã§err == nil
ãçã§ããããšã確å®ã«ããããŸãããããã£ãŠã ifã¹ããŒãã¡ã³ããå®è¡ãããŸãã ignoreError
å€æ°ãèªã¿åãããããšã¯ãããŸããã ããã§ã¯ãæ¢åã®åäœã®ãããŸããããªãŒããŒã©ã€ãã¯ãããŸããã ããã§çŽ¹ä»ãã||
ã®åŠçã¯ã ||
åŸã®åŒãããŒã«å€ã§ã¯ãªãå Žåã«ã®ã¿åãå
¥ããããŸããã€ãŸããçŸåšã³ã³ãã€ã«ãããŸããã
ç§ã¯æé»ã®ãªã¿ãŒã³ãåå£ã§ããããšã«åæããŸãã
ãããç§ã®äŸã¯ããªã貧匱ã§ãã ãã ãã if
ã for
ããŸãã¯switch
å
ã§ã®æäœãèš±å¯ããªããšãå€ãã®æœåšçãªæ··ä¹±ã解決ãããŸãã
æ€èšã®åºæºã¯ãäžè¬çã«èšèªã§ã¯ãã®ãŸãŸã§ã¯é£ããããšãªã®ã§ããã®ããªã¢ã³ããèšèªã§ãšã³ã³ãŒãããã®ãã©ãã»ã©é£ãããã確èªããããšã«ããŸããã ä»ã®ãã®ãããããã»ã©é£ããããšã§ã¯ãããŸããïŒ https ïŒ
ç§ã¯ããªã¿ãŒã³åŒæ°ã®1ã€ã®ã¿ã€ãã®å€ãš1ã€ã®äœçœ®ãç¹å¥ã«ãããšãããããã®ææ¡ã®ãã¹ãŠãæ¬åœã«å«ãã§ãã ããã¯ããã®ç¹å®ã®ã³ã³ããã¹ãã§err
ãç¹å¥ãªååã«ãããããå®éã«ã¯ããã«æªããã®ã«ãªããŸãã
ç§ã¯ç¢ºãã«äººã ïŒç§ãå«ãïŒïŒãäœåãªæèãªãã§ãšã©ãŒãè¿ãããšã«é£œã飜ãããŠããã¹ãã§ããããšã«åæããŸãã
ä»ã®æ»ãå€ãããå Žåã
if err != nil {
return 0, nil, "", Struct{}, wrap(err)
}
ããã¯ééããªãèªãã®ãé¢åã«ãªãå¯èœæ§ããããŸãã https://github.com/golang/go/issues/19642#issuecomment-288559297ã®return ..., err
ã«å¯Ÿãã@nigeltaoã®ææ¡ãå°ãæ°ã«å
¥ããŸãã
ç§ãæ£ããç解ããŠããã°ãæ§æããªãŒãæ§ç¯ããã«ã¯ãããŒãµãŒã¯å€æ°ã®ã¿ã€ããç¥ã£ãŠåºå¥ããå¿ èŠããããŸã
boolean := BoolFunc() || BoolExpr
ãš
err := FuncReturningError() || Expr
èŠæ ããè¯ããããŸããã
å°ãªãã»ããããã§ãã...
æ»ãå€ã®ExpressionListã«ããã«2ã€ä»¥äžã®èŠçŽ ãå«ãŸããŠããå Žåãã©ã®ããã«æ©èœããŸããïŒ
ãšããã§ã代ããã«panicIfã欲ããã§ãã
err := doSomeThing()
panicIf(err)
err = doAnotherThing()
panicIf(err)
@ianlancetaylorããªãã®ææ¡ã®äŸã§ã¯ã err
ã¯ãŸã æ瀺çã«å®£èšãããŠãããããéæ³ã®ãïŒèšèªãäºåå®çŸ©ãããŠããïŒãšããŠåŒã蟌ãŸããŠããŸãããïŒ
ãããšã次ã®ãããªãã®ã«ãªããŸãã
func Chdir(dir string) error {
return (err := syscall.Chdir(dir)) || &PathError{"chdir", dir, err}
}
ïŒ
äžæ¹ïŒãã§ã«ãèšèªå€ââæŽããšããŠããŒã¯ãããŠãããã...ïŒ
ãšã©ãŒæã«ã·ã§ãŒãã«ãããå®è¡ããæ°ããæŒç®åïŒ!!ãŸãã¯??ïŒãå°å
¥ããŸãïŒ= nilïŒãŸãã¯null蚱容åïŒïŒ
func DirCh(dir string) (string, error) {
return dir, (err := syscall.Chdir(dir)) !! &PathError{"chdir", dir, err}
}
ãããé ãããå Žåã¯ç³ãèš³ãããŸãã:)
Goã§ã®ãšã©ãŒåŠçãç¹°ãè¿ãããå¯èœæ§ãããããšã«åæããŸãã ç¹°ãè¿ããŠãããŸããŸããããèªã¿ãããã«åœ±é¿ãäžãããã®ãå€ãããŸãã ã埪ç°çè€é床ãïŒä¿¡ããããªããããããŸãããïŒãè€é床ã®å°ºåºŠãšããŠå¶åŸ¡ãããŒã䜿çšããã®ã«ã¯çç±ããããŸãã ãifãã¹ããŒãã¡ã³ãã¯äœåãªãã€ãºãè¿œå ããŸãã
ãã ããææ¡ãããæ§æã||ã ç¹ã«èšå·ã¯äžè¬ã«ORæŒç®åãšããŠç¥ãããŠãããããèªã¿ãããã¯ãããŸããã ããã«ãè€æ°ã®å€ãšãšã©ãŒãè¿ãé¢æ°ãã©ã®ããã«åŠçããŸããïŒ
ããã§ããã€ãã®ã¢ã€ãã¢ãæããŠããŸãã ãšã©ãŒãåºåãšããŠäœ¿çšãã代ããã«ããšã©ãŒãå ¥åãšããŠäœ¿çšããã®ã¯ã©ãã§ããïŒ äŸïŒ https ïŒ
ãã¹ãŠã®ã³ã¡ã³ããããããšãã
@opennotaè¯ãç¹ã§ãã ããã§ãæ©èœããå¯èœæ§ã¯ãããŸãããåŽé¢ãåä»ã§ããããšã«åæããŸãã
@mattn Return ExpressionListã¯ãªããšæãã®ã§ãäœãæ±ããŠããã®ã
@mattn panicif
ã¯ããã®ææ¡ã®éèŠãªèŠçŽ ã®1ã€ã«å¯Ÿå¿ããŠããŸãããããã¯ãè¿œå ã®ã³ã³ããã¹ãã§ãšã©ãŒãè¿ãç°¡åãªæ¹æ³ã§ãã ãããŠãã¡ãããä»æ¥ã¯ç°¡åã«panicif
æžãããšãã§ããŸãã
@tandrã¯ãã err
ã¯éæ³ã®ããã«å®çŸ©ãããŠããŸãããããã¯ããªãã²ã©ãããšã§ãã å¥ã®å¯èœæ§ã¯ããšã©ãŒåŒãerror
ã䜿çšããŠãšã©ãŒãåç
§ã§ããããã«ããããšã§ããããã¯ãå¥ã®æ¹æ³ã§ã²ã©ããã®ã§ãã
@tandrå¥ã®æŒç®åã䜿çšããããšãã§ããŸããã倧ããªå©ç¹ã¯ãããŸããã çµæãèªã¿ããããªãããã§ã¯ãªãããã§ãã
@henryasææ¡ã¯ãè€æ°ã®çµæãåŠçããæ¹æ³ã説æããŠãããšæããŸãã
@henryasäŸãããããšãã ãã®çš®ã®ã¢ãããŒãã§ç§ãå«ãã®ã¯ããšã©ãŒåŠçãã³ãŒãã®æãé¡èãªåŽé¢ã«ãªãããšã§ãã ãšã©ãŒåŠçãååšãã衚瀺ãããããã«ãããã®ã§ããããããæåã«è¡šç€ºãããããã«ããããããŸããã ããã¯ã if err != nil
ã€ãã£ãªã ãšãšã©ãŒåŠçã³ãŒãã®ã€ã³ãã³ãã«ãããä»æ¥ãåœãŠã¯ãŸããŸãããšã©ãŒåŠçã®ããã«æ°ããæ©èœãè¿œå ãããŠããããã¯åœãŠã¯ãŸãã¯ãã§ãã
å床ãæè¬ããŸãã
@ianlancetaylorç§ã®éã³å Žã®ãªã³ã¯ããã§ãã¯ã¢ãŠããããã©ããã¯ããããŸããããã³ã³ããã¹ããè¿œå ã§ãããpanicIfãããããŸããã
ããã§ã¯ãããç°¡ç¥åãããããŒãžã§ã³ãåçŸããŸãã
func panicIf(err error, transforms ...func(error) error) {
if err == nil {
return
}
for _, transform := range transforms {
err = transform(err)
}
panic(err)
}
å¶ç¶ã«ããç§ã¯GopherConã§
func DirCh(dir string) (string, error) {
dir := syscall.Chdir(dir) =: err; if err != nil { return "", err }
}
ããã§ã =:
ã¯æ§æã®æ°ãããããã§ãããå察æ¹åã«å²ãåœãŠã:=
ãã©ãŒã§ãã ãã¡ããã =
ãäœããå¿
èŠã§ãããããã¯ç¢ºãã«åé¡ããããŸãã ããããäžè¬çãªèãæ¹ã¯ãèªè
ãæ
å ±ã倱ãããšãªãã幞ããªéãç解ããããããããšã§ãã
äžæ¹ãçŸåšã®ãšã©ãŒåŠçæ¹æ³ã«ã¯ã1ã€ã®é¢æ°ã§å€ãã®ããšãå®è¡ããŠããå¯èœæ§ããããäžéšã®ãªãã¡ã¯ã¿ãªã³ã°ãé ããŠããå¯èœæ§ãããããšãæ確ã«æãåºããããšããç¹ã§ãããã€ãã®ã¡ãªããããããŸãã
ããã§@billyhã«ãã£ãŠææ¡ãããæ§æãæ¬åœã«å¥œãã§ã
func Chdir(dir string) error {
e := syscall.Chdir(dir) catch: &PathError{"chdir", dir, e}
return nil
}
ãŸãã¯https://github.com/pkg/errorsã䜿çšããããè€éãªäŸ
func parse(input io.Reader) (*point, error) {
var p point
err := read(&p.Longitude) catch: nil, errors.Wrap(err, "Failed to read longitude")
err = read(&p.Latitude) catch: nil, errors.Wrap(err, "Failed to read Latitude")
err = read(&p.Distance) catch: nil, errors.Wrap(err, "Failed to read Distance")
err = read(&p.ElevationGain) catch: nil, errors.Wrap(err, "Failed to read ElevationGain")
err = read(&p.ElevationLoss) catch: nil, errors.Wrap(err, "Failed to read ElevationLoss")
return &p, nil
}
ãšã©ãŒè£
食ããµããŒãããŠãããããã倧å¹
ãªèšèªå€æŽãå¿
èŠãªïŒæããã«go1.10ã§ã¯ãªãïŒåçŽãªã¢ã€ãã¢ã¯ãæ°ããcheck
ããŒã¯ãŒãã®å°å
¥ã§ãã
check A
ãšcheck A, B
2ã€ã®åœ¢åŒã«ãªããŸãã
ã©ã¡ããA
ãšB
ããå¿
èŠãerror
ã 2çªç®ã®åœ¢åŒã¯ããšã©ãŒãè£
食ããå Žåã«ã®ã¿äœ¿çšãããŸãã ãšã©ãŒãè£
食ããå¿
èŠããªãããŸãã¯è£
食ããããªã人ã¯ãããåçŽãªåœ¢åŒã䜿çšããŸãã
check A
ã¯A
è©äŸ¡ããŸãã nil
å ŽåãäœãããŸããã nil
ã§ãªãå Žåã check
ã¯return {<zero>}*, A
ãŸãã
äŸ
check
ãšã€ã³ã©ã€ã³ã§äœ¿çšã§ãããããerr := UpdateDB() // signature: func UpdateDb() error
if err != nil {
return err
}
ã«ãªããŸã
check UpdateDB()
a, b, err := Foo() // signature: func Foo() (string, string, error)
if err != nil {
return "", "", err
}
// use a and b
ã«ãªããŸã
a, b, err := Foo()
check err
// use a and b
check A, B
ã¯A
è©äŸ¡ããŸãã nil
å ŽåãäœãããŸããã nil
ã§ãªãå Žåã check
ã¯return {<zero>}*, B
ãŸãã
ããã¯ããšã©ãŒãè£
食ããããã®ãã®ã§ãã åŒãç¶ãA
ãã§ãã¯ããŸãããæé»ã®return
䜿çšãããã®ã¯B
ã§ãã
äŸ
a, err := Bar() // signature: func Bar() (string, error)
if err != nil {
return "", &BarError{"Bar", err}
}
ã«ãªããŸã
a, err := Foo()
check err, &BarError{"Bar", err}
ã³ã³ãã€ã«ãšã©ãŒã§ã
error
è©äŸ¡ãããªããã®ã«ã¯ã check
ã¹ããŒãã¡ã³ãã䜿çšããŸã{ type }*, error
圢åŒã§ã¯ãªãæ»ãå€ãæã€é¢æ°ã§check
ã䜿çšããŸã2ã€ã®expr圢åŒã®check A, B
ãç絡ããŠããŸãã B
A
ãnil
å Žåã B
ã¯è©äŸ¡ãããŸããã
ãšã©ãŒã®è£
食ã¯ãµããŒããããŠããŸãããå®éã«ãšã©ãŒãè£
食ããå¿
èŠãããå Žåã«ã®ã¿ãããäžæ Œå¥œãªcheck A, B
æ§æã®æéãæ¯æããŸãã
if err != nil { return nil, nil, err }
ãã€ã©ãŒãã¬ãŒãïŒããã¯éåžžã«äžè¬çã§ãïŒã®å Žåã check err
ã¯ãæ確ããç ç²ã«ããããšãªããå¯èœãªéãç°¡æœã«ãªããŸãïŒä»¥äžã®æ§æã«é¢ãã泚èšãåç
§ïŒã
ãã®çš®ã®æ§æïŒ check ..
ãè¡ã®å
é ã return
ãšåæ§ïŒã¯ãå¶åŸ¡ãããŒã®äžæãé ãããšãªãããã€ã©ãŒãã¬ãŒãã®ãšã©ãŒãã§ãã¯ãæé€ããããã®è¯ãæ¹æ³ã§ãããšç§ã¯äž»åŒµããŸããæé»ã®ãªã¿ãŒã³ãå°å
¥ãããŸãã
äžèšã®<do-stuff> || <handle-err>
ã<do-stuff> catch <handle-err>
ããŸãã¯å¥ã®ã¹ã¬ããã§ææ¡ãããa, b = foo()?
ãããªã¢ã€ãã¢ã®æ¬ ç¹ã¯ããããŒãå°é£ã«ããæ¹æ³ã§å¶åŸ¡ãããŒã®å€æŽãé衚瀺ã«ããããšã§ãããã©ããŒãã; åè
ã¯ãä»ã®ç¹ã§ã¯ããããããè¡ã®æåŸã«|| <handle-err>
æ©æ¢°ãè¿œå ãããåŸè
ã¯ãã³ãŒãã®ããããããè¡ã®äžå€®ãšæåŸãå«ããã©ãã«ã§ã衚瀺ã§ããå°ããªèšå·ãä»ããŠããŸããããããè€æ°åã
check
ã¹ããŒãã¡ã³ãã¯åžžã«çŸåšã®ãããã¯ã®æäžäœã«ãããå¶åŸ¡ãããŒãå€æŽããä»ã®ã¹ããŒãã¡ã³ããšåãããã«ç®ç«ã¡ãŸãïŒããšãã°ãåæã®return
ïŒã
@ALTree ãç§ã¯ããªãã®äŸãã©ã®ããã«ç解ã§ããŸããã§ããïŒ
a, b, err := Foo()
check err
ãªãªãžãã«ããã®3ã€ã®äŸ¡å€ã®ãããªã¿ãŒã³ãå®çŸããŸãã
return "", "", err
æçµãšã©ãŒãé€ããŠã宣èšããããã¹ãŠã®æ»ãå€ã«å¯ŸããŠãŒãå€ãè¿ãã ãã§ããïŒ WriteïŒïŒã倱æãããšãã«æžã蟌ãŸãããã€ãæ°ãªã©ããšã©ãŒãšãšãã«æå¹ãªå€ãè¿ãããå Žåã¯ã©ãã§ããããã
ã©ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããå Žåã§ãããšã©ãŒåŠçã®äžè¬æ§ãæå°éã«å¶éããå¿ èŠããããŸãã
è¡ã®å
é ã«check
ãããããšã®äŸ¡å€ã«é¢ããŠãç§ã®å人çãªå¥œã¿ã¯ãåè¡ã®å
é ã«ãã©ã€ããªå¶åŸ¡ãããŒã衚瀺ãããšã©ãŒåŠçããã®ãã©ã€ããªå¶åŸ¡ãããŒã®å¯èªæ§ãã»ãšãã©åŠšããªãããã«ããããšã§ããã§ããã ãã ãŸãããšã©ãŒåŠçãcheck
ãcatch
ãããªäºçŽèªã§åºå¥ãããŠããå Žåãã»ãšãã©ãã¹ãŠã®ææ°ã®ãšãã£ã¿ãŒã¯ãäœããã®æ¹æ³ã§äºçŽèªã®æ§æã匷調衚瀺ãããããç®ç«ãããŸããå³åŽã«ããå Žåã
@billyhããã¯ãäžèšã®æ¬¡ã®è¡ã§èª¬æãããŠããŸãã
nilã§ãªãå Žåããã§ãã¯ã¯
return {<zero>}*, A
check
ã¯ããšã©ãŒïŒæåŸã®äœçœ®ïŒãé€ããŠãä»»æã®æ»ãå€ã®ãŒãå€ãè¿ããŸãã
ãšã©ãŒãšãšãã«æå¹ãªå€ãè¿ãããå Žåã¯ã©ãã§ãããã
次ã«ã if err != nil {
ã€ãã£ãªã ã䜿çšããŸãã
ããé«åºŠãªãšã©ãŒå埩æé ãå¿
èŠã«ãªãå Žåãå€ããããŸãã ããšãã°ããšã©ãŒããã£ããããåŸãäœããããŒã«ããã¯ãããããã°ãã¡ã€ã«ã«äœããæžã蟌ãã ãããå¿
èŠãããå ŽåããããŸãã ããããã¹ãŠã®å Žåã§ããããŒã«ããã¯ã¹ã«ã¯éåžžã®if err
ã€ãã£ãªã ããããããã䜿çšããŠæ°ãããããã¯ãéå§ã§ããŸããããã§ããšã©ãŒåŠçã«é¢é£ããããããçš®é¡ã®æäœããæ確ã«è¡šçŸãããŠããŠãå¯èœã§ããå®è¡ãããŸãã
ã©ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããå Žåã§ãããšã©ãŒåŠçã®äžè¬æ§ãæå°éã«å¶éããå¿ èŠããããŸãã
äžèšã®ç§ã®çããåç
§ããŠãã ããã ããªãã¯ãŸã if
ãšèšèªãä»ããªãã«äžããä»ã®ãã®ãæã£ãŠããã§ãããã
ã»ãšãã©ãã¹ãŠã®çŸä»£ã®ç·šéè ã¯äºçŽèªã匷調ããããšããŠããŸã
å€åã ããããèªã¿ãããããããã«æ§æã®åŒ·èª¿è¡šç€ºãå¿ èŠãšããäžéæãªæ§æãå°å ¥ããããšã¯çæ³çã§ã¯ãããŸããã
ãã®ç¹å®ã®ãã°ã¯ãèšèªã«ããã«ãªã¿ãŒã³æ©èœãå°å
¥ããããšã§ä¿®æ£ã§ããŸãã
ãã®å Žåãé¢æ°aïŒïŒã¯123ãè¿ããŸãã
func aïŒïŒint {
bïŒïŒ
456ãè¿ã
}
func bïŒïŒ{
return return intïŒ123ïŒ
}
ãã®æ©èœã¯ã次ã®ããã«ãšã©ãŒåŠçãç°¡çŽ åããããã«äœ¿çšã§ããŸãã
func handleïŒvar * fooãerr errorïŒïŒvar * fooãerr errorïŒ{
errïŒ= nil {ã®å Žå
return return nilãerr
}
varãnilãè¿ã
}func client_codeïŒïŒïŒ* client_objectãerrorïŒ{
var objãerr = handleïŒsomething_that_can_failïŒïŒïŒ
//ããã¯äœãã倱æããªãã£ãå Žåã«ã®ã¿å°éããŸã
//ãã以å€ã®å Žåãclient_codeé¢æ°ã¯ãšã©ãŒãã¹ã¿ãã¯ã«äŒæããŸã
assertïŒerr == nilïŒ
}
ããã«ããããšã©ãŒãã¹ã¿ãã¯ã«äŒæã§ãããšã©ãŒãã³ãã©ãŒé¢æ°ãäœæã§ããŸãã
ãã®ãããªãšã©ãŒåŠçé¢æ°ã¯ãã¡ã€ã³ã³ãŒãããåé¢ã§ããŸã
ééããå Žåã¯ç³ãèš³ãããŸããããèŠç¹ãæ確ã«ãããã®ã§ããã以äžã®é¢æ°ã¯ãšã©ãŒã vet
èŠåãçæããŸããããããšãåãå
¥ããããŸããïŒ
func Chdir(dir string) (err error) {
syscall.Chdir(dir) || err
return nil
}
@rodcorsiãã®ææ¡ã§ã¯ãããªãã®äŸã¯ç£å»ã®èŠåãªãã«åãå ¥ããããŸãã ãšåçã«ãªããŸã
if err := syscall.Chdir(dir); err != nil {
return err
}
ãšã©ãŒãåŠçããããã«ã³ã³ããã¹ãã®äœ¿çšãæ¡åŒµããã®ã¯ã©ãã§ããïŒ ããšãã°ã次ã®å®çŸ©ãäžããããŸãã
type ErrorContext interface {
HasError() bool
SetError(msg string)
Error() string
}
ãšã©ãŒãçºçããããé¢æ°ã«ãªããŸãã...
func MyFunction(number int, ctx ErrorContext) int {
if ctx.HasError() {
return 0
}
return number + 1
}
äžéæ©èœã§ã¯..ã
func MyIntermediateFunction(ctx ErrorContext) int {
if ctx.HasError() {
return 0
}
number := 0
number = MyFunction(number, ctx)
number = MyFunction(number, ctx)
number = MyFunction(number, ctx)
return number
}
ãããŠäžäœã¬ãã«ã®æ©èœã§ã¯
func main() {
ctx := context.New()
no := MyIntermediateFunction(ctx)
if ctx.HasError() {
log.Fatalf("Error: %s", ctx.Error())
return
}
fmt.Printf("%d\n", no)
}
ãã®ã¢ãããŒãã䜿çšãããšãããã€ãã®å©ç¹ããããŸãã ãŸãããªãŒããŒãã¡ã€ã³ã®å®è¡ãã¹ããæ°ãæ£ããããšã¯ãããŸããã ã¡ã€ã³ã®å®è¡ãã¹ããã®éžè±ã瀺ãæå°éã®ãifãã¹ããŒãã¡ã³ãããããŸãã
第äºã«ãããã¯ãšã©ãŒãé ããŸããã ã¡ãœããã·ã°ããã£ãããErrorContextãåãå ¥ããå Žåãé¢æ°ã«ãšã©ãŒãããå¯èœæ§ãããããšã¯æããã§ãã é¢æ°å ã§ã¯ãéåžžã®Goã³ãŒãã䜿çšããŠãšã©ãŒãã©ã®ããã«åŠçããããã瀺ãéåžžã®åå²ã¹ããŒãã¡ã³ãïŒãifããªã©ïŒã䜿çšããŸãã
第3ã«ããšã©ãŒã¯èªåçã«é¢ä¿è
ïŒãã®å Žåã¯ã³ã³ããã¹ãææè
ïŒã«ããã«ãããŸãã è¿œå ã®ãšã©ãŒåŠçãããå Žåã¯ãæ確ã«è¡šç€ºãããŸãã ããšãã°ãæ¢åã®ãšã©ãŒãã©ããããããã«ãäžéé¢æ°ã«ããã€ãã®å€æŽãå ããŸãããã
func MyIntermediateFunction(ctx ErrorContext) int {
if ctx.HasError() {
return 0
}
number := 0
number = MyFunction(number, ctx)
number = MyFunction(number, ctx)
number = MyFunction(number, ctx)
if ctx.HasError() {
ctx.SetError(fmt.Sprintf("wrap msg: %s", ctx.Error())
return
}
number *= 20
number = MyFunction(number, ctx)
return number
}
åºæ¬çã«ã¯ãå¿
èŠã«å¿ããŠãšã©ãŒåŠçã³ãŒããèšè¿°ããã ãã§ãã æåã§ããã«ããå¿
èŠã¯ãããŸããã
æåŸã«ãé¢æ°ã®äœæè
ã§ããããªãã¯ããšã©ãŒãåŠçããå¿
èŠããããã©ãããå€æã§ããŸãã çŸåšã®Goã¢ãããŒãã䜿çšãããšããããè¡ãã®ã¯ç°¡åã§ã...
`` ``
//次ã®å®çŸ©ãäžãããã
func MyFunctionïŒnumber intïŒãšã©ãŒ
//次ã«ãããè¡ããŸã
MyFunctionïŒ8ïŒ//ãšã©ãŒããã§ãã¯ããã«
With the ErrorContext, you as the function owner can make the error checking optional with this:
func MyFunctionïŒctx ErrorContextïŒ{
if ctxïŒ= nil && ctx.HasErrorïŒïŒ{
æ»ã
}
//..ã
}
Or make it compulsory with this:
func MyFunctionïŒctx ErrorContextïŒ{
if ctx.HasErrorïŒïŒ{// ctxãnilã®å Žåã¯ãããã¯ã«ãªããŸã
æ»ã
}
//..ã
}
If you make error handling compulsory and yet the user insists on ignoring error, they can still do that. However, they have to be very explicit about it (to prevent accidental ignore). For instance:
func UpperFunctionïŒctx ErrorContextïŒ{
ç¡èŠãããŸãïŒ= context.NewïŒïŒ
MyFunctionïŒignoredïŒ//ããã¯ç¡èŠãããŸã
MyFunction(ctx) //this one is handled
}
`` ``
ãã®ã¢ãããŒãã¯ãæ¢åã®èšèªã«äœãå€æŽããŸããã
@ALTree Albertoã check
ãš@ianlancetaylorãææ¡ãããã®ã
ããã§
func F() (int, string, error) {
i, s, err := OhNo()
if err != nil {
return i, s, &BadStuffHappened(err, "oopsie-daisy")
}
// all is good
return i+1, s+" ok", nil
}
ã«ãªããŸã
func F() (int, string, error) {
i, s, err := OhNo()
check i, s, err || &BadStuffHappened(err, "oopsie-daisy")
// all is good
return i+1, s+" ok", nil
}
ãŸãã check
ãå¶éããŠãšã©ãŒã¿ã€ãã®ã¿ãåŠçã§ãããããè€æ°ã®æ»ãå€ãå¿
èŠãªå Žåã¯ããããã«ååãä»ããŠå²ãåœãŠãå¿
èŠããããŸããããã«ãããäœããã®æ¹æ³ã§ãã€ã³ãã¬ãŒã¹ããå²ãåœãŠãããåçŽãªãæ»ããã®ããã«åäœããŸãã
func F() (a int, s string, err error) {
i, s, err = OhNo()
check err |= &BadStuffHappened(err, "oopsy-daisy") // assigns in place and behaves like simple "return"
// all is good
return i+1, s+" ok", nil
}
return
ããã€ãåŒã§åãå
¥ããããããã«ãªãå Žåã check
ã¯äžèŠã§ããããæšæºé¢æ°ã«ãªããŸã
func check(e error) bool {
return e != nil
}
func F() (a int, s string, err error) {
i, s, err = OhNo()
check(err) || return &BadStuffHappened(err, "oopsy-daisy")
// all is good
return i+1, s+" ok", nil
}
æåŸã®è§£æ±ºçã¯Perlã®ããã«æããŸããð
誰ãæåã«ãããææ¡ããã®ãæãåºããŸããããããã«å¥ã®æ§æã®ã¢ã€ãã¢ããããŸãïŒã¿ããªã®ãæ°ã«å ¥ãã®èªè»¢è»å°å±:-)ã è¯ããã®ã ãšèšã£ãŠããããã§ã¯ãããŸããããã¢ã€ãã¢ããããã«æã蟌ãã§ããã®ãªã...
x, y := try foo()
ãšåçã«ãªããŸãïŒ
x, y, err := foo()
if err != nil {
return (an appropriate number of zero values), err
}
ãš
x, y := try foo() catch &FooErr{E:$, S:"bad"}
ãšåçã«ãªããŸãïŒ
x, y, err := foo()
if err != nil {
return (an appropriate number of zero values), &FooErr{E:err, S:"bad"}
}
try
圢åŒã¯ç¢ºãã«ä»¥åã«ææ¡ãããŠãããäœåºŠããã¢ãžã¥ãè¡šé¢çãªæ§æã®éãããããŸãã try ... catch
圢åŒã¯ããŸãææ¡ãããŸãããã @ ALTreeã®check A, B
æ§é ãš@tandrã®ãã©ããŒã¢ããææ¡ã«æããã«äŒŒãŠããŸãã 1ã€ã®éãã¯ãããã¯ã¹ããŒãã¡ã³ãã§ã¯ãªãåŒã§ããããã次ã®ããã«èšãããšãã§ããŸãã
z(try foo() catch &FooErr{E:$, S:"bad"})
1ã€ã®ã¹ããŒãã¡ã³ãã«è€æ°ã®try / catchãå«ããããšãã§ããŸãã
p = try q(0) + try q(1)
a = try b(c, d() + try e(), f, try g() catch &GErr{E:$}, h()) catch $BErr{E:$}
ç§ãã¡ã¯ããã奚å±ããããšã¯æããŸãããã ããã§ããè©äŸ¡ã®é åºã«æ³šæããå¿
èŠããããŸãã ããšãã°ã e()
ãnil以å€ã®ãšã©ãŒãè¿ããå Žåã«ã h()
ãå¯äœçšã«ã€ããŠè©äŸ¡ããããã©ããã
æããã«ã try
ãcatch
ãããªæ°ããããŒã¯ãŒãã¯ãGo1.xã®äºææ§ãå£ããŸãã
ç§ã¯ããã®ææ¡ã®å¯Ÿè±¡ãçµãã¹ãã ãšææ¡ããŸãã ãã®ææ¡ã«ãã£ãŠã©ã®ãããªåé¡ãä¿®æ£ãããŸããïŒ æ¬¡ã®3è¡ã2è¡ãŸãã¯1è¡ã«æžãããŸããïŒ ããã¯ãreturn / ifã®èšèªã®å€æŽã§ããå¯èœæ§ããããŸãã
if err != nil {
return err
}
ãŸãã¯ããšã©ãŒããã§ãã¯ããåæ°ãæžãããŸããïŒ ããã«å¯Ÿããtry / catchãœãªã¥ãŒã·ã§ã³ãããããŸããã
ãšã©ãŒåŠçã®ããã®åççãªã·ã§ãŒãã«ããæ§æã«ã¯ã次ã®3ã€ã®ããããã£ãããããšããå§ãããŸãã
return err
ïŒãå¥ã®ã¢ã¯ã·ã§ã³ãããç°¡åã«ããã¹ãã§ã¯ãããŸããã ãŸã£ããç°ãªãã¢ã¯ã·ã§ã³ãæãŸããå ŽåããããŸãïŒ t.Fatal
åŒã³åºããªã©ïŒã ãŸããã³ã³ããã¹ããè¿œå ããããšã人ã
ã«æããšã©ãŸãããããããŸããããããã®å¶çŽãèãããšãã»ãŒæå°éã®æ§æã®1ã€ã¯æ¬¡ã®ããã«ãªããŸãã
STMT SEPARATOR_TOKEN VAR BLOCK
äŸãã°ã
syscall.Chdir(dir) :: err { return err }
ããã¯
if err := syscall.Chdir(dir); err != nil {
return err
}
````
Even though it's not much shorter, the new syntax moves the error path out of the way. Part of the change would be to modify `gofmt` so it doesn't line-break one-line error-handling blocks, and it indents multi-line error-handling blocks past the opening `}`.
We could make it a bit shorter by declaring the error variable in place with a special marker, like
syscall.ChdirïŒdirïŒ:: {return @err }
`` `
ãŒã以å€ã®å€ãšãšã©ãŒã®äž¡æ¹ãè¿ãããå Žåãããã¯ã©ã®ããã«åäœããã®ã§ããããã ããšãã°ãbufio.Peekã¯ããŒã以å€ã®å€ãšErrBufferFullã®äž¡æ¹ãåæã«è¿ãå¯èœæ§ããããŸãã
@mattnã¯ãåŒãç¶ãå€ãæ§æã䜿çšã§ããŸãã
@nigeltaoã¯ããããããŸããã bufio.PeekããŒã以å€ãšnilãè¿ãããããã®åäœã«ãã£ãŠãŠãŒã¶ãŒã®ã³ãŒãã«ãã°ãçããå¯èœæ§ããããšæãããŸãã ã³ãŒãã¯ãå€ãšãšã©ãŒã®äž¡æ¹ãæé»çã«äœ¿çšããŠã¯ãªããŸããã ãããã£ãŠãå€ãšãšã©ãŒã®äž¡æ¹ãåŒã³åºãå ïŒãã®å ŽåïŒã«è¿ãå¿ èŠããããŸãã
ret, err := doSomething() :: err { return err }
return ret, err
@jbaããªãã説æããŠããããšã¯ã転眮ãããé¢æ°åææŒç®åã«å°ã䌌ãŠããŸãïŒ
syscall.Chdir(dir) ⫱ func (err error) { return &PathError{"chdir", dir, err} }
ããããç§ãã¡ãã»ãšãã©åœä»€åã®ã³ãŒããæžããŠãããšããäºå®ã¯ããã€ã³ãã®äžéšãæ©æã«æ»ãããšãã§ããããã«ããããšã§ããããã2çªç®ã®äœçœ®ã§é¢æ°ã䜿çšããªãããšãå¿ èŠãšããŸãã
ã ããä»ãç§ã¯ãã¹ãŠã®çš®é¡ã«é¢é£ããŠãã3ã€ã®èŠ³å¯ã«ã€ããŠèããŠããŸãïŒ
ãšã©ãŒåŠçã¯é¢æ°åæã«äŒŒãŠããŸãããGoã§ã®åŠçæ¹æ³ã¯ãHaskellã®Errorã¢ãããšã¯éã§ããã·ãŒã±ã³ã·ã£ã«ã³ãŒãã§ã¯ãªãåœä»€åãèšè¿°ããŠããããããšã©ãŒãå€æããïŒã³ã³ããã¹ããè¿œå ããïŒå¿ èŠããããŸãããšã©ãŒä»¥å€ã®å€ïŒå€æ°ã«ãã€ã³ãããã ãã§ãïŒã
(x, y, error)
ãè¿ãGoé¢æ°ã¯ãéåžžãå®éã«ã¯(x, y) | error
åéåïŒïŒ19412ïŒã®ãããªãã®ãæå³ããŸãã
ãŠããªã³ãã¢ã³ããã¯ãŸãã¯ãã¿ãŒã³ãããã³ã°ããèšèªã§ã¯ãã±ãŒã¹ã¯åå¥ã®ã¹ã³ãŒãã§ãããGoã§ã®ãšã©ãŒã§çºçããåé¡ã®å€ãã¯ãå宣èšãããå€æ°ã®äºæããªãã·ã£ããŠã€ã³ã°ãåå ã§ããããããã®ã¹ã³ãŒããåé¢ããããšã§æ¹åãããå¯èœæ§ããããŸãïŒïŒ21114ïŒã
ãããã£ãŠãå®éã«å¿
èŠãªã®ã¯=:
æŒç®åã®ãããªãã®ã§ãããäžçš®ã®ãŠããªã³ãããã³ã°æ¡ä»¶ä»ãã§ãã
syscall.Chdir(dir) =? err { return &PathError{"chdir", dir, err} }
`` `è¡ã
nïŒ= io.WriteStringïŒwãsïŒ=ïŒ err {returnerr}
and perhaps a boolean version for `, ok` index expressions and type assertions:
```go
y := m[x] =! { return ErrNotFound }
ã¹ã³ãŒãã³ã°ãé€ããŠãããã¯åã«gofmt
ãã¯ã³ã©ã€ããŒã«ãã£ãšåŸé ã«å€æŽããããšãšå€§å·®ãããŸããïŒ
err := syscall.Chdir(dir); if err != nil { return &PathError{"chdir", dir, err} }
`` `è¡ã
nãerrïŒ= io.WriteStringïŒwãsïŒ; if errïŒ= nil {returnerr}
```go
y, ok := m[x]; if !ok { return ErrNotFound }
ããããã¹ã³ãŒãã³ã°ã¯å€§ããããšã§ãïŒ ã¹ã³ãŒãã®åé¡ã¯ããã®çš®ã®ã³ãŒãããããéããããã埮åŠãªãã°ããžãšäžç·ãè¶ãããšããã§ãã
@ianlancetaylor
ç§ã¯å
šäœçãªã¢ã€ãã¢ã®ãã¡ã³ã§ããããã®ããã®äžå¯è§£ãªperlã®ãããªæ§æã倧ãã«æ¯æããŠããããã§ã¯ãããŸããã ããããã次ã®ããã«ãããåèªã®å€ãæ§æã®æ¹ãæ··ä¹±ãå°ãªãã§ãããã
syscall.Chdir(dir) or dump(err): errors.Wrap(err, "chdir failed")
syscall.Chdir(dir) or dump
ãŸããå²ãåœãŠã®å Žåã«æåŸã®åŒæ°ããããããããã©ãããããããŸããã§ãããäŸïŒ
resp := http.Get("https://example.com") or dump
ãšã©ãŒã¯goã®å€ã§ãããç¹å¥ãªã¿ã€ãã§ã¯ãªãããšãå¿ããªãã§ãã ããã
ãšã©ãŒããã®éã«å¯ŸããŠå®è¡ã§ããªãä»ã®æ§é äœã«å¯ŸããŠå®è¡ã§ããããšã¯äœããããŸããã ããã¯ãæ§é äœãäžè¬çã«ç解ããŠããã°ããšã©ãŒãšãã®åŠçæ¹æ³ãç解ããŠããããšãæå³ããŸãïŒåé·ã ãšæã£ãŠããŠãïŒ
ãã®æ§æã§ã¯ãæ°æ§ã®éçºè ããããã䜿çšããã³ãŒããç解ãå§ããåã«ãæ°ããæ å ±ãåŠã¶å¿ èŠããããŸãã
ããã ãã§ã¯ããã®ææ¡ã¯ç§èŠã®äŸ¡å€ããããŸããã
å人çã«ã¯ãã®æ§æã奜ãã§ã
err := syscall.Chdir(dir)
if err != nil {
return err
}
return nil
以äž
if err := syscall.Chdir(dir); err != nil {
return err
}
return nil
ããã¯ãã1è¡ã§ãããæå³ããã¢ã¯ã·ã§ã³ãšãšã©ãŒåŠçãåé¢ããŠããŸãã ãã®ãã©ãŒã ã¯ç§ã«ãšã£ãŠæãèªã¿ããããã®ã§ãã
@bcmills ïŒ
ã¹ã³ãŒãã³ã°ãé€ããŠãããã¯åã«gofmtãã¯ã³ã©ã€ããŒã«ãã£ãšåŸé ã«å€æŽããããšãšå€§å·®ãããŸãã
ã¹ã³ãŒãã³ã°ã ãã§ã¯ãããŸããã 巊端ããããŸãã ããã¯æ¬åœã«èªã¿ãããã«åœ±é¿ãããšæããŸãã ç§ãæãã«
syscall.Chdir(dir) =: err; if err != nil { return &PathError{"chdir", dir, err} }
ãããã¯ããã«æ確ã§ã
err := syscall.Chdir(dir); if err != nil { return &PathError{"chdir", dir, err} }
ç¹ã«ãè€æ°ã®é£ç¶ããè¡ã§çºçããå Žåã¯ãç®ã巊端ãã¹ãã£ã³ããŠãšã©ãŒåŠçãç¡èŠã§ããããã§ãã
@bcmillsã®ã¢ã€ãã¢ã
æåŸã®å€ãnilã§F2
é¢æ°ãå®è¡ãããŸãã
func F1() (foo, bar){}
first := F1() ?> last: F2(first, last)
returnã¹ããŒãã¡ã³ãã䜿çšãããã€ã転éã®ç¹æ®ãªã±ãŒã¹
func Chdir(dir string) error {
syscall.Chdir(dir) ?> err: return &PathError{"chdir", dir, err}
return nil
}
å¥ã®åé¡ã§@urandomã«ãã£ãŠããããããå®éã®äŸ
ç§ã«ãšã£ãŠã¯ããã©ã€ããªãããŒã«çŠç¹ãåœãŠããšã¯ããã«èªã¿ããããªããŸã
func configureCloudinit(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig) (cloudconfig.UserdataConfig, error) {
// When bootstrapping, we only want to apt-get update/upgrade
// and setup the SSH keys. The rest we leave to cloudinit/sshinit.
udata := cloudconfig.NewUserdataConfig(icfg, cloudcfg) ?> err: return nil, err
if icfg.Bootstrap != nil {
udata.ConfigureBasic() ?> err: return nil, err
return udata, nil
}
udata.Configure() ?> err: return nil, err
return udata, nil
}
func ComposeUserData(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig, renderer renderers.ProviderRenderer) ([]byte, error) {
if cloudcfg == nil {
cloudcfg = cloudinit.New(icfg.Series) ?> err: return nil, errors.Trace(err)
}
_ = configureCloudinit(icfg, cloudcfg) ?> err: return nil, errors.Trace(err)
operatingSystem := series.GetOSFromSeries(icfg.Series) ?> err: return nil, errors.Trace(err)
udata := renderer.Render(cloudcfg, operatingSystem) ?> err: return nil, errors.Trace(err)
logger.Tracef("Generated cloud init:\n%s", string(udata))
return udata, nil
}
ãšã©ãŒåŠçã¯äººéå·¥åŠçã§ã¯ãªãããšã«åæããŸãã ã€ãŸãã以äžã®ã³ãŒããèªããšãã¯ããããif error not nil then
ã«çºå£°ããå¿
èŠããããŸããããã¯ã if there is an error then
å€æãããŸãã
if err != nil {
// handle error
}
ç§ã¯ãã®ãããªæ¹æ³ã§äžèšã®ã³ãŒããè¡šçŸããèœåãæã¡ãããšæã£ãŠããŸã-ç§ã®æèŠã§ã¯ãã£ãšèªã¿ãããã§ãã
if err {
// handle error
}
ãã ç§ã®è¬èãªææ¡:)
ããã¯perlã®ããã«èŠããŸããããã¯éæ³ã®å€æ°ããæã£ãŠããŸã
åèãŸã§ã«ãperlã§ã¯
openïŒFILEã$ fileïŒãŸãã¯dieïŒ "cannot open $ fileïŒ$ïŒ"ïŒ;
ç§èŠãããã¯äŸ¡å€ããããŸãããç§ãè¡ãããšã«ã€ããŠå¥œããª1ã€ã®ãã€ã³ãã¯ãã®ãšã©ãŒåŠçã§ã
æ瀺çã§ãããªãã®é¡ã«ã
ç§ãã¡ãããã«åºå·ãããªããç§ã¯éæ³ã®å€æ°ãæããªãããã«ãããã®ã§ããç§ãã¡ã¯
ãšã©ãŒå€æ°ã«ååãä»ããããšãã§ããŸã
eïŒ= syscall.ChdirïŒdirïŒïŒ> eïŒïŒPathError {"chdir"ãdirãe}
ãŸãã||ãšã¯ç°ãªãèšå·ã䜿çšããããšãã§ããŸãã ãã®ã¿ã¹ã¯ã«åºæã®ã
'ã'ã®ãããªããã¹ãèšå·ã¯åŸæ¹ã«ããããäžå¯èœã ãšæããŸã
äºææ§
nã_ãerrã_ = somecallïŒ...ïŒïŒ> errïŒïŒPathError {"somecall"ãnãerr}
14:47ã§ç«ã2017幎8æ1æ¥ã«ã¯ããããªãŽã®[email protected]ã¯æžããŸããïŒ
ã¢ã€ãã¢ãæ··ãã@bcmillshttps ïŒ//github.com/bcmills玹ä»ã§ãã
æ¡ä»¶ä»ããã€ã転éæŒç®åãæåŸã®å€ãnilã§
func F1ïŒïŒïŒfooãbarïŒ{}
æåïŒ= F1ïŒïŒïŒ>æåŸïŒF2ïŒæåãæåŸïŒreturnã¹ããŒãã¡ã³ãã䜿çšãããã€ã転éã®ç¹æ®ãªã±ãŒã¹
func ChdirïŒdir stringïŒãšã©ãŒ{
syscall.ChdirïŒdirïŒïŒ> errïŒreturnïŒPathError {"chdir"ãdirãerr}
nilãè¿ã
}å®éã®äŸ
https://github.com/juju/juju/blob/01b24551ecdf20921cf620b844ef6c2948fcc9f8/cloudconfig/providerinit/providerinit.go
å¥ã®åé¡ã§@urandomhttps ïŒ//github.com/urandomã«ãã£ãŠããããããŸãã
ç§ã«ãšã£ãŠã¯ããã©ã€ããªãããŒã«çŠç¹ãåœãŠããšã¯ããã«èªã¿ããããªããŸãfunc configureCloudinitïŒicfg * instancecfg.InstanceConfigãcloudcfg cloudinit.CloudConfigïŒïŒcloudconfig.UserdataConfigãerrorïŒ{
//ããŒãã¹ãã©ãããããšãã¯ãapt-get update / upgradeã®ã¿ãå¿ èŠã§ã
// SSHããŒãèšå®ããŸãã æ®ãã¯cloudinit / sshinitã«ä»»ããŸãã
udataïŒ= cloudconfig.NewUserdataConfigïŒicfgãcloudcfgïŒïŒ> errïŒreturn nilãerr
if icfg.BootstrapïŒ= nil {
udata.ConfigureBasicïŒïŒïŒ> errïŒnilãerrãè¿ããŸã
udataãnilãè¿ããŸã
}
udata.ConfigureïŒïŒïŒ> errïŒnilãerrãè¿ããŸã
udataãnilãè¿ããŸã
}
func ComposeUserDataïŒicfg * instancecfg.InstanceConfigãcloudcfg cloudinit.CloudConfigãrenderer renderers.ProviderRendererïŒïŒ[] byteãerrorïŒ{
cloudcfg == nil {ã®å Žå
cloudcfg = cloudinit.NewïŒicfg.SeriesïŒïŒ> errïŒreturn nilãerrors.TraceïŒerrïŒ
}
configureCloudinitïŒicfgãcloudcfgïŒïŒ> errïŒnilãerrors.TraceïŒerrïŒãè¿ããŸã
OperatingSystemïŒ= series.GetOSFromSeriesïŒicfg.SeriesïŒïŒ> errïŒreturn nilãerrors.TraceïŒerrïŒ
udataïŒ= renderer.RenderïŒcloudcfgãoperationingSystemïŒïŒ> errïŒreturn nilãerrors.TraceïŒerrïŒ
logger.TracefïŒ "çæãããã¯ã©ãŠãã®åæåïŒ\ nïŒ s"ãstringïŒudataïŒïŒ
udataãnilãè¿ããŸã
}â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/21161#issuecomment-319359614 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AbwRO_J0h2dQHqfysf2roA866vFN4_1Jks5sTx5hgaJpZM4Oi1c-
ã
ãããã®ææ¡ããããã¹ãŠã®å€æŽãçŸåšã®åœ¢åŒãããè€éã«ãªããšèããã®ã¯ç§ã ãã§ããã
åçŽããšç°¡æœãã¯åçã§ãäºææ§ããªããšæããŸãã ã¯ãããããã®å€æŽã¯ãã¹ãŠ1è¡ä»¥äžçããªããŸãããèšèªã®ãŠãŒã¶ãŒãåŠç¿ããå¿ èŠã®ããæŒç®åãŸãã¯ããŒã¯ãŒããå°å ¥ãããŸãã
@rodcorsiãã€ããŒã«èŠããããšã¯ç¥ã£ãŠããŸããã2çªç®ã®éšåããããã¯ã§ããããšãéèŠã ãšæããŸããæ¢åã®if
for
ã¹ããŒãã¡ã³ããšselect
ãšswitch
ã©ã¡ããäžæ¬åŒ§ã§åºåãããæ§æã䜿çšããããããã®1ã€ã®ç¹å®ã®å¶åŸ¡ãããŒæäœã§äžæ¬åŒ§ãçç¥ããã®ã¯åä»ãªããã§ãã
ãŸããæ°ããã·ã³ãã«ã«ç¶ãä»»æã®åŒã«ã€ããŠå¿é ããå¿ èŠããªãå Žåã¯ã解æããªãŒãæ確ã§ããããšã確èªããæ¹ãã¯ããã«ç°¡åã§ãã
ã¹ã±ããã§å¿µé ã«çœ®ããŠããæ§æãšã»ãã³ãã£ã¯ã¹ã¯æ¬¡ã®ãšããã§ãã
NonZeroGuardStmt = ( Expression | IdentifierList ":=" Expression |
ExpressionList assign_op Expression ) "=?" [ identifier ] Block .
ZeroGuardStmt = ( Expression | IdentifierList ":=" Expression |
ExpressionList assign_op Expression ) "=!" Block .
Expression
ã®æåŸã®å€ããã®ã¿ã€ãã®ãŒãå€ãšçãããªãå Žåã NonZeroGuardStmt
ã¯Block
NonZeroGuardStmt
å®è¡ããŸãã identifier
ãååšããå Žåã Block
å
ã®ãã®å€ã«ãã€ã³ããããŸãã Expression
ã®æåŸã®å€ããã®ã¿ã€ãã®ãŒãå€ãšçããå Žåã ZeroGuardStmt
ã¯Block
ZeroGuardStmt
å®è¡ããŸãã
以äžã®ããã«:=
圢æ
ã®ä»ã®ïŒãªãŒãã£ã³ã°ïŒã®å€Expression
ã«çµåããŠããIdentifierList
ã®ããã«ShortVarDecl
ã èå¥åã¯å
å«ã¹ã³ãŒãã§å®£èšãããŸããããã¯ãèå¥åãBlock
å
ã«ã衚瀺ãããããšãæå³ããŸãã
assign_op
圢åŒã®å Žåãå·ŠåŽã®åãªãã©ã³ãã¯ãã¢ãã¬ã¹å¯èœããããã€ã³ããã¯ã¹åŒããŸãã¯ïŒ =
å²ãåœãŠã®å Žåã®ã¿ïŒç©ºçœã®èå¥åã§ããå¿
èŠããããŸãã ãªãã©ã³ãã¯æ¬åŒ§ã§å²ãããšãã§ããŸãã å³åŽã®Expression
ã®ä»ã®ïŒå
é ã®ïŒå€ã¯ã Assignment
ããã«è©äŸ¡ãããŸãã å²ãåœãŠã¯ã Block
å®è¡åã«ã Block
ãå®è¡ããããã©ããã«é¢ä¿ãªãè¡ãããŸãã
ããã§ææ¡ãããŠããææ³ã¯Go1ãšäºææ§ããããšæããŸãã ?
ã¯æå¹ãªèå¥åã§ã¯ãªãããã®æåã䜿çšããæ¢åã®GoæŒç®åã¯ãããŸããããŸãã !
ã¯æå¹ãªæŒç®åã§ããã {
ãåŸã«ç¶ãå¯èœæ§ã®ããæ¢åã®ãããã¯ã·ã§ã³ã
@bcmills LGTMãgofmtãžã®ä»éããå€æŽã
=?
ãš=!
ããããããèªäœã§ããŒã¯ã³ã«ãããšãææ³ã®äºææ§ãç°¡åã«ãªããšæããŸãã
ç§ã¯ããªãã=ãäœããšæã£ãã§ãããïŒ ããã³=ïŒ ããããã®ããŒã¯ã³ã¯ããèªäœã§ãææ³ã®äºææ§ãç°¡åã«ããŸãã
ããã¯ææ³ã§ã¯å®è¡ã§ããŸãããåå¥è§£æã§ã¯å®è¡ã§ããŸãããã·ãŒã±ã³ã¹ã=ïŒã æå¹ãªGo1ã³ãŒãïŒhttps://play.golang.org/p/pMTtUWgBN9ïŒã§è¡šç€ºã§ããŸãã
äžæ¬åŒ§ã¯ãç§ã®ææ¡ã§è§£æãæ確ã«ãããã®ã§ãã =!
ã¯çŸåšãããŒã«å€æ°ã®å®£èšãŸãã¯ä»£å
¥ã«ã®ã¿è¡šç€ºã§ãã宣èšãšä»£å
¥ã¯çŸåšãäžæ¬åŒ§ã®çŽåã«è¡šç€ºã§ããŸããïŒhttpsæé»ã®ã»ãã³ãã³ïŒhttps://play.golang.org/p/lhcqBhr7TeïŒã§åºåãããŠããªãéããïŒ//play.golang.org/p/ncJyg-GMuLïŒã
@romainmenkeãããã ããªãã ãã§ã¯ãããŸããã ã¯ã³ã©ã€ããŒãšã©ãŒåŠçã®äŸ¡å€ãããããŸããã 1è¡ç¯çŽã§ããŸãããããã«è€éã«ãªããŸãã åé¡ã¯ããããã®ææ¡ã®å€ãã§ããšã©ãŒåŠçéšåãé ããŠããŸãããšã§ãã ãšã©ãŒåŠçãéèŠã§ãããããããããç®ç«ããªãããã®ã§ã¯ãªããã³ãŒããèªã¿ããããããšããèãæ¹ã§ãã ç°¡æœãã¯èªã¿ããããšåãã§ã¯ãããŸããã æ¢åã®ãšã©ãŒåŠçã·ã¹ãã ã«å€æŽãå ããå¿ èŠãããå Žåã¯ãåŸæ¥ã®try-catch-finallyã®æ¹ããããã§ã®å€ãã®ã¢ã€ãã¢ã®ç®çãããã¯ããã«é åçã ãšæããŸãã
check
ææ¡ãæ°ã«å
¥ã£ãã®ã¯ããããæ¡åŒµããŠåŠçããããšãã§ããããã§ãã
f, err := os.Open(myfile)
check err
defer check f.Close()
ä»ã®ææ¡ãdefer
ãšæ··åã§ããããã«ã¯èŠããŸããã check
ãéåžžã«èªã¿ããããç¥ããªãå Žåã¯Googleã«ãšã£ãŠç°¡åã§ãã error
ã¿ã€ãã«éå®ããå¿
èŠã¯ãªããšæããŸãã æåŸã®äœçœ®ã®æ»ããã©ã¡ãŒã¿ãŒã§ãããã®ã¯ãã¹ãŠããã䜿çšã§ããŸãã ã ãããå埩åã¯ãå¿
èŠãããå ŽåããããŸãcheck
ã«ã€ããŠNext() bool
ã
ç§ã¯ãã€ãŠæ¬¡ã®ãããªã¹ãã£ããŒãäœæããŸãã
func (s *Scanner) Next() bool {
if s.Error != nil || s.pos >= s.RecordCount {
return false
}
s.pos++
var rt uint8
if !s.read(&rt) {
return false
}
...
ãã®æåŸã®ãããã¯ã代ããã«check s.read(&rt)
å¯èœæ§ããããŸãã
@carlmjohnson
ä»ã®ææ¡ã
defer
ãšæ··åã§ããããã«ã¯èŠããŸããã
defer
ãæ¡åŒµããŠãæ°ããæ§æã䜿çšããŠå€éšé¢æ°ããæ»ãããšãã§ãããšæ³å®ããŠããå Žåã¯ããã®æ³å®ãä»ã®ææ¡ã«ãåæ§ã«é©çšã§ããŸãã
defer f.Close() =? err { return err }
@ALTreeã®check
ææ¡ã§ã¯å¥ã®ã¹ããŒãã¡ã³ããå°å
¥ãããŠãããããåã«ãšã©ãŒãè¿ã以å€ã®ããšãè¡ãdefer
ãšãããçµã¿åãããæ¹æ³ãããããŸããã
defer func() {
err := f.Close()
check err, fmt.Errorf(âŠ, err) // But this func() doesn't return an error!
}()
察æ¯ïŒ
defer f.Close() =? err { return fmt.Errorf(âŠ, err) }
ãããã®ææ¡ã®å€ãã®æ£åœæ§ã¯ãããåªããã人éå·¥åŠãã§ããããããäœæãã以å€ã«ããããã®ãããããã©ã®ããã«åªããŠãããã¯å®éã«ã¯ããããŸããã ãããã¯ã©ã®ããã«ã³ãŒãã®ä¿å®æ§ãåäžãããŸããïŒ æ§æå¯èœæ§ïŒ èªã¿ãããïŒ å¶åŸ¡ãããŒã®ç解ã®ããããïŒ
@jimmyfrasche
ãããã¯ã©ã®ããã«ã³ãŒãã®ä¿å®æ§ãåäžãããŸããïŒ æ§æå¯èœæ§ïŒ èªã¿ãããïŒ å¶åŸ¡ãããŒã®ç解ã®ããããïŒ
åã«è¿°ã¹ãããã«ããããã®ææ¡ã®äž»ãªå©ç¹ã¯ãããããå²ãåœãŠãšerr
å€æ°ã®ããæ確ãªã¹ã³ãŒãããæ¥ãå¿
èŠããããŸãïŒïŒ19727ãïŒ20148ãïŒ5634ãïŒ21114ãããã³ããããä»ã®ããŸããŸãªãã®ãåç
§ããŠãã ãããšã©ãŒåŠçã«é¢é£ããŠäººã
ãã¹ã³ãŒãã³ã°ã®åé¡ã«ééããæ¹æ³ã
@bcmillsã¯ã¢ãããŒã·ã§ã³ãæäŸããŠãããŠããããšãããããŠç³ãèš³ãããŸãããããªãã®ä»¥åã®æçš¿ã§ãããéããŸããã
ãã ãããã®åæãèãããšããã¹ãŠã®å€æ°ã§äœ¿çšã§ãããå²ãåœãŠã®ããæ確ãªã¹ã³ãŒããã®ããã®ããäžè¬çãªæ©èœãæäŸããæ¹ãããã®ã§ã¯ãªãã§ããããã 確ãã«ããšã©ãŒä»¥å€ã®å€æ°ã®ã·ã§ã¢ãæå³ããã«ã·ã£ããŠã€ã³ã°ããŸããã
:=
ã®çŸåšã®åäœãå°å
¥ããããšãã®ããšãèŠããŠããŸãããã®ã¹ã¬ããã®å€ãã¯ãæé»ã®ãå€æ°ãååšããå Žåã«ã®ã¿åå©çšãããã®ä»£ããã«ãåå©çšããååã«æ瀺çã«æ³šéãä»ããæ¹æ³ãæ±ããŠããŸãããç§ã®çµéšã§ã¯ããã¹ãŠã®åŸ®åŠãªèŠã«ããåé¡ãçŸããå Žæã§ãããæ£ç¢ºã«çŸåšã®ç¯å²ãã
â ãã®ã¹ã¬ãããèŠã€ããããšãã§ããŸãã誰ãããªã³ã¯ãæã£ãŠããŸããïŒ
Goã«ã€ããŠã¯æ¹åã§ãããšæãããšããããããããŸããã :=
ã®åäœã¯ãåžžã«1ã€ã®é倧ãªééããšããŠç§ãé©ãããŸããã ãã¶ãã :=
ã®åäœãåæ€èšããããšã¯ãæ ¹æ¬çãªåé¡ã解決ããæ¹æ³ããŸãã¯å°ãªããšãä»ã®ãã極端ãªå€æŽã®å¿
èŠæ§ãæžããæ¹æ³ã§ããïŒ
@jimmyfrasche
ãã ãããã®åæãèãããšããã¹ãŠã®å€æ°ã§äœ¿çšã§ãããå²ãåœãŠã®ããæ確ãªã¹ã³ãŒããã®ããã®ããäžè¬çãªæ©èœãæäŸããæ¹ãããã®ã§ã¯ãªãã§ããããã
ã¯ãã ããã¯ã @ jbaãšç§ãææ¡ãã=?
ãŸãã¯::
æŒç®åã«ã€ããŠç§ãæ°ã«å
¥ã£ãŠããããšã®1ã€ã§ããããã¯ãéãšã©ãŒïŒæããã«éå®ããããµãã»ããïŒã«ãããŸãæ¡åŒµãããŸãã
å人çã«ã¯ãããæ瀺çãªã¿ã°ä»ãå ±çšäœ/å€æ°/代æ°çããŒã¿åæ©èœïŒïŒ19412ãåç §ïŒã䜿çšãããšãé·æçã«ã¯å¹žãã«ãªããšæããŸãããããã¯èšèªã«å¯Ÿããã¯ããã«å€§ããªå€æŽã§ããããã¯ãGo 1 / Go2ãæ··åšããç°å¢ã®æ¢åã®APIã«é©çšãããŸãã
å¶åŸ¡ãããŒã®ç解ã®ããããïŒ
ç§ãš@bcmillsã®ææ¡ã§ã¯ãããªãã®ç®ã¯å·ŠåŽãã¹ãã£ã³ããŠããšã©ãŒã®ãªãå¶åŸ¡ãããŒãç°¡åã«åã蟌ãããšãã§ããŸãã
@ bcmills ïŒ19412ã®åèªã®å°ãªããšãååã¯ç§ãæ åœããŠãããšæãã®ã§ãåèšã¿ã€ãã§ç§ã売ãå¿ èŠã¯ãããŸãã;ïŒ
ãšã©ãŒã®ãããã®ãè¿ãããšã«ãªããšã4ã€ã®ã±ãŒã¹ããããŸã
ããªãã4ãæã£ãå Žåãããã¯ç©äºãããªãããŒã«ãªããšããã§ãã ã¿ãã«ã¿ã€ãïŒæ§é äœã®ã©ãã«ä»ã補åã¿ã€ãã«å¯Ÿå¿ããã©ãã«ãªã補åã¿ã€ãïŒãå°å ¥ããã«ãåèšã¿ã€ãã䜿çšããŠããããŸãã¯ãšã©ãŒããã¢ãã«åããå Žåã¯ãæ§é äœã«ãã¹ãŠããã³ãã«ããŠãåé¡ãã±ãŒã¹3ã«æžããå¿ èŠããããŸãã
ã¿ãã«ã¿ã€ããå°å
¥ãããšãããããçš®é¡ã®åé¡ãäºææ§ã®åé¡ãå¥åŠãªéè€ãçºçããŸãïŒ func() (int, string, error)
ã¯æé»çã«å®çŸ©ãããã¿ãã«ã§ããããããšãè€æ°ã®æ»ãå€ã¯å¥ã®æŠå¿µã§ããïŒæé»çã«å®çŸ©ãããã¿ãã«ã®å Žåãããã¯func() (n int, msg string, err error)
ãæå³ããŸããïŒ
åèšã¿ã€ãã«ã¯ãŸã å€ãã®å©ç¹ããããšæããŸããããã¡ãããã¹ã³ãŒãã®åé¡ãä¿®æ£ããããã«äœãããŸããã çµæã®ã±ãŒã¹ã«äœãããã£ããšãã«ãšã©ãŒã®ã±ãŒã¹ãåã«ã·ã£ããŠã€ã³ã°ããã®ã§ã¯ãªãããçµæãŸãã¯ãšã©ãŒãã®åèšå šäœãã·ã£ããŠã€ã³ã°ã§ãããããã©ã¡ãããšããã°æªåããå¯èœæ§ããããŸãã
@jbaãããã©ã®ããã«æãŸããç¹æ§ã§ãããããããŸããã å¶åŸ¡ãããŒã2次å ã«ãããšããæŠå¿µã®äžè¬çãªé£ãããé€ãã°ãããã°ããªãããã§ãªãã®ããç§ã«ã¯ããããããŸããã ã¡ãªããã説æããŠããããŸããïŒ
ã¿ãã«ã¿ã€ããå°å ¥ããã«[âŠ]åèšã¿ã€ãã䜿çšããŠããããŸãã¯ãšã©ãŒããã¢ãã«åããå Žåã¯ãæ§é äœã«ãã¹ãŠã[ãã³ãã«]ããå¿ èŠããããŸãã
ç§ã¯ããã§å€§äžå€«ã§ãïŒç§ãã¡ã¯ãã®æ¹æ³ã§ã¯ããã«èªã¿ãããåŒã³åºããµã€ããæã£ãŠãããšæããŸãïŒèª€ã£ãŠè»¢çœ®ãããäœçœ®ãã€ã³ãã£ã³ã°ã¯ãããããŸããïŒïŒããããŠïŒ12854ã¯çŸåšæ§é äœã®æ»ãã«é¢é£ãããªãŒããŒãããã®å€ãã軜æžããŸãã
倧ããªåé¡ã¯ç§»è¡ã§ããGo1ã®ãå€ãšãšã©ãŒãã¢ãã«ããGo2ã®æœåšçãªãå€ãŸãã¯ãšã©ãŒãã¢ãã«ã«ã©ã®ããã«ç§»è¡ããã®ã§ãããããç¹ã«ãå®éã«ãå€ããè¿ãio.Writer
ãããªAPIãèãããšãšãšã©ãŒãïŒ
åèšã¿ã€ãã«ã¯ãŸã å€ãã®å©ç¹ããããšæããŸããããã¡ãããã¹ã³ãŒãã®åé¡ãä¿®æ£ããããã«äœãããŸããã
ããã¯ããªããããããã©ã®ããã«é梱ãããã«äŸåããŸããããã¯ç§ãã¡ãä»æ¥ã®å Žæã«æ»ããšç§ã¯æããŸãã ãŠããªã³ã奜ãå Žåã¯ã =?
ããŒãžã§ã³ããé察称ãã¿ãŒã³ãããã³ã°ãAPIãšããŠæ³å®ã§ããŸãã
i := match strconv.Atoi(str) | err error { return err }
ããã§ã match
ã¯åŸæ¥ã®MLã¹ã¿ã€ã«ã®ãã¿ãŒã³äžèŽæäœã§ãããé網çŸ
çãªäžèŽã®å Žåã¯å€ãè¿ããŸãïŒãŠããªã³ã«äžèŽããªãéžæè¢ãè€æ°ããå Žåã¯interface{}
ãšããŠïŒç¶²çŸ
çã§ã¯ãªãè©Šåã®å€±æã§æ
ãŠãã®ã§ã¯ãªãã
ããã§èª¬æãããŠããåé¡ã«ããã°ã©ã ã§å¯ŸåŠããããã±ãŒãžãhttps://github.com/mpvl/errdã§ãã§ãã¯ã€ã³ããŸããïŒèšèªã®å€æŽã¯ãããŸããïŒã ãã®ããã±ãŒãžã®æãéèŠãªåŽé¢ã¯ããšã©ãŒåŠçãççž®ããã ãã§ãªããæ£ããå®è¡ããããããããšã§ãã ç¹ã«deferãšã®çžäºäœçšã«ãããŠãåŸæ¥ã®æ £çšçãªãšã©ãŒåŠçãèŠãç®ãããããªãããŒã§ããæ¹æ³ã«ã€ããŠãããã¥ã¡ã³ãã§äŸã瀺ããŸãã
ãã ããããã¯ãããŒããŒãããã±ãŒãžã ãšæããŸãã ç®çã¯ãèšèªãæ¡åŒµããããã®æè¯ã®æ¹æ³ã«ã€ããŠãããã€ãã®è¯ãçµéšãšæŽå¯ãåŸãããšã§ãã ãããåé¡ã«ãªãã®ã§ããã°ããžã§ããªãã¯ãšéåžžã«ããçžäºäœçšããŸãã
ãŸã ããã€ãã®äŸã«åãçµãã§ããŸããããã®ããã±ãŒãžã¯å®éšããæºåãã§ããŠããŸãã
@bcmills a millionïŒ+1ïŒforïŒ12854
ãæ°ã¥ãã®ããã«ããreturn XanderrorããšãreturnXor errorããããã®ã§ãå€ãæ¹æ³ãæ°ããæ¹æ³ã«ãªã³ããã³ãã§å€æãããã¯ãããªããã°ããããåé¿ããããšã¯ã§ããŸããïŒãã¡ãããã°ããããŸãïŒãŸãã¯ããX and errorãé¢æ°ã«å¿ ç¶çã«äœ¿çšãããå Žåãå°ãªããšãã©ã³ã¿ã€ã ã¯ãããã¯ã«ãªããŸãïŒã
ç¹ã«ãšã©ãŒåŠçã®ããã ãã«ç¹å¥ãªãã¯ããèšèªã«å°å ¥ãããšããã¢ã€ãã¢ã¯æ¬åœã«å¥œãã§ã¯ãããŸãããããã¯ããããã®ææ¡ã®å€ãã§ã®ç§ã®å€§ããªåé¡ã§ãã
ç ç³ãéæ³ã¯å€§ããããšã§ã¯ãªããããã¯ãã©ã¹ã§ãã
çŸåšã®æ £æ§ã§ã¯ãããæ©èœçãªãšã©ãŒåŠçãã©ãã€ã ãžã®å€§èŠæš¡ãªé£èºãåŠçããã«ã¯ãæ £æ§ã倧ããããæ å ±ãå°ãªãããŸãã
Go 2ãåèšã¿ã€ããååŸããå ŽåïŒççŽã«èšã£ãŠïŒè¯ãæå³ã§ïŒïŒïŒããæ°ããã¹ã¿ã€ã«ãã«ç§»è¡ããã«ã¯ãã©ã¡ãããšããã°ãéåžžã«ãã£ãããšãã段éçãªããã»ã¹ã§ããå¿
èŠããããŸãããšã©ãŒã®åŠçæ¹æ³ã®æçåãšæ··ä¹±ãå¢ããŠãããããæ£å³ã®ããžãã£ãã§ã¯ãªããšæããŸãã ïŒãã ãã3ã€ã®ãã£ãã«ã§ã¯ãªãchan union { Msg1 T; Msg2 S; Err error }
ãããªãã®ã«ããã«äœ¿çšãå§ããŸãïŒã
ãããGo1以åã§ãããGoããŒã ãã次ã®6ãæéããã¹ãŠã移åããåé¡ãçºçããå Žåã¯ç¶æããããšèšãããšãã§ããã°ãããã¯1ã€ã®ããšã§ãããçŸåšã¯åºæ¬çã«è¡ãè©°ãŸã£ãŠããŸããåèšã¿ã€ããååŸãããšããŠãã
ãæ°ã¥ãã®ããã«ããreturn XanderrorããšãreturnXor errorããããã®ã§ãå€ãæ¹æ³ãæ°ããæ¹æ³ã«ãªã³ããã³ãã§å€æãããã¯ãããªããã°ããããåé¿ããããšã¯ã§ããŸããã
äžã§è¿°ã¹ãããã«ãæ°ããæ¹æ³ã§ã¯ããããäœã§ããããXãšãšã©ãŒãè¿ãããã«ããŒããå¿ èŠã¯ãªããšæããŸãã 倧å€æ°ã®ã±ãŒã¹ããXãŸãã¯ãšã©ãŒãè¿ããã§ãããæ°ããæ¹æ³ãããã ããæ¹åããå Žåãããã¯çŽ æŽãããããšã§ããããããŸããªãXããã³ãšã©ãŒãè¿ããããã«å€ãGo1äºæã®æ¹æ³ãåŒãç¶ã䜿çšã§ããŸãã
@nigeltaoæ¬åœã§ãããæšæºã©ã€ãã©ãªå šäœãæ¢åã®ã¹ã¿ã€ã«ã§ç¶æããããšãææ¡ããªãéãã移è¡äžã«ããããåºå¥ããããã®äœããã®æ¹æ³ãå¿ èŠã§ãã
@jbaã¯è¬æŒãèŠãŠãREADMEãèªã¿ãŸããã ç§ã¯ããªããæ¬åŒ§/è泚/ææ«è泚/ãµã€ãããŒãã®ããšã§ã©ãããæ¥ãŠããã®ãç解ããŸããïŒãããŠç§ã¯ãµã€ãããŒãïŒããã³æ¬åŒ§ïŒã®ãã¡ã³ã§ãïŒã
ããè¯ãçšèªããªãããã«ãåŽã«äžå¹žãªéã眮ãããšãç®æšã§ããå Žåã$ EDITORãã©ã°ã€ã³ã¯èšèªãå€æŽããã«æ©èœããã³ãŒãã®äœæè ã®å¥œã¿ã«é¢ä¿ãªããæ¢åã®ãã¹ãŠã®ã³ãŒãã§æ©èœããŸãã
èšèªã®å€æŽã«ãããæ§æãããããã³ã³ãã¯ãã«ãªããŸãã @bcmillsã¯ãããã«ããã¹ã³ãŒããæ¹åããããšè¿°ã¹ãŠããŸããã :=
ãšã¯ç°ãªãã¹ã³ãŒãèŠåããªãéããã©ã®ããã«ã§ãããã¯ããããŸããããæ··ä¹±ãçããããã§ãã
@bcmillsããªãã®ã³ã¡ã³ããããããŸããã ããªãã¯æããã«ããããåºå¥ããããšãã§ããŸãã å€ãæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãã
err := foo()
if err != nil {
return n, err // n can be non-zero
}
æ°ããæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸã
check foo()
ãŸã
foo() || &FooError{err}
ãŸãã¯ãã€ã¯ã·ã§ããã®è²ãäœã§ããã æšæºã©ã€ãã©ãªã®ã»ãšãã©ã¯ç§»è¡ã§ãããšæããŸããããã¹ãŠã移è¡ã§ããããã§ã¯ãããŸããã
@ianlancetaylorã®èŠä»¶ã«è¿œå ããã«ã¯ããšã©ãŒã¡ãã»ãŒãžãåçŽåããããšã§ãç©äºãçãããã ãã§ãªãããšã©ãŒåŠçãç°¡åã«è¡ãããšãã§ããŸãã ãããã¯ãšããŠã³ã¹ããªãŒã ãšã©ãŒãé¢æ°ã延æãããŸã§æž¡ãã®ã¯ãæ£ããè¡ãã®ãé£ããã§ãã
ããšãã°ããšã©ãŒãçºçããå Žåã«ãã¡ã€ã«ã®æžã蟌ã¿ãäžæ¢ããGoogle CloudStorageãã¡ã€ã«ãžã®æžã蟌ã¿ã«ã€ããŠèããŠã¿ãŸãã
func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
client, err := storage.NewClient(ctx)
if err != nil {
return err
}
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
defer func() {
if r := recover(); r != nil {
w.CloseWithError(fmt.Errorf("panic: %v", r))
panic(r)
}
if err != nil {
_ = w.CloseWithError(err)
} else {
err = w.Close()
}
}
_, err = io.Copy(w, r)
return err
}
ãã®ã³ãŒãã®åŸ®åŠãªç¹ã¯æ¬¡ã®ãšããã§ãã
ããã±ãŒãžerrdã䜿çšãããšããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
return errd.Run(func(e *errd.E) {
client, err := storage.NewClient(ctx)
e.Must(err)
e.Defer(client.Close, errd.Discard)
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
e.Defer(w.CloseWithError)
_, err = io.Copy(w, r)
e.Must(err)
})
}
errd.Discard
ã¯ãšã©ãŒãã³ãã©ãŒã§ãã ãšã©ãŒãã³ãã©ãŒã䜿çšããŠããšã©ãŒãã©ããããã°ã«èšé²ããããšãã§ããŸãã
e.Must
ã¯foo() || wrapError
çžåœããŸã
e.Defer
ã¯äœåã§ãããé
延ãžã®ãšã©ãŒã®åãæž¡ããåŠçããŸãã
ãžã§ããªãã¯ã¹ã䜿çšãããšããã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
return errd.Run(func(e *errd.E) {
client := e.Must(storage.NewClient(ctx))
e.Defer(client.Close, errd.Discard)
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
e.Defer(w.CloseWithError)
_ = e.Must(io.Copy(w, r))
})
}
Deferã«äœ¿çšããã¡ãœãããæšæºåãããšã次ã®ããã«ãªããŸãã
func writeToGS(ctx context.Context, bucket, dst, src string, r io.Reader) error {
return errd.Run(func(e *errd.E) {
client := e.DeferClose(e.Must(storage.NewClient(ctx)), errd.Discard)
e.Must(io.Copy(e.DeferClose(client.Bucket(bucket).Object(dst).NewWriter(ctx)), r)
})
}
DeferCloseã¯ãCloseãŸãã¯CloseWithErrorã®ãããããéžæããŸãã ãããè¯ããšèšã£ãŠããã®ã§ã¯ãªããå¯èœæ§ã瀺ããŠããã ãã§ãã
ãšã«ãããç§ã¯å é±ã¢ã ã¹ãã«ãã ã®ããŒãã¢ããã§ãã®ãããã¯ã«ã€ããŠãã¬ãŒã³ããŒã·ã§ã³ãè¡ããŸãããããšã©ãŒåŠçãæ£ããè¡ãã®ãç°¡åã«ããæ©èœã¯ãçãããããã䟿å©ã§ãããšèããããŠããããã§ãã
ãšã©ãŒãæ¹åãããœãªã¥ãŒã·ã§ã³ã¯ãç©äºãçãããããšããããç©äºãæ£ããããããšã容æã«ããããšã«å°ãªããšãåããããçŠç¹ãåãããå¿ èŠããããŸãã
@ALTree errdã¯ãç®±ããåºããŠãæŽç·Žããããšã©ãŒå埩ããåŠçããŸãã
@jimmyfrasche ïŒerrdã¯ãéã³å Žã®äŸãšã»ãŒåãããã«æ©èœããŸããããšã©ãŒããããã¯ã延æè ã«æž¡ãããšãã§ããŸãã
@jimmyfrasche ïŒã»ãšãã©ã®ææ¡ã¯ãã³ãŒãã§ãã§ã«éæã§ããããšã«ã¯ããŸãè¿œå ãããªãããšã«åæããŸãã
@romainmenke ïŒç°¡æœãã«çŠç¹ãåœãŠãããããŠããããšã«åæããŸãã ç©äºãæ£ããè¡ãããšã容ââæã«ããããã«ããã倧ããªçŠç¹ãåœãŠãã¹ãã§ãã
@jba ïŒerrdã¢ãããŒãã䜿çšãããšãå·ŠåŽãèŠãã ãã§ãšã©ãŒãããŒãšéãšã©ãŒãããŒãããªãç°¡åã«ã¹ãã£ã³ã§ããŸãïŒeãã§å§ãŸããã®ã¯ãã¹ãŠãšã©ãŒãŸãã¯å»¶æåŠçã§ãïŒã ãŸããã©ã®æ»ãå€ããšã©ãŒãŸãã¯å»¶æã®ããã«åŠçãããã©ããåŠçãããªãããã¹ãã£ã³ããããšãéåžžã«ç°¡åã«ãªããŸãã
@bcmills ïŒerrdèªäœã¯ã¹ã³ãŒãã®åé¡ãä¿®æ£ããŸãããã以åã«å®£èšããããšã©ãŒå€æ°ãªã©ã«ããŠã³ã¹ããªãŒã ãšã©ãŒãæž¡ãå¿ èŠããªãããããšã©ãŒåŠçãAFAICTã®åé¡ãå€§å¹ ã«è»œæžãããŸãã
errdã¯å®å šã«ãããã¯ãšå埩ã«äŸåããŠããããã§ãã ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããããã§ãã ãã®ãããå šäœçãªè§£æ±ºçãã©ããã¯ããããŸããã
@urandom ïŒ
å
ã®ã³ãŒãã®å ŽåïŒ
ãã®ä»ã®ãªãŒããŒãããïŒ
e.Must(err, msg("oh noes!")
ïŒãšããŠã©ããããã«ã¯ãGo1.8ã§çŽ30nsããããŸãã ãã³ãïŒ1.9ïŒã§ã¯ãå²ãåœãŠã¯ãŸã ãããŸãããã³ã¹ãã2nsã§èšæž¬ããŸããã ãã¡ãããäºåã«å®£èšããããšã©ãŒã¡ãã»ãŒãžã®å Žåãã³ã¹ãã¯ãŸã ç¡èŠã§ããŸããïŒ*ïŒ2016 MacBookProã§å®è¡ãããŠãããã¹ãŠã®çªå·ã
å šäœãšããŠãå ã®ã³ãŒããdeferã䜿çšããŠããå Žåãã³ã¹ãã¯èš±å®¹ã§ããããã§ãã ããã§ãªãå ŽåããªãŒã¹ãã£ã³ã¯å»¶æã®ã³ã¹ããå€§å¹ ã«åæžããããšã«åãçµãã§ãããããæéã®çµéãšãšãã«ã³ã¹ããäžããå¯èœæ§ãããããŸãã
ãšã«ããããã®ããã±ãŒãžã®ãã€ã³ãã¯ãæã ã¯ãã€ã³ãã§è¡ã2.ã±ãŒã¹ã§æé«ã®èšèªã®è¿œå ãæ§ç¯ããããšãã§ããããã«æããä»ã¯æçšã§ããã代æ¿ã®ãšã©ãŒåŠçã䜿çšããŠã©ã®ããã«çµéšãåŸãããšã§ããã§ããçŸåšã®è°è«ã¯ããããAã®åæžã«ããŸãçŠç¹ãåœãŠãŠåçŽãªã±ãŒã¹ã§ã¯æ°è¡ã§ãããåŸããããã®ã¯ã¯ããã«å€ããééããªãä»ã®ãã€ã³ããããéèŠã§ãã
@jimmyfrasche ïŒ
ãã®å Žåã$ EDITORãã©ã°ã€ã³ã¯èšèªãå€æŽããã«æ©èœããŸã
ã¯ããããã¯ç§ã話ã®äžã§äž»åŒµããŠããããšã§ãã ããã§ç§ã¯ãèšèªãå€æŽããå Žåãããã¯ããµã€ãããŒããã®æŠå¿µãšäžèŽããŠããå¿ èŠããããšäž»åŒµããŠããŸãã
@nigeltao
ããªãã¯æããã«ããããåºå¥ããããšãã§ããŸãã å€ãæ¹æ³ã¯æ¬¡ã®ããã«ãªããŸãã
ç§ã¯ã䜿çšã®ãã€ã³ãã§ã¯ãªãã宣èšã®ãã€ã³ãã«ã€ããŠè©±ããŠããã
ããã§èª¬æããææ¡ã®äžã«ã¯ãã³ãŒã«ãµã€ãã§2ã€ãåºå¥ããªããã®ããããŸãããåºå¥ãããã®ããããŸãã ãå€ãŸãã¯ãšã©ãŒããæ³å®ãããªãã·ã§ã³ã®1ã€ïŒ ||
ã try ⊠catch
ã match
ãéžæããå Žåã䜿çšããã³ã³ãã€ã«æãšã©ãŒã«ãªããŸãã ãå€ãšãšã©ãŒãé¢æ°ã䜿çšããæ§æã§ãããé¢æ°ã®å®è£
è
ããããå®çŸ©ããå¿
èŠããããŸãã
宣èšã®æç¹ã§ã¯ãçŸåšããå€ãšãšã©ãŒããšãå€ãŸãã¯ãšã©ãŒããåºå¥ããæ¹æ³ã¯ãããŸããã
func Atoi(string) (int, error)
ãš
func WriteString(Writer, String) (int, error)
æ»ãå€ã®ã¿ã€ãã¯åãã§ããããšã©ãŒã®ã»ãã³ãã£ã¯ã¹ãç°ãªããŸãã
@mpvlç§ã¯
WithDefaultïŒïŒã®çµæãæäœããããã®ãããã¬ãã«ã®é¢æ°ãªã©ã®äžè¬çãªãã«ããŒãç¡èŠããåçŽåã®ããã«åžžã«ã³ã³ããã¹ãã䜿çšããããã©ãŒãã³ã¹ã«é¢ãã決å®ãç¡èŠãããšãæå°éã®ãã¢ããŒã³APIã¯ä»¥äžã®æäœïŒ
type Handler = func(ctx context.Context, panicing bool, err error) error
Run(context.Context, func(*E), defaults ...Handler) //egregious style but most minimal
type struct E {...}
func (*E) Must(err error, handlers ...Handler)
func (*E) Defer(func() error, handlers ...Handler)
ã³ãŒããèŠããšãäžèšã®ããã«å®çŸ©ãããŠããªãããã€ãã®æ£åœãªçç±ãããããŸãããæŠå¿µãããããç解ããããã«ãã³ã¢ã»ãã³ãã£ã¯ã¹ãååŸããããšããŠããŸãã ããšãã°ã IsSentinel
ãã³ã¢ã«ãããã©ããã¯ããããŸããã
@jimmyfrasche
@bcmillsã¯ãããã«ããã¹ã³ãŒããæ¹åããããšè¿°ã¹ãŠããŸãããã©ãããã°ãããããããŸããã
äž»ãªæ¹åç¹ã¯ã err
å€æ°ãã¹ã³ãŒãå€ã«ä¿ã€ããšã§ãã ããã«ããã httpsïŒ//github.com/golang/go/issues/19727ãããªã³ã¯ãããŠãããããªãã°ãåé¿ã§ã
res, err := ctxhttp.Get(ctx, c.HTTPClient, dirURL)
if err != nil {
return Directory{}, err
}
defer res.Body.Close()
c.addNonce(res.Header)
if res.StatusCode != http.StatusOK {
return Directory{}, responseError(res)
}
var v struct {
âŠ
}
if json.NewDecoder(res.Body).Decode(&v); err != nil {
return Directory{}, err
}
ãã°ã¯æåŸã®ifã¹ããŒãã¡ã³ãã§çºçããŸãã Decode
ããã®ãšã©ãŒã¯åé€ãããŸããã以åã®ãã§ãã¯ããã®err
ããŸã ã¹ã³ãŒãå
ã«ãã£ããããæããã§ã¯ãããŸããã 察ç
§çã«ã ::
ãŸãã¯=?
æŒç®åã䜿çšãããšã次ã®ããã«èšè¿°ãããŸãã
res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) =? err { return Directory{}, err }
defer res.Body.Close()
c.addNonce(res.Header)
(res.StatusCode == http.StatusOK) =! { return Directory{}, responseError(res) }
var v struct {
âŠ
}
json.NewDecoder(res.Body).Decode(&v) =? err { return Directory{}, err }
ããã§ã圹ç«ã€2ã€ã®ã¹ã³ãŒãã®æ¹åããããŸãã
err
ïŒä»¥åã®Get
åŒã³åºãããïŒã¯return
ãããã¯ã®ã¹ã³ãŒãå
ã«ãããããåŸç¶ã®ãã§ãã¯ã§èª€ã£ãŠäœ¿çšããããšã¯ã§ããŸãããDecode
err
ããã®Decode
ã¯ãnilnessããã§ãã¯ãããã®ãšåãã¹ããŒãã¡ã³ãã§å®£èšãããããã宣èšãšãã§ãã¯ã®éã«ã¹ãã¥ãŒã¯ãããŸãããïŒ1ïŒã³ã³ãã€ã«æã«ãšã©ãŒãæããã«ããã«ã¯ãïŒ1ïŒã ãã§ååã§ããããïŒ2ïŒæãããªæ¹æ³ã§guardã¹ããŒãã¡ã³ãã䜿çšããå Žåã¯ç°¡åã«åé¿ã§ããŸãã
@bcmills説æããŠãããŠããããšã
ãããã£ãŠã res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) =? err { return Directory{}, err }
ã§ã¯ã =?
ãã¯ãã¯æ¬¡ã®ããã«å±éãããŸãã
var res *http.Reponse
{
var err error
res, err = ctxhttp.Get(ctx, c.HTTPClient, dirURL)
if err != nil {
return Directory{}, err
}
}
ãããæ£ãããã°ã :=
ãšã¯ç°ãªãã»ãã³ãã£ã¯ã¹ãå¿
èŠã ãšèšã£ããšãã®æå³ã§ãã
次ã®ãããªç¬èªã®æ··ä¹±ãåŒãèµ·ããããã§ãã
func f() error {
var err error
g() =? err {
if err != io.EOF {
return err
}
}
//one could expect that err could be io.EOF here but it will never be so
}
ç§ãäœãã誀解ããŠããªãéãã
ãããããã¯æ£ããæ¡åŒµã§ãã ããªãã¯ããã:=
ãšã¯ç°ãªããšããããšã¯æ£ããã§ãããããŠããã¯æå³çã§ãã
ããã¯ããèªèº«ã®æ··ä¹±ãåŒãèµ·ããããã§ã
ããã¯æ¬åœã ã ãããå®éã«æ··ä¹±ãããã©ããã¯ç§ã«ã¯ããããŸããã ããã§ããå Žåã宣èšçšã®ã¬ãŒãã¹ããŒãã¡ã³ãã®ãïŒãããªã¢ã³ããæäŸã§ããŸãïŒã=ãããªã¢ã³ãã®ã¿ãå²ãåœãŠãŸãïŒã
ïŒãããŠä»ãæŒç®åã¯=?
ãš=!
代ããã«=?
?
ãš!
ãšç¶Žãããã¹ãã ãšç§ã¯æããŸããïŒ
res := ctxhttp.Get(ctx, c.HTTPClient, dirURL) ?: err { return Directory{}, err }
ããã
func f() error {
var err error
g() ?= err { (err == io.EOF) ! { return err } }
// err may be io.EOF here.
}
@mpvl errd
ã«é¢ããç§ã®äž»ãªé¢å¿äºã¯ããã³ãã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ãããã®ã§ããããã¯ãã³ãŒã«ããã¯ã®é¢æ°åãã€ãã©ã€ã³ãä¿é²ããããã§ãããã³ãŒã«ããã¯/ç¶ç¶ã¹ã¿ã€ã«ã³ãŒãïŒGoãC ++ãªã©ã®åœä»€åèšèªãšé¢æ°åã®äž¡æ¹ïŒã§ã®çµéšã§ãã MLãHaskellã®ãããªèšèªïŒã¯ãåçã®ã·ãŒã±ã³ã·ã£ã«/åœä»€åã¹ã¿ã€ã«ãããåŸãã®ãã¯ããã«é£ããå Žåãå€ããšããããšã§ããããã¯ãä»ã®Goã€ãã£ãªã ãšãäžèŽããŸãã
APIã®äžéšãšããŠHandler
ã¹ã¿ã€ã«ã®ãã§ãŒã³ãæ³å®ããŠããŸããããããšãHandler
ãæ€èšããŠããä»ã®æ§æïŒ Block
åäœãããã®ãªã©ïŒã®ä»£çšã§ããïŒ sïŒïŒ
@bcmillsç§ã¯ãŸã ãèšèªã«æ°åã®æŠå¿µã1è¡ã«å°å
¥ãã1ã€ã®ãã®ã ãã§æ©èœããéæ³ã®æ©èœã䜿çšããŠããŸããããæçµçã«ãããããx, err := f(); if err != nil { return err }
ãæžãããã®ã»ãã®å°ãçãæ¹æ³ä»¥äžã®ãã®ã§ããçç±ãç解ããŸããã
@bcmills @mpvlã®ããæ°ãèµ·ããããäŸãæžãçŽã=?
ææ¡ã䜿çšããŠãåä»ãªãšã©ãŒåŠçãè¡ããŸãã
func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
client := storage.NewClient(ctx) =? err { return err }
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
defer func() {
if r := recover(); r != nil { // r is interface{} not error so we can't use it here
_ = w.CloseWithError(fmt.Errorf("panic: %v", r))
panic(r)
}
if err != nil { // could use =! here but I don't see how that simplifies anything
_ = w.CloseWithError(err)
} else {
err = w.Close()
}
}()
io.Copy(w, r) =? err { return err } // what about n? does this need to be prefixed by a '_ ='?
return nil
}
ãšã©ãŒåŠçã®å€§éšåã¯å€æŽãããŠããŸããã =?
ã¯2ãæã§ãã䜿çšã§ããŸããã§ããã ãããããããã¯ç§ãèŠãããšãã§ãããããªå©çãå®éã«ã¯æäŸããŸããã§ããã 2çªç®ã®äŸã§ã¯ãã³ãŒããé·ããªãã io.Copy
ã2ã€ã®ãã®ãè¿ããšããäºå®ããããã«ãããªã£ãŠãããããããã§äœ¿çšããªãæ¹ãããã§ãããã
@jimmyfrascheãã®ã³ãŒãã¯äŸå€ã§ãããèŠåã§ã¯ãããŸããã æžããããããããã®æ©èœãèšèšããã¹ãã§ã¯ãããŸããã
ãŸãã recover
ãããã«ããã¹ããã©ããçåã«æããŸãã w.Write
ãŸãã¯r.Read
ïŒãŸãã¯io.Copy
ïŒïŒããããã¯ã«ãªã£ãŠããå Žåã¯ãçµäºããã®ãããããæåã§ãã
recover
ããªããã°ã defer
ã¯å®éã«ã¯å¿
èŠãªããé¢æ°ã®äžéšã¯æ¬¡ã®ããã«ãªããŸãã
_ = io.Copy(w, r) =? err { _ = w.CloseWithError(err); return err }
return w.Close()
@jimmyfrasche
// r is interface{} not error so we can't use it here
ç§ã®ç¹å®ã®è¡šçŸïŒhttps://github.com/golang/go/issues/21161#issuecomment-319434101ïŒã¯ãŒãå€ã«é¢ãããã®ã§ãããç¹ã«ãšã©ãŒã§ã¯ãªãããšã«æ³šæããŠãã ããã
// what about n? does this need to be prefixed by a '_ ='?
ç§ã¯ããã«ã€ããŠãã£ãšæ確ã«ã§ãããããããŸããããããã§ã¯ãããŸããã
ãã®äŸã§ã®@mpvlã®recover
ã®äœ¿çšã¯ç¹ã«å¥œãã§ã¯ãããŸãããæ
£çšçãªå¶åŸ¡ãããŒããããããã¯ã®äœ¿çšãä¿é²ããŸãããã©ã¡ãããšããã°ãç¡é¢ä¿ãªrecover
åŒã³åºããæé€ããå¿
èŠããããšæããŸãïŒ Go 2ã®æšæºã©ã€ãã©ãªã®fmt
ïŒã«ãããã®ãªã©ã
ãã®ã¢ãããŒãã§ã¯ããã®ã³ãŒãã次ã®ããã«èšè¿°ããŸãã
func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
client := storage.NewClient(ctx) =? err { return err }
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
io.Copy(w, r) =? err {
w.CloseWithError(err)
return err
}
return w.Close()
}
äžæ¹ãæ
£çšçãªå埩ã§ã¯ãæ
£çšçãªãšã©ãŒåŠçããµããŒãããããšãç®çãšããæ©èœãé©çšããæ©äŒãã»ãšãã©ãªããšããã®ã¯æ£ããããšã§ãã ãã ãããªã«ããªãClose
æäœããåé¢ãããšãIMOã®ã³ãŒããããããã¯ãªãŒã³ã«ãªããŸãã
func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
client := storage.NewClient(ctx) =? err { return err }
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
defer func() {
if err != nil {
_ = w.CloseWithError(err)
} else {
err = w.Close()
}
}()
defer func() {
recover() =? r {
err = fmt.Errorf("panic: %v", r)
panic(r)
}
}()
io.Copy(w, r) =? err { return err }
return nil
}
@jbaé 延ãã³ãã©ãŒãåãããã¯ã«ãªããŸããä»ã®ã³ã³ãã¥ãŒã¿ãŒã®ããã»ã¹ã«éç¥ããããšããããã誀ã£ãŠäžæ£ãªãã©ã³ã¶ã¯ã·ã§ã³ãã³ãããããããšã¯ãããŸããïŒæœåšçãªãšã©ãŒç¶æ ã§ãå¯èœã§ãããšæ³å®ããŠããŸãïŒã ãããããªãäžè¬çã§ãªãå Žåã¯ãããããããããã¹ãã§ãã èªã¿åã/æžã蟌ã¿/ã³ããŒããããã¯ã«ãªããªãããšã«åæããŸãããäœããã®çç±ã§åççã«ãããã¯ã«ãªãå¯èœæ§ã®ããä»ã®ã³ãŒããããã«ãã£ãå Žåã¯ãæåã®å Žæã«æ»ããŸãã
@bcmillsã®æåŸã®ãªããžã§ã³ã¯èŠæ ããè¯ããªããŸãïŒå®éã«=?
ãåãåºãããšããŠãïŒ
@jba ïŒ
_ = io.Copy(w, r) =? err { _ = w.CloseWithError(err); return err }
return w.Close()
ããã¯ãŸã èªè ã®ãããã¯ã®å Žåãã«ããŒããŠããŸããã 確ãã«ããã¯ãŸããªã±ãŒã¹ã§ãããéåžžã«éèŠãªã±ãŒã¹ã§ãããããã¯ãçºçããå Žåã«ããã§CloseãåŒã³åºãã®ã¯éåžžã«æªãããšã§ãã
ãã®ã³ãŒãã¯äŸå€ã§ãããèŠåã§ã¯ãããŸããã æžããããããããã®æ©èœãèšèšããã¹ãã§ã¯ãããŸããã
@jba ïŒãã®å Žåãç§ã¯å¿ããåæãerrd
ãä¿å®çãªãšã©ãŒåŠçãç°¡åã«è¡ããäžæ¹ã§ãã«ãŒã«ãç·©åããããã®åªåãå¿
èŠã§ãããä»ã®æ¹åã«å°ãã§ã移åãããã®ã§ã¯ãªãã¢ãããŒããå¿
èŠã§ãã
@jimmyfrasche ïŒããªãã®åçŽåã«é¢ããŠïŒããªãã¯å€§äœæ£ããã§ãã
@mpvlç§ã¯ãããããã€ãã®ããšã«çµã蟌ãããšããŠããã®ã§ããããã©ã®ããã«æ©èœããããã©ã®ããã«äœ¿çšãããããããŠç§ãæžããã³ãŒãã«ã©ã®ããã«é©åããããæ³åããã®ãç°¡åã§ããã
@jimmyfrasche ïŒç解ããŸããããAPIã§ãããè¡ãå¿ èŠããªãå Žåã¯åé¡ãããŸããã :)
@bcmills ïŒãã³ãã©ãŒã¯ãéèŠåºŠã®é«ãé ã«ãããã€ãã®ç®çãæãããŸãã
ããã§ãéèŠåºŠã®é«ãé ã«ããããã®ã¹ã³ãŒãã以äžã§æå®ããå¿ èŠããããŸãã
ããã©ã«ãã®ãšã©ãŒã¯ããšã©ãŒãã©ããã§åŠçãããããšãä¿èšŒããããããããã®ãã®ã§ãã
ããããç§ã¯ãããã¯ã¬ãã«ã§ããçããããŸããã§ããã ç§ã¯ããšããšãã³ãã©ãŒã®ä»£ããã«ãªãã·ã§ã³ãåããAPIãæã£ãŠããŸããã ãã ãããã®çµæãAPIãé
ããªããããã«äžåšçšã«ãªããŸããã
ããã§ã¯ãã³ãŒã«ããã¯ã®åé¡ãããã»ã©ã²ã©ããšã¯æãããŸããã ãŠãŒã¶ãŒã¯ããšã©ãŒãçºçããå Žåã«åŒã³åºããããã³ãã©ãŒãã©ã³ããŒã«æž¡ãããšã§ã©ã³ããŒãå®çŸ©ããŸãã ç¹å®ã®ã©ã³ããŒã¯ããšã©ãŒãåŠçããããããã¯ã§æ瀺çã«æå®ãããŸãã å€ãã®å Žåããã³ãã©ãŒã¯ãã€ã³ã©ã€ã³ã§æž¡ãããã©ãããããæååãªãã©ã«ã«ãªããŸãã äœãæçšã§äœãããã§ãªããã確èªããããã«ãå°ãéãã§ã¿ãŸãã
ãšããã§ããã³ãã©ãŒã§ã®ãã°ãšã©ãŒãæšå¥šããªãå Žåã¯ãã³ã³ããã¹ããµããŒããåé€ãããå¯èœæ§ããããŸãã
@jba ïŒ
ãŸããç§ã¯å埩ãããã«ããã¹ããã©ããçåã«æããŸãã w.WriteãŸãã¯r.ReadïŒãŸãã¯io.CopyïŒïŒããããã¯ã«ãªã£ãŠããå Žåã¯ãããããçµäºããã®ãæåã§ãã
writeToGSã¯ããããã¯ãçºçããå Žåã§ãçµäºããŸãïŒ!!!ïŒãããã¯ãnil以å€ã®ãšã©ãŒã§CloseWithErrorãåŒã³åºãããšãä¿èšŒããã ãã§ãã ãããã¯ãåŠçãããªãå Žåã§ãã延æã¯åŒã³åºãããŸãããerr == nilã§ãããããCloudStorageã§ãã¡ã€ã«ãç Žæããå¯èœæ§ããããŸãã ããã§è¡ãæ£ããããšã¯ãäžæçãªãšã©ãŒã§CloseWithErrorãåŒã³åºããŠããããããã¯ãç¶ããããšã§ãã
Goã³ãŒãã§ãã®ãããªäŸãããããèŠã€ããŸããã io.PipesãåŠçãããšãã³ãŒããå°ã埮åŠã«ãªããããããšããããããŸãã ãšã©ãŒã®åŠçã¯ãå€ãã®å Žåãèªåã§èŠãã»ã©ç°¡åã§ã¯ãããŸããã
@bcmills
ãã®äŸã§ã®@mpvlã®recoverã®äœ¿çšã¯ç¹ã«å¥œãã§ã¯ãããŸãããããã¯ãæ £çšçãªå¶åŸ¡ãããŒããããããã¯ã®äœ¿çšãä¿é²ããŸãã
ãããã¯ã®äœ¿çšãå°ãã§ã奚å±ããããšã¯ããŠããŸããã ãããã¯ã¯CloseWithErrorã®çŽåŸã«åçºçãããããå¶åŸ¡ãããŒã¯å€æŽãããªãããšã«æ³šæããŠãã ããã ãããã¯ã¯ãããã¯ã®ãŸãŸã§ãã
ãã ããããã§recoverã䜿çšããªãã®ã¯èª€ãã§ãããããã¯ãçºçãããšã延æãnilãšã©ãŒã§åŒã³åºããããããŸã§ã«æžã蟌ãŸããå
容ãã³ãããã§ããããšãéç¥ããŸãã
ããã§recoverã䜿çšããªãå¯äžã®ããçšåºŠæå¹ãªè°è«ã¯ãä»»æã®Readerã§ãã£ãŠãããããã¯ãçºçããå¯èœæ§ã¯éåžžã«äœããšããããšã§ãïŒãã®äŸã§ã¯ãçç±ã«ããReaderã®ã¿ã€ãã¯äžæã§ã:)ïŒã
ãã ããæ¬çªã³ãŒãã®å Žåãããã¯åãå
¥ããããªãã¹ã¿ã³ã¹ã§ãã ç¹ã«ãååãªèŠæš¡ã§ããã°ã©ãã³ã°ããå Žåãããã¯ãã€ãçºçããã¯ãã§ãïŒãããã¯ã¯ãã³ãŒãã®ãã°ä»¥å€ã®åå ã§çºçããå¯èœæ§ããããŸãïŒã
ãšããã§ã errd
ããã±ãŒãžã䜿çšãããšããŠãŒã¶ãŒãããã«ã€ããŠèããå¿
èŠããªããªãããšã«æ³šæããŠãã ããã ãã ãããããã¯ãçºçããå Žåã«ãšã©ãŒãéç¥ãããã®ä»ã®ã¡ã«ããºã ã¯åé¡ãããŸããã ãããã¯ã§å»¶æãåŒã³åºããªãããšãæ©èœããŸãããããèªäœã«åé¡ããããŸãã
宣èšã®æç¹ã§ã¯ãçŸåšããå€ãšãšã©ãŒããšãå€ãŸãã¯ãšã©ãŒããåºå¥ããæ¹æ³ã¯ãããŸããã
@bcmillsããããªãã»ã©ã å¥ã®èªè»¢è»å°å±ã®çŒ¶ãéããã«ã¯ãããªããèšãããšãã§ãããšæããŸã
func Atoi(string) ?int
ãã以å€ã®
func Atoi(string) (int, error)
ãã ããWriteStringã¯å€æŽãããŸããã
func WriteString(Writer, String) (int, error)
@bcmills / @ jbaã«ãã=?
/ =!
/ :=?
/ :=!
ææ¡ã¯ãåæ§ã®ææ¡ãããæ°ã«å
¥ã£ãŠããŸãã ããã¯ããã€ãã®çŽ æŽãããç¹æ§ãæã£ãŠããŸãïŒ
=?
ãããã¯å
ã§=?
䜿çšã§ããŸãïŒããã¯ãŸããç§ãããŸãè¯ããªããšæãããã€ãã®ç¹æ§ãæã£ãŠããŸãã
æ§æã®å·£ã ç¹°ãè¿ã䜿çšãããšãããã«å³ã«ã€ã³ãã³ãããç¶ããŸãã ããèªäœã¯å¿
ãããæªãããšã§ã¯ãããŸãããããšã©ãŒã®åå ãšãªããšã©ãŒãåŠçããå¿
èŠãããéåžžã«è€éãªãšã©ãŒåŠçã®ç¶æ³ã§ã¯ãã³ãŒããåŠçãããšã©ãŒãçŸåšã®çŸç¶ãããã¯ããã«æ確ã§ãªããªããšæããŸãã ãã®ãããªç¶æ³ã§ã¯ãæãå€åŽã®ãšã©ãŒã«=?
ã䜿çšããå
åŽã®ãšã©ãŒã«if err != nil
ã䜿çšã§ããŸãããããã«ããããšã©ãŒåŠçãäžè¬çã«ããŸãã¯äžè¬çãªã±ãŒã¹ã§æ¬åœã«æ¹åãããŸãããïŒ ãã¶ããäžè¬çãªã±ãŒã¹ãæ¹åããããšãå¿
èŠãªãã¹ãŠã§ãããå人çã«ã¯ãããé
åçã ãšã¯æããŸããã
ããã¯ãã®äžè¬æ§ãåŸãããã«èšèªã«åœããå°å
¥ããŸãã ããŒãå€ã§ã¯ãªãããšå®çŸ©ãããŠããåœãã¯å®å
šã«åççã§ãããç§ã®æèŠã§ã¯ã if err != nil {
ã¯æ瀺çã§ããããã if err {
ãããåªããŠããŸãã =?
/ etcã䜿ãããšããå®éã®ããã¿ãèŠããããšæããŸãã ããèªç¶ãªå¶åŸ¡ãããŒãè¶
ããŠããã®åœãã«ã¢ã¯ã»ã¹ããããšããŸãã ããã¯ç¢ºãã«äžçŸ©çã§çãã²ãããã§ãããããããã¯èµ·ãããŸãã æ©èœã®æœåšçãªæªçšã¯ãããèªäœãæ©èœã«å¯Ÿããåè«ã§ã¯ãããŸããããèæ
®ãã¹ãç¹ããããŸãã
æ¹åãããã¹ã³ãŒãïŒãã©ã¡ãŒã¿ãŒã宣èšããããªã¢ã³ãã®å ŽåïŒãåªããŠããå ŽåããããŸãããã¹ã³ãŒããä¿®æ£ããå¿ èŠãããå Žåã¯ãäžè¬çã«ã¹ã³ãŒããä¿®æ£ããŠãã ããã
ãå³ç«¯ã®çµæã®ã¿ãã®ã»ãã³ãã£ã¯ã¹ã¯çã«ããªã£ãŠããŸãããç§ã«ã¯å°ãå¥åŠã«æããŸãã ããã¯è°è«ãšããããã¯ææ ã§ãã
ãã®ææ¡ã¯èšèªã«ç°¡æœããè¿œå ããŸãããè¿œå ã®åã¯ãããŸããã ãã¯ãæ¡åŒµãè¡ãããªããã»ããµãšããŠå®å šã«å®è£ ã§ããŸãã ãã¡ãããããã¯æãŸãããããŸããããã«ããšãã©ã°ã¡ã³ãéçºãè€éã«ãªãããã®ãããªããªããã»ããµã¯ãåãèªèããŠè¡ççã§ããå¿ èŠããããããéåžžã«è€éã«ãªããŸãã ç§ã¯ãããªããã»ããµãäœãã ãããšèšã£ãŠåŽäžããããšã¯ããŠããŸããã ç§ã¯ãããããã®ææ¡ãå®å šã«ç ç³ã§ããããšãææããããã ãã«æèµ·ããŸãã Goã§ã¯ä»ã§ããªãã£ãããšã¯äœãã§ããŸããã ããã³ã³ãã¯ãã«æžãããšãã§ããŸãã ç§ã¯ç¬æçã«ç ç³ã«å察ããŠããŸããã æ éã«éžæãããèšèªã®æœè±¡åã«ã¯åããããŸããããããç ç³ã§ãããšããäºå®ã¯ãããã°ç¡å®ã§ããããšã蚌æããããŸã§ããããðãšèŠãªãããã¹ãã§ããããšãæå³ããŸãã
æŒç®åã®lhsã¯ã¹ããŒãã¡ã³ãã§ãããã¹ããŒãã¡ã³ãã®éåžžã«éããããµãã»ããã§ãã ãã®ãµãã»ããã«å«ããèŠçŽ ã¯ããªãèªæã§ãããä»ã«äœããªããšããŠããå€æŽã«å¯Ÿå¿ããããã«èšèªä»æ§ã®ææ³ããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠããããŸãã
ã®ãããªãã®ã«ãªããŸã
func F() (S, T, error)
func MustF() (S, T) {
return F() =? err { panic(err) }
}
èš±å¯ãããŠããïŒ
ããã
defer f.Close() :=? err {
return err
}
ïŒã©ããããããïŒåçã§ãªããã°ãªããªãããšãèš±å¯ãããŸã
func theOuterFunc() (err error) {
//...
defer func() {
if err2 := f.Close(); err2 != nil {
err = err2
}
}()
//...
}
ããã¯éåžžã«åé¡ããããéåžžã«æ··ä¹±ããç¶æ³ãåŒãèµ·ããå¯èœæ§ããããéåžžã«éGoã®ãããªæ¹æ³ã§ãæé»çã«ã¯ããŒãžã£ãå²ãåœãŠãããšã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãé ããŠããããšãç¡èŠããŸãã å¥ã®æ¹æ³ã¯ãæé»ã®ã¯ããŒãžã£ããreturn
è¿ãã func()
ããã¿ã€ãerror
å€ãè¿ãããšãã§ããªããšãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšã§ããéãã
ãã ããå®éã«ã¯ãã¹ã³ãŒãã®ä¿®æ£ããããã«æ¹åãããŠããããšãé€ãã°ãGoã§ã®ãšã©ãŒã®åŠçã§çŽé¢ããåé¡ã¯ä¿®æ£ãããŸããã ããããif err != nil { return err }
ãšå
¥åããã®ã¯åä»ã§ãïŒ21182ã§è¡šçŸããããããªèªã¿ãããã®æžå¿µãæ³ãšããŠã§ãã 2ã€ã®æ倧ã®åé¡ã¯
errors
ããã±ãŒãžããã®ãµããŒãã«ããè¿œå ã®èŠåã¯ããã¹ãŠã®åé¡ã解決ã§ããããã§ã¯ãããŸããããããã§ã¯å€§ãã«åœ¹ç«ã¡ãŸããããã ããåé¡ã§ã¯ãªããå€ãã®äººãããã«ä»ã®åŽé¢ãèŠã€ããŸãããç§ãæãæéãè²»ãããäœãããåä»ã§åä»ãªåé¡ã ãšæããŸãã
ãã¡ãããç§ãäœããå°ç¡ãã«ããããšãæ€åºããããã®ããè¯ãéçåæã¯åžžã«ãããããã§ãïŒãããŠäžè¬çã«ããã®ã·ããªãªã ãã§ã¯ãããŸããïŒã ãœãŒã¹ã®åæã容æã«ããèšèªã®å€æŽãšèŠåã«ãããããããããæçšã«ãªãããšãèå³æ·±ãã§ãããã
ç§ã¯ããã«ã€ããŠããããæžããã°ããã§ãïŒããããïŒããããªããïŒïŒããç§ã¯ææ¡ãåŽäžããŠããŸããã ã¡ãªããã¯ãããšæããŸãããããŒãã¯ãªã¢ããããéããåŒãããããããšã«ã¯ç¢ºä¿¡ãæãŠãŸããã
@jimmyfrasche
ïŒ=ã®çŸåšã®åäœãå°å ¥ããããšãã®ããšãèŠããŠããŸãããã®ã¹ã¬ããã®å€ãã¯ãæé»ã®ãçŸåšã®ã¹ã³ãŒãã«å€æ°ãååšããå Žåã«ã®ã¿åå©çšãããã§ã¯ãªããåå©çšããååã«æ瀺çã«æ³šéãä»ããæ¹æ³ãæ±ããŠããŸããã ãç§ã®çµéšã§ã¯ãããã¯ãã¹ãŠã®åŸ®åŠãªèŠã«ããåé¡ãçŸããå Žæã§ãã
â ãã®ã¹ã¬ãããèŠã€ããããšãã§ããŸãã誰ãããªã³ã¯ãæã£ãŠããŸããïŒ
GoããªãªãŒã¹ããããšãã«é¢ãã£ãŠããªãéããå¥ã®ã¹ã¬ãããèŠããŠããã«éããªããšæããŸãã ãªãªãŒã¹çŽåã®2009/11/9ã®ä»æ§ã«ã¯ã次ã®ãããªãã®ããããŸãã
éåžžã®å€æ°å®£èšãšã¯ç°ãªããçãå€æ°å®£èšã¯ãå ã åãã¿ã€ãã®åããããã¯ã§å®£èšãããŠããŠã空çœä»¥å€ã®å€æ°ã®å°ãªããšã1ã€ãæ°ããå Žåã«ãå€æ°ãå宣èšã§ããŸãã
以åã¯ïŒ=ã®ããèšèªã䜿çšããŠããŸãããããã®åå©çšã«ãŒã«ããªããåããã®ã®æ°ããååãèããã®ã¯é¢åã ã£ãã®ã§ãåããŠä»æ§ãèªãã§ãããçŽ æŽãããã«ãŒã«ã ãšæã£ããšãã®ããšãèŠããŠããŸãã
@mpvl
ããªãã®å
ã®äŸã®ããªãããŒãã¯ãããå€ãã®çµæã ãšæããŸã
Goã®ãšã©ãŒåŠçèªäœãããããã§äœ¿çšããŠããAPIã
ããã¯èå³æ·±ãäŸã§ãããç¹ã«
ãããã¯ãçºçããå Žåãéåžžã¯ãã¡ã€ã«ãéããããªãã®ã§ã
éåžžã®ãdeferw.CloseïŒïŒãã€ãã£ãªã ã¯æ©èœããŸããã
ãããšãã«éãããåŒã³åºãããšãé¿ããå¿
èŠããªãã£ãå Žå
ãããã¯ããããŠããªãã¯ããããšãã§ããŸãïŒ
func writeToGS(ctx context.Context, bucket, dst string, r io.Reader) (err error) {
client, err := storage.NewClient(ctx)
if err != nil {
return err
}
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
defer w.Close()
_, err = io.Copy(w, r)
if err != nil {
w.CloseWithError(err)
}
return err
}
CloseãåŒã³åºãããã«ã»ãã³ãã£ã¯ã¹ãå€æŽããããšä»®å®ããŸã
CloseWithErrorãåŒã³åºããåŸã¯ãäœãããŸããã
ãããããªã«æªãã¯ãªããšæããŸãã
ãããã¯ãçºçãããšãã«ãã¡ã€ã«ããšã©ãŒãªãã§æžã蟌ãŸããªããšããèŠä»¶ããã£ãŠãã察å¿ããã®ã¯ããã»ã©é£ããããšã§ã¯ãããŸããã ããšãã°ãCloseã®åã«æ瀺çã«åŒã³åºãå¿ èŠãããFinalizeé¢æ°ãè¿œå ããŸãã
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
defer w.Close()
_, err = io.Copy(w, r)
return w.Finalize(err)
ãããã¯ãšã©ãŒã¡ãã»ãŒãžãæ·»ä»ããããšã¯ã§ããŸããããé©åãªãã°ãèšé²ããããšã§ããããããæ確ã«ããããšãã§ããŸãã
ïŒCloseã¡ãœããã«ã¯ãrecoveråŒã³åºããå«ãŸããŠããå¯èœæ§ããããŸãããããã
å®éã«ã¯æ¬åœã«æªãèãã§ã...ïŒ
ãã ãããã®äŸã®ãããã¯å埩ã®åŽé¢ã¯ã99ïŒ ä»¥äžã®ãšã©ãŒåŠçã®ã±ãŒã¹ã§ã¯ãããã¯å埩ãè¡ãããªãããããã®ã³ã³ããã¹ãã§ã¯ããèµ€ãã·ã³ã ãšæããŸãã
@rogpeppe ïŒ
ãããã¯ãšã©ãŒã¡ãã»ãŒãžãæ·»ä»ããããšã¯ã§ããŸããããé©åãªãã°ãèšé²ããããšã§ããããããæ確ã«ããããšãã§ããŸãã
ããã¯åé¡ã§ã¯ãªããšæããŸãã
ææ¡ãããAPIã®å€æŽã¯è»œæžãããŸãããåé¡ã¯ãŸã å®å šã«ã¯è§£æ±ºãããŠããŸããã å¿ èŠãªã»ãã³ãã£ã¯ã¹ã§ã¯ãä»ã®ã³ãŒããé©åã«åäœããå¿ èŠããããŸãã 以äžã®äŸãèããŠã¿ãŸãããã
r, w := io.Pipe()
go func() {
var err error // used to intercept downstream errors
defer func() {
w.CloseWithError(err)
}()
r, err := newReader()
if err != nil {
return
}
defer func() {
if errC := r.Close(); errC != nil && err == nil {
err = errC
}
}
_, err = io.Copy(w, r)
}()
return r
ããèªäœã§ããã®ã³ãŒãã¯ããšã©ãŒåŠçãããªãããŒã§ããããå°ãªããšãåä»ã§ããå¯èœæ§ãããããšã瀺ããŠããŸãïŒãããŠããããä»ã®ææ¡ã§ã©ã®ããã«æ¹åãããã®ãèå³ããããŸãïŒïŒããã¯ã¹ãã«ã¹ã«ããŠã³ã¹ããªãŒã ãšã©ãŒãå€æ°ã«æž¡ããå°ãããããŸãæ£ãããšã©ãŒãæž¡ãããããšãä¿èšŒããããã®äžæ Œå¥œãªifã¹ããŒãã¡ã³ãã ã©ã¡ãããããžãã¹ããžãã¯ãããæ°ãããããããŠããŸãã ãšã©ãŒåŠçãã³ãŒããæ¯é ããŸãã ãããŠããã®äŸã¯ãŸã ãããã¯ãåŠçããŠããŸããã
å®å
šãæãããã«ã errd
ãã®_ã¯ãããã¯ãæ£ããåŠçãã次ã®ããã«ãªããŸãã
r, w := io.Pipe()
go errd.Run(func(e *errd.E) {
e.Defer(w.CloseWithError)
r, err := newReader()
e.Must(err)
e.Defer(r.Close)
_, err = io.Copy(w, r)
e.Must(err)
})
return r
äžèšã®ãªãŒããŒïŒ errd
ã䜿çšããŠããªãïŒããªãŒããŒãšããŠwriteToGSã«æž¡ãããnewReaderã«ãã£ãŠè¿ãããio.Readerããããã¯ã«ãªã£ãå Žåã§ããææ¡ãããAPIä¿®æ£ã§èª€ã£ãã»ãã³ãã£ã¯ã¹ãçºçããŸãïŒæ£åžžã«çµäºããå¯èœæ§ããããŸãïŒãã€ãããããã¯ã§éããããåŸã®GSãã¡ã€ã«ãnilãšã©ãŒã§è¡šç€ºãããŸããïŒ
ããããã€ã³ãã蚌æããŸãã Goã§ã®é©åãªãšã©ãŒåŠçã«ã€ããŠæšè«ããã®ã¯ç°¡åã§ã¯ãããŸããã errd
ã§ã³ãŒããæžãçŽããšãã³ãŒããã©ã®ããã«èŠãããã調ã¹ããšããããã°ã®ããã³ãŒããããããèŠã€ãããŸããã errd
ããã±ãŒãžã®åäœãã¹ããäœæãããšãã«ãé©åãªæ
£çšçãªGoãšã©ãŒåŠçãäœæããããšãããã«å°é£ã§åŸ®åŠã§ããããå®éã«åŠã³ãŸããã :)
ææ¡ãããAPIã®å€æŽã«ä»£ããæ¹æ³ã¯ããããã¯æã«å»¶æããŸã£ããåŠçããªãããšã§ãã ããã«ã¯ç¬èªã®åé¡ããããåé¡ãå®å šã«è§£æ±ºããããšã¯ã§ãããããããå ã«æ»ãããšã¯ã§ããŸããããããã€ãã®åªããå質ããããŸãã
ãããã«ãããç°¡æœãã«çŠç¹ãåœãŠããã®ã§ã¯ãªãããšã©ãŒåŠçã®åŸ®åŠãã軜æžããèšèªã®å€æŽãæåã§ãããã
@mpvl
Goã®ãšã©ãŒåŠçã³ãŒãã§ãå¥ã®é¢æ°ãäœæãããšåé¡ã解決ããããšããããããŸãã ç§ã¯ããªãã®ã³ãŒãããã®ãããªãã®ã®äžã«æžãã§ãããïŒ
func something() {
r, w := io.Pipe()
go func() {
err := copyFromNewReader(w)
w.CloseWithError(err)
}()
...
}
func copyFromNewReader(w io.Writer) error {
r, err := newReader()
if err != nil {
return err
}
defer r.Close()
_, err = io.Copy(w, r)
return err
}()
r.Closeã¯æçšãªãšã©ãŒãè¿ããªããšæ³å®ããŠããŸãããªãŒããŒãæåŸãŸã§èªã¿ãio.EOFã®ã¿ãçºçããå Žåã¯ãéãããšãã«ãšã©ãŒãè¿ããããã©ããã¯ã»ãŒééããªãåé¡ã§ã¯ãããŸããã
ç§ã¯errdAPIã«ç±å¿ã§ã¯ãããŸãã-éå§ããããŽã«ãŒãã³ã«ææãããŸãã äŸïŒ https ïŒ
function inã¯ããã°ã©ã ã®æ£ç¢ºãã«åœ±é¿ãäžããã¹ãã§ã¯ãããŸããããerrdã䜿çšããå Žåã¯åœ±é¿ããŸãã ãããã¯ãæœè±¡åã®å¢çãå®å
šã«ééããããšãæåŸ
ããŠããŸãããGoã«ã¯ãããŸããã
@mpvl
w.CloseWithErrorïŒerrïŒã延æãã
ãšããã§ããã®è¡ã¯åžžã«CloseWithErrorãnilãšã©ãŒå€ã§åŒã³åºããŸãã ç§ã¯ããªããããã€ããã ã£ããšæããŸã
æžããŸãïŒ
defer func() {
w.CloseWithError(err)
}()
@mpvl
è¿ããããšã©ãŒããšã«æ³šæããŠãã ããClose
äžã®æ¹æ³io.Reader
ã»ãšãã©ãªãæçšã§ããïŒhttps://github.com/golang/go/issues/20803#issuecomment-312318808ã§ãªã¹ããåç
§ããŠãã ããïŒã
ããã¯ãä»æ¥ã®äŸã次ã®ããã«æžãå¿ èŠãããããšã瀺åããŠããŸãã
r, w := io.Pipe()
go func() (err error) {
defer func() { w.CloseWithError(err) }()
r, err := newReader()
if err != nil {
return err
}
defer r.Close()
_, err = io.Copy(w, r)
return err
}()
return r
...å°ãåé·ã§ããããšãé€ãã°ãããã¯ç§ã«ã¯å®å šã«åé¡ãªãããã§ãã
ãããã¯ãçºçããå Žåã«w.CloseWithError
ã«nilãšã©ãŒãæž¡ãããã®ã¯äºå®ã§ãããããã°ã©ã å
šäœã¯ãšã«ãããã®æç¹ã§çµäºããŸãã nilãšã©ãŒã§éããªãããšãéèŠãªå Žåã¯ãåçŽãªååå€æŽãš1è¡ã®è¿œå è¡ã§ãã
-go func() (err error) {
- defer func() { w.CloseWithError(err) }()
+go func() (rerr error) {
+ rerr = errors.New("goroutine exited by panic")
+ defer func() { w.CloseWithError(rerr) }()
@rogpeppe ïŒç¢ºãã«ãããããšãã :)
ã¯ããç§ã¯ãŽã«ãŒãã³ã®åé¡ãèªèããŠããŸãã ããã¯åä»ã§ãããããããç£å»ã®ãã§ãã¯ã§æãŸããã®ã¯é£ããããšã§ã¯ãããŸããã ãšã«ãããç§ã¯errdãæçµçãªè§£æ±ºçãšããŠã§ã¯ãªãããšã©ãŒåŠçã«æé©ã«å¯ŸåŠããæ¹æ³ãçµéšããæ¹æ³ãšããŠèŠãŠããŸãã çæ³çã«ã¯ãåãåé¡ã解決ããèšèªã®å€æŽããããŸãããé©åãªå¶éã課ããããŸãã
ãããã¯ãæœè±¡åã®å¢çãå®å šã«ééããããšãæåŸ ããŠããŸãããGoã«ã¯ãããŸããã
ããã¯ç§ãæåŸ ããŠããããšã§ã¯ãããŸããã ãã®å ŽåãAPIãæåããªãã£ããšãã«æåãå ±åããªãããšãæåŸ ããŠããŸãã æåŸã®ã³ãŒãã¯ãã©ã€ã¿ãŒã«deferã䜿çšããªããããæ£ããåŠçãããŸãã ããããããã¯éåžžã«åŸ®åŠã§ãã ãã®å Žåãæ £çšçãªãã®ãšèŠãªããããããå€ãã®ãŠãŒã¶ãŒã¯deferã䜿çšããŸãã
ãã¶ããç£å»ã®ãã§ãã¯ã®ã»ããã¯ã延æã®åé¡ã®ãã䜿çšæ³ãæãããããšãã§ããŸãã ããã§ããå ã®ãæ £çšçãªãã³ãŒããšæåŸã«ãªãã¡ã¯ã¿ãªã³ã°ãããã³ãŒãã®äž¡æ¹ã§ãä»ã®ç¹ã§ã¯éåžžã«åçŽãªã³ãŒãã§ããäœãã®åŸ®åŠãªãšã©ãŒåŠçãåé¿ããããã®å€ãã®èª¿æŽããããŸãã åé¿çã®ã³ãŒãã¯ãç¹å®ã®ãšã©ãŒã±ãŒã¹ãåŠçããæ¹æ³ãç解ããããã®ãã®ã§ã¯ãªããçç£çãªäœ¿çšã«äœ¿çšã§ããçŽç²ãªè³ã®ãµã€ã¯ã«ã®ç¡é§ã§ãã
å
·äœçã«ã¯ã errd
ããåŠãŒããšããŠããã®ã¯ãåçŽã«äœ¿çšããå Žåã«ãšã©ãŒåŠçãããç°¡åã«ãªããã©ããã§ãã ç§ãèŠãããšãã§ãããã®ãããå€ãã®è€éããšåŸ®åŠããæ¶ããŸãã ãã®ã»ãã³ãã£ã¯ã¹ã®åŽé¢ãæ°ããèšèªæ©èœã«äœç³»åã§ãããã©ããã確èªããã®ã¯è¯ãããšã§ãã
@jimmyfrasche
ããã¯ãã®äžè¬æ§ãåŸãããã«èšèªã«åœããå°å ¥ããŸãã
ããã¯éåžžã«è¯ãç¹ã§ãã åœãã«é¢ããéåžžã®åé¡ã¯ãããŒã«é¢æ°ãåŒã³åºãã®ãå¿ããããnilãžã®ãã€ã³ã¿ãŒãéåç §ããã®ãå¿ãããããããšããçããŸãã
æŒç®åãnillableåã§ã®ã¿æ©èœããããã«å®çŸ©ããããšã§ãåŸè
ã«å¯ŸåŠã§ããŸãïŒãããŠãã»ãšãã©åœ¹ã«ç«ããªããããçµæãšããŠ=!
ãåé€ããå¯èœæ§ããããŸãïŒã
é¢æ°åã§ã¯æ©èœããªãããã«ããŸãã¯ãã€ã³ã¿ãŒåãŸãã¯ã€ã³ã¿ãŒãã§ãŒã¹åã§ã®ã¿æ©èœããããã«ããã«å¶éããããšã§ãåè ã«å¯ŸåŠã§ããŸãããã®å Žåãå€æ°ãããŒã«å€ã§ã¯ãªãããšã¯æããã§
[
MustF
]ã®ãããªãã®ã¯èš±å¯ãããŸããïŒ
ã¯ãã
[
defer f.Close() :=? err {
]ãèš±å¯ãããŠããå Žåãããã¯ïŒã©ããããããïŒåçã§ãªããã°ãªããŸãã
[defer func() { ⊠}()
]ã
å¿
ãããããã§ã¯ãããŸããã ç¬èªã®ã»ãã³ãã£ã¯ã¹ãæã€ããšãã§ããŸãïŒç¡åé¢æ°ãããcall/cc
ããã«ïŒã defer
=?
ã䜿çšããããã®ä»æ§å€æŽãææ¡ããŠããŸããïŒå°ãªããšãææ³ã®å€æŽãå¿
èŠã§ãïŒã®ã§ããã®ãããªå®çŸ©ãã©ãã»ã©è€éã«ãªããã¯æ£ç¢ºã«ã¯ããããŸããã ã
2ã€ã®æ倧ã®åé¡ã¯[âŠ] 2ããšã©ãŒãå çããŠãç¶æ³ã«ãã£ãŠã¯äœããã¹ãããå€æããããšã§ãã
ããã¯å®éã«ã¯ãã£ãšå€§ããªåé¡ã§ããããšã«åæããŸããããã®åé¡ãšã»ãŒçŽäº€ããŠããããã«èŠããŸãïŒããã¯ãå®åæãšããã«é¢é£ãããšã©ãŒã®å¯èœæ§ãæžããããšã«é¢ãããã®ã§ãïŒã
ïŒ @ rogpeppe ã @ davecheney ã @ dsnet ã @ crawshaw ãç§ãããã³ä»ã®ããã€ãã®äººã¯ããšã©ãŒãæ€æ»ããããã®APIã«ã€ããŠGopherConã§çŽ æŽãããè°è«ãããããšãå¿ããŠããŸãããã®åã«ãããã€ãã®è¯ãææ¡ãèŠãããããšãé¡ã£ãŠããŸãã ããããç§ã¯æ¬åœã«ããã¯å¥ã®åé¡ã®åé¡ã ãšæããŸããïŒ
@bcmills ïŒãã®ã³ãŒãã«ã¯2ã€ã®åé¡ããããŸã1ïŒ @rogpeppeãè¿°ã¹ãã®ãšåãïŒ
ãã以å€ã®å ŽåãCloseã«ãã£ãŠè¿ããããšã©ãŒã¯ç¡èŠã§ããããšãå€ãããšã«åæããŸãã ãã ããåžžã«ã§ã¯ãããŸããïŒæåã®äŸãåç §ïŒã
ç§ã®ããªãåçŽãªäŸïŒç§èªèº«ã®äŸãå«ãïŒã§4ã€ãŸãã¯5ã€ã®èª€ã£ãææ¡ãè¡ãããããšã¯å°ãé©ãã¹ãããšã§ãããGoã§ã®ãšã©ãŒåŠçã¯ç°¡åã§ã¯ãªããšãŸã 䞻匵ããªããã°ãªããªãããã§ãã :)
@bcmills ïŒ
ãããã¯ãçºçããå Žåã«w.CloseWithErrorã«nilãšã©ãŒãæž¡ãããã®ã¯äºå®ã§ãããããã°ã©ã å šäœã¯ãšã«ãããã®æç¹ã§çµäºããŸãã
ããŸããïŒ ãã®ãŽã«ãŒãã³ã®å»¶æã¯ãŸã åŒã³åºãããŸãã ç§ãç解ããŠããéãããããã¯å®äºãããŸã§å®è¡ãããŸãã ãã®å ŽåãCloseã¯io.EOFãéç¥ããŸãã
ããšãã°ã httpsïŒ//play.golang.org/p/5CFbsAe8zFãåç §ããŠ
åæ§ã«ãä»ã®ã³ãŒãã¯ããããã¯ç¶æ ã®ãŽã«ãŒãã³ïŒäŸã®ãããªïŒãã誀ã£ãio.EOFãåãåããæåãå®äºãããããã¯ç¶æ ã®ãŽã«ãŒãã³ããããã¯ãåéããåã«ãã¡ã€ã«ãGSã«ã³ãããããå ŽåããããŸãã
次ã®è°è«ã¯æ¬¡ã®ããã«ãªããããããŸããïŒãã°ã®ããã³ãŒããæžããªãã§ãã ããããããïŒ
nilãšã©ãŒã§éããªãããšãéèŠãªå Žåã¯ãåçŽãªååå€æŽãš1è¡ã®è¿œå è¡ã§ãã
çµäºæã«io.EOFãéç¥ããããã«ãnilã§éããå¿ èŠããããããæ©èœããŸããã
nilãšã©ãŒã§éããªãããšãéèŠãªå Žåã¯ãåçŽãªååå€æŽãš1è¡ã®è¿œå è¡ã§ãã
çµäºæã«io.EOFãéç¥ããããã«ãnilã§éããå¿ èŠããããããæ©èœããŸããã
ãªãã ãã§ããïŒ æåŸã®return err
ã¯ã rerr
ãnil
ãŸãã
@bcmills ïŒãããããªããä»äœãæå³ããŠããã®ãããããŸãã ã¯ããããŸãããã¯ãã§ãã ãã ããè¡æ°ã«ã€ããŠã¯å¿é ããŠããŸããããã³ãŒãã®åŸ®åŠãã«ã€ããŠã¯å¿é ããŠããŸãã
ããã¯ãå¯å€ã·ã£ããŠã€ã³ã°ãšåãã«ããŽãªã®åé¡ã§ãããçºçããå¯èœæ§ã¯ãããã«äœããªããŸãïŒããããæªåããŸãïŒãè°è«ã®äœå°ã®ããã»ãšãã©ã®å¯å€ã·ã£ããŠã€ã³ã°ã®ãã°ã¯ãåªããåäœãã¹ãã§çºçããŸãã ä»»æã®ãããã¯ããã¹ãããã®ã¯å°é£ã§ãã
倧èŠæš¡ã«éçšããå Žåããã®ãããªãã°ãçºçããããšã¯ã»ãŒç¢ºå®ã§ãã ç§ã¯åå·çãããããŸããããããŒã¿ã®æ倱ãç Žæã«ã€ãªããå¯èœæ§ãã¯ããã«äœãã·ããªãªãèŠãŠããŸããã éåžžãããã¯åé¡ãããŸãããããã©ã³ã¶ã¯ã·ã§ã³åŠçïŒgsãã¡ã€ã«ã®æžã蟌ã¿ãªã©ïŒã«ã¯é©ããŠããŸããã
ç§ãããªãã®ææ¡ãå¥ã®æ§æã§ãã€ãžã£ãã¯ããããšãæ°ã«ããªãã§ãã ãã-人ã ã¯ãã®ãããªãã®ã«ã€ããŠã©ã®ããã«æããŸããïŒ
return err if f, err := os.Open("..."); err != nil
@SirCmpwnããã¯
ããã¯å ¬å¹³ã§ãããããªãã®ææ¡ã¯ç§ã«ãäžå¿«æãäžããŸã-ããã¯ãŠãŒã¶ãŒãæåŸ ããããã«èšç·Žãããæ¹æ³ãšã¯ç°ãªãæ¯ãèããããäžéæãªæ§æïŒ||ïŒãå°å ¥ããŸã|| æ¯ãèãã æ£ãã解決çãäœã§ãããããããªãããããããå°ãçèããã§ãããã
@SirCmpwnã¯ããå ã®æçš¿ã§è¿°ã¹ãããã«ãããã®ææ¡ãæžããŠããã®ã¯ãäž»ã«Goãšã©ãŒåŠçãç°¡çŽ åããã人ã«ããšã©ãŒãå€æŽããã«è¿ãã ãã§ãªãããšã©ãŒã®åšãã«ã³ã³ããã¹ããç°¡åã«ã©ããã§ããããã«ããæ¹æ³ãèããããã«ä¿ãããã§ãã ãã ç§ã¯ã§ããéãææ¡ãæžããŸãããããããæ¡çšãããããšã¯æåŸ ããŠããŸããã
äºè§£ããã
ããã¯ããå°ãéæ¿ã§ããããã¯ãé§ååã®ã¢ãããŒãã®æ¹ãããŸããããããããŸããã
f = try!(os.Open("..."))
try!
ã¯ãã¿ãã«ã®æåŸã®å€ãé£ã¹ãŠãnilã§ãªãå Žåã¯ãããè¿ãããã以å€ã®å Žåã¯ã¿ãã«ã®æ®ãã®å€ãè¿ããŸãã
ç§ãã¡ã®åé¡ã®èª¬æã¯ã
Goã§ã®ãšã©ãŒåŠçã¯ãåé·ã§å埩çã§ãã Goã®ãšã©ãŒåŠçã®æ £çšçãªåœ¢åŒã¯ããšã©ãŒä»¥å€ã®å¶åŸ¡ãããŒã確èªããããšãããå°é£ã«ããåé·æ§ã¯ãç¹ã«åå¿è ã«ãšã£ãŠé åçã§ã¯ãããŸããã çŸåšãŸã§ããã®åé¡ã«å¯ŸããŠææ¡ããããœãªã¥ãŒã·ã§ã³ã¯ãéåžžãè·äººã«ãã1åéãã®ãšã©ãŒåŠçæ©èœãå¿ èŠãšãããšã©ãŒåŠçã®å±ææ§ãæžãããè€éããå¢ããŠããŸãã Goã®ç®æšã®1ã€ã¯ãã©ã€ã¿ãŒã«ãšã©ãŒåŠçãšå埩ãæ€èšãããããšã§ããããããšã©ãŒåŠçã®æ¹åããã®ç®æšã«åºã¥ããŠæ§ç¯ããå¿ èŠããããŸãã
ãã®åé¡ã®èª¬æã«å¯ŸåŠããããã«ãGo2.xã§ã®ãšã©ãŒåŠçã®æ¹åã«é¢ãã次ã®ç®æšãææ¡ããŸãã
ãã®ææ¡ã®è©äŸ¡ïŒ
f.Close() =? err { return fmt.Errorf(âŠ, err) }
ãããã®ç®æšã«ããã°ãç§ã¯ãããç®æšïŒ1ã§ããŸãæåãããšçµè«ä»ããŸãã ãããïŒ2ã§ã©ã®ããã«åœ¹ç«ã€ãã¯ããããŸããããã³ã³ããã¹ããè¿œå ããå¯èœæ§ãäœããªããŸããïŒç§èªèº«ã®ææ¡ã¯ïŒ2ã§ãã®åŒ±ç¹ãå
±æããŠããŸããïŒã ãã ããïŒ3ãšïŒ4ã§ã¯å®éã«ã¯æåããŸããã
1ïŒä»ã®äººãèšã£ãŠããããã«ããšã©ãŒå€ã®ãã§ãã¯ãšå²ãåœãŠã¯äžéæã§ç°åžžã§ãã ãš
2ïŒ =?
æ§æãçããã§ãã é¡äŒŒããŠãããç°ãªã=!
æ§æãšçµã¿åããããšãç¹ã«æ··ä¹±ããŸãã 人ã
ã圌ãã®æå³ã«æ
£ããã«ã¯ãã°ããæéãããããŸãã ãš
3ïŒãšã©ãŒãšãšãã«æå¹ãªå€ãè¿ãããšã¯ååã«äžè¬çã§ãããããæ°ãããœãªã¥ãŒã·ã§ã³ã§ããã®ã±ãŒã¹ãåŠçããå¿
èŠããããŸãã
ãšã©ãŒåŠçããããã¯ã«ããã®ã¯è¯ãèããããããŸããããä»ã®äººã瀺åããŠããããã«ãããã¯gofmtãžã®å€æŽãšçµã¿åããããŠããŸãã ç§ã®ææ¡ãšæ¯èŒããŠãããã¯äžè¬æ§ãæ¹åããŸããããã¯ãç®æšïŒ4ã«åœ¹ç«ã¡ã芪ãã¿ãããã¯ãã³ã³ããã¹ããè¿œå ããŠãšã©ãŒãè¿ããšããäžè¬çãªã±ãŒã¹ã®ç°¡æœããç ç²ã«ããŠãç®æšïŒ3ã«åœ¹ç«ã¡ãŸãã
èŠçŽã§ç§ã«å°ããå Žåãäžèšã®ãšã©ãŒåŠçã®æ¹åç®æšãæºãããŠããéãããšã©ãŒåŠçã®ç¹å®ã®ãœãªã¥ãŒã·ã§ã³ãããäžè¬çãªãœãªã¥ãŒã·ã§ã³ã®æ¹ãæãŸããããšã«åæãããããããŸããã ãããããã®è°è«ãèªãã§ããã«ã€ããŠãã£ãšèããã®ã§ãç¹å®ã®è§£æ±ºçãåŠçãããšã©ãŒãããæ確ã§åçŽã«ãªããšä¿¡ããåŸåããããŸãã Goã®ãšã©ãŒã¯åãªãå€ã§ããããšã©ãŒåŠçã¯ããã°ã©ãã³ã°ã®éèŠãªéšåãæ§æããããããšã©ãŒåŠçã³ãŒããæ確ãã€ç°¡æœã«ããããã®ç¹å®ã®æ§æãé©åã§ãããšæãããŸãã ã¹ã³ãŒãã³ã°ãæ§æå¯èœæ§ãªã©ã®ä»ã®ç®æšãšçµã¿åããããšããã§ã«é£ããåé¡ïŒãšã©ãŒåŠçã®ã¯ãªãŒã³ãªè§£æ±ºçãèãåºãïŒãããã«é£ããè€éã«ãªãã®ã§ã¯ãªãããšæããŸãã
ãããããããããã圌ã®èšäºã®ãã¡@rscãã€ã³ãã¯ããšè¡ã2ã«åããŠãã©ã¡ãã®åé¡å£°æãç®æšãæ§æã®ææ¡ã¯ãåé¡ãéèŠã§ããããšã蚌æããŠããçµéšãå ±åããã«ãäºåã«å¯èœæ§ããããŸãã ãã¶ããããŸããŸãªæ§æã®ææ¡ã«ã€ããŠè°è«ãã代ããã«ãããŒã¿ããµããŒãããããã«æãäžãå§ããã¹ãã§ããããïŒ
ãšã¯ããã @ rscã圌ã®èšäº
人éå·¥åŠãéèŠã§ãããšä»®å®ããã°ãããã¯èªæã ãšæããŸãã Goã³ãŒãããŒã¹ãéããç©äºã也ãããããèšèªã察åŠã§ãã人éå·¥åŠãæ¹åãããããæ©äŒãããå Žæãæ¢ããŸããçŸåšããšã©ãŒåŠçã¯æããã«å€ãå€ã§ãã Toward Go 2ã®ã¢ãããŒãã¯ãåé¿çã®ããåé¡ãç¡èŠããããšã誀ã£ãŠäž»åŒµããŠããå¯èœæ§ããããšæããŸãããã®å Žåã人ã ã¯ãã ãã€ãªãšç¬ã£ãŠèããŸãã
if $val, err := $operation($args); err != nil {
return err
}
ã³ãŒããããå®åçãªãã®ãå€ãå Žåãåé¡ã¯èªæã®ç§èŠã§ãã
@billyh
f.Close() =? err { return fmt.Errorf(âŠ, err) }
ã®åœ¢åŒã¯ãé床ã«åé·ã§æ··ä¹±ããŠããããã«æããŸãã å人çã«ã¯ããšã©ãŒéšåããããã¯ã«ãªã£ãŠãããšã¯æããŸããã å¿
ç¶çã«ã1è¡ã§ã¯ãªã3è¡ã«åæ£ãããããšã«ãªããŸããããã«ããšã©ãŒãè¿ãåã«ãšã©ãŒãå€æŽãã以äžã®ããšãè¡ãå¿
èŠããããªãå€æŽã§ã¯ãçŸåšã®if err != nil { ... }
䜿çšã§ããŸãã
=?
æŒç®åãå°ãæ··ä¹±ããŸãã ããã§äœãèµ·ãã£ãŠããã®ãã¯ããã«ã¯ããããŸããã
ãã®ãããªãã®ã§ïŒ
file := os.Open("/some/file") or raise(err) errors.Wrap(err, "extra context")
ãŸãã¯éèšïŒ
file := os.Open("/some/file") or raise
ãšå»¶æïŒ
defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2)
ã¯ããå°ãèšèãå€ããåèªãéžæããããšã§æåã®æ··ä¹±ãæžããããšãã§ããŸãïŒã€ãŸãã raise
ãPythonãªã©ã®ä»ã®èšèªã®åæ§ã®ããŒã¯ãŒãã«ããã«é¢é£ä»ããããraiseããšã©ãŒ/ last-non-ãçºçããããšæšæž¬ããå¯èœæ§ããããŸãããã©ã«ã-ã¹ã¿ãã¯ãåŒã³åºãå
ã«èšå®ããŸãïŒã
ããã¯ã倪éœã®äžã§èµ·ãããããã¹ãŠã®ãããŸããªãšã©ãŒåŠçã解決ããããšããªããåªããå¿ é ã®ãœãªã¥ãŒã·ã§ã³ã§ããããŸãã ã¯ããã«ãéçã§ã®ãšã©ãŒåŠçã®æ倧ã®ãã£ã³ã¯ã¯ãäžèšã®æ§è³ªã®ãã®ã§ãã åŸè ã«ã€ããŠã¯ãçŸåšã®æ§æã圹ç«ã¡ãŸãã
ç·šéïŒ
ãéæ³ããå°ãæžããããå Žåã¯ãåã®äŸã次ã®ããã«ãªããŸãã
file, err := os.Open("/some/file") or raise errors.Wrap(err, "extra context")
file, err := os.Open("/some/file") or raise err
defer err2 := f.Close() or errors.ReplaceIfNil(err, err2)
å人çã«ã¯ãåã®äŸã®æ¹ããããã§ã®ããã«åå²ããã®ã§ã¯ãªããå®å
šãªãšã©ãŒåŠçãå³ã«ç§»åããã®ã§ãããè¯ããšæããŸãã ããããããã¯ãã£ãšæ確ãããããŸããã
ç§ãã¡ã®åé¡ã®èª¬æã¯ã...
ç§ã¯åé¡ã®èšè¿°ã«åæããŸããã å¥ã®æ¹æ³ãææ¡ããããšæããŸãã
èšèªã®èŠ³ç¹ããã¯ããšã©ãŒåŠçã¯ååšããŸããã GoãæäŸããã®ã¯ãäºåã«å®£èšããããšã©ãŒã¿ã€ãã ãã§ããããã§ããæ¬åœã«æ°ãããã®ã¯äœãæå¹ã«ããªãããã䟿å®äžã§ãã ãšã©ãŒã¯åãªãå€ã§ãã ãšã©ãŒåŠçã¯éåžžã®ãŠãŒã¶ãŒã³ãŒãã§ãã èšèªPOVããã¯ç¹å¥ãªããšã¯äœããããŸããããç¹å¥ãªããšããããŸããã ãšã©ãŒåŠçã®å¯äžã®åé¡ã¯ããã®äŸ¡å€ã®ããçŸããã·ã³ãã«ãã絶察ã«æé€ããªããã°ãªããªããšèãã人ãããããšã§ãã
Cznicã®èšãéãã«æ²¿ã£ãŠãåãªããšã©ãŒåŠç以äžã®ããšã«åœ¹ç«ã€ãœãªã¥ãŒã·ã§ã³ããããšäŸ¿å©ã§ãã
ãšã©ãŒåŠçãããäžè¬çã«ãã1ã€ã®æ¹æ³ã¯ãå ±çšäœå/åèšåãšã¢ã³ã©ããã®èŠ³ç¹ãããšã©ãŒåŠçãèããããšã§ãã SwiftãšRustã¯ã©ã¡ããïŒ ïŒ æ§æã¯ãRustã¯å°ãäžå®å®ã ãšæããŸããã
åèšåãé«ã¬ãã«ã®æŠå¿µã«ããããªãå Žåã¯ãã¿ãã«ãå®éã«ã¯Goã®äžéšã§ã¯ãªãããã«ãè€æ°ã®æ»ãã®äžéšã«ããããšãã§ããŸãããããã§ãè€æ°ã®æ»ããè¡ãããšãã§ããŸãã
Swiftã«è§Šçºãããæ§æã®åºãå·ïŒ
func Failable() (*Thingie | error) {
...
}
guard thingie, err := Failable() else {
return wrap(err, "Could not make thingie)
}
// err is not in scope here
ããã¯ã次ã®ãããªä»ã®çšéã«ã䜿çšã§ããŸãã
guard val := myMap[key] else { val = "default" }
@bcmillsãš@jbaã«ãã£ãŠææ¡ããããœãªã¥ãŒã·ã§ã³=?
ã¯ããšã©ãŒã ãã§ãªãããŒã以å€ã®æŠå¿µã§ãã ãã®äŸã¯æ£åžžã«æ©èœããŸãã
func Foo()(Bar, Recover){}
bar := Foo() =? recover { log.Println("[Info] Recovered:", recover)}
ãã®ææ¡ã®äž»ãªã¢ã€ãã¢ã¯ãèªã¿ãããããããã«ããµã€ãããŒããã³ãŒãã®äž»ãªç®çãåé¢ããäºæ¬¡çãªã±ãŒã¹ãèã«çœ®ãããšã§ãã
ç§ã«ãšã£ãŠãGoã³ãŒãã®èªã¿åãã¯ãå Žåã«ãã£ãŠã¯ç¶ç¶çã§ã¯ãªããå€ãã®å Žåã if err!= nil {return err}
ã§ã¢ã€ãã¢ãæ¢ããŠããã®ã§ãç§ãã¡ãèªãã æ¬ã®ããã«ããµã€ãããŒãã®ã¢ã€ãã¢ã¯ç§ã«ãšã£ãŠèå³æ·±ãããã§ããäž»ãªã¢ã€ãã¢ãç¶ç¶çã«èªãã§ããããµã€ãããŒããèªãã§ãã ããã ïŒ @jbaããŒã¯ïŒ
éåžžã«ãŸããªç¶æ³ã§ã¯ããšã©ãŒãé¢æ°ã®äž»ãªç®çã§ãããããããå埩äžã§ãã éåžžããšã©ãŒãçºçããå Žåã¯ãã³ã³ããã¹ãããã°ããªã¿ãŒã³ãè¿œå ããŸãããã®ãããªå Žåããµã€ãããŒãã䜿çšãããšã³ãŒããèªã¿ããããªããŸãã
ãããæè¯ã®æ§æã§ãããã©ããã¯ããããŸãããç¹ã«ã2çªç®ã®éšåã®ãããã¯ã¯å¥œãã§ã¯ãããŸããããµã€ãããŒãã¯å°ããããå¿
èŠããããè¡ã¯ååã§ããå¿
èŠããããŸãã
bar := Foo() =? recover: log.Println("[Info] Recovered:", recover)
@billyh
- ä»ã®äººãèšã£ãŠããããã«ããšã©ãŒå€ã®ãã§ãã¯ãšå²ãåœãŠã¯äžéæã§çãããã®ã§ãã ãš
ãã£ãšå ·äœçã«èšã£ãŠãã ããããäžéæã§çãããã¯ã²ã©ã䞻芳çã§ãã ææ¡ãæ··ä¹±ããã ãããšæãã³ãŒãã®äŸãããã€ãæããŠããã ããŸããïŒ
- =ïŒ æ§æãçããã§ãã [âŠ]
ãããæ©èœã®IMOã§ãã 誰ããç°åžžãªãªãã¬ãŒã¿ãŒãèŠãå Žåãæ£ç¢ºã§ãããã©ããããããªãããšãåã«æ³å®ããã®ã§ã¯ãªãããããäœãããŠããã®ãã調ã¹ãåŸåãããã®ã§ã¯ãªãããšæããŸãã
- ãšã©ãŒãšãšãã«æå¹ãªå€ãè¿ãããšã¯ååã«äžè¬çã§ãããããæ°ãããœãªã¥ãŒã·ã§ã³ã§ããã®ã±ãŒã¹ãåŠçããå¿ èŠããããŸãã
ããŸãïŒ
ææ¡ã泚ææ·±ãèªãã§ãã ããã =?
ã¯ã Block
è©äŸ¡ããåã«å²ãåœãŠãå®è¡ããããããã®å Žåã«ã䜿çšã§ããŸãã
n := r.Read(buf) =? err {
if err == io.EOF {
[âŠ]
}
return err
}
ãŸãã @ nigeltaoãææããããã«ãæ¢åã® 'nãerrïŒ= r.ReadïŒbufïŒ `ãã¿ãŒã³ããã€ã§ã䜿çšã§ããŸãã äžè¬çãªã±ãŒã¹ã®ã¹ã³ãŒããšå®åæãæ¯æŽããæ©èœãè¿œå ããŠããããããŸããªã±ãŒã¹ã«ã䜿çšããå¿ èŠãããããšãæå³ããããã§ã¯ãããŸããã
ãã¶ããããŸããŸãªæ§æã®ææ¡ã«ã€ããŠè°è«ãã代ããã«ãããŒã¿ããµããŒãããããã«æãäžãå§ããã¹ãã§ããããïŒ
Ianãå
ã®æçš¿ã§ãªã³ã¯ããå€æ°ã®åé¡ïŒããã³ãããã®äŸïŒãåç
§ããŠãã ããã
https://github.com/golang/go/wiki/ExperienceReports#error-handlingãåç
§ããŠ
ãããã®ã¬ããŒãããå ·äœçãªæŽå¯ãåŸãå Žåã¯ããããå ±æããŠãã ããã
@urandom
å人çã«ã¯ããšã©ãŒéšåããããã¯ã«ãªã£ãŠãããšã¯æããŸããã å¿ ç¶çã«ãããã¯ããã1è¡ã§ã¯ãªã3è¡ã«åºããããšã«ãªããŸãã
ãããã¯ã®ç®çã¯2ã€ãããŸãã
3è¡å¯Ÿ1ã¯ãèšèªã®å€æŽã§ãããããŸãããè¡æ°ãæ倧ã®æžå¿µäºé
ã§ããå Žåã¯ã gofmt
å€æŽããã ãã§å¯ŸåŠã§ããŸãã
file, err := os.Open("/some/file") or raise errors.Wrap(err, "extra context")
file, err := os.Open("/some/file") or raise err
ãã§ã«return
ãšpanic
ãŸã; ãããã®äžã«raise
ãè¿œå ãããšãã²ã€ã³ãå°ãªãããããã«é¢æ°ãçµäºããæ¹æ³ãå€ãããããã«èŠããŸãã
defer err2 := f.Close() or errors.ReplaceIfNil(err, err2)
errors.ReplaceIfNil(err, err2)
ã«ã¯ãéåžžã«çããåç
§æž¡ãã®ã»ãã³ãã£ã¯ã¹ãå¿
èŠã§ãã
代ããã«ããã€ã³ã¿ã§err
æž¡ãããšãã§ããŸãã
defer err2 := f.Close() or errors.ReplaceIfNil(&err, err2)
ããããããã§ãç§ã«ã¯éåžžã«å¥åŠã«æããŸãã or
ããŒã¯ã³ã¯ãåŒãã¹ããŒãã¡ã³ãããŸãã¯ãã®ä»ã®ãã®ãæ§æããŸããïŒ ïŒããå
·äœçãªææ¡ã圹ç«ã€ã§ããããïŒ
@carlmjohnson
guard ⊠else
ã¹ããŒãã¡ã³ãã®å
·äœçãªæ§æãšã»ãã³ãã£ã¯ã¹ã¯äœã§ããããïŒ ç§ã«ã¯ãããŒã¯ã³ãšå¯å€äœçœ®ãå
¥ãæ¿ãã£ã=?
ãŸãã¯::
ãã䌌ãŠããããã«èŠããŸãã ïŒç¹°ãè¿ãã«ãªããŸãããããå
·äœçãªææ¡ã圹ç«ã¡ãŸãïŒããªãã念é ã«çœ®ããŠããå®éã®æ§æãšã»ãã³ãã£ã¯ã¹ã¯äœã§ããïŒïŒ
@bcmills
æ¶ç©ºã®ReplaceIfNilã¯åçŽã§ãã
func ReplaceIfNil(original, replacement error) error {
if original == nil {
return replacement
}
return original
}
ããã«ã€ããŠã¯äœãçããããšã¯ãããŸããã ãã¶ãåå...
or
ã¯äºé
æŒç®åã§ãããå·ŠåŽã®ãªãã©ã³ãã¯IdentifierListãŸãã¯PrimaryExprã®ããããã§ãã åè
ã®å Žåãå³ç«¯ã®èå¥åã«ãªããŸãã 次ã«ãå·ŠåŽã®ãªãã©ã³ããããã©ã«ãå€ã§ãªãå Žåã«ãå³åŽã®ãªãã©ã³ããå®è¡ã§ããããã«ããŸãã
ãã®ãããåŸã§åŒã®å€ãååŸããé¢æ°Resultã®æåŸã®ãã©ã¡ãŒã¿ãŒãé€ããŠãããã©ã«ãå€ãè¿ãéæ³ãå®è¡ããããã«ãåŸã§å¥ã®ããŒã¯ã³ãå¿
èŠã«ãªããŸããã
IIRCãå°ãåã«ãé¢åãªããã©ã«ãå€ã®åæåã®ä»£ããã«ãèšèªã«ã...ããªã©ãè¿œå ãããšããå¥ã®ææ¡ããããŸããã ãã®ãããå
šäœã¯æ¬¡ã®ããã«ãªããŸãã
f, err := os.Open("/some/file") or return ..., errors.Wrap(err, "more context")
ãããã¯ã«é¢ããŠã¯ãããåºããã³ããªã³ã°ãå¯èœã«ãªãããšãç解ããŠããŸãã ãã®ææ¡ã®ç¯å²ããä»®æ³ã®80ïŒ ãã«ããŒããã®ã§ã¯ãªããèãããããã¹ãŠã®ã·ããªãªã«å¯Ÿå¿ããããšã§ãããã©ããã¯ãå人çã«ã¯ããããŸããã ãããŠãç§ã¯å人çã«ãçµæãäœè¡ãããããéèŠã§ãããšä¿¡ããŠããŸãïŒ=ïŒã®ãããªãããŸããªããŒã¯ã³ã䜿çšããå Žåããããç§ã®æ倧ã®é¢å¿äºã§ãããšã¯æ±ºããŠèšããŸããã§ããããå®éã«ã¯èªã¿ãããããŸãã¯ãã®æ¬ åŠã§ãïŒã ãã®æ°ããææ¡ãäžè¬çãªã±ãŒã¹ã§è€æ°ã®è¡ã«ãŸãããå Žåãç§ã¯å人çã«æ¬¡ã®ãããªãã®ããããã®å©ç¹ãç解ããŠããŸããã
if f, err := os.Open("/some/file"); err != nil {
return errors.Wrap(err, "more context")
}
if
ã¹ã³ãŒãå€ã§å©çšå¯èœã«ãªãå Žåã@urandom
or
ã¯äºé æŒç®åã§ãããå·ŠåŽã®ãªãã©ã³ãã¯IdentifierListãŸãã¯PrimaryExprã®ããããã§ãã [âŠ]次ã«ãå·ŠåŽã®ãªãã©ã³ããããã©ã«ãå€ã§ãªãå Žåã«ãå³åŽã®ãªãã©ã³ããå®è¡ã§ããããã«ããŸãã
Goã®äºé
æŒç®åã¯åŒã§ãããã¹ããŒãã¡ã³ãã§ã¯ãªãããã or
ãäºé
æŒç®åã«ãããšå€ãã®çåãçããŸãã ïŒãã倧ããªåŒã®äžéšãšããŠã®or
ã®ã»ãã³ãã£ã¯ã¹ã¯äœã§ããïŒãŸãã :=
æçš¿ããäŸã§ãã®ãžã£ã€ãã¯ã©ã®ããã«ãªããŸããïŒïŒ
ãããå®éã«ã¹ããŒãã¡ã³ãã§ãããšä»®å®ãããšãå³åŽã®ãªãã©ã³ãã¯äœã§ããïŒ ãããåŒã§ããå Žåããã®ã¿ã€ãã¯äœã§ããããããŠraise
ã¯ä»ã®ã³ã³ããã¹ãã§åŒãšããŠäœ¿çšã§ããŸããïŒ ãããã¹ããŒãã¡ã³ãã§ããå Žåã raise
以å€ã®å Žåããã®ã»ãã³ãã£ã¯ã¹ã¯äœã§ããïŒ ãŸãã¯ã or raise
ãæ¬è³ªçã«åäžã®ã¹ããŒãã¡ã³ãã«ããããšãææ¡ããŠããŸããïŒããšãã°ã ::
ãŸãã¯=?
代ããã®æ§æãšããŠor raise
=?
ïŒïŒ
æžããŸãã
defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2) or raise(err3) Transform(err3)
ïŒ
æžããŸãã
f(r.Read(buf) or raise err)
ïŒ
defer f.Close() or raise(err2) errors.ReplaceIfNil(err, err2) or raise(err3) Transform(err3)
ãããã2çªç®ã®raise
ãããããã¯ç¡å¹ã«ãªããŸãã ããããªãã£ãå Žåã¯ãå€æãã§ãŒã³å
šäœãå®è¡ãããæçµçµæãåŒã³åºãå
ã«è¿ãããã¯ãã§ãã å
šäœãšããŠãã®ãããªã»ãã³ãã£ã¯ã¹ã¯ããããå¿
èŠãããŸãããã次ã®ããã«æžãããšãã§ããŸãã
defer f.Close() or raise(err2) Transform(errors.ReplaceIfNil(err, err2)
f(r.Read(buf) or raise err)
ç§ã®å
ã®ã³ã¡ã³ããæ³å®ãããšãå·ŠåŽã®æåŸã®å€ããšãããŸãã¯åãã®ã§ãããã©ã«ãå€ã®å ŽåãæçµçãªåŒã¯çµæãªã¹ãã®æ®ãã®éšåã«è©äŸ¡ãããŸãã ã¯ããããã¯æå¹ãªã¯ãã§ãã ãã®å Žåã r.Read
ããšã©ãŒãè¿ããšããã®ãšã©ãŒãåŒã³åºãå
ã«è¿ãããŸãã ãã以å€ã®å Žåã n
ã¯f
æž¡ãããŸã
ç·šéïŒ
çšèªã«æ··ä¹±ããªãéãã or
ã¯äºé
æŒç®åã ãšæããŸãããã®ãªãã©ã³ãã¯åãã¿ã€ãã§ããå¿
èŠããããŸãïŒãã ããå·ŠåŽã®ãªãã©ã³ãããªã¹ãã§ããå Žåã¯ãå°ãéæ³ã®ããã«ãªããŸãããã®å Žåãããã¯äžèšã®ãªã¹ãã®æåŸã®èŠçŽ ãåããŸãïŒã raise
ã¯ããã®ãªãã©ã³ããåãããã®ãªãã©ã³ãã®å€ãæåŸã®æ»ãåŒæ°ã®å€ãšããŠäœ¿çšããŠé¢æ°ããæ»ãåé
æŒç®åã§ãããåã®åŒæ°ã«ã¯ããã©ã«ãå€ããããŸãã 次ã«ãé¢æ°ïŒå¥åreturn ..., err
ããæ»ãç®çã§ãã¹ã¿ã³ãã¢ãã³ã¹ããŒãã¡ã³ãã§raise
ãæè¡çã«äœ¿çšã§ããŸãã
ããã¯çæ³çãªã±ãŒã¹ã§ããã or raise
ã¯ããããã¯ã§ã¯ãªãåçŽãªã¹ããŒãã¡ã³ããåãå
¥ããéãã =?
æ§æã®ä»£æ¿ãšããŠãåé¡ãããŸãããããŸãåé·ã§ã¯ãªãæ¹æ³ã§ãŠãŒã¹ã±ãŒã¹ã®å€§éšåãã«ããŒããŸãã ãŸãã¯ãåŒãåãå
¥ããdeferã®ãããªææ³ã䜿çšããããšãã§ããŸãã ããã¯ã次ã®ãããªã±ãŒã¹ã®å€§éšåãã«ããŒããŸãã
f := os.Open("/some/file") or raise(err) errors.Wrap(err, "with context")
è€éãªã±ãŒã¹ïŒ
f := os.Open or raise(err) func() {
if err == io.EOF {
[âŠ]
}
return err
}()
ç§ã®ææ¡ã«ã€ããŠããå°ãèããŠãç§ã¯å ±çšäœ/åèšåã«ã€ããŠå°ãèœãšããŠããŸãã ç§ãææ¡ããŠããæ§æã¯
guard [ ASSIGNMENT || EXPRESSION ] else { [ BLOCK ] }
åŒã®å ŽåãåŒãè©äŸ¡ãããçµæãããŒã«åŒã®true
ãŸãã¯ä»ã®åŒã®ç©ºçœå€ãšçãããªãå ŽåãBLOCKãå®è¡ãããŸãã å²ãåœãŠã§ã¯ãæåŸã«å²ãåœãŠãããå€ã!= true
/ != nil
ã«å¯ŸããŠè©äŸ¡ãããŸãã ã¬ãŒãã¹ããŒãã¡ã³ãã«ç¶ããŠãè¡ããããã¹ãŠã®å²ãåœãŠãã¹ã³ãŒãå
ã«ãªããŸãïŒæ°ãããããã¯ã¹ã³ãŒãã¯äœæãããŸãã[ããããæåŸã®å€æ°ãé€ããŠïŒ]ïŒã
Swiftã§ã¯ã guard
ã¹ããŒãã¡ã³ãã®BLOCKã«ã¯ã return
ã break
ã continue
ããŸãã¯throw
ãããããå«ãŸããŠããå¿
èŠããããŸãã ç§ã¯ããã奜ããã©ããã¯æ±ºããŠããŸããã èªè
ã¯guard
ãšããåèªããäœãç¶ãããç¥ã£ãŠããã®ã§ãããã¯ããçšåºŠã®äŸ¡å€ãè¿œå ããããã§ãã
guard
ããã®ã³ãã¥ããã£ã«ãã£ãŠé«ãè©äŸ¡ãããŠãããã©ãããèšãã®ã«ååãªã»ã©Swiftããã©ããŒããŠãã人ã¯ããŸããïŒ
äŸïŒ
guard f, err := os.Open("/some/file") else { return errors.Wrap(err, "could not open:") }
guard data, err := ioutil.ReadAll(f) else { return errors.Wrap(err, "could not read:") }
var obj interface{}
guard err = json.Unmarshal(data, &obj) else { return errors.Wrap(err, "could not unmarshal:") }
guard m, _ := obj.(map[string]interface{}) else { return errors.New("unexpected data format") }
guard val, _ := m["key"] else { return errors.New("missing key") }
ç§èŠã§ã¯ã誰ããäžåºŠã«ããã§ããŸãã«ãåºç¯å²ã®åé¡ã«ã€ããŠè©±ãåã£ãŠããŸãããå®éã®æãäžè¬çãªãã¿ãŒã³ã¯ããã®ãŸãŸã®ãšã©ãŒãè¿ããã§ãã ã§ã¯ã次ã®ãããªsmthã§æãåé¡ã«åãçµã¿ãŸãããã
code, err ?= fn()
ããã¯ãé¢æ°ãerrïŒ= nilïŒã§æ»ãå¿ èŠãããããšãæå³ããŸãã
ïŒ=æŒç®åã®å Žåãå°å ¥ã§ããŸããïŒïŒ=
code, err ?:= fn()
ã³ã³ãã€ã©ã¯å€æ°ãerrããåãååã®erræ»ãå€ã«æž¡ãå¿ èŠããããããïŒïŒ=ã®ç¶æ³ã¯ã·ã£ããŠã€ã³ã°ã®ããã«æªåããŠããããã§ãã
ééã£ãã³ãŒããåã«çãããã®ã§ã¯ãªããæ£ããã³ãŒããç°¡åã«èšè¿°ã§ããããã«ããããšã«çŠç¹ãåœãŠãŠãã人ãããããšã«ãç§ã¯å®éã«ããªãè奮ããŠããŸãã
ããã€ãã®ã¡ã¢ïŒ
ãšã©ãŒã¢ãã«ã«é¢ãããã€ã¯ããœããã®Midoriã®èšèšè ã®1人ããã®èå³æ·±ããçµéšã¬ããŒãã ã
ãã®ããã¥ã¡ã³ããšSwiftã®ããã€ãã®ã¢ã€ãã¢ã¯ãGo2ã«çŸããé©çšã§ãããšæããŸãã
æ°ããåä¿åãããthrows
ããŒã¯ãŒããå°å
¥ãããšãé¢æ°ã¯æ¬¡ã®ããã«å®çŸ©ã§ããŸãã
func Get() []byte throws {
if (...) {
raise errors.New("oops")
}
return []byte{...}
}
å¥ã®éã¹ããŒé¢æ°ãããã®é¢æ°ãåŒã³åºãããšãããšãæªåŠçã®ã¹ããŒå¯èœãšã©ãŒãåå ã§ã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
代ããã«ãäžè¬çãªã±ãŒã¹ã§ããããšã«èª°ããåæãããšã©ãŒãäŒæãããããããåŠçã§ããå¿
èŠããããŸãã
func ScrapeDate() time.Time throws {
body := Get() // compilation error, unhandled throwable
body := try Get() // we've been explicit about potential throwable
// ...
}
ã¡ãœããã倱æããªãããšãããã£ãŠããå ŽåããŸãã¯ãã¹ãã§ãswiftãšåæ§ã«try!
å°å
¥ã§ããŸãã
func GetWillNotFail() time.Time {
body := Get() // compilation error, throwable not handled
body := try Get() // compilation error, throwable can not be propagated, because `GetWillNotFail` is not annotated with throws
body := try! Get() // works, but will panic on throws != nil
// ...
}
ãã ãããããã«ã€ããŠã¯ããããããŸããïŒswiftãšåæ§ïŒïŒ
func main() {
// 1:
do {
fmt.Printf("%v", try ScrapeDate())
} catch err { // err contains caught throwable
// ...
}
// 2:
do {
fmt.Printf("%v", try ScrapeDate())
} catch err.(type) { // similar to a switch statement
case error:
// ...
case io.EOF
// ...
}
}
ps1ã è€æ°ã®æ»ãå€func ReadRune() (ch Rune, size int) throws { ... }
ps2ã return try Get()
ãŸãã¯return try! Get()
æ»ãããšãã§ããŸã
ps3ã buffer.NewBuffer(try Get())
ãbuffer.NewBuffer(try! Get())
ãããªåŒã³åºãããã§ãŒã³ã§ããããã«ãªããŸãã
ps4ã 泚éã«ã€ããŠããããããªãïŒ errors.Wrap(err, "context")
ãæžãç°¡åãªæ¹æ³ïŒ
ps5ã ãããã¯å®éã«ã¯äŸå€ã§ã
ps6ã æ倧ã®ã¡ãªããã¯ãç¡èŠãããäŸå€ã®ã³ã³ãã€ã«æãšã©ãŒã§ãã
ããªããæžããææ¡ã¯ããã¹ãŠã®æªããã®ãšäžç·ã«ã¿ã©ããªã³ã¯ã«æ£ç¢ºã«èšè¿°ãããŠããŸã
ããã®åŽé¢...ãããŠãæãããããã®1ã€ã®æçœãªçµæã¯ã人ã
å«ãããã»ãšãã©ã®å Žåãæ¯åãã¹ããŒããšæžãå¿
èŠãããã®ã¯ãªãã§ããã
æ©èœïŒ
ãšããã§ããšã©ãŒã匷å¶çã«ãã§ãã¯ããŠç¡èŠããªããšããæå³ã¯ã
ãšã©ãŒä»¥å€ã®ã¿ã€ãã«ãé©çšãããŸãã
äžè¬åããã圢åŒïŒäŸïŒgcc __attribute __ïŒïŒwarn_unused_resultïŒïŒïŒã
æŒç®åã®åœ¢åŒã«ã€ããŠã¯ãçã圢åŒãŸãã¯
ãã®ãããªããŒã¯ãŒããã©ãŒã ïŒ
ïŒ= fnïŒïŒãŸãã¯fnïŒïŒããã§ãã¯ããŸã-åŒã³åºãå
ã«ãšã©ãŒãäŒæããŸã
ïŒ= fnïŒïŒãŸãã¯nofail fnïŒïŒ-ãšã©ãŒæã«ãããã¯
12:15æåã2017幎8æ26æ¥ã«ã¯ãnvartolomei [email protected]
æžããŸããïŒ
ããã€ãã®ã¡ã¢ïŒ
é¢çœãäœéšã¬ããŒã
http://joeduffyblog.com/2016/02/07/the-error-model/ãã
ãšã©ãŒã¢ãã«ã«é¢ããMicrosoftã®Midoriã®èšèšè ããã®ããã¥ã¡ã³ããšSwiftããããã€ãã®ã¢ã€ãã¢ããããšæããŸã
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html
Go2ã«çŸããé©çšã§ããŸããæ°ããåä¿åãããthrowsããŒã¯ãŒããå°å ¥ãããšãé¢æ°ã¯æ¬¡ã®ããã«å®çŸ©ã§ããŸãã
func GetïŒïŒ[] byte throws {
ããã ïŒ...ïŒ {
ãšã©ãŒãçºçãããŸããNewïŒ "oops"ïŒ
}[] byte {...}ãè¿ããŸã
}ãã®é¢æ°ãå¥ã®éã¹ããŒé¢æ°ããåŒã³åºãããšãããšã
æªåŠçã®ã¹ããŒå¯èœãªãšã©ãŒãåå ã§ãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
代ããã«ããšã©ãŒãäŒæã§ããã¯ãã§ããããã¯èª°ããåæãããã®ã§ãã
äžè¬çãªã±ãŒã¹ããŸãã¯ãããåŠçããŸããfunc ScrapeDateïŒïŒtime.Time throws {
bodyïŒ= GetïŒïŒ//ã³ã³ãã€ã«ãšã©ãŒãæªåŠçã®ã¹ããŒå¯èœ
bodyïŒ= try GetïŒïŒ//ã¹ããŒå¯èœãªå¯èœæ§ã«ã€ããŠæ瀺ããŸãã//..ã
}ã¡ãœããã倱æããªãããšãããã£ãŠããå ŽåããŸãã¯ãã¹ãã§ã¯ã次ã®ããšãã§ããŸãã
玹ä»ããŠã¿ãŠãã ããïŒ ã¹ã€ããã«äŒŒãŠããŸããfunc GetWillNotFailïŒïŒtime.Time {
bodyïŒ= GetïŒïŒ//ã³ã³ãã€ã«ãšã©ãŒãã¹ããŒå¯èœã¯åŠçãããŸãã
bodyïŒ= try GetïŒïŒ//ã³ã³ãã€ã«ãšã©ãŒãGetWillNotFail
ã¯throwsã®æ³šéãä»ããŠããªããããthrowableãäŒæã§ããŸããã
bodyïŒ=è©ŠããŠã¿ãŠãã ããïŒ GetïŒïŒ//åäœããŸãããã¹ããŒãããšãããã¯ã«ãªããŸãïŒ= nil//..ã
}ãã ãããããã«ã€ããŠã¯ããããããŸããïŒswiftãšåæ§ïŒïŒ
func mainïŒïŒ{
// 1ïŒ
è¡ã {
fmt.PrintfïŒ "ïŒ v"ãScrapeDateïŒïŒãè©ŠããŠãã ããïŒ
} catch err {// errã«ã¯ãã£ãããããthrowableãå«ãŸããŠããŸã
//..ã
}// 2ïŒ
è¡ã {
fmt.PrintfïŒ "ïŒ v"ãScrapeDateïŒïŒãè©ŠããŠãã ããïŒ
} catch errãïŒtypeïŒ{// switchã¹ããŒãã¡ã³ãã«äŒŒãŠããŸã
ã±ãŒã¹ãšã©ãŒïŒ
//..ã
ã±ãŒã¹io.EOF
//..ã
}
}ps1ã è€æ°ã®æ»ãå€funcReadRuneïŒïŒïŒch Runeãsize intïŒthrows {
...}
ps2ã return try GetïŒïŒãŸãã¯return tryã§æ»ãããšãã§ããŸãïŒ ååŸããïŒïŒ
ps3ã ããã§ãbuffer.NewBufferïŒtry GetïŒïŒïŒãbuffer.NewBufferïŒtryïŒ
ååŸããïŒïŒïŒ
ps4ã 泚éã«ã€ããŠããããããªãâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/21161#issuecomment-325106225 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AICzv9CLN77RmPceCqvjXVE_UZ6o7JGvks5sb-IYgaJpZM4Oi1c-
ã
@jbaãš@bcmillsã«ãã£ãŠææ¡ãããæŒç®åã¯ãã??ããšç¶Žãæ¹ãé©åã§ãããéåžžã«åªããã¢ã€ãã¢ã ãšæããŸãã ã=ïŒãã®ä»£ããã« IMOã
ãã®äŸãèŠãŠãã ããïŒ
func doStuff() (int,error) {
x, err := f()
if err != nil {
return 0, wrapError("f failed", err)
}
y, err := g(x)
if err != nil {
return 0, wrapError("g failed", err)
}
return y, nil
}
func doStuff2() (int,error) {
x := f() ?? (err error) { return 0, wrapError("f failed", err) }
y := g(x) ?? (err error) { return 0, wrapError("g failed", err) }
return y, nil
}
doStuff2ã¯ã次ã®çç±ã«ãããããªãèªã¿ãããããã°ããèªãããšãã§ãããšæããŸãã
ç§ã«ã¯ããã®ææ¡ã ãã§ã¯äžå®å
šã«èŠããéæ³ãå€ãããŸãã ??
æŒç®åã¯ã©ã®ããã«å®çŸ©ãããŸããïŒ ãnilã§ãªãå ŽåãæåŸã®æ»ãå€ããã£ããã£ããŸããïŒ ãã¡ãœããã¿ã€ãã«äžèŽããå ŽåãæåŸã®ãšã©ãŒå€ããã£ããã£ããŸããïŒã
äœçœ®ãšã¿ã€ãã«åºã¥ããŠæ»ãå€ãåŠçããããã®æ°ããæŒç®åãè¿œå ããããšã¯ãããã¯ã®ããã«èŠããŸãã
2017幎8æ29æ¥ãåå13æ03å0300ããã«ãšã«ã»ã°ã¹ã¿ã[email protected] ãæžããŸããïŒ
@jbaãš@bcmillsã«ãã£ãŠææ¡ãããæŒç®åã¯ãã??ããšç¶Žãæ¹ãé©åã§ãããéåžžã«åªããã¢ã€ãã¢ã ãšæããŸãã ã=ïŒãã®ä»£ããã« IMOã
ãã®äŸãèŠãŠãã ããïŒ
func doStuffïŒïŒïŒintãerrorïŒ{
xãerrïŒ= fïŒïŒ
errïŒ= nil {ã®å Žå
0ãè¿ããwrapErrorïŒ "f failed"ãerrïŒ
}y, err := g(x) if err != nil { return 0, wrapError("g failed", err) } return y, nil
}
func doStuff2ïŒïŒïŒintãerrorïŒ{
xïŒ= fïŒïŒ?? ïŒãšã©ãŒãšã©ãŒïŒ{return 0ãwrapErrorïŒ "f failed"ãerrïŒ}
yïŒ= gïŒxïŒ?? ïŒãšã©ãŒãšã©ãŒïŒ{return 0ãwrapErrorïŒ "g failed"ãerrïŒ}
yãnilãè¿ã
}
doStuff2ã¯ã次ã®çç±ã«ãããããªãèªã¿ãããããã°ããèªãããšãã§ãããšæããŸãã
- åçŽæ¹åã®ã¹ããŒã¹ã®ç¡é§ãå°ãªã
- å·ŠåŽã®å¹žããªéããã°ããèªã¿ããã
- å³åŽã®ãšã©ãŒç¶æ ããã°ããèªã¿åãã®ã¯ç°¡åã§ã
- é¢æ°ã®ããŒã«ã«åå空éãæ±æããerrå€æ°ã¯ãããŸãã
â
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããã
@nvartolomei
??
æŒç®åã¯ã©ã®ããã«å®çŸ©ãããŸããïŒ
https://github.com/golang/go/issues/21161#issuecomment-319434101ããã³https://github.com/golang/go/issues/21161#issuecomment-320758279ãåç §ããŠãã ããã
@bcmillsã¯éæ¢ã¹ã¬ããã埩掻ãããããšãæšå¥šããŠããã®ã§ãä»ã®èšèªããã®ã¯ãªããæ€èšããå Žåãã¹ããŒãã¡ã³ã修食åã¯ããããã¹ãŠã«åççãªè§£æ±ºçãæäŸããããã§ãã @slvmndã®äŸããšãã«ã¯ãã¹ããŒãã¡ã³ã修食åã䜿çšããŠããçŽããŸãã
func doStuff() (int, err) {
x, err := f()
return 0, wrapError("f failed", err) if err != nil
y, err := g(x)
return 0, wrapError("g failed", err) if err != nil
return y, nil
}
ã¹ããŒãã¡ã³ããšãšã©ãŒãã§ãã¯ã1è¡ã§è¡ãã»ã©ç°¡æœã§ã¯ãããŸããããããªãããèªã¿ãŸãã ïŒifåŒã§ïŒ=圢åŒã®å²ãåœãŠãèš±å¯ããªãããšããå§ãããŸããããããªããšãææ³ãæ確ã§ãã£ãŠããã¹ã³ãŒãã®åé¡ã«ãã£ãŠäººã ãæ··ä¹±ããå¯èœæ§ããããŸãïŒãifãã®åŠå®ããŒãžã§ã³ãšããŠãunlessããèš±å¯ããã®ã¯å°ãã§ãæ§æç³è¡£ã§ãããèªããšããŸãæ©èœããæ€èšãã䟡å€ããããŸãã
ãã ããããã§Perlããã¯ãªãããããšã¯ãå§ãããŸããã ïŒBasic Plus 2ã¯åé¡ãããŸããïŒãã®ããã«ãã¹ããŒãã¡ã³ã修食åãã«ãŒãããŸããããã¯ã䟿å©ãªå ŽåããããŸãããããªãè€éãªåé¡ã®å¥ã®ã»ããããããããŸãã
çãããŒãžã§ã³ïŒ
errïŒ= nilã®å Žåã«æ»ã
ãã®å ŽåããµããŒãããå¿
èŠããããŸãã
ãã®ãããªæ§æã§ã¯ãçåãçããŸã-éæ»ãã¹ããŒãã¡ã³ããå¿
èŠã§ã
次ã®ãããªãifãã¹ããŒãã¡ã³ãã§ãµããŒããããŸãã
funcïŒargsïŒifæ¡ä»¶
ããããã¢ãã¿ãŒã¢ã¯ã·ã§ã³ãçºæãã代ããã«-ã·ã³ã°ã«ãå°å
¥ãã䟡å€ãããå Žå
ã®å Žåã®è¡ïŒ
errïŒ= nilreturnã®å Žå
errïŒ= nilã0ãè¿ãå ŽåãwrapErrorïŒ "failed"ãerrïŒ
errïŒ= nil do_smthïŒïŒã®å Žå
ç¹å¥ãªåœ¢åŒã®æ§æãããã¯ããã«èªç¶ãªããã§ãããïŒ ãã¶ã
æ§æ解æã«å€ãã®èŠçããããããŸãïŒ/
ããã...ããã¯ãã¹ãŠå°ããªèª¿æŽã§ããããšã©ãŒã«å¯Ÿããç¹å¥ãªlangãµããŒãã§ã¯ãããŸãã
åãæ±ã/äŒæã
16:14ææã2017幎9æ18æ¥ã«ã¯ãdsugalski [email protected]ã¯æžããŸããïŒ
@bcmills https://github.com/bcmillsã埩掻ããããšãæšå¥šããŠããã®ã§ã
éæ¢ã¹ã¬ãããä»ã®èšèªããã®ã¯ãªããæ€èšããå Žåã¯ã
ã¹ããŒãã¡ã³ã修食åã¯ãã¹ãŠã®äººã«åççãªè§£æ±ºçãæäŸããããã§ã
ããã @slvmnd https://github.com/slvmndã®äŸããšãã«ã¯ã次ã®ããã«ããçŽããŸãã
ã¹ããŒãã¡ã³ã修食åïŒfunc doStuffïŒïŒïŒintãerrïŒ{
xãerrïŒ= fïŒïŒ
errïŒ= nilã®å Žåã0ãè¿ããwrapErrorïŒ "f failed"ãerrïŒy, err := g(x) return 0, wrapError("g failed", err) if err != nil return y, nil
}
ã¹ããŒãã¡ã³ããšãšã©ãŒãã§ãã¯ã1ã€ã«ãŸãšããã»ã©ç°¡æœã§ã¯ãããŸãã
è¡ã§ãããããã¯ããªãããèªã¿ãŸãã ïŒïŒ=圢åŒã®ãçŠæ¢ããããšããå§ãããŸã
ifåŒã§ã®å²ãåœãŠãããã§ãªãå Žåãã¹ã³ãŒãã®åé¡ãçºçããå¯èœæ§ããããŸã
ææ³ãã¯ã£ããããŠããŠã人ãæ··ä¹±ãããïŒ
ãifãã®åŠå®ããŒãžã§ã³ã¯å°ãæ§æç³è¡£ã§ããã
èªãã§ãæ€èšãã䟡å€ããããŸãããã ããããã§Perlããã¯ãªãããããšã¯ãå§ãããŸããã ïŒBasic Plus2ã¯
现ããïŒãã®ããã«ã«ãŒãã¹ããŒãã¡ã³ã修食åããããŸããã
䟿å©ã§ããããªãè€éãªåé¡ã®å¥ã®ã»ãããæã¡èŸŒãã§ãã ãããâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/21161#issuecomment-330215402 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AICzv1rfnXeGVRRwaigCyyVK_STj-i83ks5sjmylgaJpZM4Oi1c-
ã
@dsugalskiã®ææ¡ã«ã€ããŠã¿ããšã
çŽç²ãªããã¹ãããã©ãã ãã®èŠèŠçãªåºå¥ãæåŸ ããã®ãåççãã¯ããããŸããã ããæç¹ã§ããããããã¹ããšãã£ã¿ã®IDEãŸãã¯ã³ãŒãã«ã©ãŒãªã³ã°ã¬ã€ã€ãŒã«ãã³ãããæ¹ãé©åã ãšæãããŸãã
ããããããã¹ãããŒã¹ã®èŠèŠçãªåºå¥ã®ããã«ãç§ããããæ¥ããããã»ã©æã«äœ¿ãå§ãããšãã«ç§ãã¡ãæã£ãŠãããã©ãŒãããæšæºã¯ãIF / UNLESSã¹ããŒãã¡ã³ã修食åãå³å¯ãããå¿ èŠããããããã«ãã£ãŠååã«ç®ç«ã€ããã«ãªããŸããã ïŒãã ããVT-220端æ«ã§ã¯ããŠã£ã³ããŠãµã€ãºãããæè»ãªãšãã£ã¿ãŒããããé©çšã容æã§ãããããèŠèŠçã«åºå¥ã§ããæšæºãä»äžãããŠããŸãïŒ
å°ãªããšãç§ã«ãšã£ãŠã¯ãã¹ããŒãã¡ã³ã修食åã®ã±ãŒã¹ã¯ç°¡åã«åºå¥ã§ããçŸåšã®if-blockã¹ããŒã ãããèªã¿ããããªã£ãŠããŸãã ãã¡ãããããã¯ä»ã®äººã«ã¯åœãŠã¯ãŸããªããããããŸãããç§ã¯è±èªã®ããã¹ããèªãã®ãšåãæ¹æ³ã§ãœãŒã¹ã³ãŒããèªãã®ã§ãæ¢åã®å¿«é©ãªãã¿ãŒã³ã«ãããã³ã°ãããŸããã誰ãããããè¡ãããã§ã¯ãããŸããã
return 0, wrapError("f failed", err) if err != nil
ã¯if err != nil { return 0, wrapError("f failed", err) }
ãšæžãããšãã§ããŸã
if err != nil return 0, wrapError("f failed", err)
ãåãããã«æžãããšãã§ããŸãã
ãã¶ããããã§å¿
èŠãªã®ã¯ãgofmtãif
ã3è¡ã«æ¡åŒµããã®ã§ã¯ãªãã1è¡ã«1è¡ã§æžãããŸãŸã«ããããšã ãã§ããïŒ
ç§ã襲ãå¥ã®å¯èœæ§ããããŸãã 䜿ãæšãŠã®Goã³ãŒãããã°ããæžã蟌ãããšãããšãã«çµéšããå€ãã®æ©æŠã¯ããã¹ãŠã®åŒã³åºãã§ãšã©ãŒãã§ãã¯ãè¡ãå¿ èŠããããããåŒã³åºããé©åã«ãã¹ãã§ããªãããã§ãã
ããšãã°ãæåã«http.NewRequestã®çµæãäžæå€æ°ã«å²ãåœãŠãŠããããã®äžã§DoãåŒã³åºããã«ãæ°ããèŠæ±ãªããžã§ã¯ãã§http.Client.DoãåŒã³åºãããšã¯ã§ããŸããã
ç§ãã¡ã¯èš±å¯ã§ãããã©ããçåã«æããŸãïŒ
f(y())
y
ã(T, error)
ã¿ãã«ãè¿ããŠãæ©èœããŸãã yããšã©ãŒãè¿ããšãã³ã³ãã€ã©ã¯åŒã®è©äŸ¡ãäžæ¢ãããã®ãšã©ãŒãfããè¿ãå¯èœæ§ããããŸãã fããšã©ãŒãè¿ããªãå Žåã¯ããšã©ãŒãè¿ãããå¯èœæ§ããããŸãã
ããããç§ã¯ããããšãã§ããŸããïŒ
n, err := http.DefaultClient.Do(http.NewRequest("DELETE", "/foo", nil))
NewRequestãŸãã¯Doã®ããããã倱æããå Žåããšã©ãŒçµæã¯nil以å€ã«ãªããŸãã
ãã ããããã«ã¯1ã€ã®é倧ãªåé¡ããããŸããã€ãŸããfã2ã€ã®åŒæ°ããŸãã¯å¯å€ååŒæ°ãåãå ¥ããå Žåãäžèšã®åŒã¯ãã§ã«æå¹ã§ãã ãŸãããããè¡ãããã®æ£ç¢ºãªã«ãŒã«ã¯ããªãè€éã«ãªãå¯èœæ§ããããŸãã
ãããã£ãŠãäžè¬çã«ãç§ã¯ããã奜ãã§ã¯ãªããšæããŸãïŒãã®ã¹ã¬ããã®ä»ã®ææ¡ã«ãç±å¿ã§ã¯ãããŸããïŒãããšã«ããæ€èšã®ããã«ã¢ã€ãã¢ãæšãŠããšæããŸããã
@rogpeppeãŸãã¯ããªãã ã䜿çšããããšãã§ããŸãjson.NewEncoderã
@gbbrã¯ããæªãäŸã§ãã
ããè¯ãäŸã¯http.RequestãããããŸããã ããã䜿çšããããã«ã³ã¡ã³ããå€æŽããŸããã
ããã å€ãã®ã¢ã€ãã¢ãã³ãŒãã®å¯èªæ§ãããã«æªåãããŠããŸãã
ç§ã¯ã¢ãããŒãã§å€§äžå€«ã§ã
if val, err := DoMethod(); err != nil {
// val is accessible only here
// some code
}
æ¬åœã«åä»ãªã®ã¯ãè¿ãããå€æ°ã®ã¹ã³ãŒãã§ãã
ãã®å Žåã val
ã䜿çšããå¿
èŠããããŸãããç¯å²ã¯if
ã§ãã
ãããã£ãŠã else
ã䜿çšããå¿
èŠããããŸããããªã³ã¿ãŒã¯ããã«å察ããŸãïŒãããŠç§ãïŒã
val, err := DoMethod()
if err != nil {
// some code
}
// some code with val
if
ãããã¯å€ã®å€æ°ã«ã¢ã¯ã»ã¹ã§ãããšäŸ¿å©ã§ãã
if val, err := DoMethod(); err != nil {
// some code
}
// some code with val
@dmbreakerããããåºæ¬çã«Swiftã®ã¬ãŒãå¥ã®ç®çã§ãã äœããã®æ¡ä»¶ãééããå ŽåãçŸåšã®ã¹ã³ãŒãå ã®å€æ°ãå²ãåœãŠãŸãã ç§ã®ä»¥åã®ã³ã¡ã³ããåç §ã
ç§ã¯Goã§ã®ãšã©ãŒåŠçãåçŽåããããšã«å šåã泚ãã§ããŸããïŒå人çã«ã¯ããã»ã©æ°ã«ããŸãããïŒãããã«ãããä»ã®ç¹ã§ã¯åçŽã§éåžžã«èªã¿ãããèšèªã«å°ãéæ³ãããããšæããŸãã
@gbbr
ããã§èšåããŠãããããããšã¯äœã§ããïŒ ç©äºãé²ããæ¹æ³ã«ã€ããŠã¯ãããªãã®æ°ã®ç°ãªãææ¡ããããŸãã
ãããã2ã€ã®éšåãããªã解決çã§ããïŒ
try
ããæ»ãã¿ãã«ã®å³ç«¯ã®å€ãã¯ãããŸãããã®åã®ãŒãå€ã§ãªãå Žåã¯ãä»ã®å€ããŒãã«èšå®ããŠããã®é¢æ°ã®å³ç«¯ã®å€ãšããŠè¿ããŸãããšå®çŸ©ããŸãã ããã¯äžè¬çãªã±ãŒã¹ã«ãªããŸã
a := try ErrorableFunction(b)
é£éãå¯èœã«ããŸã
a := try ErrorableFunction(try SomeOther(b, c))
ïŒãªãã·ã§ã³ã§ãå¹çãäžããããã«ããŒã以å€ã§ã¯ãªããŒã以å€ã«ããŸããïŒãšã©ãŒé¢æ°ããŒã以å€/ãŒã以å€ãè¿ãå Žåãé¢æ°ã¯ãå€ã§äžæ¢ãããŸãã try
'edé¢æ°ã®å³ç«¯ã®å€ã¯ãåŒã³åºãå
ã®é¢æ°ã®å³ç«¯ã®å€ã«å²ãåœãŠå¯èœã§ããå¿
èŠããããŸããããããªããšãã³ã³ãã€ã«æã®åãã§ãã¯ãšã©ãŒã«ãªããŸãã ïŒãããã£ãŠãããã¯error
ã®ã¿ãåŠçããããã«ããŒãã³ãŒãã£ã³ã°ãããŠããŸããããããããã³ãã¥ããã£ã¯ä»ã®ãè³¢ããã³ãŒãã®äœ¿çšãæšå¥šããªãã¯ãã§ããïŒ
次ã«ã次ã®ããããã®deferã®ãããªããŒã¯ãŒãã§tryreturnsããã£ããã§ããããã«ããŸãã
catch func(e error) {
// whatever this function returns will be returned instead
}
ãŸãã¯ããã£ãšå€§éæã«èšãã°ãGoããã§ã«ã©ã®ããã«æ©èœããŠãããã«ãã£ãšäžèŽããŠããŸãã
defer func() {
if err := catch(); err != nil {
set_catch(ErrorWrapper{a, "while posting request to server"})
}
}()
catch
å Žåãé¢æ°ã®ãã©ã¡ãŒã¿ãŒã¯è¿ãããå€ãšæ£ç¢ºã«äžèŽããå¿
èŠããããŸãã è€æ°ã®é¢æ°ãæäŸãããŠããå Žåãå€ã¯ããããã¹ãŠãéã®é åºã§ééããŸãã ãã¡ãããæ£ããã¿ã€ãã®é¢æ°ã«è§£æ±ºãããå€ãå
¥ããããšãã§ããŸãã defer
ããŒã¹ã®äŸã®å Žåã1ã€ã®defer
é¢æ°ãset_catch
åŒã³åºããšã次ã®å»¶æé¢æ°ã¯ãããcatch()
å€ãšããŠååŸããŸãã ïŒããã»ã¹ã§nilã«æ»ãã®ã«ååæãã§ããå Žåã¯ãçŽããããæ»ãå€ãåºåãããŸããããããªãã§ãã ãããïŒset_catchã«æž¡ãããå€ã¯ãè¿ãããåã«å²ãåœãŠå¯èœã§ããå¿
èŠããããŸãã ã©ã¡ãã®å Žåããããã¯å®£èšã§ã¯ãªãã¹ããŒãã¡ã³ãã§ãããã¹ããŒãã¡ã³ãã®å®è¡åŸã«ã®ã¿ã³ãŒãã«é©çšããããšããç¹ã§ããããdefer
ããã«æ©èœããããšãæåŸ
ããŠããŸãã
ç§ã¯åçŽãã®èŠ³ç¹ãã延æããŒã¹ã®ãœãªã¥ãŒã·ã§ã³ã奜ãåŸåããããŸãïŒåºæ¬çã«æ°ããæŠå¿µã¯å°å
¥ãããŠããŸãããæ°ãããã®ã§ã¯ãªãã2çªç®ã®ã¿ã€ãã®recover()
ã§ãïŒããããã©ãŒãã³ã¹ã®åé¡ãããå¯èœæ§ãããããšãèªããŸãã åå¥ã®catchããŒã¯ãŒãã䜿çšãããšãéåžžã®ãªã¿ãŒã³ãçºçãããšãã«å®å
šã«ã¹ããããããããªããããå¹çãåäžããå¯èœæ§ããããŸããæ倧ã®å¹çãå®çŸãããå Žåã¯ãã¹ã³ãŒããŸãã¯é¢æ°ããšã«1ã€ã ããã¢ã¯ãã£ãã«ãªãããã«ãã¹ã³ãŒãã«é¢é£ä»ããŸãã ãããã¯ã»ãŒãŒãã³ã¹ãã ãšæããŸãã ïŒããããããœãŒã¹ã³ãŒããã¡ã€ã«åãšè¡çªå·ãcatché¢æ°ããè¿ãããå¿
èŠããããŸããïŒã³ã³ãã€ã«æã«ãããè¡ãã®ã¯å®äŸ¡ã§ããã人ã
ãä»ãã«ã¹ã¿ãã¯ãã¬ãŒã¹ãèŠæ±ããçç±ã®ããã€ãããããã§ããããïŒ
ã©ã¡ãããç¹°ãè¿ãã®ãšã©ãŒåŠçãé¢æ°å ã®1ã€ã®å Žæã§å¹æçã«åŠçã§ããããã«ãããšã©ãŒåŠçãã©ã€ãã©ãªé¢æ°ãšããŠç°¡åã«æäŸã§ããããã«ããŸããããã¯ãäžèšã®rscã®ã³ã¡ã³ãã«ãããšãçŸåšã®ã±ãŒã¹ã®ææªã®åŽé¢ã®1ã€ã§ãã ãšã©ãŒåŠçã®é¢åãã¯ãæ£ããåŠçã§ã¯ãªããreturnerrããå©é·ããåŸåããããŸãã ç§ã¯ãããšèªåèªèº«ã§å€ãã®èŠåŽãããŠããããšãç¥ã£ãŠããŸãã
@thejerfãã®ææ¡ã«é¢ããIanã®ãã€ã³ãã®äžéšã¯ãé¢æ°ãã³ã³ããã¹ããè¿œå ããããè¿ããããšã©ãŒãæäœãããããããšãæããšã©ãŸãããããšãªãããšã©ãŒã®å®åæã«å¯ŸåŠããæ¹æ³ãæ¢ãããšã§ãã
ãšã©ãŒåŠçãtry
ãšcatch
åãããšããã®ç®æšã«åããããã«èŠããŸãããããã°ã©ã ãéåžžè¿œå ãã詳现ã®çš®é¡ã«ãã£ãŠç°ãªããŸãã
å°ãªããšããããçŸå®çãªäŸã§ã©ã®ããã«æ©èœãããã確èªããããšæããŸãã
ç§ã®ææ¡ã®å šäœçãªãã€ã³ãã¯ãã³ã³ããã¹ããè¿œå ãããããšã©ãŒãæäœãããã§ããããã«ããããšã§ããããã¯ããã®ã³ã³ããã¹ããäœåºŠãç¹°ãè¿ãããšãå«ãããã§ã®ã»ãšãã©ã®ææ¡ãããããã°ã©ã çã«æ£ãããšèããæ¹æ³ã§ãããããèªäœãè¿œå ã®ã³ã³ããã¹ããå ¥ããããšãã欲æ±ã劚ããŸãã ã
å ã®äŸãæžãçŽãã«ã¯ã
func Chdir(dir string) error {
if e := syscall.Chdir(dir); e != nil {
return &PathError{"chdir", dir, e}
}
return nil
}
ãšããŠåºãŠããŸã
func Chdir(dir string) error {
catch func(e error) {
return &PathError{"chdir", dir, e}
}
try syscall.Chdir(dir)
return nil
}
ãã ãããã®äŸã¯ãå®éã«ã¯ãããã®ææ¡ã®ãããã«ãåãã«è¶³ããªããã®ã§ããããã®å Žåã¯ãå ã®é¢æ°ããã®ãŸãŸã«ããŠãããšæããŸãã
å人çã«ã¯ãããããå ã®Chdiré¢æ°ãåé¡ã ãšã¯æã£ãŠããŸããã ç§ã¯ãããç¹ã«èª¿æŽããŠã1ã€ã®ãšã©ãŒé¢æ°ã§ã¯ãªããé·æéç¹°ãè¿ããããšã©ãŒåŠçã«ãã£ãŠé¢æ°ã«ãã€ãºãçºçããå Žåã«å¯ŸåŠããŠããŸãã ãŸããèãããããã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã§æåéãç°ãªãããšãè¡ãé¢æ°ãããå Žåãæ£ããçãã¯ããããããã§ã«åŸããã®ãæžãç¶ããããšã ãšæããŸãã ãããããããäžè¬çãªã±ãŒã¹ã§ãã£ããšããŠããããããèŠæ ã¯ãªããšããçç±ã§ãã»ãšãã©ã®äººã«ãšã£ãŠããã¯éåžžã«ãŸããªã±ãŒã¹ã ãšæããŸãã ãšã©ãŒããã§ãã¯ãããã€ãºã¯ãé¢æ°å ã§ãã»ãŒåãããšããäœåºŠãç¹°ãè¿ããããšããçç±ã ãã§éèŠã§ãã
ç§ã¯ãŸãã人ã ãæãã§ãããã®ã®ã»ãšãã©ãæºããããã ãããšæããŸã
func SomethingBigger(dir string) (interface{}, error) {
catch func (e error, filename string, lineno int) {
return PackageSpecificError{e, filename, lineno, dir}
}
x := try Something()
if x == true {
try SomethingElse()
} else {
a, b = try AThirdThing()
}
return whatever, nil
}
å°ããããŠæ°ã«ããªããšããçç±ã§åäžã®ifã¹ããŒãã¡ã³ãã®èŠæ ããè¯ãããããšããåé¡ãåãé€ãããšã©ãŒãè¿ããããã³ã«æ¬åœã«ãŠããŒã¯ãªããšãããŠããé¢æ°ã®åé¡ãåãé€ããŸãã ïŒããã¯å®éã«ã¯ããªããŸããªã±ãŒã¹ã§ãããBïŒãã®å Žåããã€ã©ãŒãã¬ãŒãã®ãªãŒããŒãããã¯ãåºæã®åŠçã³ãŒãã®è€éãã«å¯ŸããŠå®éã«ã¯ããã»ã©éèŠã§ã¯ãããŸããããããããåé¡ã¯è§£æ±ºçã®ãããã®ã«æžããããšãã§ããŸãã
ç§ãæ¬åœã«èŠããã§ã
func packageSpecificHandler(f string) func (err error, filename string, lineno int) {
return func (err error, filename string, lineno int) {
return &PackageSpecificError{"In function " + f, err, filename, lineno}
}
}
func SomethingBigger(dir string) (interface{}, error) {
catch packageSpecificHandler("SomethingBigger")
...
}
ãŸãã¯ããããæ©èœããå Žåã¯ãåçã®ãã®ãå¯èœã§ãã
ãããŠãããŒãžäžã®ãã¹ãŠã®ææ¡ã®äžã§...ããã¯ãŸã Goã®ããã«èŠããŸãããïŒ çŸåšã®GoãããGoã®ããã«èŠããŸãã
æ£çŽãªãšãããç§ã®å°éçãªãšã³ãžãã¢ãªã³ã°çµéšã®ã»ãšãã©ã¯PHPïŒç§ã¯ç¥ã£ãŠããŸãïŒã§ããããGoã®äž»ãªé åã¯åžžã«èªã¿ãããã§ããã ç§ã¯PHPã®ããã€ãã®åŽé¢ã楜ããã§ããŸãããç§ãæã軜èããŠããã®ã¯ããæçµçãªããæœè±¡çãªããéçãªããã³ã»ã³ã¹ã§ããã1ã€ã®ããšãè¡ãã³ãŒãã«é床ã«è€éãªæŠå¿µãé©çšããããšã§ãã
ãã®ææ¡ãèŠããšãããéšåãèŠãŠãããã«ãã€ã¯ãå®è¡ãããã®ã³ãŒãã®éšåãäœãèšã£ãŠããã®ãããŸãã¯äœãããŠããã®ããæ¬åœã«ãèãããªããã°ãªããªããšããæèŠã«ããã«éæ»ãããŸããã ç§ã¯ãã®ã³ãŒããèªã¿ããããå®éã«èšèªã«è¿œå ããããšã¯æããŸããã ç§ã®æåã®æ¬èœã¯å·ŠåŽãèŠãããšã§ãããããã¯åžžã«nil
è¿ããšæããŸãã ãã ãããã®å€æŽã«ãããã³ãŒãã®åäœãå€æããããã«ãå·Šå³ãèŠãå¿
èŠããããŸããããã¯ãããå€ãã®æéãèªãã§ãããå€ãã®ã¡ã³ã¿ã«ã¢ãã«ãæå³ããŸãã
ãã ããããã¯Goã§ã®ãšã©ãŒåŠçãæ¹åããäœå°ããªãããšãæå³ãããã®ã§ã¯ãããŸããã
ç³ãèš³ãããŸãããããã®ã¹ã¬ããå šäœãïŒãŸã ïŒèªãã§ããŸããïŒéåžžã«é·ãã§ãïŒãã人ã ãå¥ã®æ§æãæããŠããã®ãèŠãã®ã§ãç§ã®èããå ±æããããšæããŸãïŒ
a, err := helloWorld(); err? {
return fmt.Errorf("helloWorld failed with %s", err)
}
ãããç¡å¹ã«ããäžèšã®äœããèŠéããŠããªãããšãé¡ã£ãŠããŸãã ç§ã¯ãã€ããã¹ãŠã®ã³ã¡ã³ããéãæããããšãçŽæããŸã:)
åå€æã®ã»ãã³ãã£ãã¯ã®æ··ä¹±ãé¿ããããã«ãæŒç®åã¯error
åã§ã®ã¿èš±å¯ãããå¿
èŠããããšç§ã¯ä¿¡ããŠããŸãã
èå³æ·±ãã @ buchanae ããããããã¯ç§ãã¡ãã¯ããã«ä¹ãè¶ããŸããïŒ
if a, err := helloWorld(); err != nil {
return fmt.Errorf("helloWorld failed with %s", err)
}
a
ããšã¹ã±ãŒãã§ããã®ã¯ç¢ºãã§ãããçŸåšã®ç¶æ
ã§ã¯ãã¹ã³ãŒãã¯thenãããã¯ãšelseãããã¯ã«ãªããŸãã
@ object88ããã§ããå€åã¯åŸ®åŠã§ãçŸçã§ã䞻芳çã§ãã å人çã«ã¯ããã®ãããã¯ã«é¢ããŠGo 2ã«æ±ããŠããã®ã¯ãèªã¿ãããã®åŸ®åŠãªå€æŽã ãã§ãã
å人çã«ã¯ãè¡ãif
å§ãŸã£ãŠãããã !=nil
å¿
èŠãšããªããããèªã¿ããããªã£ãŠããŸãã å€æ°ã¯ãïŒã»ãšãã©ïŒïŒä»ã®è¡ã«ãã巊端ã«ãããŸãã
a
ã®ç¯å²ã®çŽ æŽãããç¹ãç§ã¯ãããèæ
®ããŠããŸããã§ããã
ãã®ææ³ã®ä»ã®å¯èœæ§ãèãããšãããã¯å¯èœã§ããããã«æãããŸãã
err := helloWorld(); err? {
return fmt.Errorf("error: %s", err)
}
ãããŠãããã
helloWorld()? {
return fmt.Errorf("hello world failed")
}
å€åããããã©ãã©ã«ãªããšããã§ãã
ãã¶ãããšã©ãŒãè¿ãããšã¯Goã®ãã¹ãŠã®é¢æ°åŒã³åºãã®äžéšã§ããã¯ããªã®ã§ã次ã®ããšãæ³åã§ããŸãã
`` `
aïŒ= helloWorldïŒïŒ; ãïŒ {{
fmt.ErrorfïŒ "helloWorld failedïŒïŒ
s"ãerrïŒãè¿ããŸã
}
å®éã®äŸå€åŠçã¯ã©ãã§ããïŒ ã€ãŸããè©ŠããŠããã£ããããŠãæçµçã«ã¯å€ãã®çŸä»£èªã®ããã«ïŒ
ããããã³ãŒããæé»çã§äžæ確ã«ãªããŸãïŒãã ããå®éã«ã¯å°ãçããªããŸãïŒ
7æ27åã«æšã2017幎11æ23æ¥ã«ã¯ãKamyar Miremadi [email protected]
æžããŸããïŒ
å®éã®äŸå€åŠçã¯ã©ãã§ããïŒ ã€ãŸããè©ŠããŠããã£ããããŠãæåŸã«
代ããã«å€ãã®çŸä»£èªã®ããã«ïŒâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/21161#issuecomment-346529787 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AICzvyy_kGAlcs6RmL8AKKS5deNRU4_5ks5s5PQVgaJpZM4Oi1c-
ã
@mpvlã®WriteToGCSã®äŸã®ã¢ããã¹ã¬ããã«æ»ã£ãŠãã³ããã/ããŒã«ããã¯ãã¿ãŒã³ã¯ãGoã®ãšã©ãŒåŠçã®å€§å¹ ãªå€æŽãä¿èšŒããã»ã©äžè¬çã§ã¯ãªãããšãïŒå床ïŒææ¡ããããšæããŸãã é¢æ°ïŒéã³å Žãªã³ã¯ïŒã§ãã¿ãŒã³ããã£ããã£ããã®ã¯é£ãããããŸããïŒ
func runWithCommit(f, commit func() error, rollback func(error)) (err error) {
defer func() {
if r := recover(); r != nil {
rollback(fmt.Errorf("panic: %v", r))
panic(r)
}
}()
if err := f(); err != nil {
rollback(err)
return err
}
return commit()
}
次ã«ãäŸã次ã®ããã«èšè¿°ã§ããŸãã
func writeToGCS(ctx context.Context, bucket, dst string, r io.Reader) error {
client, err := storage.NewClient(ctx)
if err != nil {
return err
}
defer client.Close()
w := client.Bucket(bucket).Object(dst).NewWriter(ctx)
return runWithCommit(
func() error { _, err := io.Copy(w, r); return err },
func() error { return w.Close() },
func(err error) { _ = w.CloseWithError(err) })
}
ç§ã¯ããç°¡åãªè§£æ±ºçãææ¡ããŸãïŒ
func someFunc() error {
^err := someAction()
....
}
è€æ°ã®è€æ°ã®é¢æ°ãè¿ãããå ŽåïŒ
func someFunc() error {
result, ^err := someAction()
....
}
ãããŠãè€æ°ã®æ»ãåŒæ°ã®å ŽåïŒ
func someFunc() (result Result, err error) {
var result Result
params, ^err := someAction()
....
}
^èšå·ã¯ããã©ã¡ãŒã¿ãŒãnilã§ãªãå Žåã«æ»ãããšãæå³ããŸãã
åºæ¬çã«ããšã©ãŒãçºçããå Žåã¯ã¹ã¿ãã¯ãäžã«ç§»åããã
ãã®æ¹æ³ã®æ¬ ç¹ã¯ãããŸããïŒ
@gladkikhartem
ãšã©ãŒãè¿ãããåã«ãã©ã®ããã«ãšã©ãŒãå€æŽããŸããïŒ
@urandom
ãšã©ãŒã®ã©ããã¯éèŠãªã¢ã¯ã·ã§ã³ã§ãããç§ã®æèŠã§ã¯æ瀺çã«å®è¡ããå¿
èŠããããŸãã
Goã³ãŒãã¯èªã¿ãããã«é¢ãããã®ã§ãããéæ³ã§ã¯ãããŸããã
ãšã©ãŒã©ããã³ã°ãããæ確ã«ããããšæããŸã
ãããåæã«ãå€ãã®æ å ±ãéã°ããã¹ããŒã¹ããšãã ãã®ã³ãŒããåãé€ããããšæããŸãã
if err != nil {
return err
}
ããã¯å²ç¢ã®æ±ºãŸãæå¥ã®ãããªãã®ã§ã-ããªãã¯ãããèªã¿ãããªããããªãã¯ãã ãããã¹ããããããã®ã§ãã
ãã®è°è«ã§ãããŸã§ã«èŠãã®ã¯ã次ã®çµã¿åããã§ãã
ããã¯ãäž¡æ¹ã®åŽé¢ã«èšåããŠãã@ianlancetaylorã«ããå ã®åé¡ã®èª¬æãš
@gladkikhartemã®ã¢ã€ãã¢ã¯ãç·šé/æ¡åŒµãããŠããããã§å ±åããå ã®åœ¢åŒã§ã
result, ^ := someAction()
funcã®ã³ã³ããã¹ãã§ã¯ïŒ
func getOddResult() (int, error) {
result, ^ := someResult()
if result % 2 == 0 {
return result + 1, nil
}
return result, nil
}
ãã®çãæ§æïŒãŸãã¯@gladkikhartemã«ãã£ãŠerr^
ææ¡ããã圢åŒïŒã¯ãåé¡ã®æ§æã®åé·æ§ã®éšåã«å¯ŸåŠããŸãïŒ1ïŒã
2çªç®ã®éšåã§ã¯ãã³ã³ããã¹ããè¿œå ããããšã§ãä»ã®ãšããå®å
šã«å¿ããããšãã§ããŸããåŸã§ãç¹å¥ãªcontextError
ã¿ã€ãã䜿çšãããŠããå Žåãåãšã©ãŒã«ã¹ã¿ãã¯ãã¬ãŒã¹ãèªåçã«è¿œå ããããšãææ¡ããŸãã ãã®ãããªæ°ãããã€ãã£ããšã©ãŒã¿ã€ãã¯ãå®å
šãŸãã¯çãã¹ã¿ãã¯ãã¬ãŒã¹ïŒ GO_CONTEXT_ERROR=full
æ³åããŠãã ããïŒãåãã error
ã€ã³ã¿ãŒãã§ã€ã¹ãšäºææ§ããããæäžäœã®åŒã³åºãã¹ã¿ãã¯ããå°ãªããšãé¢æ°ãšãã¡ã€ã«åãæœåºããå¯èœæ§ãæäŸããŸãããšã³ããªã
contextError
ã䜿çšããå Žåãã©ããããããGoã¯ããšã©ãŒãäœæãããæ£ç¢ºãªãã€ã³ãã«åŒã³åºãã¹ã¿ãã¯ãã¬ãŒã¹ãã¢ã¿ããããå¿
èŠããããŸãã
åã³funcã®äŸã§ïŒ
func getOddResult() (int, contextError) {
result, ^ := someResult() // here a 'contextError' is created; if the error received from 'someResult()' is also a `contextError`, the two are nested
if result % 2 == 0 {
return result + 1, nil
}
return result, nil
}
ã¿ã€ãã®ã¿ãerror
ããcontextError
ã«å€æŽãããŸãããããã¯ã次ã®ããã«å®çŸ©ã§ããŸãã
type contextError interface {
error
Stack() []StackEntry
Cause() contextError
}
ïŒãã®Stack()
ãhttps://golang.org/pkg/runtime/debug/#Stackãšã©ã®ããã«ç°ãªããã«æ³šæããŠãã ãããããã¯ããã€ã以å€ã®ããŒãžã§ã³ã®goroutineåŒã³åºãã¹ã¿ãã¯ãããã«ããããšãæãã§ããããã§ãïŒ
Cause()
ã¡ãœããã¯ããã¹ãã®çµæãšããŠnilãŸãã¯åã®contextError
ãè¿ããŸãã
ç§ã¯ããã®ãããªã¹ã¿ãã¯ãæã¡æ©ãããšã®æœåšçãªã¡ã¢ãªãžã®åœ±é¿ãããç¥ã£ãŠããã®ã§ã1ã€ãŸãã¯å°æ°ã®ãšã³ããªããå«ãŸãªãããã©ã«ãã®çãã¹ã¿ãã¯ãæã€å¯èœæ§ã瀺åããŸããã éçºè ã¯éåžžãéçº/ãããã°ããŒãžã§ã³ã§å®å šãªstracktraceãæå¹ã«ãããã以å€ã®å Žåã¯ããã©ã«ãïŒçãã¹ã¿ãã¯ãã¬ãŒã¹ïŒã®ãŸãŸã«ããŸãã
å è¡æè¡ïŒ
ãã èããããã®é£ã¹ç©ã
@gladkikhartem @ gdm85
ããªãã¯ãã®ææ¡ã®èŠç¹ãèŠéãããšæããŸãã ã€ã¢ã³ã®å ã®æçš¿ã«ãããšïŒ
ãšã©ãŒãç¡èŠããããšã¯ãã§ã«ç°¡åã§ãïŒããããç°¡åãããŸãïŒïŒïŒ20803ãåç §ïŒã ãšã©ãŒåŠçã«é¢ããæ¢åã®ææ¡ã®å€ãã¯ãå€æŽããã«ãšã©ãŒãè¿ãã®ã容æã«ããŸãïŒããšãã°ãïŒ16225ãïŒ18721ãïŒ21146ãïŒ21155ïŒã è¿œå æ å ±ã䜿çšããŠãšã©ãŒãç°¡åã«è¿ãããšãã§ãããã®ã¯ã»ãšãã©ãããŸããã
å€æŽããã«ãšã©ãŒãè¿ãããšã¯ãã°ãã°ééã£ãŠãããéåžžã¯å°ãªããšã圹ã«ç«ããªãã 泚ææ·±ããšã©ãŒåŠçã奚å±ããããšæããŸãããå€æŽãããŠããªããªã¿ãŒã³ãã®ãŠãŒã¹ã±ãŒã¹ã®ã¿ã«å¯ŸåŠãããšãã€ã³ã»ã³ãã£ããééã£ãæ¹åã«ãã€ã¢ã¹ãããŸãã
@bcmillsã³ã³ããã¹ãïŒã¹ã¿ãã¯ãã¬ãŒã¹ã®åœ¢åŒïŒãè¿œå ãããŠããå Žåããšã©ãŒã¯è¿œå æ å ±ãšãšãã«è¿ãããŸãã ãã¬ã³ãŒãæ¿å ¥äžã®ãšã©ãŒããªã©ã®äººéãèªããã¡ãã»ãŒãžãæ·»ä»ããããšã¯ãã泚ææ·±ããšã©ãŒåŠçããšèŠãªãããŸããïŒ ã³ãŒã«ã¹ã¿ãã¯ã®ã©ã®æç¹ã§ãã®ãããªã¡ãã»ãŒãžãè¿œå ããå¿ èŠããããã決å®ããã«ã¯ã©ãããã°ããã§ããïŒåé¢æ°ãããã/ããã ãªã©ïŒïŒ ãããã¯ãã¹ãŠãã³ãŒãã£ã³ã°ãšã©ãŒåŠçã®æ¹åã«é¢ããäžè¬çãªè³ªåã§ãã
ãreturnunmodifiedãã¯ãããã©ã«ãã§ãreturn unmodified with stacktraceãã䜿çšããŠäžèšã§èª¬æããããã«æã¡æ¶ãããšãã§ããïŒãªã¢ã¯ãã£ãã¹ã¿ã€ã«ã§ïŒå¿
èŠã«å¿ããŠäººéãèªããã¡ãã»ãŒãžãè¿œå ããŸãã ãã®ãããªäººéãèªããã¡ãã»ãŒãžãè¿œå ããæ¹æ³ã¯æå®ããŠããŸããããããã€ãã®ã¢ã€ãã¢ã«ã€ããŠã¯ã pkg/errors
ã§ã©ããã³ã°ãã©ã®ããã«æ©èœãããã確èªã§ããŸãã
ãå€æŽããã«ãšã©ãŒãè¿ãããšã¯ãã°ãã°ééã£ãŠããŸããïŒãããã£ãŠãç§ã¯æ æ°ãªãŠãŒã¹ã±ãŒã¹ã®ã¢ããã°ã¬ãŒããã¹ãææ¡ããŸããããã¯ãçŸåšæ害ã§ãããšææãããŠããã®ãšåããŠãŒã¹ã±ãŒã¹ã§ãã
@bcmills
ç§ã¯ïŒ20803ã«100ïŒ
åæããŸãããšã©ãŒã¯åžžã«åŠçããããæ瀺çã«ç¡èŠããå¿
èŠããããŸãïŒãããŠããªãããã以åã«è¡ãããªãã£ãã®ãããããŸãã...ïŒ
ã¯ããç§ã¯ææ¡ã®ãã€ã³ãã«å¯ŸåŠããŸããã§ããããããŠç§ã¯ããããå¿
èŠã¯ãããŸããã æå³ã¯çµæãšäžèŽããªããããèåŸã«ããæå³ã§ã¯ãªããææ¡ãããå®éã®è§£æ±ºçã«é¢å¿ããããŸãã ãããŠç§ãèŠããšã|| ãã®ãããª|| ææ¡ãããŠãããã®-ããã¯ç§ãæ¬åœã«æ²ãããããŸãã
ãšã©ãŒã³ãŒãããšã©ãŒã¡ãã»ãŒãžãªã©ã®æ
å ±ããšã©ãŒã«åã蟌ãã®ãç°¡åã§ééçã§ããå ŽåïŒæ
éãªãšã©ãŒåŠçã奚å±ããå¿
èŠã¯ãããŸããïŒã人ã
ã¯ãããèªåã§è¡ããŸãã
ããšãã°ããšã©ãŒããšã€ãªã¢ã¹ã«ããŸãã ããããçš®é¡ã®ãã®ãè¿ãããã£ã¹ãããã«é¢æ°ã®å€ã§äœ¿çšããããšãã§ããŸãã 人çããšãŠã楜ã«ããŠãããã§ãããã
Goããšã©ãŒãåŠçããããã«ç§ã«æãåºãããã®ã¯å¥œãã§ããããã¶ã€ã³ãç§ã«çãããããšãããããã«å§ãããšãã¯å«ãã§ãã
@ gdm85
ãšã©ãŒã«ã¹ã¿ãã¯ãã¬ãŒã¹ãèªåçã«è¿œå ããã®ã¯ã²ã©ãèãã§ããJavaã¹ã¿ãã¯ãã¬ãŒã¹ãèŠãŠãã ããã
ãšã©ãŒãèªåã§ã©ãããããšãäœãåé¡ã«ãªã£ãŠããã®ããããã²ãŒãããŠç解ããã®ãã¯ããã«ç°¡åã«ãªããŸãã ããããããå
ãããšã®å
šäœçãªãã€ã³ãã§ãã
@gladkikhartemç§ã¯ããèªåã©ããã³ã°ãã®åœ¢åŒãããã²ãŒãããäœãæªãã®ããç解ããã®ãå©ããã®ã«ã¯ããã«æªãã ãããšããããšã«åæã
Goã®ãã¹ããã©ã¯ãã£ã¹ïŒå€ããå°ãªããæšæºçã§ããå¯èœæ§ããããŸãïŒã®ç解ãæ·±ããããšãšããã®ãããªå®çŸ©ãçŸåšã®ç¶æ³ããã®æ¹åã«åããææ¡ãè¡ãããã®éµã«ãªããšæãã®ã§ãäž¡æ¹ã«ãé¡ãããŸãã
@gladkikhartemãã®ææ¡ã¯ãã§ã«if err != nil { return err }
åçŽåããããšã«é¢ããããã€ãã®ç°ãªãææ¡ããã§ã«ããããããã¯ãã®ç¹å®ã®ã±ãŒã¹ãæ¹åããã ãã®æ§æãè°è«ããå Žæã§ãã ããããšãã
@ianlancetaylor
è°è«ãéªéã«ãªããªãããã«åãããŠããŸã£ããããããªããã
ãšã©ãŒã«ã³ã³ããã¹ãæ
å ±ãè¿œå ããå Žåã¯ã次ã®æ§æã䜿çšããããšããå§ãããŸãã
ïŒãããŠãã³ã³ããã¹ãæœåºã容æã«ããããã«ã1ã€ã®é¢æ°ã«å¯ŸããŠ1ã€ã®ãšã©ãŒã¿ã€ãã®ã¿ã䜿çšããããã«äººã
ã«åŒ·å¶ããŸãïŒ
type MyError struct {
Type int
Message string
Context string
Err error
}
func VeryLongFunc() error {
var err MyError
err.Context = "general function context"
result, ^err.Err := someAction() {
err.Type = PermissionError
err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
}
// in case we need to make a cleanup after error
result, ^err.Err := someAction() {
err.Type = PermissionError
err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
file.Close()
}
// another variant with different symbol and return statement
result, ?err.Err := someAction() {
err.Type = PermissionError
err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
return err
}
// using original approach
result, err.Err := someAction()
if err != nil {
err.Type = PermissionError
err.Message = fmt.SPrintf("some action has no right to access file %v: ", file)
return err
}
}
func main() {
err := VeryLongFunc()
if err != nil {
e := err.(MyError)
log.Print(e.Error(), " in ", e.Dir)
}
}
^èšå·ã¯ããšã©ãŒãã©ã¡ãŒã¿ã瀺ããé¢æ°å®çŸ©ãšãsomeActionïŒïŒ{}ãã®ãšã©ãŒåŠçãåºå¥ããããã«äœ¿çšãããŸãã
ãšã©ãŒãå€æŽãããã«è¿ãããå Žåã¯ã{}ãçç¥ã§ããŸã
ã泚ææ·±ããšã©ãŒåŠçããããé©åã«å®çŸ©ããããã«ãç§èªèº«ã®æåŸ ã«è¿ä¿¡ããããã®ãªãœãŒã¹ãããã«è¿œå ããŸãã
çŸåšã®ã¢ãããŒããšåããããéå±ã§ãããã¹ããŒãã¡ã³ããæ©èœããå¯èœæ§ãããå Žåã¯1è¡ã§ãããä»ã®ã¢ãããŒããããæ··ä¹±ãå°ãªããšæããŸãã å€åïŒ
blah, err := doSomething()
if err != nil: return err
...ãããã¯...
blah, err := doSomething()
if err != nil: return &BlahError{"Something",err}
誰ãããã§ã«ãããæèµ·ãããããããŸããããããããã®æçš¿ããããç§ã¯ãããã®å€ããèªã¿ãŸãããããã¹ãŠã§ã¯ãããŸããã ãšã¯ãããå人çã«ã¯ãæé»çã§ãããããæ瀺çã§ããæ¹ãè¯ããšæããŸãã
ç§ã¯ééæåããã°ã©ãã³ã°ã®ãã¡ã³ã§ãããã¢ã€ãã¢ã¯Elixirã®with
ã¹ããŒãã¡ã³ãããæ¥ãŠããŸãã
else
ãããã¯ã¯ã e == nil
ç絡ãããšå®è¡ãããŸãã
ããããæ¬äŒŒã³ãŒããå ã«çœ®ããç§ã®ææ¡ã§ãã
func Chdir(dir string) (e error) {
with e == nil {
e = syscall.Chdir(dir)
e, val := foo()
val = val + 1
// something else
} else {
printf("e is not nil")
return
}
return nil
}
@ardhitamaããã¯ããWithãããTryãã¹ããŒãã¡ã³ãã®ãããªãã®ã§ããããElseãããCââatchãã®ãããªãã®ã§ããããšãé€ããŠã
JavaãCïŒã®ãããªäŸå€åŠçãå®è£
ããŠã¿ãŸãããïŒ
ããã°ã©ããŒããã®é¢æ°ã§äŸå€ãåŠçããããªãå Žåã¯ããã®é¢æ°ã®çµæãšããŠäŸå€ãè¿ããŸãã ããã§ããããã°ã©ããŒãæãŸãªãå Žåã«äŸå€ãåŠçããããã«åŒ·å¶ããæ¹æ³ã¯ãªããå€ãã®å Žåãæ¬åœã«å¿
èŠã¯ãããŸããããããã§åŸãããã®ã¯ãã³ãŒããéãããif errïŒ= nilã¹ããŒãã¡ã³ãã§ããèªã¿åãäžèœïŒãã€ãºãå€ãïŒã ããããä»ã®ããã°ã©ãã³ã°èšèªã§TryCatchFinallyã¹ããŒãã¡ã³ããçºæãããã®ã¯ãããçç±ã§ã¯ãªãã§ããããã
ã§ããããGo Authorsãé åºã«ãªããªãããã«ããã£ãŠã¿ãŠããã ããïŒ æ¬¡ã®ããŒãžã§ã³ã§ã¯ããTryCatchFinallyãã¹ããŒãã¡ã³ããå°å ¥ããã ãã§ãã ããããšãã
@KamyarM
Goã«ã¯äŸå€ããªããããgoã«äŸå€åŠçãå°å
¥ããããšã¯ã§ããŸããã
Goã§try {} catch {}ãå°å
¥ããããšã¯ãCã§try {} catch {}ãå°å
¥ããããšã«äŒŒããã¯ãŸã£ããééã£ãŠããŸãã
@ianlancetaylor
Goã®ãšã©ãŒåŠçããŸã£ããå€æŽããã«ããã®ãããªgofmtããŒã«ã1è¡ã®ãšã©ãŒåŠçã«å€æŽããã®ã¯ã©ãã§ããããã
err := syscall.Chdir(dir)
if err != nil {return &PathError{"chdir", dir, err}}
err = syscall.Chdir(dir2)
if err != nil {return err}
äžäœäºææ§ããããçŸåšã®ãããžã§ã¯ãã«é©çšã§ããŸã
äŸå€ã¯è£ 食ãããgotoã¹ããŒãã¡ã³ãã§ãããã³ãŒã«ã¹ã¿ãã¯ãã³ãŒã«ã°ã©ãã«å€æããŸããæãæ·±å»ãªéåŠè¡ãããžã§ã¯ãããã®äœ¿çšãçŠæ¢ãŸãã¯å¶éããã®ã«ã¯ååãªçç±ããããŸãã ã¹ããŒããã«ãªããžã§ã¯ãã¯ãå¶åŸ¡ãä»»æã«ã¹ã¿ãã¯ã«è»¢éããŠããåœä»€ã®å®è¡ãåéããã¡ãœãããåŒã³åºããŸã...ããã¯æªãèãã®ããã«èãããŸãã
@KamyarMæ¬è³ªçã«ã¯ããã§ãããå®éã«ã¯ããã§ã¯ãããŸããã ç§ã®æèŠã§ã¯ãããã§ã¯æ瀺çã§ãããGoã®ã€ãã£ãªã ãç Žã£ãŠããªãããã§ãã
ã©ãããŠïŒ
with
ã¹ããŒãã¡ã³ãå
ã®åŒã¯ãæ°ããå€æ°ã宣èšã§ããªãããããããã¯å€æ°ããè©äŸ¡ããããšãæ瀺çã«ç€ºããŠããŸããwith
å
ã®ã¹ããŒãã¡ã³ãã¯ã try
ããã³catch
ãããã¯å
ã®ããã«åäœããŸãã å®éãææªã®ã·ããªãªã§with
ã®ç¶æ
ãè©äŸ¡ããå¿
èŠããã次ã®ååœä»€ã§ã¯ãé床ãäœäžããŸããif
ãåé€ããäŸå€ãã³ãã©ãŒãäœæããªãããã«ããŸãïŒ with
ã®åŒãšelse
ãããã¯ïŒãthrow
ãããã¹ã¿ãã¯ãå·»ãæ»ãå¿
èŠã¯ãããŸããpsã ç§ãééã£ãŠããå Žåã¯ç§ãèšæ£ããŠãã ããã
@ardhitama
KamyarMã¯ã withã¹ããŒãã¡ã³ããtry catchãšåããããéãèŠããéåžžã®ã³ãŒããããŒã«ã€ã³ãã³ãã¬ãã«ãå°å
¥ãããšããæå³ã§æ£ããã§ãã
åãšã©ãŒãåå¥ã«ä¿®æ£ãããšããå
ã®ææ¡ã®ã¢ã€ãã¢ã«ã€ããŠãèšåããŠããŸããã äžç·ã«ã°ã«ãŒãæãšããããã ãã®tryã§ãã£ããããŸãã¯ä»ã®æ¹æ³ã§ãšã¬ã¬ã³ãã«ä»äºã«è¡ãã®ã§ã¯ãããŸããã
@gladkikhartem
ã¯ãããããã£ãŠãç§ã¯ä»£ããã«ãééæåããã°ã©ãã³ã°ããæ¡çšããããšãææ¡ããæ瀺æ§ãåé€ããªãããã«ããŸãã åé¡ãæ»æããã®ã¯å¥ã®è§åºŠã§ããä»ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãã³ã³ãã€ã©ãŒã«if err != nil
ãèªåçã«æžã蟌ãŸããªãããšã§åé¡ã解決ããããšèããŠããŸãã
with
ã¯ããšã©ãŒåŠçã ãã§ãªããä»ã®å¶åŸ¡ãããŒã«ã圹ç«ã¡ãŸãã
@gladkikhartem
Try Catch Finally
ãããã¯ã¯çŸãããšæããŸãã If err!=nil ...
ã¯å®éã«ã¯éãã³ãŒãã§ãã
Goã¯åãªãããã°ã©ãã³ã°èšèªã§ãã ä»ã«ãããããã®èšèªããããŸãã ç§ã¯ãå²ç¢ã³ãã¥ããã£ã®å€ãããããèªåãã¡ã®å®æã®ããã«èŠãŠãããééããå€ãããèªãããããããšãåãå ¥ããŠããªãããšãç¥ããŸããã ããã¯ééã£ãŠããŸãã
@gladkikhartem
Goã®äœè
ããããGo ++ãŸãã¯GoïŒãŸãã¯GoJavaãšåŒãã§ãããã«Try Catch Finally
ã玹ä»ããŠã倧äžå€«ã§ã;ïŒ
@KamyarM
äžå¿ èŠãªå€æŽãåé¿ããããšã¯ããšã³ãžãã¢ãªã³ã°ã®åãçµã¿ã«ãšã£ãŠå¿ èŠã§ãããéèŠã§ãã 人ã ããã®æèã§å€åãèšããšãã圌ãã¯å®éã«ã¯_ããè¯ãæ¹åãžã®å€å_ãæå³ããããã¯ãã®æå³ãããçµè«ãžã®åæãå°ã_è°è«_ã§å¹æçã«äŒããŸãã
_ãã ããªãã®å¿ãéããŠãã ããïŒ_é åã¯èª¬åŸåããããŸããã ç®èãªããšã«ãããã¯ã»ãšãã©ã®ããã°ã©ããŒãå€ããŠäžæ Œå¥œã ãšèŠãªããŠããããšã_æ°ããæ¹åããã_ãšèšãããšããŸãã
Goã³ãã¥ããã£ã以åã®éã¡ã«ã€ããŠè©±ãåãå€ãã®ææ¡ãè°è«ããããŸãã ããããGoã¯åãªãããã°ã©ãã³ã°èšèªã§ãããšããªããèšããšããç§ã¯ããªãã«åæããŸãã ããã¯å²ç¢ã®ãŠã§ããµã€ããä»ã®å Žæã§ããèšã£ãŠããŸãããããŠç§ã¯ããã確èªããäœäººãã®äººã ã«ã話ããŸããã
ç§ã¯ãå²ç¢ã³ãã¥ããã£ã®å€ãããããèªåãã¡ã®å®æã®ããã«èŠãŠãããééããå€ãããèªãããããããšãåãå ¥ããŠããªãããšãç¥ããŸããã
Goã¯åŠè¡ç 究ã«åºã¥ããŠããŸãã å人çãªæèŠã¯é¢ä¿ãããŸããã
Microsoftã®CïŒã³ã³ãã€ã©ã®äž»èŠãªéçºè ã§ããã_exceptions_ã¯ãšã©ãŒã管çããããã®æªãæ¹æ³ã§ãããšå ¬ã«èªããŠããŸãããGo / Rustã¢ãã«ãããè¯ã代æ¿æ段ãšããŠè³è³ããŠããŸãïŒ http ïŒ
確ãã«ãGoã®ãšã©ãŒã¢ãã«ãæ¹åããäœå°ã¯ãããŸãããããã€ãã®çãããå©ç¹ãšåŒãæãã«éåžžã«è€éã«ãªãã ããªã®ã§ãäŸå€ã®ãããªãœãªã¥ãŒã·ã§ã³ãæ¡çšããããšã¯ã§ããŸããã
@ Dr-ã²ã©ãèšäºãããããšãã
ããããGoLangãã¢ã«ãããã¯èšèªãšããŠèšåããŠãããšããã¯ã©ãã«ãèŠã€ãããŸããã§ããã
ãšããã§ãç§ã®ãã€ã³ããæ確ã«ããããã«ããã®äŸã§ã¯
func Execute() error {
err := Operation1()
if err!=nil{
return err
}
err = Operation2()
if err!=nil{
return err
}
err = Operation3()
if err!=nil{
return err
}
err = Operation4()
return err
}
次ã®ããã«CïŒã§äŸå€åŠçãå®è£ ããã®ãšäŒŒãŠããŸãã
public void Execute()
{
try
{
Operation1();
}
catch (Exception)
{
throw;
}
try
{
Operation2();
}
catch (Exception)
{
throw;
}
try
{
Operation3();
}
catch (Exception)
{
throw;
}
try
{
Operation4();
}
catch (Exception)
{
throw;
}
}
ããã¯CïŒã§ã®äŸå€åŠçã®ã²ã©ãæ¹æ³ã§ã¯ãããŸãããïŒ ç§ã®çãã¯ã€ãšã¹ã§ããç§ã¯ããªãã®ããšãç¥ããŸããïŒ Goã§ã¯ä»ã«éžæè¢ã¯ãããŸããã ããã¯ãã®ã²ã©ãéžæãŸãã¯é«ééè·¯ã§ãã ãããGOã®ç¶æ³ã§ãããç§ã«ã¯éžæã®äœå°ããããŸããã
ã¡ãªã¿ã«ãããªããå ±æããèšäºã§ãè¿°ã¹ãããã«ãã©ã®èšèªã§ãè¿œå ã®æ§æãå¿ èŠãšããã«Goã®ãããªãšã©ãŒåŠçãå®è£ ã§ãããããGoã¯å®éã«ã¯é©æ°çãªãšã©ãŒåŠçæ¹æ³ãå®è£ ããŠããŸããã ãšã©ãŒåŠçã®æ¹æ³ããªãããããšã©ãŒåŠçã«Ifã¹ããŒãã¡ã³ãã䜿çšããããã«å¶éãããŠããŸãã
ãšããã§ãGOã«ã¯æšå¥šãããŠããªãPanic, Recover , Defer
ããããããã¯Try Catch Finally
ã«äŒŒãŠããŸãããç§ã®å人çãªæèŠã§ã¯ã Try Catch Finally
æ§æã¯ãäŸå€åŠçã®ããã¯ãªãŒã³ã§æŽçãããæ¹æ³ã§ãã
@ Dr-ã²ã©ã
ãŸããããããã§ãã¯ããŠãã ããïŒ
https://github.com/manucorporat/try
@KamyarM ã圌ã¯GoãåŠè¡èšèªã§ãããšã¯èšããŸããã§ããã圌ã¯ãããåŠè¡ç 究ã«åºã¥ããŠãããšèšããŸããã Goã«é¢ããèšäºããããŸããã§ããããGoãæ¡çšãããšã©ãŒåŠçãã©ãã€ã ã調æ»ããŠããŸãã
manucorporat/try
ãé©åã§ããããšãããã£ãå Žåã¯ãã³ãŒãã§äœ¿çšããŠãã ããã ãã ããèšèªèªäœã«try/catch
ãè¿œå ããã³ã¹ãïŒããã©ãŒãã³ã¹ãèšèªã®è€éããªã©ïŒã¯ããã¬ãŒããªãã®äŸ¡å€ããããŸããã
@KamyarM
ããªãã®äŸã¯æ£ç¢ºã§ã¯ãããŸããã ã®ä»£æ¿
err := Operation1()
if err!=nil {
return err
}
err = Operation2()
if err!=nil{
return err
}
err = Operation3()
if err!=nil{
return err
}
return Operation4()
ã«ãªããŸã
Operation1();
Operation2();
Operation3();
Operation4();
ãã®äŸã§ã¯ãäŸå€åŠçã®æ¹ãã¯ããã«åªããŠããããã§ãã çè«çã«ã¯è¯ãã¯ãã§ãããå®éã«ã¯
ãšã³ããã€ã³ãã§çºçãããšã©ãŒããšã«ãæ£ç¢ºãªãšã©ãŒã¡ãã»ãŒãžãè¿ä¿¡ããå¿
èŠããããŸãã
Goã®ã¢ããªã±ãŒã·ã§ã³å
šäœã¯éåžž50ïŒ
ã®ãšã©ãŒåŠçã§ãã
err := Operation1()
if err!=nil {
log.Print("input error", err)
fmt.Fprintf(w,"invalid input")
w.WriteHeader(http.StatusBadRequest)
return
}
err = Operation2()
if err!=nil{
log.Print("controller error", err)
fmt.Fprintf(w,"operation has no meaning in this context")
w.WriteHeader(http.StatusBadRequest)
return
}
err = Operation3()
if err!=nil{
log.Print("database error", err)
fmt.Fprintf(w,"unable to access database, try again later")
w.WriteHeader(http.StatusServiceUnavailable)
return
}
ãããŠããã人ã ããã£ãããè©Šã¿ããããªåŒ·åãªããŒã«ãæã£ãŠãããªããç§ã¯åœŒãã泚ææ·±ããšã©ãŒåŠçãæ¯æããŠããã䜿ãããããš100ïŒ ç¢ºä¿¡ããŠããŸãã
ã¢ã«ããã¢ãèšåãããŠããã®ã¯èå³æ·±ãã§ãããå²ç¢ã¯å®éã®çµéšããåŠãã æèšã®éãŸãã§ãã 誀ã£ããšã©ãŒã¡ãã»ãŒãžãè¿ãäžæ£ãªAPIãäœæããããšãç®æšã§ããå Žåã¯ãäŸå€åŠçãæé©ã§ãã
ãã ãããªã¯ãšã¹ãã«äžæ£ãªåœ¢åŒã®JSON request body
ãå«ãŸããŠããå Žåã invalid HTTP header
ãšã©ãŒã¯çºçããŸãããäŸå€åŠçã¯ã䜿çšããC ++ããã³CïŒAPIã§ãããå®çŸããéæ³ã®çºå°ãšå¿ãã®ãã¿ã³ã§ãã圌ãã
APIã«ãã¬ããžã倧ããå Žåãæå³ã®ãããšã©ãŒåŠçãå®çŸããã®ã«ååãªãšã©ãŒã³ã³ããã¹ããæäŸããããšã¯äžå¯èœã§ãã ããã¯ãåªããã¢ããªã±ãŒã·ã§ã³ã¯Goã§50ïŒ ã®ãšã©ãŒåŠçã§ããããšã©ãŒãåŠçããããã«éããŒã«ã«å¶åŸ¡è»¢éãå¿ èŠãšããèšèªã§ã¯90ïŒ ã§ããå¿ èŠãããããã§ãã
@gladkikhartem
ããªããèšåããå¥ã®æ¹æ³ã¯ãCïŒã§ã³ãŒããæžãæ£ããæ¹æ³ã§ãã ããã¯ããã4è¡ã®ã³ãŒãã§ãããæ£åžžãªå®è¡ãã¹ã瀺ããŠããŸãã ãããã®if err!=nil
ãã€ãºã¯ãããŸããã äŸå€ãçºçããå Žåããããã®äŸå€ãåŠçããé¢æ°ã¯Try Catch Finally
ã䜿çšããŠãããåŠçã§ããŸãïŒåãé¢æ°èªäœããŸãã¯åŒã³åºãå
ã®åŒã³åºãå
ãŸãã¯åŒã³åºãå
ããŸãã¯åŒã³åºãå
ã®åŒã³åºãå
ã®åŒã³åºãå
ã®åŒã³åºãå
ã§ããå¯èœæ§ããããŸãïŒ ...ãŸãã¯ãã¢ããªã±ãŒã·ã§ã³ã§æªåŠçã®ãã¹ãŠã®ãšã©ãŒãåŠçããã€ãã³ããã³ãã©ãŒãããã°ã©ããŒã«ã¯ããŸããŸãªéžæè¢ããããŸããïŒ
err := Operation1()
if err!=nil {
log.Print("input error", err)
fmt.Fprintf(w,"invalid input")
w.WriteHeader(http.StatusBadRequest)
return
}
err = Operation2()
if err!=nil{
log.Print("controller error", err)
fmt.Fprintf(w,"operation has no meaning in this context")
w.WriteHeader(http.StatusBadRequest)
return
}
err = Operation3()
if err!=nil{
log.Print("database error", err)
fmt.Fprintf(w,"unable to access database, try again later")
w.WriteHeader(http.StatusServiceUnavailable)
return
}
ã·ã³ãã«ã«èŠããŸãããããã¯ããªãããŒãªãã®ã§ãã ãããããã·ã¹ãã ãšã©ãŒããŠãŒã¶ãŒãšã©ãŒïŒæåã®æå³ãæã£ãŠããªãå¯èœæ§ã®ãããŠãŒã¶ãŒã«å éšç¶æ ããªãŒã¯ããããšãªãïŒãããã³HTTPã³ãŒããå«ãã«ã¹ã¿ã ãšã©ãŒã¿ã€ãããŸãšããããšãã§ããŸãã
func Chdir(dir string) error {
if e := syscall.Chdir(dir); e != nil {
return &PathError{"chdir", dir, e}
}
return nil
}
ãããããããè©ŠããŠã¿ãŠãã ãã
func Chdir(dir string) error {
return syscall.Chdir(dir) ? &PathError{"chdir", dir, err}:nil;
}
func Chdir(dir string) error {
return syscall.Chdir(dir) ? &PathError{"chdir", dir, err};
}
md5-9bcd2745464e8d9597cba6d80c3dcf40
```go
func Chdir(dir string) error {
n , _ := syscall.Chdir(dir):
// something to do
fmt.Println(n)
}
ãããã®ãã¹ãŠã«ã¯ãèªè
ã«ãšã£ãŠç©äºãåçŽåããªããããçš®ã®æçœã§ãªãéæ³ãå«ãŸããŠããŸãã åã®2ã€ã®äŸã§ã¯ã err
ã¯ãããçš®ã®ç䌌ããŒã¯ãŒããŸãã¯èªçºçã«çºçããå€æ°ã«ãªããŸãã åŸè
ã®2ã€ã®äŸã§ã¯ã :
æŒç®åãäœãããŠããã®ãããŸã£ããããããŸããããšã©ãŒã¯èªåçã«è¿ãããŸããïŒ ãªãã¬ãŒã¿ãŒã®RHSã¯åäžã®ã¹ããŒãã¡ã³ãã§ããããããšããããã¯ã§ããïŒ
FWIWã return newPathErr("chdir", dir, syscall.Chdir(dir))
ãå®è¡ã§ããããã«ã©ãããŒé¢æ°ãèšè¿°ãã3çªç®ã®ãã©ã¡ãŒã¿ãŒãnilã®å Žåã¯èªåçã«nilãšã©ãŒãè¿ããŸãã :-)
IMOãç§ãèŠãäžã§æé«ã®ææ¡ã¯ïŒ21732ã«ãç°¡çŽ åãšã©ãŒãŽãŒã§ã®åãæ±ãããšãè¿œå ã®ã³ã³ããã¹ãæ å ±ãšãšã©ãŒãè¿ãã@mrkaspaããããã®ç®æšãéæããã«ã¯ïŒ
a, b, err? := f1()
ããã«æ¡åŒµããŸãïŒ
if err != nil { return nil, errors.Wrap(err, "failed") }
ãããŠç§ã¯ããã§ããããããã¯ã«ãããããšãã§ããŸãïŒ
a, b, err! := f1()
ããã«æ¡åŒµããŸãïŒ
if err != nil { panic(errors.Wrap(err, "failed")) }
ããã«ãããäžäœäºææ§ãç¶æãããgoã§ã®ãšã©ãŒåŠçã®ãã¹ãŠã®åé¡ç¹ãä¿®æ£ãããŸãã
ããã¯ããŒã以å€ã®å€ããšã©ãŒãè¿ãbufioé¢æ°ã®ãããªã±ãŒã¹ã«ã¯å¯Ÿå¿ããŠããŸããããä»ã®æ»ãå€ãæ°ã«ãªãå Žåã¯ãæ瀺çãªãšã©ãŒåŠçãè¡ã£ãŠãåé¡ãªããšæããŸãã ãããŠãã¡ããããšã©ãŒä»¥å€ã®æ»ãå€ã¯ããã®ã¿ã€ãã«é©åãªnilå€ã§ããå¿ èŠããããŸãã
ïŒ ä¿®é£Ÿåã¯ãé¢æ°ãšïŒã®ãã€ã©ãŒãã¬ãŒããšã©ãŒã®åãæž¡ããæžãããŸãã 修食åã¯ãassertãäžéšã®ã¡ã€ã³é¢æ°ãªã©ã®ä»ã®èšèªã§äœ¿çšãããå Žæã§ãåãããšãè¡ããŸãã
ãã®ãœãªã¥ãŒã·ã§ã³ã«ã¯ãéåžžã«ã·ã³ãã«ã§ããããããªããšããå©ç¹ããããŸããããã®ææ¡æžã«èšèŒãããŠããèŠä»¶ãæºãããŠãããšæããŸãã
ããªããæã£ãŠããå Žå...
func foo() (int, int, error) {
a, b, err? := f1()
return a, b, nil
}
func bar() (int, error) {
a, b, err? := foo()
return a+b, nil
}
foo
ã§åé¡ãçºçããå Žåã bar
ã®åŒã³åºããµã€ãã§ããšã©ãŒã¯æå³ãè¿œå ããã«åãããã¹ãã§äºéã«ã©ãããããŸãã å°ãªããšããç§ã¯ææ¡ã®errors.Wrap
éšåã«å察ããŸãã
ããããããã«æ¡å€§ãããšãããã®æåŸ ãããçµæã¯äœã§ããïŒ
func baz() (a, b int, err error) {
a = 1
b = 2
a, b, err? = f1()
return
a
ãšb
ã¯nilå€ã«åå²ãåœãŠãããŸããïŒ ãããããªããããã¯éæ³ã§ãããé¿ããã¹ãã ãšç§ã¯æããŠããŸãã 圌ãã¯ä»¥åã«å²ãåœãŠãããå€ãå®è¡ããŸããïŒ ïŒç§ã¯ååä»ãã®æ»ãå€ãèªåã§æ°ã«ããŸããããããã§ããã®ææ¡ã®ç®çã®ããã«èæ
®ããå¿
èŠããããŸããïŒ
@ dup2Xãããèšèªãåé€ããŸããããããã¯ãã£ãšããããã¹ãã§ã
@ object88ãšã©ãŒãçºçããå Žåãä»ã®ãã¹ãŠã
ã©ããã³ã°ã«é¢ããŠã¯ãããã©ã«ãã®ã¡ãã»ãŒãžã¯äœã圹ã«ç«ããªããšæããŸãã ãšã©ãŒãé£éãããã ãã§ãåé¡ãããŸããã äŸå€ã«å éšäŸå€ãããå Žåã®ããã«ã ã©ã€ãã©ãªã®å¥¥æ·±ãã§ãšã©ãŒããããã°ããã®ã«éåžžã«äŸ¿å©ã§ãã
æ¬æãè¡šããŠãç§ã¯åæããŸããã@ crekerã ãã®ã·ããªãªã®äŸã¯ãnil以å€ã®ãšã©ãŒã®å Žåã§ããnil以å€ã®æ»ãå€ã®Go stdlibã«ãããå®éã«ã¯ã bufio.Reader
æ§é äœã®ããã€ãã®é¢æ°ã®ããã«æ©èœããŸãã ç§ãã¡Goããã°ã©ããŒã¯ããã¹ãŠã®ãšã©ãŒããã§ãã¯/åŠçããããšãç©æ¥µçã«å¥šå±ãããŠããŸãã nil以å€ã®æ»ãå€ãšãšã©ãŒãååŸãããããããšã©ãŒãç¡èŠããæ¹ãã²ã©ãæããããŸãã åŒçšããå Žåãnilsãè¿ãããšã©ãŒããã§ãã¯ããªããšãç¡å¹ãªå€ãæäœããŠããå¯èœæ§ããããŸãã
ããããããã¯ããŠããããããããå°ã調ã¹ãŠã¿ãŸãããã ?
æŒç®åã®ã»ãã³ãã£ã¯ã¹ã¯äœã§ããããïŒ error
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããåã«ã®ã¿é©çšã§ããŸããïŒ ä»ã®ã¿ã€ãã«é©çšããããåŒæ°ãè¿ãããã§ããŸããïŒ ãšã©ãŒãå®è£
ããªãåã«é©çšã§ããå Žåãnil以å€ã®å€/ãã€ã³ã¿ãŒã«ãã£ãŠããªã¬ãŒãããŸããïŒ ?
æŒç®åãè€æ°ã®æ»ãå€ã«é©çšã§ããŸããããããšãã³ã³ãã€ã©ãšã©ãŒã§ããïŒ
@erwbgy
æçšãªãã®ãæ·»ä»ããã«ãšã©ãŒãè¿ãããå Žåã¯ãã³ã³ãã€ã©ã«ãã¹ãŠã®æªåŠçã®ãšã©ãŒããif errïŒ= nilreturn ...ããšããŠåŠçããããã«æ瀺ããæ¹ãã¯ããã«ç°¡åã§ãã次ã«äŸã瀺ããŸãã
func doStuff() error {
doAnotherStuff() // returns error
}
func doStuff() error {
res := doAnotherStuff() // returns string, error
}
ãããŠãè¿œå ã®çæ°ã®å¿ èŠã¯ãããŸãããïŒ ãã®å Žåã®èšå·ã
@ object88
ããã«ç€ºãããŠãããšã©ãŒã©ããã³ã°ã®ææ¡ã®ã»ãšãã©ãå®éã®ã³ãŒãã«é©çšããããšããŸãããã1ã€ã®å€§ããªåé¡ã«çŽé¢ããŸãããã³ãŒããå¯éããããŠãå€èªã§ããªããªããŸãã
ã³ãŒãã®é«ããåªå
ããŠãã³ãŒãã®å¹
ãç ç²ã«ããã ãã§ãã
errïŒ= nilã®å Žåããšã©ãŒãéåžžã§ã©ããã³ã°ãããšãå®éã«ã¯èªã¿ãããããããã«ã³ãŒããæ¡æ£ã§ããããããšã©ãŒã©ããã³ã°ã®ããã«äœãå€æŽããå¿
èŠã¯ãªããšæããŸãã
@ object88
ãµã€ããäœæããå Žåãnilsãè¿ãããšã©ãŒããã§ãã¯ããªããšãç¡å¹ãªå€ã§æäœããŠããå¯èœæ§ããããŸãã
ããããããã¯ãnilã®ãããã¯ã®ãããªæçœã§èŠã€ãããããšã©ãŒãçæããŸãã ãšã©ãŒæã«æå³ã®ããå€ãè¿ãå¿ èŠãããå Žåã¯ãæ瀺çã«ãããè¡ãããã®å Žåã«äœ¿çšã§ããå€ãæ£ç¢ºã«ææžåããå¿ èŠããããŸãã ãšã©ãŒæã«ããŸããŸå€æ°ã«å«ãŸããŠããã©ã³ãã ãªãã®ãè¿ãã ãã§ã¯å±éºã§ããã埮åŠãªãšã©ãŒã«ã€ãªãããŸãã ç¹°ãè¿ããŸãããããããã¯äœãåŸãããŸããã
@gladkikhartem if errïŒ= nilã®åé¡ã¯ãå®éã®ããžãã¯ãå®å šã«å€±ãããããšã§ããã³ãŒããæåãããã¹ã§äœãããã®ããç解ãããšã©ãŒåŠçãæ°ã«ããªãå Žåã¯ãç©æ¥µçã«æ€çŽ¢ããå¿ èŠããããŸãã ã å®éã®ã³ãŒããæ°è¡ããããã以å€ã¯ãã¹ãŠãšã©ãŒãã§ãã¯ã§ããCã³ãŒããããããèªãã§ãããããªãã®ã«ãªããŸãã 人ã ã¯ããã®ãã¹ãŠãã©ããããŠé¢æ°ã®æåŸã«ç§»åãããã¯ãã«é ŒãããšãããããŸãã
é©åã«èšè¿°ãããã³ãŒãã§ããžãã¯ãã©ã®ããã«å¯éããããã®ãããããŸããã ããã¯è«çã§ãã ã³ãŒãã®ãã¹ãŠã®è¡ã«ã¯ãæ°ã«ãªãå®éã®ã³ãŒããå«ãŸããŠããŸãã ããªããæãŸãªãã®ã¯ããã€ã©ãŒãã¬ãŒãã®ç·ãšç·ãééããããšã§ãã ã³ã¡ã³ãã䜿çšããããã圹ç«ã€å Žåã¯ã³ãŒãããããã¯ã«åå²ããŸãã ããããããã¯èšèªã§ã¯ãªãå®éã®ã³ãŒãã®åé¡ã®ããã«èãããŸãã
åãã©ãŒãããããªãå Žåãããã¯éã³å Žã§æ©èœããŸãã
a, b, err := Frob("one string"); if err != nil { return a, b, fmt.Errorf("couldn't frob: %v", err) }
// continue doing stuff with a and b
ãããã£ãŠãå ã®ææ¡ãããã³äžèšã®ä»ã®å€ãã®ææ¡ã¯ããããã®100æåã®æ確ãªçç¥æ§æãèãåºããgofmtãæ¹è¡ã®è¿œå ãš3è¡ã«ããããããã¯ã®åãã©ãŒãããã䞻匵ããã®ãæ¢ããããšããŠããããã§ãã
ããã§ãgofmtãå€æŽããŠãè€æ°è¡ã®ãããã¯ã䞻匵ããã®ããããäžã®è¡ããå§ããŠããããããçããããæ確ã«ããæ¹æ³ãèãåºãããšãæ³åããŠã¿ãŸãããã
ã»ãã³ãã³ã®åã®éšåïŒå²ãåœãŠïŒãå€æŽããŠã69æåãåæžããå¿ èŠã¯ãªããšæããŸãã ãããã®ãã¡ã49ã¯returnã¹ããŒãã¡ã³ããè¿ãããå€ãããã³ãšã©ãŒã©ããã³ã°ã§ããããã®æ§æãå€æŽããããšã«ã¯ããŸã䟡å€ããããŸããïŒããšãã°ãreturnã¹ããŒãã¡ã³ãããªãã·ã§ã³ã«ããããšã§ããŠãŒã¶ãŒãæ··ä¹±ãããŸãïŒã
ãã®ãããã¢ã³ããŒã¹ã³ã¢ãã³ãŒãã®ãã£ã³ã¯ãè¡šã; if err != nil { _ }
çç¥åœ¢ãèŠã€ããããšãã§ããŸãã nilã®æ¯èŒãå€å°èŠããªããªã£ããšããŠããããããããããããã«ãçç¥åœ¢ã«ã¯æ瀺çã«err
ãå«ããå¿
èŠããããšæããŸãããã®ããã ; if _ != nil { _ }
çç¥åœ¢ãèãåºãå¿
èŠããããŸãã
å°ãã®éã1ã€ã®æåã䜿çšããããšãæ³åããŠã¿ãŠãã ããã ãã®ãã£ã©ã¯ã¿ãŒãäœã§ããããã¬ãŒã¹ãã«ããŒãšããŠÂ§ãéžæããŸãã ãã®å Žåãã³ãŒãã®è¡ã¯æ¬¡ã®ããã«ãªããŸãã
a, b, err := Frob("one string") § err return a, b, fmt.Errorf("couldn't frob: %v", err)
æ¢åã®ä»£å ¥æ§æãæ»ãæ§æãå€æŽããããç®ã«èŠããªãéæ³ãçºçããããããã«ããããããã¯ããã«åªããæ¹æ³ãããããŸããã ïŒerrãšnilãæ¯èŒããŠãããšããäºå®ãããã«ã¯ããããªããšããç¹ã§ããŸã ããã€ãã®éæ³ããããŸããïŒ
ããã¯88æåã§ã100æåã®è¡ã«åèš12æåãç¯çŽã§ããŸãã
ã ããç§ã®è³ªåã¯ïŒããã¯æ¬åœã«ãããããããã®ãââïŒ
ç·šéïŒç§ã®ãã€ã³ãã¯ã人ã
ãGoã®if err != nil
ãããã¯ãèŠãŠãããã®ãããããåãé€ãããšãã§ããã°ããã®ã«ããšèšããšãã圌ãã話ããŠããããšã®80ã90ïŒ
ã¯ããªããæ¬è³ªçã«æã£ãŠãããã®ã ãšæããŸããšã©ãŒãåŠçããããã«è¡ãããš_ã Goã®æ§æã«ãã£ãŠåŒãèµ·ããããå®éã®ãªãŒããŒãããã¯æå°éã§ãã
@lpar ãããªãã¯ç§ãäžã§é©çšããã®ãšã»ãšãã©åãè«çã«åŸã£ãŠããã®ã§ãåœç¶ç§ã¯ããªãã®æšè«ã«åæããŸãã ããããç§ã¯ããªãããã¹ãŠã®ãšã©ãŒãå³ã«çœ®ãããšã®èŠèŠçãªé åã軜èŠããŠãããšæããŸãïŒ
a, b := Frob("one string") § err { return ... }
åãªãæåæ°ã®åæžãè¶ ããèŠå ã§èªã¿ããããªããŸãã
@lparã»ãšãã©åœ¹ã«ç«ããªãfmt.Errorf
ãåé€ããreturnãç¹å¥ãªæ§æã«å€æŽããåŒã³åºãã¹ã¿ãã¯ããšã©ãŒã«å°å
¥ããŠãå®éã®ã³ã³ããã¹ããæã¡ãåãªãæ å
ã®æååã§ã¯ãªãå Žåã¯ãããã«å€ãã®æåãç¯çŽã§ããŸãã ããã¯ããªãã«ãã®ãããªãã®ãæ®ãã§ããã
a, b, err? := Frob("one string")
ç§ã«ãšã£ãŠã®Goãšã©ãŒã®åé¡ã¯ãåžžã«ã³ã³ããã¹ãã®æ¬ åŠã§ããã æååãè¿ãããæãè¿ãããããããšã¯ããšã©ãŒãå®éã«çºçããå Žæãç¹å®ããã®ã«ãŸã£ãã圹ç«ã¡ãŸããã ãã®ãããããšãã°github.com/pkg/errors
ã¯ç§ã«ãšã£ãŠå¿
é ã«ãªããŸããã ãã®ãããªãšã©ãŒã§ã¯ãGoãšã©ãŒåŠçã®åçŽãã®å©ç¹ãšãã³ã³ããã¹ããå®å
šã«ãã£ããã£ããŠé害ã®æ£ç¢ºãªå ŽæãèŠã€ããããšãã§ããäŸå€ã®å©ç¹ãåŸãããŸãã
ãŸããäŸããã®ãŸãŸäœ¿çšããŠãããšã©ãŒåŠçãå³åŽã«ãããšããäºå®ã¯ãèªã¿ããããå€§å¹ ã«åäžãããŸãã ã³ãŒãã®å®éã®æå³ãç解ããããã«ããã€ã©ãŒãã¬ãŒãã®æ°è¡ãã¹ãããããå¿ èŠããªããªããŸããã ãšã©ãŒåŠçã®éèŠæ§ã«ã€ããŠããªããæãããšãèšãããšãã§ããŸããããããç解ããããã«ã³ãŒããèªããšããç§ã¯ãšã©ãŒãæ°ã«ããŸããã ç§ã«å¿ èŠãªã®ã¯æåããéã§ãã ãããŠãç§ããšã©ãŒãå¿ èŠãšãããšããç§ã¯ããããå ·äœçã«æ¢ããŸãã ãšã©ãŒã¯ããã®æ§è³ªäžãäŸå€çãªã±ãŒã¹ã§ãããå¯èœãªéãã¹ããŒã¹ããšããªãããã«ããå¿ èŠããããŸãã
fmt.Errorf
ãerrors.Wrap
ãšæ¯èŒããŠã圹ã«ç«ããªãããã©ãããšããåé¡ã¯ãã©ã¡ããã»ãŒåãããã«åé·ã§ããããããã®åé¡ãšçŽäº€ããŠãããšæããŸãã ïŒå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã©ã¡ãã䜿çšããŠããŸããããšã©ãŒãšãšã©ãŒãçºçããã³ãŒãè¡ããã°ã«èšé²ããä»ã®äœãã䜿çšããŠããŸããïŒ
ã§ãããããšã©ãŒåŠçãå³åŽã«ããããšãæ¬åœã«æ°ã«å ¥ã£ãŠãã人ããããšæããŸãã PerlãšRubyã®ããã¯ã°ã©ãŠã³ãããæ¥ããšããŠããç§ã¯ããã»ã©ç¢ºä¿¡ããŠããŸããã
@lparã³ãŒã«ã¹ã¿ãã¯ãèªåçã«ãã£ããã£ããããã errors.Wrap
ã䜿çšããŸããããããã¹ãŠã®ãšã©ãŒã¡ãã»ãŒãžã¯å®éã«ã¯å¿
èŠãããŸããã ç§ã¯ãããèµ·ãã£ãå Žæãšãããããããšã©ãŒãçæããé¢æ°ã«ã©ã®åŒæ°ãæž¡ããããããã£ãšæ°ã«ããŸãã ããªãã¯ããªããåããããªããšãããŠãããšããèšã£ãŠããŸã-ããªãã®ãšã©ãŒã¡ãã»ãŒãžã«ããã€ãã®æèãæäŸããããã«ã³ãŒãã®è¡ãèšé²ããŠãã ããã ãšã©ãŒã«ã³ã³ããã¹ããäžããªãããã€ã©ãŒãã¬ãŒããæžããæ¹æ³ãèããããšãã§ãããšãããšïŒããã¯ã»ãšãã©ããã§ã®ææ¡ã§ãïŒã
ãšã©ãŒã¯å³åŽã«ãããŸãã ç§ã«ãšã£ãŠãããã¯åã«å Žæã«ã€ããŠã§ã¯ãªãããšã©ãŒåŠçãæ£ãã°ã£ãŠããã³ãŒããèªãããã«å¿ èŠãªèªç¥çè² è·ãæžããããšã«ã€ããŠã§ãã ãšã©ãŒãéåžžã«éèŠã§ããããããšã©ãŒãšåããããå€ãã®ã¹ããŒã¹ã䜿çšããŠã»ãããšããè°è«ã¯è²·ããŸããã ç§ã¯å®éã«åœŒããã§ããã ãé¢ããããšãæãã§ããŸãã ãããã¯ã¡ã€ã³ã¹ããŒãªãŒã§ã¯ãããŸããã
@creker
ããã¯ããŠãŒã¶ãŒå ¥åã®èª€ããåå ã§ãšã©ãŒãçæããæ¬çªã·ã¹ãã ã®ãšã©ãŒããããäºçŽ°ãªéçºè ãšã©ãŒã説æããŠããå¯èœæ§ãé«ããªããŸãã ãšã©ãŒãç¹å®ããããã«å¿ èŠãªã®ãè¡çªå·ãšãã¡ã€ã«ãã¹ã ãã§ããå Žåã¯ãã³ãŒããèšè¿°ããã ãã§ãäœãåé¡ãªã®ãããã§ã«ç¥ã£ãŠããå¯èœæ§ããããŸãã
@äŸå€ã«äŒŒãŠããããã ã»ãšãã©ã®å Žåãã³ãŒã«ã¹ã¿ãã¯ãšäŸå€ã¡ãã»ãŒãžã§å Žæãç¹å®ãããšã©ãŒãçºçããå Žæãç¹å®ã§ããŸãã ããè€éãªã±ãŒã¹ã§ã¯ãå°ãªããšããšã©ãŒãçºçããå Žæãç¥ã£ãŠããŸãã äŸå€ã¯ãããã©ã«ãã§ãã®å©ç¹ãæäŸããŸãã Goã䜿çšãããšãåºæ¬çã«ã³ãŒã«ã¹ã¿ãã¯ããšãã¥ã¬ãŒãããŠãšã©ãŒãé£éãããããå®éã®ã³ãŒã«ã¹ã¿ãã¯ãå«ããå¿ èŠããããŸãã
é©åã«èšè¿°ãããã³ãŒãã§ã¯ããšã©ãŒãäºæ³ããããããã»ãšãã©ã®å Žåãè¡çªå·ãšãã¡ã€ã«ãã¹ããæ£ç¢ºãªåå ãããããŸãã ããªãã¯å®éã«ãããèµ·ãããããããªãæºåã®ããã«ããã€ãã®ã³ãŒããæžããŸããã äºæããªãããšãèµ·ãã£ãå Žåã¯ãããã§ããã³ãŒã«ã¹ã¿ãã¯ã¯åå ãç¹å®ããŸããããæ€çŽ¢ã¹ããŒã¹ãå€§å¹ ã«åæžããŸãã
@ãªã®ã§
ç§ã®çµéšã§ã¯ããŠãŒã¶ãŒå ¥åãšã©ãŒã¯ã»ãŒå³åº§ã«åŠçãããŸãã å®éã«åé¡ãšãªãæ¬çªãšã©ãŒã¯ã³ãŒãã®å¥¥æ·±ãã§çºçãïŒããšãã°ããµãŒãã¹ãããŠã³ããŠå¥ã®ãµãŒãã¹ããšã©ãŒãã¹ããŒããïŒãé©åãªã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã 䟡å€ã®ããããšãšããŠãJavaã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãã¡ãã»ãŒãžã§ã¯ãªããæ¬çªç°å¢ã®åé¡ããããã°ãããšãã«éåžžã«åœ¹ç«ã¡ãŸãã
@creker
ãšã©ãŒã¯åãªãå€ã§ãããé¢æ°ã®å
¥åãšåºåã®äžéšã§ãã 圌ãã¯ãäºæãã¬ãããšã¯ã§ããŸããã§ããã
é¢æ°ããšã©ãŒãåºããçç±ãç¥ãããå Žåã¯ããã¹ãããã®ã³ã°ãªã©ã䜿çšããŠãã ãã...
@gladkikhartemçŸå®ã®äžçã§ã¯ãããã»ã©åçŽã§ã¯ãããŸããã ã¯ããé¢æ°ã·ã°ããã£ã«æ»ãå€ãšããŠãšã©ãŒãå«ãŸããŠãããšããæå³ã§ãšã©ãŒãçºçããããšãäºæ³ãããŸãã ããããç§ãæåŸ ããããšã¯ããããèµ·ãã£ãçç±ãšãããåŒãèµ·ãããåå ãæ£ç¢ºã«ç¥ã£ãŠããããšã§ãããããã£ãŠãå®éã«ã¯ããããä¿®æ£ãããããŸã£ããä¿®æ£ããªãããç¥ã£ãŠããŸãã æªããŠãŒã¶ãŒå ¥åã¯éåžžããšã©ãŒã¡ãã»ãŒãžãèŠãã ãã§ç°¡åã«ä¿®æ£ã§ããŸãã ãããã³ã«ãããã¡ã䜿çšããŠããŠãäžéšã®å¿ é ãã£ãŒã«ããèšå®ãããŠããªãå Žåããããã¯ãŒã¯äžã§åä¿¡ãããã¹ãŠã®ãã®ãé©åã«æ€èšŒããã°ãããã¯äºæ³ãããä¿®æ£ããã®ã¯éåžžã«ç°¡åã§ãã
ãã®æç¹ã§ãç§ã¯ãã¯ãç§ãã¡ãè°è«ããŠããããšãç解ããŠããŸããã é©åã«å®è£ ãããå Žåãã¹ã¿ãã¯ãã¬ãŒã¹ãŸãã¯ãšã©ãŒã¡ãã»ãŒãžã®ãã§ãŒã³ã¯éåžžã«äŒŒãŠããŸãã ãããã¯æ€çŽ¢ã¹ããŒã¹ãåæžãããšã©ãŒãåçŸããŠä¿®æ£ããããã®æçšãªã³ã³ããã¹ããæäŸããŸãã å¿ èŠãªã®ã¯ãååãªã³ã³ããã¹ããæäŸããªãããšã©ãŒåŠçãåçŽåããæ¹æ³ãèããããšã§ãã ç§ã¯æ±ºããŠãé©åãªæèãããåçŽããéèŠã§ãããšäž»åŒµããŠããããã§ã¯ãããŸããã
ãããJavaã®è°è«ã§ãâãã¹ãŠã®ãšã©ãŒã³ãŒããå¥ã®å Žæã«ç§»åããŠããããèŠãå¿ èŠããªãããã«ããŸãã ç§ã¯ããã誀ã£ãæ¹åã«é²ãã§ãããšæããŸãã ãããè¡ãããã®Javaã®ã¡ã«ããºã ãå€§å¹ ã«å€±æããã ãã§ãªããã³ãŒããèŠããšãããšã©ãŒãçºçãããšãã®Javaã®åäœã¯ããã¹ãŠãæ©èœãããšãã®åäœãšåããããéèŠã§ãã
誰ããã®è°è«ãããŠããŸããã ããã§èª¬æããŠããããšãããã¹ãŠã®ãšã©ãŒåŠçã1ãæã«ããäŸå€åŠçãšæ··åããªãããã«ããŸãããã ãããã倧倱æããšåŒã¶ã®ã¯åãªãæèŠã§ããããããã«ããŠãå²ç¢ãããã«æ»ãããšã¯ãªããšæããŸãã Goãšã©ãŒåŠçã¯ãŸã£ããç°ãªããæ¹åããããšãã§ããŸãã
@crekerç§ã¯åãããšãææããæå³ã®ãã/æçšãªãšã©ãŒã¡ãã»ãŒãžãšèŠãªããããã®ãæ確ã«ããããã«äŸé ŒããŸããã
çå®ã¯ãã³ãŒã«ã¹ã¿ãã¯ãšé¢æ°ã®åŒæ°ãšåŒãæãã«ãå¯å€å質ã®ãšã©ãŒã¡ãã»ãŒãžããã¹ãïŒéçºè
ããã®ç¬éã«ãã®ç¥èã§ãããæžããšãããã€ã¢ã¹ããããŸãïŒããã€ã§ãæäŸããããšã§ãã ãšã©ãŒã¡ãã»ãŒãžããã¹ãïŒ fmt.Errorf
ãŸãã¯errors.New
ïŒã䜿çšãããšãã³ãŒã«ã¹ã¿ãã¯/ããã¯ãã¬ãŒã¹ãèªã¿åããªããããœãŒã¹ã³ãŒãå
ã®ããã¹ããæ€çŽ¢ããããšã«ãªããŸãïŒããã¯äžèŠå«ãããŠããããã§ãçŸççç±ããã§ã¯ãªãããšãé¡ã£ãŠããŸãïŒãã¡ã€ã«/è¡çªå·ïŒ errors.Wrap
ãªã©ïŒã§çŽæ¥æ€çŽ¢ããããšã«å¯Ÿå¿ããŸãã
2ã€ã®ç°ãªãã¹ã¿ã€ã«ã§ãããç®çã¯åãã§ãããããã®æ¡ä»¶ã§å®è¡æã«äœãèµ·ãã£ãããé ã®äžã§åçŸããããšããããšã§ãã
ãã®ãããã¯ã«é¢ããŠãåé¡ïŒ19991ã¯ãæå³ã®ãããšã©ãŒãå®çŸ©ãã2çªç®ã®ã¹ã¿ã€ã«ãžã®ã¢ãããŒãã®æå¹ãªèŠçŽãäœæããŠããå¯èœæ§ããããŸãã
ãã¹ãŠã®ãšã©ãŒã³ãŒããå¥ã®å Žæã«ç§»åããŠããããèŠãå¿ èŠããªãããã«ããŸã
@lpar ããšã©ãŒåŠçãå³ã«ç§»åããããšã«ã€ããŠã®ç§ã®ãã€ã³ãã«å¿çããŠããå ŽåïŒè泚/ææ«è泚ïŒJavaïŒãšè泚ïŒç§ã®ææ¡ïŒã«ã¯å€§ããªéãããããŸãã ãµã€ãããŒãã¯ãã³ã³ããã¹ãã倱ãããšãªããããããªã¢ã€ã·ããã®ã¿ãå¿ èŠãšããŸãã
@ gdm85
ãœãŒã¹ã³ãŒãå ã®ããã¹ããæ€çŽ¢ããããšã«ãªããŸã
ã¹ã¿ãã¯ãã¬ãŒã¹ãšé£éãšã©ãŒã¡ãã»ãŒãžãé¡äŒŒããŠãããšããæå³ãšãŸã£ããåãã§ãã ã©ã¡ããããšã©ãŒãçºçãããŸã§ã®ãã¹ãèšé²ããŸãã ã¡ãã»ãŒãžã®å Žåã«ã®ã¿ãã¡ãã»ãŒãžãæžãã®ã«åå泚æããªããšãããã°ã©ã ã®ã©ãããã§ãéä¿¡ãããå¯èœæ§ã®ããå®å šã«åœ¹ã«ç«ããªãã¡ãã»ãŒãžã«ãªã£ãŠããŸãå¯èœæ§ããããŸãã é£éãšã©ãŒã®å¯äžã®å©ç¹ã¯ãå€æ°ã®å€ãèšé²ã§ããããšã§ãã ãããŠãããã§ãããé¢æ°ã®åŒæ°ãäžè¬çãªå€æ°ã®å Žåã«ã¯èªååã§ããå°ãªããšãç§ã«ãšã£ãŠã¯ããšã©ãŒããå¿ èŠãªã»ãšãã©ãã¹ãŠãã«ããŒããŸãã ãããã¯ãŸã å€ã§ãããå¿ èŠã«å¿ããŠãswitchããšå ¥åããããšãã§ããŸãã ããããããæç¹ã§ãããããã°ã«èšé²ããå¯èœæ§ããããã¹ã¿ãã¯ãã¬ãŒã¹ã衚瀺ã§ããããšã¯éåžžã«äŸ¿å©ã§ãã
Goããããã¯ã§äœãããããèŠãŠãã ããã ãã¹ãŠã®ãŽã«ãŒãã³ã®å®å šãªã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããŸãã ãšã©ãŒã®åå ãçªãæ¢ããŠããã«ä¿®æ£ããã®ã«äœå圹ç«ã£ããæãåºããŸããã ãããããã«ç°¡åã§ããããç§ã¯ãã°ãã°é©ããããŸããã ããã¯å®å šã«æµããèšèªå šäœãéåžžã«äºæž¬å¯èœã§ããããããã¬ãŒããå¿ èŠãããŸããã
Javaã«é¢é£ãããã¹ãŠã®ãã®ã«ã¯æ±åãããããã§ã人ã ã¯ãã°ãã°è°è«ãæã¡ãŸããã ããã¯æªãããã§ãã ç§ã¯Javaã®ãã¡ã³ã§ã¯ãããŸãããããã®ãããªæšè«ã¯èª°ã®å©ãã«ããªããŸããã
ç¹°ãè¿ããŸããããšã©ãŒã¯éçºè ããã°ãä¿®æ£ããããã®ãã®ã§ã¯ãããŸããã ããã¯ããšã©ãŒåŠçã®å©ç¹ã®1ã€ã§ãã Javaã®æ¹æ³ã¯ãããããšã©ãŒåŠçã§ãããããã§ã¯ãªãããšãéçºè ã«æããŠããŸããã ãšã©ãŒã¯ãã¢ããªã±ãŒã·ã§ã³å±€ãšãããè¶ ãããããŒå±€ã«ååšããå¯èœæ§ããããŸãã Goã®ãšã©ãŒã¯ãã·ã¹ãã ãå®è¡ãããªã«ããªæŠç¥ãå¶åŸ¡ããããã«æ¥åžžçã«äœ¿çšãããŸããã³ã³ãã€ã«æã§ã¯ãªããå®è¡æã«äœ¿çšãããŸãã
ããã¯ãèšèªãã¹ã¿ãã¯ã解ãã»ããããšã©ãŒãçºçããåã«è¡ã£ããã¹ãŠã®ã¡ã¢ãªã倱ãããšã«ãã£ãŠãšã©ãŒã®çµæãšããŠãããŒå¶åŸ¡ãç¡å¹ã«ããå Žåãç解ã§ããªãå¯èœæ§ããããŸãã ãšã©ãŒã¯ãGoã®å®è¡æã«å®éã«åœ¹ç«ã¡ãŸãã ãªãè¡çªå·ã®ãããªãã®ãéã¶å¿ èŠãããã®ãââããããŸãã-å®è¡äžã®ã³ãŒãã¯ãããã»ãšãã©æ°ã«ããŸããã
@ãªã®ã§
ç¹°ãè¿ããŸããããšã©ãŒã¯éçºè ããã°ãä¿®æ£ããããã®ãã®ã§ã¯ãããŸãã
ããã¯å®å šã«ãããŠå®å šã«ééã£ãŠããŸãã ãšã©ãŒã¯ãŸãã«ãã®çç±ã«ãããã®ã§ãã ãããã¯ããã«éå®ãããŸããããããã¯äž»ãªçšéã®1ã€ã§ãã ãšã©ãŒã¯ãã·ã¹ãã ã«åé¡ãããããšã瀺ããŠãããããäœããè¡ãå¿ èŠããããŸãã äºæ³ãããç°¡åãªãšã©ãŒã®å Žåã¯ãTCPã¿ã€ã ã¢ãŠããªã©ã®å埩ãè©Šã¿ãããšãã§ããŸãã ããæ·±å»ãªåé¡ã«ã€ããŠã¯ããã°ã«ãã³ãããåŸã§åé¡ããããã°ããŸãã
ããã¯ããšã©ãŒåŠçã®å©ç¹ã®1ã€ã§ãã Javaã®æ¹æ³ã¯ãããããšã©ãŒåŠçã§ãããããã§ã¯ãªãããšãéçºè ã«æããŠããŸããã
JavaãäœãæããŠããããã¯ããããŸããããåãçç±ã§äŸå€ã䜿çšããŸããå®è¡æã«ã·ã¹ãã ãå®è¡ãããªã«ããªæŠç¥ãå¶åŸ¡ããããã§ãã Goã¯ããšã©ãŒåŠçã«é¢ããŠç¹å¥ãªããšã¯äœããããŸããã
ããã¯ãèšèªãã¹ã¿ãã¯ã解ãã»ããããšã©ãŒãçºçããåã«è¡ã£ããã¹ãŠã®ã¡ã¢ãªã倱ãããšã«ãã£ãŠãšã©ãŒã®çµæãšããŠãããŒå¶åŸ¡ãç¡å¹ã«ããå Žåãç解ã§ããªãå¯èœæ§ããããŸã
ç§ã®ããã§ã¯ãªãã誰ãã®ãããããããŸããã
ãšã©ãŒã¯ãGoã®å®è¡æã«å®éã«åœ¹ç«ã¡ãŸãã ãªãè¡çªå·ã®ãããªãã®ãéã¶å¿ èŠãããã®ãââããããŸãã-å®è¡äžã®ã³ãŒãã¯ãããã»ãšãã©æ°ã«ããŸããã
ã³ãŒãã®ãã°ãä¿®æ£ããããšã«é¢å¿ãããå Žåã¯ãè¡çªå·ããããè¡ãæ¹æ³ã§ãã ããã«ã€ããŠæããŠãããã®ã¯Javaã§ã¯ãããŸãããCã«ã¯ãŸãã«ãã®çç±ã§__LINE__
ãš__FUNCTION__
ãŸãã ãšã©ãŒããã°ã«èšé²ãããšã©ãŒãçºçããæ£ç¢ºãªå Žæãèšé²ããå¿
èŠããããŸãã ãããŠãäœããããŸããããªããšããããªãã¯å°ãªããšãäœãããå§ããå¿
èŠããããŸãã å埩äžèœãªãšã©ãŒã«ãã£ãŠåŒãèµ·ããããã©ã³ãã ãªãšã©ãŒã¡ãã»ãŒãžã§ã¯ãããŸããã ãã®ãããªæ
å ±ãå¿
èŠãªãå Žåã¯ãç¡èŠããŠãã ããã ããã¯ããªããå·ã€ããŸããã ããããå°ãªããšãããã¯ããã«ãããå¿
èŠãªãšãã«äœ¿çšããããšãã§ããŸãã
ããã®äººã ãäŒè©±ãäŸå€ãšãšã©ãŒå€ã«ã·ãããç¶ããçç±ãããããŸããã 誰ããã®æ¯èŒãããŠããŸããã§ããã è°è«ãããå¯äžã®ããšã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãéåžžã«æçšã§ãããå€ãã®ã³ã³ããã¹ãæ å ±ãéã¶ãšããããšã§ãã ãããç解ã§ããªãå Žåã¯ããã¬ãŒã¹ãååšããªãå®å šã«ç°ãªãå®å®ã«äœãã§ããå¯èœæ§ããããŸãã
ããã¯å®å šã«ãããŠå®å šã«ééã£ãŠããŸãã
ããããç§ãåç §ããŠããæ¬çªã·ã¹ãã ã¯ãŸã å®è¡äžã§ããããããŒå¶åŸ¡ã«ãšã©ãŒã䜿çšããGoã§èšè¿°ããããšã©ãŒã®äŒæã«ã¹ã¿ãã¯ãã¬ãŒã¹ã䜿çšããèšèªã®äœéãªå®è£ ã«åã£ãŠä»£ãããŸããã
ãããç解ã§ããªãå Žåã¯ããã¬ãŒã¹ãååšããªãå®å šã«ç°ãªãå®å®ã«äœãã§ããå¯èœæ§ããããŸãã
ãšã©ãŒã¿ã€ããè¿ããã¹ãŠã®é¢æ°ã®ã³ãŒã«ã¹ã¿ãã¯æ å ±ãé£éãããã«ã¯ãèªåã®è£éã§ãããè¡ããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ã¯äœéã§ãããã»ãã¥ãªãã£äžã®çç±ããããã¡ããããžã§ã¯ãã®å€éšã§ã®äœ¿çšã«ã¯é©ããŠããŸããã 圌ããäžæµã®Goåžæ°ã«ããŠãåã«ææ ®ã®ãªããšã©ãŒäŒææŠç¥ãæ¯æŽããããšã¯æè¡çãªååã§ãã
ãã®ãããªæ å ±ãå¿ èŠãªãå Žåã¯ãç¡èŠããŠãã ããã ããã¯ããªããå·ã€ããŸããã
ãœãããŠã§ã¢ã®è¥å€§åã¯ããµãŒããŒãGoã§æžãçŽãããçç±ã§ãã 衚瀺ãããªããã®ã§ãããã€ãã©ã€ã³ã®ã¹ã«ãŒããããäœäžããå¯èœæ§ããããŸãã
TCPã¿ã€ã ã¢ãŠããšãã°ãã³ãã®åŠçã«é¢ããããç¡é¢ä¿ãªã¬ãã¹ã³ã§ã¯ãªãããã®æ©èœã䜿çšããããšã§ã¡ãªãããåŸãããå®éã®ãœãããŠã§ã¢ã®äŸããå§ãããŸãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã¯é ããªããŸã
ã¹ã¿ãã¯ãã¬ãŒã¹ããšã©ãŒãã¹ã§çæãããããšãèãããšãããããã©ãã»ã©é ããã¯èª°ãæ°ã«ããŸããã ãœãããŠã§ã¢ã®éåžžã®æäœã¯ãã§ã«äžæãããŠããŸãã
ã»ãã¥ãªãã£äžã®çç±ãããããã¡ãã®ãããžã§ã¯ã以å€ã§ã®äœ¿çšã«ã¯é©ããŠããŸãã
ãããŸã§ã®ãšããããã»ãã¥ãªãã£äžã®çç±ãã®ããã«ããŸãã¯ãã®ããšã«ã€ããŠã¯ãåäžã®æ¬çªã·ã¹ãã ãã¹ã¿ãã¯ãã¬ãŒã¹ããªãã«ããã®ãèŠãããšããããŸããã äžæ¹ããšã©ãŒãçæããããã«ã³ãŒãããã©ã£ããã¹ããã°ããç¹å®ã§ããããšã¯éåžžã«äŸ¿å©ã§ãã ãããŠãããã¯å€§èŠæš¡ãªãããžã§ã¯ãåãã§ãããå€ãã®ç°ãªãããŒã ãã³ãŒãããŒã¹ã§äœæ¥ããŠãããã·ã¹ãã å šäœã®å®å šãªç¥èãæã£ãŠãã人ã¯èª°ãããŸããã
衚瀺ãããªããã®ã§ãããã€ãã©ã€ã³ã®ã¹ã«ãŒããããäœäžããå¯èœæ§ããããŸãã
ããããå®éã«ã¯ããã§ã¯ãããŸããã åã«è¿°ã¹ãããã«ãã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãšã©ãŒæã«çæãããŸãã ãœãããŠã§ã¢ãåžžã«ãããã«ééããªãéããã¹ã«ãŒãããã¯1ããã圱é¿ãåããŸããã
ã¹ã¿ãã¯ãã¬ãŒã¹ããšã©ãŒãã¹ã§çæãããããšãèãããšãããããã©ãã»ã©é ããã¯èª°ãæ°ã«ããŸããã ãœãããŠã§ã¢ã®éåžžã®æäœã¯ãã§ã«äžæãããŠããŸãã
çå®ã§ã¯ãªãã
@ object88ã¯ãå®éã®è£œåã³ãŒããæ³åããŠãã ããã ã©ã®ãããã®ãšã©ãŒãçºçãããšäºæ³ããŸããïŒ ããŸãæããŸããã å°ãªããšãé©åã«äœæãããã¢ããªã±ãŒã·ã§ã³ã§ã¯ã ãŽã«ãŒãã³ãããžãŒã«ãŒãã«ãããå埩ããšã«åžžã«ãšã©ãŒãã¹ããŒããå Žåã¯ãã³ãŒãã«åé¡ããããŸãã ããããããã ãšããŠããGoã¢ããªã±ãŒã·ã§ã³ã®å€§éšåãIOããŠã³ãã§ããããšãèãããšãããã¯æ·±å»ãªåé¡ã§ã¯ãããŸããã
@ãªã®ã§
ããããç§ãåç §ããŠããæ¬çªã·ã¹ãã ã¯ãŸã å®è¡äžã§ããããããŒå¶åŸ¡ã«ãšã©ãŒã䜿çšããGoã§èšè¿°ããããšã©ãŒã®äŒæã«ã¹ã¿ãã¯ãã¬ãŒã¹ã䜿çšããèšèªã®äœéãªå®è£ ã«åã£ãŠä»£ãããŸããã
ç³ãèš³ãããŸããããããã¯ç§ãèšã£ãããšãšã¯äœã®é¢ä¿ããªãç¡æå³ãªæç« ã§ãã çããã€ããã¯ãããŸããã
ã¹ã¿ãã¯ãã¬ãŒã¹ã¯é ããªããŸã
é ãã§ããããããã§ããïŒ ããã¯éèŠã§ããïŒ ããã¯æããŸããã Goã¢ããªã±ãŒã·ã§ã³ã¯äžè¬ã«IOããŠã³ãã§ãã ãã®å ŽåãCPUãµã€ã¯ã«ãè¿œããããã®ã¯ã°ãããŠããŸãã ããªãã¯CPUãæ¶è²»ããGoã©ã³ã¿ã€ã ã§ã¯ããã«å€§ããªåé¡ãæ±ããŠããŸãã ãã°ã®ä¿®æ£ã«åœ¹ç«ã€äŸ¿å©ãªæ©èœãæšãŠãã®ã¯è°è«ã®äœå°ããããŸããã
ã»ãã¥ãªãã£äžã®çç±ãããããã¡ãã®ãããžã§ã¯ã以å€ã§ã®äœ¿çšã«ã¯é©ããŠããŸããã
ååšããªããã»ãã¥ãªãã£äžã®çç±ãã«ã€ããŠã¯ãããããåãäžããã€ããã¯ãããŸããã ãã ããéåžžãã¢ããªã±ãŒã·ã§ã³ãã¬ãŒã¹ã¯å éšã«ä¿åãããŠãããéçºè ã®ã¿ããããã«ã¢ã¯ã»ã¹ã§ããããšãæãåºããŠãã ããã ãããŠãé¢æ°åãé衚瀺ã«ããããšãããšããšã«ããæéã®ç¡é§ã«ãªããŸãã ããã¯ã»ãã¥ãªãã£ã§ã¯ãããŸããã ããã«ã€ããŠè©³ãã説æããå¿ èŠããªãããšãé¡ã£ãŠããŸãã
ã»ãã¥ãªãã£äžã®çç±ã§äž»åŒµãããªããäŸãã°macOS / iOSã«ã€ããŠèããŠã»ããã ãã¹ãŠã®ã¹ã¬ããã®ã¹ã¿ãã¯ãšãã¹ãŠã®CPUã¬ãžã¹ã¿ã®å€ãå«ããããã¯ãã¯ã©ãã·ã¥ãã³ããã¹ããŒããŠãåé¡ãããŸããã ãããããããã®ãã»ãã¥ãªãã£äžã®çç±ãã®åœ±é¿ãåããŠããã®ãèŠãªãã§ãã ããã
圌ããäžæµã®Goåžæ°ã«ããŠãåã«ææ ®ã®ãªããšã©ãŒäŒææŠç¥ãæ¯æŽããããšã¯æè¡çãªååã§ãã
ãã以äžäž»èŠ³çã«ãªããŸããïŒ ãæããããªããšã©ãŒäŒææŠç¥ãããã¯ã©ãã§èŠãŸãããïŒ
ãœãããŠã§ã¢ã®è¥å€§åã¯ããµãŒããŒãGoã§æžãçŽãããçç±ã§ãã 衚瀺ãããªããã®ã§ãããã€ãã©ã€ã³ã®ã¹ã«ãŒããããäœäžããå¯èœæ§ããããŸãã
ç¹°ãè¿ããŸããããããã§ããïŒ
TCPã¿ã€ã ã¢ãŠããšãã°ãã³ãã®åŠçã«é¢ããããç¡é¢ä¿ãªã¬ãã¹ã³ã§ã¯ãªãããã®æ©èœã䜿çšããããšã§ã¡ãªãããåŸãããå®éã®ãœãããŠã§ã¢ã®äŸããå§ãããŸãã
ãã®æç¹ã§ãç§ã¯ããã°ã©ããŒä»¥å€ã®èª°ããšè©±ããŠããããã§ãã ãã¬ãŒã¹ã¯ããã¹ãŠã®ãœãããŠã§ã¢ã«ã¡ãªããããããããŸãã ããã¯ããã°ã®ä¿®æ£ã«åœ¹ç«ã€ãã¹ãŠã®èšèªããã³ãã¹ãŠã®ã¿ã€ãã®ãœãããŠã§ã¢ã«å ±éã®ææ³ã§ãã 詳现ã«ã€ããŠã¯ããŠã£ãããã£ã¢ãã芧ãã ããã
ã³ã³ã»ã³ãµã¹ãªãã«éåžžã«å€ãã®éçç£çãªè°è«ããããšããããšã¯ããã®åé¡ã解決ããããã®ãšã¬ã¬ã³ããªæ¹æ³ããªãããšãæå³ããŸãã
@ object88
Goã¯ä»ã®ãŽã«ãŒãã³ã®ãããã¯ã解é€ãããã®ãåŸ
ã€å¿
èŠãããããããã¹ãŠã®ãŽã«ãŒãã³ã®ãã¬ãŒã¹ãååŸããå Žåã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãé
ããªãå¯èœæ§ããããŸãã
çŸåšå®è¡ããŠãããŽã«ãŒãã³ããã¬ãŒã¹ããã ãã§ããã°ãããã»ã©é
ãã¯ãããŸããã
@creker
ãã¬ãŒã¹ã¯ããã¹ãŠã®ãœãããŠã§ã¢ã«å©çããããããããã¯ããªãããã¬ãŒã¹ããŠãããã«äŸåããŸãã ã»ãšãã©ã®Goãããžã§ã¯ãã§ã¯ã䞊è¡æ§ãé¢ä¿ããŠãããããã¹ã¿ãã¯ã®ãã¬ãŒã¹ã¯è¯ãèãã§ã¯ãããŸããã§ããã ããŒã¿ã¯ååŸã«ç§»åããå€ãã®ãã®ãçžäºã«éä¿¡ããŠãããäžéšã®ãŽã«ãŒãã³ã¯ã»ãã®æ°è¡ã®ã³ãŒãã§ãã ãã®ãããªå Žåã«ã¹ã¿ãã¯ãã¬ãŒã¹ããããšåœ¹ã«ç«ã¡ãŸããã
ãã®ããããã°ã«æžã蟌ãŸããã³ã³ããã¹ãæ
å ±ã§ã©ããããããšã©ãŒã䜿çšããŠãåãã¹ã¿ãã¯ãã¬ãŒã¹ãåäœæããŸãããããã¯å®éã®ãŽã«ãŒãã³ã¹ã¿ãã¯ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ããžãã¯èªäœã«ãã€ã³ããããŸãã
ç«ããããããã«* .log | grep "orderID = xxx"ãå®è¡ãããšã©ãŒã®åå ãšãªã£ãå®éã®ã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ã®ã¹ã¿ãã¯ãã¬ãŒã¹ãååŸããŸãã
Goã®åæå®è¡æ§ã«ãããã³ã³ããã¹ããè±å¯ãªãšã©ãŒã¯ã¹ã¿ãã¯ãã¬ãŒã¹ããã䟡å€ããããŸãã
@gladkikhartemã¯ãé©åãªè°è«ãæžãããã«æéãå²ããŠ
ç§ã¯ããªãã®è°è«ãç解ããéšåçã«åæããŸãã ããã§ããå°ãªããšã5ã€ã®é¢æ°ã®ã¹ã¿ãã¯ãåŠçããå¿ èŠãããããšã«æ°ä»ããŸããã ããã¯ãäœãèµ·ãã£ãŠããã®ããã©ãããæ¢ãå§ããã¹ãããç解ããã®ã«ååãªå€§ããã§ãã ããããéåžžã«å°ããªãŽã«ãŒãã³ã¹ã¿ãã¯ãã¬ãŒã¹ãå€æ°ããéåžžã«åæã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã®å©ç¹ã倱ãããŸãã ç§ãåæããããšã
@creker
å®éã®è£œåã³ãŒããæ³åããŠãã ããã ã©ã®ãããã®ãšã©ãŒãçºçãããšäºæ³ããŸããïŒ [...]ãGoã¢ããªã±ãŒã·ã§ã³ã®å€§éšåãIOããŠã³ãã§ããããšãèãããšãããã¯æ·±å»ãªåé¡ã§ã¯ãããŸããã
IOããŠã³ãæäœã«ã€ããŠèšåããã®ã¯è¯ãããšã§ãã io.Reader Readã¡ãœããã¯ãEOFã§æ£åžžãªãšã©ãŒãè¿ããŸãã ã ãããããã¯å¹žããªéã§ããããèµ·ããã ããã
@urandom
ã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãã·ã¹ãã ã®ãããã¡ã€ãªã³ã°ã«åœ¹ç«ã€æ å ±ãæå³ããã«å ¬éããŸãã
å¹³åçãªã¢ããªã±ãŒã·ã§ã³ããšã©ãŒã¿ã€ãã§ã¹ã¿ãã¯ãã¬ãŒã ãåéãããªãŒããŒãããã«æ°ä»ããã©ããã¯ããããŸããããããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§ã¯ãçŸåšã®é¢æ°åŒã³åºãã®ãªãŒããŒãããã®ããã«ãå€ãã®å°ããªGoé¢æ°ãæåã§ã€ã³ã©ã€ã³åãããŸãã ãã¬ãŒã¹ãããšæªåããŸãã
Goã®ç®æšã¯ãã·ã³ãã«ã§é«éãªãœãããŠã§ã¢ã䜿çšããããšã§ããããã¬ãŒã¹ã¯äžæ©åŸéãããšæããŸãã å°ããªé¢æ°ãèšè¿°ãããããã®é¢æ°ãããšã©ãŒãè¿ãããšãã§ããã¯ãã§ããããã«ãããåŸæ¥ãšã¯ç°ãªãã¿ã€ãã®ãšã©ãŒãæåã®ã€ã³ã©ã€ã³åãä¿é²ãããŸãã
@creker
ç§ã¯ããªãã«ãããªãäžååé³ãåŒãèµ·ããäŸãäžããããšãé¿ããŸãã ãäžäŸ¿ããããããŠç³ãèš³ããããŸããã
ååãããã«ãã®æ©èœãæããã«ããæ°ããããŒã¯ãŒããreturnifãã䜿çšããããšãææ¡ããŸãã ãŸãããšã©ãŒåŠçãããå€ãã®ãŠãŒã¹ã±ãŒã¹ã§äœ¿çšã§ããã»ã©ååãªæè»æ§ããããŸãã
äŸ1ïŒååä»ãreturnã䜿çšïŒïŒ
aãerr = somethingïŒbïŒ
errïŒ= nil {ã®å Žå
æ»ã
}
ã«ãªããŸãïŒ
aãerr = somethingïŒbïŒ
returnif errïŒ= nil
äŸ2ïŒååä»ããªã¿ãŒã³ã䜿çšããªãïŒïŒ
aãerrïŒ= somethingïŒbïŒ
errïŒ= nil {ã®å Žå
ãè¿ãããšã©ãŒ
}
ã«ãªããŸãïŒ
aãerrïŒ= somethingïŒbïŒ
returnif errïŒ= nil {aãerr}
ååä»ãè¿åã®äŸã«é¢ããŠãããªãã¯ã©ãããæå³ã§ãã...
a, err = something(b)
returnif err != nil
@ambernardino
代ããã«fmtããŒã«ãæŽæ°ããã ãã§ãèšèªæ§æãæŽæ°ããããæ°ããã圹ã«ç«ããªãããŒã¯ãŒããè¿œå ãããããå¿
èŠããªãã®ã¯ãªãã§ããã
a, err := something(b)
if err != nil { return a, err }
ãŸã
a, err := something(b)
if err != nil { return a, err }
@gladkikhartemã¢ã€ãã¢ã¯ããšã©ãŒãäŒæãããã³ã«ãããå ¥åããããšã§ã¯ãªããç§ã¯ããããããæã¿ãåãããã«æ©èœããã¯ãã§ã
a, err? := something(b)
@mrkaspa
ã¢ã€ãã¢ã¯ãã³ãŒããããèªã¿ãããããããšã§ãã ã³ãŒãã®å
¥åã¯åé¡ã§ã¯ãªããèªã¿åãã¯åé¡ã§ãã
@gladkikhartem rustã¯ãã®ã¢ãããŒãã䜿çšããŠãããèªã¿ã«ãããªããšã¯æããªã
@gladkikhartem ?
èªã¿ã«ãããªããšã¯æããŸããã ãã€ãºãå®å
šã«é€å»ããŠãããšæããŸãã ç§ã«ãšã£ãŠã®åé¡ã¯ããã€ãºããããšãæçšãªã³ã³ããã¹ããæäŸããå¯èœæ§ãæé€ãããããšã§ãã éåžžã®ãšã©ãŒã¡ãã»ãŒãžããã©ã°ã€ã³ãããããšã©ãŒãã©ãããããã§ããå ŽæãããããŸããã ã³ãŒã«ã¹ã¿ãã¯ã¯æãããªè§£æ±ºçã§ããããã§ã«è¿°ã¹ãããã«ããã¹ãŠã®äººã«åœ¹ç«ã€ããã§ã¯ãããŸããã
@mrkaspa
ãããŠãããã¯ãããèªã¿ã«ãããããšæããŸãã次ã¯äœã§ããïŒ ç§ãã¡ã¯æåã®è§£æ±ºçãèŠã€ããããšããŠããŸããããããšãåã«æèŠãå
±æããããšããŠããŸããïŒ
@creker
ãïŒã äœãè¿ãããã®ãã¯ããã»ã©æ確ã§ã¯ãªãããã¡ãã人ã¯ãããäœãããŠããã®ããç¥ã£ãŠããå¿
èŠãããããããã£ã©ã¯ã¿ãŒã¯èªè
ã«èªç¥çè² è·ãå ããŸãã ãããŠãã¡ãã ïŒ ãµã€ã³ã¯èªè
ã®å¿ã«çåãæããããŸãã
åã«è¿°ã¹ãããã«ãerrïŒ= nilã³ã³ãã€ã©ãåé€ãããå Žåã¯ãæªäœ¿çšã®ãšã©ãŒãã©ã¡ãŒã¿ãæ€åºããããããèªåã§è»¢éã§ããŸãã
ãš
a, err? := doStuff(a,b)
err? := doAnotherStuff(b,z,d,g)
a, b, err? := doVeryComplexStuff(b)
èªã¿ããããªããŸã
a := doStuff(a,b)
doAnotherStuff(b,z,d,g)
a, b := doVeryComplexStuff(b)
åãéæ³ã§ãã¿ã€ããããã®ãå°ãªããèãããã®ãå°ãªã
@gladkikhartemãããšãèªè ãäœãæ°ããããšãåŠã¶å¿ èŠã®ãªã解決çã¯ãªããšæããŸãã ããã¯èšèªãå€æŽããçµæã§ãã ãã¬ãŒããªããè¡ãå¿ èŠããããŸããåºæ¬çãªçšèªã§äœãè¡ãããŠããã®ããæ£ç¢ºã«ç€ºãé¡ã®æ§æã«åé·æ§ãæãããããåé·æ§ãé ããããæ§æã®ç³è¡£ãè¿œå ãããã§ããæ°ããæ§æãå°å ¥ããŸããä»ã«æ¹æ³ã¯ãããŸããã èªè ãåŠã¶ããã«äœããè¿œå ãããã®ãåã«æåŠããããšã¯éå¹æã§ãã ãã¹ãŠã®Go2ã®åé¡ãéããŠãããã1æ¥ãšåŒã¶æ¹ãããã§ãããã
ããªãã®äŸã®ããã«ãããã¯ããã«å€ãã®éæ³ã®ãã®ãå°å ¥ããéçºè ããšã©ãŒã«ã³ã³ããã¹ããæäŸã§ããããã«ããæ§æãå°å ¥ããããã®ã€ã³ãžã§ã¯ã·ã§ã³ãã€ã³ããé衚瀺ã«ããŸãã ãããŠãæãéèŠãªã®ã¯ãã©ã®é¢æ°åŒã³åºãããšã©ãŒãã¹ããŒããå¯èœæ§ããããã«é¢ããæ å ±ãå®å šã«é ãããšã§ãã ããã¯ãŸããŸãäŸå€ã®ãããªã«ãããããŸãã ãŸãããšã©ãŒãåã¹ããŒããããšã ããçå£ã«èããŠããå Žåã¯ãã¹ã¿ãã¯ãã¬ãŒã¹ãå¿ é ã«ãªããŸããããã¯ããã®å Žåã«ã³ã³ããã¹ããä¿æã§ããå¯äžã®æ¹æ³ã ããã§ãã
å ã®ææ¡ã¯ãå®éã«ã¯ãã§ã«ãã¹ãŠãããªãããŸãã«ããŒããŠããŸãã ããã¯ååã«åé·ã§ããããšã©ãŒãã©ããããŠæçšãªã³ã³ããã¹ããæäŸããã®ã«é©ããå ŽæãæäŸããŸãã ããããäž»ãªåé¡ã®1ã€ã¯ããã®éæ³ã®ããšã©ãŒãã§ãã éæ³ã§ã¯ãªããåé·ã§ããªãã®ã§ãéããšæããŸãã ã¡ãã£ãšçãäžã§ãã ãããããè¯ããããããããªãã®ã¯ãããå€ãã®éæ³ãå°å ¥ããããšã§ãã
||
ããå
ã®ãšã©ãŒãèªåçã«ã©ããããæ°ãããšã©ãŒãçæãããšãããã©ãã§ããããã ãããã£ãŠãäŸã¯æ¬¡ã®ããã«ãªããŸã
func Chdir(dir string) error {
syscall.Chdir(dir) || &PathError{"chdir", dir}
return nil
}
err
ãæ¶ããŠããã¹ãŠã®ã©ããã³ã°ãæé»çã«åŠçãããŸãã 次ã«ããããã®å
éšãšã©ãŒã«ã¢ã¯ã»ã¹ããæ¹æ³ãå¿
èŠã§ãã Inner() error
ãããªå¥ã®ã¡ãœãããerror
ã€ã³ã¿ãŒãã§ãŒã¹ã«è¿œå ããŠããããŸããããªããšæããŸãã 1ã€ã®æ¹æ³ã¯ã unwrap(error) []error
ãããªçµã¿èŸŒã¿é¢æ°ãå°å
¥ããããšã§ãã ãããè¡ãããšã¯ãããããã©ãããããé åºã§ãã¹ãŠã®å
éšãšã©ãŒã®ã¹ã©ã€ã¹ãè¿ãããšã§ãã ããããã°ãå
éšãšã©ãŒããããã®ç¯å²ã«ã¢ã¯ã»ã¹ã§ããŸãã
error
ã¯åãªãã€ã³ã¿ãŒãã§ã€ã¹ã§ãããã«ã¹ã¿ã ã®error
ã¿ã€ãã®ã©ããããããšã©ãŒãé
眮ããå Žæãå¿
èŠã§ããããšãèãããšãããã®å®è£
ã«ã¯çåããããŸãã
ç§ã«ãšã£ãŠãããã¯ãã¹ãŠã®ããã¯ã¹ã«ãã§ãã¯ããŒã¯ãä»ããŸãããããäžæè°ããããããããŸããã ãããããšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯å®çŸ©äžéåžžã«ç¹æ®ã§ãããããäžçŽåžæ°ã«è¿ã¥ããããšã¯æªãèãã§ã¯ãªããããããŸããã ãšã©ãŒåŠçã¯ãéåžžã®Goã³ãŒãã§ãããç¹å¥ãªããšã¯äœããªããããåé·ã§ãã ããã¯çŽã®äžã掟æãªèŠåºããäœãã®ã«è¯ããããããŸãããããšã©ãŒã¯ãã®ãããªæ±ããæ£åœåããã«ã¯ããŸãã«ãç¹å¥ã§ãã 圌ãã¯ç¹å¥ãªã±ãŒã·ã³ã°ãå¿ èŠã§ãã
ãšã©ãŒãã§ãã¯ã®æ°ãŸãã¯åã ã®ãã§ãã¯ã®é·ããæžããããšã«ã€ããŠã®åœåã®ææ¡ã¯ãããŸããïŒ
åŸè ã®å Žåãæ¡ä»¶æãšç¹°ãè¿ãæã1ã€ãããªããšããçç±ã§ãææ¡ã®å¿ èŠæ§ã«ç°è°ãå±ããã®ã¯ç°¡åã§ãã ã«ãŒããå«ããªäººãããŸãããæé»ã®ã«ãŒãæ§é ãæäŸããå¿ èŠããããŸããïŒ
ãããŸã§ã«ææ¡ãããæ§æã®å€æŽã¯ãèå³æ·±ãæèå®éšãšããŠåœ¹ç«ã¡ãŸããããå ã®æ§æã®å€æŽã»ã©æ確ãçºé³å¯èœããŸãã¯åçŽãªãã®ã¯ãããŸããã Goã¯bashã§ã¯ãªãããšã©ãŒã«ã€ããŠãéæ³ãã§ããå¿ èŠã¯ãããŸããã
ç§ã¯ãŸããŸããããã®ææ¡ãèªã¿ãè°è«ããäœãæ°ãããã®ãè¿œå ããã®ã§ãããã¯æªããèªããªãããã¹ãŠããã®ãŸãŸã«ããŠãããã«ä»ãªããªã人ã ããŸããŸãèŠãŠããŸãã
@asææ¡ã¯ããããéæããããšããŠããããšã®èŠçŽã瀺ããŠããŸãã äœãè¡ãããŠããã®ãã¯ããªãæ確ã«å®çŸ©ãããŠããŸãã
ãªãªãžãã«ãšåããããæ確ãçºé³å¯èœããŸãã¯ã·ã³ãã«
ã©ããªææ¡ãæ°ããæ§æãå°å ¥ããäžéšã®äººã ã«ãšã£ãŠæ°ããããšã¯ãèªããªããè€éãªãªã©ããšåãããã«èãããŸãã ãããæ°ãããããšãã£ãŠããããã¯ã£ããããŠãããââãçºé³ãããããåçŽã«ãªã£ããããããšã¯ãããŸããã "||" ãš "ïŒ" äŸã¯ããããäœãããããç¥ã£ãŠããã°ãæ¢åã®æ§æãšåããããæ確ã§åçŽã§ãã ãããšããã->ããšã<-ãã¯éæ³ãå€ãããŠãèªè ã¯ããããäœãæå³ããã®ããç¥ããªããã°ãªããªãããšäžå¹³ãèšãå§ããå¿ èŠããããŸããïŒ ããããã¡ãœããåŒã³åºãã«çœ®ãæããŸãããã
Goã¯bashã§ã¯ãªãããšã©ãŒã«ã€ããŠãéæ³ãã§ããå¿ èŠã¯ãããŸããã
ããã¯å®å šã«æ ¹æ ããªããäœã®è°è«ãšããŠãæ°ããããŸããã Bashãšé¢ä¿ãããã®ã¯ãç§ãè¶ ããŠããŸãã
@creker
ã¯ããç§ã¯ã€ãã³ãã«ãã£ãšéæ³ãå°å
¥ããããªãã«å®å
šã«åæããŸãã ç§ã®äŸã¯ïŒã®ç¶ãã§ãå°ãªããã®ãå
¥åãããšãããªãã¬ãŒã¿ãŒã®èãã
ç§ãã¡ã¯äœããç ç²ã«ããŠãããã€ãã®å€åãšãã¡ããããã€ãã®éæ³ãå°å ¥ããå¿ èŠãããããšã«åæããŸãã ããã¯ã䜿ããããã®é·æãšãã®ãããªéæ³ã®çæã®ãã©ã³ã¹ã«ãããŸããã
ãªãªãžãã«|| ææ¡ã¯ããªãçŽ æŽããããå®éã«ãã¹ããããŠããŸãããç§ã®æèŠã§ã¯ãã©ãŒãããã¯éãã§ããç§ã¯ãã©ãŒããããã«å€æŽããããšããå§ãããŸã
syscal.Chdir(dir)
|| return &PathError{"chdir", dir}
PSããªãã¯ãã®ãããªéæ³ã®æ§æã®å€çš®ã«ã€ããŠã©ãæããŸããïŒ
syscal.Chdir(dir) {
return &PathError{"chdir", dir}
}
@gladkikhartemã¯ã©ã¡ããèªã¿ãããã®èŠ³ç¹ããã¯ããªãèŠæ ããããŸãããåŸè ã®æ¹ãæªãæããããŸãã ããã¯ç§ãããããããªããã®å¥åŠãªãããã¯ã¹ã³ãŒãã玹ä»ããŸãã
æ§æãåç¬ã§èŠãã®ã§ã¯ãªããé¢æ°ã®ã³ã³ããã¹ãã§èŠãããšããå§ãããŸãã ãã®ã¡ãœããã«ã¯ãããã€ãã®ç°ãªããšã©ãŒåŠçãããã¯ããããŸãã
func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
absPath, err := p.preparePath()
if err != nil {
return nil, err
}
fis, err := l.context.ReadDir(absPath)
if err != nil {
return nil, err
} else if len(fis) == 0 {
return nil, nil
}
buildPkg, err := l.context.Import(".", absPath, 0)
if err != nil {
if _, ok := err.(*build.NoGoError); ok {
// There isn't any Go code here.
return nil, nil
}
return nil, err
}
return buildPkg, nil
}
ææ¡ãããå€æŽã¯ããã®æ©èœãã©ã®ããã«ã¯ãªãŒã³ã¢ããããŸããïŒ
func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
absPath, err? := p.preparePath()
fis, err? := l.context.ReadDir(absPath)
if len(fis) == 0 {
return nil, nil
}
buildPkg, err := l.context.Import(".", absPath, 0)
if err != nil {
if _, ok := err.(*build.NoGoError); ok {
// There isn't any Go code here.
return nil, nil
}
return nil, err
}
return buildPkg, nil
}
@bcmillsã®ææ¡ã®æ¹ãé©ããŠããŸãã
func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
absPath := p.preparePath() =? err { return nil, err }
fis := l.context.ReadDir(absPath) =? err { return nil, err }
if len(fis) == 0 {
return nil, nil
}
buildPkg := l.context.Import(".", absPath, 0) =? err {
if _, ok := err.(*build.NoGoError); ok {
// There isn't any Go code here.
return nil, nil
}
return nil, err
}
return buildPkg, nil
}
@ object88
func (l *Loader) processDirectory(p *Package) (p *build.Package, err error) {
absPath, err := p.preparePath() {
return nil, fmt.Errorf("prepare path: %v", err)
}
fis, err := l.context.ReadDir(absPath) {
return nil, fmt.Errorf("read dir: %v", err)
}
if len(fis) == 0 {
return nil, nil
}
buildPkg, err := l.context.Import(".", absPath, 0) {
err, ok := err.(*build.NoGoError)
if !ok {
return nil, fmt.Errorf("buildpkg: %v",err)
}
return nil, nil
}
return buildPkg, nil
}
ãããçªã£èŸŒã¿ç¶ããŸãã ãã¶ããããå®å šãªäœ¿çšäŸãæãã€ãããšãã§ããŸãã
@erwbgy ãããã¯ç§ã«ã¯æé«ã«èŠããŸãããæ¯æããããã»ã©çŽ æŽããããšã¯ç¢ºä¿¡ããŠããŸããã
?
æŒç®åããšã©ãŒä»¥å€ã®å€ã«é©çšã§ããŸããïŒ (!ok)?
ãok!?
ãªããšãããŠãããã§ããïŒå²ãåœãŠãšæäœããã³ãã«ããŠããã®ã§å°ãå¥åŠã§ãïŒïŒ ãŸãã¯ããã®æ§æã¯error
ã®ã¿æå¹ã§ããïŒ@rodcorsi ãããã¯ç§ãReadDir
ãªãã ReadBuildTargetDirectoryForFileInfo
ãããã®ãããªã°ããããã®ã ã£ãå Žåã¯ã©ããªãã§ããããã ãŸãã¯ãããããããªãã¯å€æ°ã®è°è«ãæã£ãŠããŸãã preparePath
ã®ãšã©ãŒåŠçããç»é¢ããã¯ã¿åºããŠããŸããŸãã æ°Žå¹³æ¹åã®ç»é¢ãµã€ãºãå¶éãããŠããããã€ã¹ïŒãŸãã¯Githubã®ããã«ããã»ã©åºããªããã¥ãŒããŒãïŒã§ã¯ã =?
éšåã倱ãããå¯èœæ§ããããŸãã åçŽã¹ã¯ããŒã«ã¯éåžžã«åŸæã§ãã æ°Žå¹³ã§ã¯ããã»ã©å€ããããŸããã
@gladkikhartem ã error
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããããã€ãã®ïŒæåŸã®ïŒïŒåŒæ°ã«é¢é£ä»ããããŠããããã§ãã ããã¯é¢æ°å®£èšã«ãã䌌ãŠããŸãããããŠããã¯ãã ..._æã_å¥åŠã§ãã ok
ã¹ã¿ã€ã«ã®æ»ãå€ã«é¢é£ä»ããæ¹æ³ã¯ãããŸããïŒ å
šäœãšããŠã1è¡ãã賌å
¥ããŠããŸããã
@ object88
ã¯ãŒãã©ããã¯ãéåžžã«å¹
åºãã³ãŒãã®åé¡ã解決ããŸãã åºã䜿ãããŠããŸãããïŒ
éåžžã«é·ãé¢æ°åŒã³åºãã«é¢ãã@ object88 ã ããã§äž»ãªåé¡ã«å¯ŸåŠããŸãããã åé¡ã¯ãç»é¢ããæŒãåºããããšã©ãŒåŠçã§ã¯ãããŸããã åé¡ã¯ãé·ãé¢æ°åãåŒæ°ã®å€§ããªãªã¹ãã§ãã ãšã©ãŒåŠçãç»é¢å€ã«ããããšã«ã€ããŠè°è«ããåã«ããããä¿®æ£ããå¿ èŠããããŸãã
ããã©ã«ãã§ã¯ãŒãã©ããã«èšå®ãããŠããIDEãŸãã¯ã³ãŒããã¬ã³ããªãŒãªããã¹ããšãã£ã¿ã¯ãŸã èŠãããšããããŸããã ãããŠãããŒãžãããŒããããåŸã«CSSãæåã§ãããã³ã°ãã以å€ã«ãGithubã䜿çšããŠãããè¡ãæ¹æ³ããŸã£ããèŠã€ããŠããŸããã
ãããŠãç§ã¯ã³ãŒãå¹ ãéèŠãªèŠçŽ ã§ãããšæããŸã-ããã¯ãã®ææ¡ã®æšé²åã§ãã_å¯èªæ§_ãç©èªã£ãŠããŸãã 䞻匵ã¯ããšã©ãŒã®åšãã«ãã³ãŒããå€ãããããšããããšã§ãã æ©èœããªããšããããã§ã¯ãªãããšã©ãŒãä»ã®æ¹æ³ã§å®è£ ããå¿ èŠããããšããããã§ã¯ãããŸããããã³ãŒããããŸãèªã¿åããªããšããããšã§ãã
@ object88
ã¯ãããã®ã³ãŒãã¯ããšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæåŸã®ãã©ã¡ãŒã¿ãšããŠè¿ããã¹ãŠã®é¢æ°ã§æ©èœããŸãã
è¡ã®ç¯çŽã«é¢ããŠã¯ãããå°ãªãè¡æ°ã§ããå€ãã®æ
å ±ãå
¥åããããšã¯ã§ããŸããã ã³ãŒãã¯åçã«åæ£ããå¯åºŠãé«ããããããã¹ãŠã®ã¹ããŒãã¡ã³ãã®åŸã«ã¹ããŒã¹ãå
¥ãããããªãããã«ããå¿
èŠããããŸãã
ç§ã¯ãããé¢æ°å®£èšã®ããã«èŠããããšã«åæããŸãããåæã«ããã¯æ¢åã®å Žåãšéåžžã«äŒŒãŠããŸã...; errïŒ= nil {ã¹ããŒãã¡ã³ããªã®ã§ã人ã
ã¯ããŸãæ··ä¹±ããŸããã
ã³ãŒãå¹ ã¯éèŠãªèŠçŽ ã§ãã 80è¡ã®ãšãã£ã¿ãŒãš80è¡ã®ã³ãŒããé¢æ°åŒã³åºãã§ããããã®åŸã«||ãããå Žåã¯ã©ããªããŸããïŒ è¿ããŸããïŒ é¢æ°ãäœããè¿ãããšãèå¥ã§ããŸãããããã¯ãèªã¿åããã®ããæ»ãå€ã®ãªãæå¹ãªgoã³ãŒãã«ãªãããã§ãã
å®å
šãæãããã«ã ||
æ§æãèªåããžãã¯ãšã©ãŒã©ããã³ã°ãããã³ãšã©ãŒä»¥å€ã®æ»ãå€ã®èªåãŒãåã䜿çšããäŸã瀺ããŸãã
func (l *Loader) processDirectory(p *Package) (*build.Package, error) {
absPath := p.preparePath() || errors.New("prepare path")
fis := l.context.ReadDir(absPath) || errors.New("ReadDir")
if len(fis) == 0 {
return nil, nil
}
buildPkg, err := l.context.Import(".", absPath, 0)
if err != nil {
if _, ok := err.(*build.NoGoError); ok {
// There isn't any Go code here.
return nil, nil
}
return nil, err
}
return buildPkg, nil
}
ä»ã®æ»ãå€ã«ã€ããŠã®è³ªåã«ã€ããŠã ãšã©ãŒãçºçããå Žåããã¹ãŠã®å Žåã§å€ã¯ãŒãã«ãªããŸãã ãããéèŠã ãšæãçç±ã«ã€ããŠã¯ããã§ã«èª¬æããŸããã
åé¡ã¯ãããªãã®äŸãããããé¢ä¿ããŠããªããšããããšã§ãã ããããããã§ããå°ãªããšãç§ã«ãšã£ãŠã¯ããã®ææ¡ãäœãè¡šããŠããã®ãã瀺ããŠããŸãã ç§ã解決ãããã®ã¯ãæãäžè¬çã§ä¹±æŽã«äœ¿çšãããŠããã€ãã£ãªã ã§ã
err := func()
if err != nil {
return err
}
ãã®çš®ã®ã³ãŒãã¯ãäžè¬ã«ãšã©ãŒåŠçã®å€§ããªéšåïŒæ倧ã§ã¯ãªãã«ããŠãïŒã§ããããšã«åæã§ããŸãã ãããã£ãŠããã®å Žåã解決ããããšã¯è«ççã§ãã ãããŠããšã©ãŒã«ãã£ãšé¢ä¿ããããšããããå Žåã¯ãããã€ãã®ããžãã¯ãé©çšããŠãã ãã-ãããå®è¡ããŠãã ããã ããã§ãããã°ã©ããŒãèªãã§ç解ããããã®å®éã®ããžãã¯ãåé·æ§ã§ããå¿ èŠããããŸãã ç§ãã¡ãå¿ èŠãšããªãã®ã¯ãç¡æèã®å®åæãèªãããã«ã¹ããŒã¹ãšæéãç¡é§ã«ããããšã§ãã ããã¯ç¡æå³ã§ãããããã§ãGoã³ãŒãã®éèŠãªéšåã§ãã
æé»çã«ãŒãå€ãè¿ãããšã«ã€ããŠã®ä»¥åã®è©±ã«ã€ããŠã ãšã©ãŒæã«æå³ã®ããå€ãè¿ãå¿
èŠãããå Žåã¯ããããéžæããŠãã ããã ããã§ããåé·æ§ã¯åªããŠãããã³ãŒããç解ããã®ã«åœ¹ç«ã¡ãŸãã ãã£ãšè€éãªããšãããå¿
èŠãããå Žåã¯ãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãæšãŠãŠãåé¡ãããŸããã ãŸãã ||
ã¯ãäž¡æ¹ã®ã±ãŒã¹ã解決ããã®ã«ååãªæè»æ§ããããŸãã ãšã©ãŒä»¥å€ã®å€ã¯çç¥ã§ããæé»çã«ãŒãã«ãªããŸãã ãŸãã¯ãå¿
èŠã«å¿ããŠæ瀺çã«æå®ããããšãã§ããŸãã ãšã©ãŒãè¿ããä»ã®ãã¹ãŠããŒãã«ãããå Žåãå«ãŸãããããã«é¢ããå¥ã®ææ¡ããããããšãèŠããŠããŸãã
@ object88
䞻匵ã¯ããšã©ãŒã®åšãã«ãã³ãŒããå€ãããããšããããšã§ãã
ããã¯åãªãã³ãŒãã§ã¯ãããŸããã äž»ãªåé¡ã¯ããšã©ãŒã®åšãã«ç¡æå³ãªå®åæãå€ãããŠããšã©ãŒåŠçã®éåžžã«äžè¬çãªã±ãŒã¹ãããããšã§ãã èªã䟡å€ã®ãããã®ãããå Žåãåé·æ§ã¯éèŠã§ãã ãšã©ãŒãåã¹ããŒããããšãé€ããŠã if err == nil then return err
ã¯äœã®äŸ¡å€ããããŸããã ãã®ãããªããªããã£ãããžãã¯ã®å Žåãå€ãã®ã¹ããŒã¹ãå¿
èŠã«ãªããŸãã ãããŠããã¹ãŠããšã©ãŒãè¿ãå¯èœæ§ã®ããããžãã¯ãã©ã€ãã©ãªåŒã³åºããã©ãããŒãªã©ãããã°ããã»ã©ããã®å®åæãéèŠãªãã®ãã€ãŸãã³ãŒãã®å®éã®ããžãã¯ãæ¯é
ãå§ããŸãã ãããŠããã®ããžãã¯ã«ã¯ãå®éã«ã¯ããã€ãã®éèŠãªãšã©ãŒåŠçããžãã¯ãå«ãŸããŠããå¯èœæ§ããããŸãã ããããããã¯ãã®åšãã®ã»ãšãã©ã®å®åæã®ãã®å埩çãªæ§è³ªã§å€±ãããŸãã ãããŠããã¯è§£æ±ºããããšãã§ããGoã競åããä»ã®çŸä»£èšèªã¯ããã解決ããããšããŸãã ãšã©ãŒåŠçã¯éåžžã«éèŠã§ãããããéåžžã®ã³ãŒãã ãã§ã¯ãããŸããã
@creker
err != nil return err
ãå®åçãããå Žåãç§ãã¡ãæããŠããã®ã¯ãã¹ã¿ãã¯ã®ãšã©ãŒã転éããç°¡åãªæ¹æ³ãäœæããå Žåãçµ±èšçã«ããã°ã©ããŒãç¹ã«ãžã¥ãã¢ã¯ãå®è¡ããã®ã§ã¯ãªããæãç°¡åãªæ¹æ³ã䜿çšããããšã§ããç¹å®ã®ç¶æ³ã§äœãé©åãã
ããã¯Goã®ãšã©ãŒåŠçãšåãèãã§ã-ããã¯ããªãã«ãŸãšããªããšãããããšã匷å¶ããŸãã
ãããã£ãŠããã®ææ¡ã§ã¯ãä»ã®äººããšã©ãŒãæ
éã«åŠçããŠã©ããããããšã奚å±ããããšæããŸãã
åçŽãªãšã©ãŒåŠçã¯èŠæ ããæªããå®è£ ã«æéããããããã«ããå¿ èŠããããŸãããã©ããã³ã°ãŸãã¯ã¹ã¿ãã¯ãã¬ãŒã¹ã䜿çšããé©åãªãšã©ãŒåŠçã¯èŠæ ãããããç°¡åã«å®è¡ã§ããŸãã
@gladkikhartemç§ã¯ãã€ããå€ä»£ã®ç·šéè ã«ã€ããŠã®ãã®è°è«ã
@gladkikhartem Goã«ã¯ãã§ã«ãã®åé¡ããããããã«ã€ããŠã¯äœãã§ããªããšæããŸãã ã¡ãªã¿ã«ãGoãè¡ã£ãŠããªãã³ã³ãã€ã«ã®å€±æãå®è¡æã®ãããã¯ã§éçºè ã匷å¶ãããŸã§ãéçºè ã¯åžžã«æ æ°ã«ãªããŸãã
Goãå®éã«è¡ãããšã¯ãäœã匷å¶ããªãããšã§ãã Goããšã©ãŒã®åŠçã匷å¶ãããšããæŠå¿µã¯èª€è§£ãæãããããåžžã«ããã§ããã Goã®äœè ã¯ãããã°ã®æçš¿ãäŒè°ã®è¬æŒã§ããããããã«åŒ·å¶ããŸãã å®éã®èšèªã§ã¯ãããããããšãäœã§ãã§ããŸãã ãããŠãããã§ã®äž»ãªåé¡ã¯ãGoãããã©ã«ãã§éžæãããã®ã§ããããã©ã«ãã§ã¯ããšã©ãŒã¯é»ã£ãŠç¡èŠãããŸãã ãããå€ããææ¡ãããããŸãã Goãããªãã«ãŸãšããªããšã匷å¶ããããšã«ã€ããŠã ã£ããªããããã¯æ¬¡ã®ããšãããã¹ãã§ãã ã³ã³ãã€ã«æã«ãšã©ãŒãè¿ãããè¿ããããšã©ãŒãé©åã«åŠçãããªãå Žåã¯å®è¡æã«ãããã¯ã«ãªããŸãã ç§ãç解ããŠããããšãããRustã¯ãããè¡ããŸã-ãšã©ãŒã¯ããã©ã«ãã§ãããã¯ã«ãªããŸãã ãããç§ãæ£ããããšã匷å¶ããããšãšåŒãã§ãããã®ã§ãã
Goã§ãšã©ãŒãåŠçããããšãå®éã«åŒ·å¶ããã®ã¯ãéçºè
ã®è¯å¿ã§ãããä»ã«ã¯äœããããŸããã ããããããã¯åžžã«è«ŠããããªããŸããä»ã®ãšãããé¢æ°ã®ã·ã°ããã£ãæ瀺çã«èªã¿åããªããšããšã©ãŒãè¿ãããããšã誰ãæããŠãããŸããã å®éã®äŸããããŸãã é·ãéã fmt.Println
ããšã©ãŒãè¿ãããšãfmt.Println
ãã ç§ã¯ãã®æ»ãå€ã䜿ããŸããããã å°å·ãããã ãã§ãã ã§ãããããããäœãè¿ãã®ããèŠãåæ©ã¯ãããŸããã ããã¯Cãæ±ããŠããã®ãšåãåé¡ã§ãã ãšã©ãŒã¯å€ã§ãããå®è¡æã«ã³ãŒããå£ããŠãåŠçãããŠããªãäŸå€ãªã©ã®æçšãªãããã¯ã«ããã¯ã©ãã·ã¥ãçºçããªãããããšã©ãŒã«ã€ããŠäœãããããªããªããŸã§ãå¿
èŠãªãã¹ãŠãç¡èŠã§ããŸãã
@gladkikhartemã¯ããã®ææ¡ã«ã€ããŠç§ãç解ããŠããããšãããéçºè ããšã©ãŒãæ éã«ã©ããããããšã奚å±ãããã®ã§ã¯ãããŸããã ããã¯ãææ¡ãæãä»ã人ã ã«ããããã«ããŒããããšãå¿ããªãããã«ä¿ãããšã§ãã å€ãã®å Žåããšã©ãŒãåã¹ããŒããã ãã®è§£æ±ºçãæãä»ãã®ã§ãå®éã«ã¯ããå€ãã®ã³ã³ããã¹ããäžããŠããåã¹ããŒããããšãå¿ããŠããŸããŸãã
ç§ã¯äž»ã«ãGoãšã©ãŒåŠçãç°¡çŽ åããã人ã ã«ããšã©ãŒãå€æŽããã«è¿ãã ãã§ãªãããšã©ãŒã®åšãã«ã³ã³ããã¹ããç°¡åã«ã©ããã§ããããã«ããæ¹æ³ãèããããã«ä¿ãããã«ãã®ææ¡ãæžããŠããŸãã
@creker
ç§ã®ãšãã£ã¿ãŒã¯100æåå¹
ã§ããããã¯ããã¡ã€ã«ãšã¯ã¹ãããŒã©ãŒãgitã³ã³ãœãŒã«ãªã©ãããããã§ããç§ãã¡ã®ããŒã ã§ã¯ã100æåãè¶
ããã³ãŒããäœæãã人ã¯èª°ãããŸãããããã¯ã°ãããŠããŸãïŒããã€ãã®äŸå€ãé€ããŠïŒ
Goã¯ãšã©ãŒåŠçã匷å¶ããŠããŸãããããªã³ã¿ãŒã¯åŒ·å¶ããŸãã ïŒãã¶ããããã®ããã«ãªã³ã¿ãŒãæžãã¹ãã§ããïŒïŒ
ããŠãç§ãã¡ã解決çãæãä»ãããšãã§ããã誰ããèªåã®ããæ¹ã§ææ¡ãç解ããŠãããªããç§ãã¡ãå¿ èŠãšãããã®ã®ããã€ãã®èŠä»¶ãæå®ããŠã¿ãŸãããïŒ æåã«èŠä»¶ã«ã€ããŠåæãã次ã«ãœãªã¥ãŒã·ã§ã³ãéçºããæ¹ãã¯ããã«ç°¡åãªäœæ¥ã§ãã
äŸãã°ïŒ
@creker ãç§ã®éçºã®çŽ75ïŒ ã¯VSCodeã®15ã€ã³ãã©ãããããã§è¡ãããŠããŸããæ°Žå¹³æ¹åã®ã¹ããŒã¹ãæ倧åããŸãããç¹ã«äžŠã¹ãŠç·šéããå Žåã¯ãŸã å¶éããããŸããåŠçã®éã§ãããè³ããŸãããã¹ã¯ããããããã¯ããã«å€ãã®ã©ãããããããããŸããç§ãã¡ã¯èª°ãã倧å€ã¢ãã¿ãŒãæã£ãŠãããšäºæ³ããŠããã®ã§ãèšèªã®èŠªãã¿ããããå¶éããããããŸããã
æ®å¿µãªãããç»é¢ãã©ãã»ã©å€§ãããŠããgithubã¯ãã¥ãŒããŒããå¶éããŸãã
@gladkikhartem
ããã§ã¯åå¿è
ã®æ æ°ãåœãŠã¯ãŸããŸããããããã®äŸã®ããã€ãã§errors.New
ãèªç±ã«äœ¿çšããŠããããšããèšèªã®ç解ãäžè¶³ããŠããããšã瀺ããŠããŸãã ãšã©ãŒã¯åçã§ãªãéãæ»ãå€ã«å²ãåœãŠãã¹ãã§ã¯ãããŸããããããã®ãšã©ãŒãåçã®ããã±ãŒãžã¹ã³ãŒãå€æ°ã«å
¥ããããå Žåãæ§æã¯ããŒãžäžã§çããªããå®éã«ã¯æ¬çªã³ãŒãã§ãåãå
¥ããããŸãã Goãšã©ãŒåŠçããã€ã©ãŒãã¬ãŒããã§æãèŠããã§ãã人ã¯ãã»ãšãã©ã®ã·ã§ãŒãã«ããã䜿çšãããšã©ãŒãé©åã«åŠçããããã®ååãªçµéšããããŸããã
äœãsimplifying error handling
æ§æãããã¯æããã§ã¯ãããŸããããåäŸã¯less runes != simple
ã§ãã åçŽåã®ããã«ãå®éåå¯èœãªæ¹æ³ã§æ§æã枬å®ã§ãã修食åãããã€ããããšæããŸãã
ããšãã°ãå
ã®ææ¡ã§ã¯ããšã©ãŒãäŒæããæ¹æ³ã®æ°ã2ãã3ã«å¢ããŠããŸããããã¯è«çORã«äŒŒãŠããŸãããã»ãã³ãã£ã¯ã¹ãç°ãªããŸãã ããã¯ãè€é床ã®äœãæ¡ä»¶ä»ããªã¿ãŒã³ãèŠçŽãããã®ã§ãïŒ copy
ãŸãã¯append
ããŸãã¯>>
ãšæ¯èŒããŠïŒã æ°ããæ¹æ³ã¯å€ãæ¹æ³ãããèªç¶ã§ã¯ãªãã倧声ã§è©±ããšããããabs, err := path(foo) || return err
-> if theres an error, it's returning err
ã«ãªããŸãããã®å ŽåãåçŽããŒã䜿çšã§ããçç±ã¯è¬ã«ãªããŸããã³ãŒãã¬ãã¥ãŒã§å€§å£°ã§èšã£ãã®ãšåãããã«æžãããšãã§ããŸãã
@ãªã®ã§
less runes != simple
å®å
šã«åæããŸãã
ç°¡åã«èšããšãèªã¿ãããç解ãããããšããæå³ã§ãã
goã«æ
£ããŠããªã人ã¯ãgoãèªãã§ããã®æ©èœãç解ããå¿
èŠããããŸãã
ããã¯åè«ã®ããã§ãªããã°ãªããŸãã-ããªãã¯ããã説æããå¿
èŠã¯ãããŸããã
çŸåšã®ãšã©ãŒåŠçã¯å®éã«ã¯ç解ã§ããŸããã if err != nil return.
ãå€ãããå Žåã¯å®å
šã«èªã¿åãããšã¯ã§ããŸããã
@ object88倧äžå€«ã§ãã ãã®è°è«ã¯ããªãé »ç¹ã«åºãŠããã®ã§ãç§ã¯ãã£ãšäžè¬çã«èšããŸããã ããšãã°ãGoã®èšè¿°ã«äœ¿çšã§ãããšãã§ããªãå€ä»£ã®ã¿ãŒããã«ç»é¢ãæ³åããŠã¿ãŸãããã ããã¯ã©ã®ãããªè°è«ã§ããïŒ ããã®ã°ãããããšã®éçã¯ã©ãã«ãããŸããïŒ ç§ãã¡ãããã«ã€ããŠçå£ã«èããŠãããªããç§ãã¡ã¯é£ããäºå®ã芳å¯ããå¿ èŠããããŸã-æã人æ°ã®ããç»é¢ãµã€ãºãšè§£å床ã¯äœã§ããïŒ ãããŠããããã®ã¿ãäœããæãããšãã§ããŸãã ããããè°è«ã¯éåžžã誰ã䜿çšããªãç»é¢ãµã€ãºãæ³åããã ãã§ããã誰ãã䜿çšã§ããå¯èœæ§ã¯ãããã§ãã
@gladkikhartemãããããªã³ã¿ãŒã¯ããªãã匷å¶ããŸããã圌ãã¯ç€ºåããŸãã ããã«ã¯å€§ããªéãããããŸãã ãããã¯ãªãã·ã§ã³ã§ãããGoããŒã«ãã§ãŒã³ã®äžéšã§ã¯ãªããææ¡ãè¡ãã ãã§ãã 匷å¶ã¯ãã³ã³ãã€ã«ãšã©ãŒãŸãã¯ã©ã³ã¿ã€ã ãšã©ãŒã®2ã€ã ããæå³ããŸãã ä»ã®ãã¹ãŠã¯ãéžæããããã®ææ¡ãšãªãã·ã§ã³ã§ãã
ç§ã¯åæããŸããææ¡ã¯ãã¹ãŠã®åŽé¢ãå®å šã«ç¶²çŸ ããŠããããã§ã¯ãªãã®ã§ãç§ãã¡ãæããã®ãããé©åã«çå®ããå¿ èŠããããŸãã
@ãªã®ã§
æ°ããæ¹æ³ã¯å€ãæ¹æ³ãããèªç¶ã§ã¯ãªãã倧声ã§è©±ããšããããè ¹çã«ãªãã§ããããerrïŒ= pathïŒfooïŒ|| return err->ãšã©ãŒãçºçããå Žåãerrãè¿ãããŸãããã®å Žåãã³ãŒãã¬ãã¥ãŒã§å€§å£°ã§è¿°ã¹ãã®ãšåãããã«åçŽããŒã䜿çšã§ããã®ã¯ãªããè¬ã§ãã
æ°ããæ¹æ³ã¯ã1ã€ã®çç±ã ãã§èªç¶ã§ã¯ãããŸãããçŸåšãèšèªã®äžéšã§ã¯ãããŸããã ä»ã«çç±ã¯ãããŸããã ãã§ã«ãã®æ§æã§Goãæ³åããŠã¿ãŠãã ãã-ããªããããã«ç²ŸéããŠããã®ã§ããã¯èªç¶ã§ãããã ->
ã select
ã go
ãªã©ãä»ã®èšèªã«ã¯ãªããã®ã«ç²ŸéããŠããããã«ã ãªã¿ãŒã³ã®ä»£ããã«åçŽããŒã䜿çšã§ããã®ã¯ãªãã§ããïŒ è³ªåã§çããŸãã ã«ãŒãã§åãããšãã§ããã®ã«ã1åã®åŒã³åºãã§ã¹ã©ã€ã¹ãè¿œå ããæ¹æ³ãããã®ã¯ãªãã§ããïŒ ã«ãŒãã§åãããšãã§ããã®ã«ã1åã®åŒã³åºãã§ãªãŒããŒããã©ã€ã¿ãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã³ããŒããæ¹æ³ãããã®ã¯ãªãã§ããïŒ ãªã©ãªã©ãªã©ã³ãŒããããã³ã³ãã¯ãã§èªã¿ããããããããã§ãã Goããã§ã«å€ãã®äŸã§ããããšççŸããŠããå Žåãããªãã¯ãããã®è°è«ãããŠããã®ã§ãã ç¹°ãè¿ãã«ãªããŸããããããæ°ããããŸã èšèªã«ãªã£ãŠããªããšããçç±ã ãã§ããã£ãšãªãŒãã³ã«ãªããäœãæã¡èœãšããªãããã«ããŸãããã ããã§ã¯äœãéæã§ããŸããã åé¡ããããŸããå€ãã®äººã
ã解決çãæ±ããŠããŸããããã«å¯ŸåŠããŸãããã Goã¯ãããã«è¿œå ããããã®ã«ãã£ãŠåæ¶ãããç¥èãªçæ³çãªèšèªã§ã¯ãããŸããã
ã«ãŒãã§åãããšãã§ããã®ã«ã1åã®åŒã³åºãã§ã¹ã©ã€ã¹ãè¿œå ããæ¹æ³ãããã®ã¯ãªãã§ããïŒ
ifã¹ããŒãã¡ã³ãã®ãšã©ãŒãã§ãã¯ãæžãã®ã¯ç°¡åã§ããã append
å®è£
ãèŠãŠã¿ãããšæããŸãã
ã«ãŒãã§åãããšãã§ããã®ã«ã1åã®åŒã³åºãã§ãªãŒããŒããã©ã€ã¿ãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã³ããŒããæ¹æ³ãããã®ã¯ãªãã§ããïŒ
ãªãŒããŒãšã©ã€ã¿ãŒã¯ãã³ããŒæäœã®ãœãŒã¹ãšå®å ããããã¡ãªã³ã°æŠç¥ãå Žåã«ãã£ãŠã¯ã«ãŒãå ã®çªå µã®å€ãããæœè±¡åããŸãã ãã®æœè±¡åãã«ãŒããšã¹ã©ã€ã¹ã§è¡šçŸããããšã¯ã§ããŸããã
Goããã§ã«å€ãã®äŸã§ããããšççŸããŠãããšããããªãã¯ãããã®è°è«ãããŠããã
å°ãªããšããããã®äŸã§ã¯ããã§ã¯ãªããšæããŸãã
ç¹°ãè¿ãã«ãªããŸããããããæ°ããããŸã èšèªã«ãªã£ãŠããªããšããçç±ã ãã§ããã£ãšãªãŒãã³ã«ãªããäœãæã¡èœãšããªãããã«ããŸãããã
Goã«ã¯äºææ§ãä¿èšŒãããŠããããšãèãããšãæ°æ©èœãã²ã©ãå Žåã¯æ°žé ã«å¯ŸåŠããªããã°ãªããªããããæ°æ©èœãæã粟æ»ããå¿ èŠããããŸãã ãããŸã§èª°ãããã§è¡ã£ãããšã¯ãããŸããããå®éã®æŠå¿µå®èšŒãäœæãããå°ããªéçºããŒã ã§äœ¿çšãããŠããŸãã
ããã€ãã®ææ¡ïŒãžã§ããªãã¯ãªã©ïŒã®å±¥æŽãèŠããšããããå®è¡ããåŸãããããŒãããã¯å®éã«ã¯è¯ã解決çã§ã¯ãªãã®ã§ããŸã å€æŽãå ããªãã§ãã ããããšããèªèãããããããšãããããŸãã 代æ¿æ¡ã¯ææ¡ã«æºã¡ãèšèªã§ãããããããããã®ãŒã£ãŠæé€ããç°¡åãªæ¹æ³ã¯ãããŸããã
ã¯ã€ãã¹ã¯ãªãŒã³ãšã·ã³ã¹ã¯ãªãŒã³ã«ã€ããŠãèæ ®ãã¹ããã1ã€ã®ããšã¯ãã«ãã¿ã¹ã¯ã§ãã
ãšãã£ã¿ãŒãèŠã€ããã ãã§ãªããã³ã³ããã¹ããå¥ã®ãŠã£ã³ããŠã«å®å šã«åãæ¿ããŠé¢æ°ãæ€çŽ¢ããã®ã§ã¯ãªããã³ãŒããå°ããŸãšãããšãã«ä»ã®äœãã远跡ããããã«ãè€æ°ã®ãŠã£ã³ããŠã䞊ã¹ãŠé 眮ããå ŽåããããŸãããšãã£ã¿ãŒã«æ»ããŸãã
@ãªã®ã§
ææ¡ãããæ©èœã®ã»ãšãã©ãå®çšçã§ã¯ãªãããšã«å®å
šã«åæããç§ã¯ãããèãå§ããŠããŸã|| ãš ïŒ ãã®ãåœãŠã¯ãŸãå¯èœæ§ããããŸãã
@creker
copyïŒïŒãšappendïŒïŒã¯ãå®è£
ããã®ãç°¡åãªã¿ã¹ã¯ã§ã¯ãããŸãã
ç§ã¯CI / CDã«ãªã³ã¿ãŒãæã£ãŠãããæåéããã¹ãŠã®ãšã©ãŒãåŠçããããã«åŒ·å¶ãããŸãã ãããã¯èšèªã®äžéšã§ã¯ãããŸããããããã¯æ°ã«ããŸãã-ç§ã¯ãã çµæãå¿
èŠã§ãã
ïŒã¡ãªã¿ã«ãç§ã¯åŒ·ãæèŠãæã£ãŠããŸã-誰ããGoã§ãªã³ã¿ãŒã䜿çšããŠããªãå Žå-圌ã¯ãã ........ïŒ
ç»é¢ãµã€ãºã«ã€ããŠ-ããã¯çå£ã«ãé¢çœããããããŸããã ãã®ç¡é¢ä¿ãªè°è«ããããŠãã ããã ç»é¢ã¯å¿
èŠãªã ãåºãããããšãã§ããŸããã³ãŒãã®|| return &PathError{Err:err}
éšåã衚瀺ãããªãå¯èœæ§ãåžžã«ãããŸãã ãideããšããåèªãã°ãŒã°ã«ã§æ€çŽ¢ããŠãã³ãŒãã«äœ¿çšã§ããã¹ããŒã¹ã®çš®é¡ã確èªããŠãã ããã
ãããŠãä»ã®äººã®ããã¹ããããèªãã§ãã ãããç§ã¯Goãããªãã«ãã¹ãŠã®ãšã©ãŒãåŠçããããšã匷å¶ãããšã¯èšããŸããã§ãã
ããã¯Goã®ãšã©ãŒåŠçãšåãèãã§ã-ããã¯ããªãã«ãŸãšããªããšãããããšã匷å¶ããŸãã
@gladkikhartem Goã¯ããšã©ãŒåŠçã«é¢ããŠäœã匷å¶ããŸããããããåé¡ã§ãã ãŸãšããªããšãã©ããã¯é¢ä¿ãããŸãããããã¯ãã ã®ãããã³ã°ã§ãã ç§ã«ãšã£ãŠã¯ã fmt.Println
ãããªãã®ãé€ããŠããã¹ãŠã®å Žåã«ãã¹ãŠã®ãšã©ãŒãåŠçããããšãæå³ããŸãã
誰ããGoã§ãªã³ã¿ãŒã䜿çšããŠããªãå Žå-圌ã¯ãã
å€åããã§ãã ããããäœããå®éã«åŒ·å¶ãããŠããªãå Žåãããã¯é£ã¶ã€ããã¯ãããŸããã 䜿çšãã人ãããã°ã䜿çšããªã人ãããŸãã
ç»é¢ãµã€ãºã«ã€ããŠ-ããã¯çå£ã«ãé¢çœããããããŸããã ãã®ç¡é¢ä¿ãªè°è«ããããŠãã ããã
ã©ããããããææ決å®ã«åœ±é¿ãäžããã¯ãã®ä¹±æ°ãæãå§ããã®ã¯ç§ã§ã¯ãããŸããã ç§ã¯åé¡ãç解ããŠãããšæ確ã«è¿°ã¹ãŠããŸãããããã¯å®¢èŠ³çã§ãªããã°ãªããŸããã ãç§ã¯80ã·ã³ãã«å¹ ã®IDEãæã£ãŠããŸããGoã¯ããã説æããä»ã®ãã¹ãŠãç¡èŠããå¿ èŠããããŸããã§ã¯ãããŸããã
ç§ã®ç»é¢ãµã€ãºã«ã€ããŠè©±ããŠããå Žåã Visual Studio Codeã¯ã270åã®æ°Žå¹³æ¹åã®ã¹ããŒã¹ã®ã·ã³ãã«ãæäŸããŸãã ãããªã«å€ãã®ã¹ããŒã¹ãåãã®ãæ®éã ãšäž»åŒµããã€ããã¯ãããŸããã ããããã³ã¡ã³ãä»ãã®æ§é äœãç¹ã«é·ãååã®ãã£ãŒã«ãã¿ã€ããèæ
®ãããšãç§ã®ã³ãŒãã¯ç°¡åã«120ã·ã³ãã«ãè¶
ããå¯èœæ§ããããŸãã ||
æ§æã䜿çšããå Žåã3ã5åã®åŒæ°ã®é¢æ°åŒã³åºããšã«ã¹ã¿ã ã¡ãã»ãŒãžã§ã©ããããããšã©ãŒã®å Žåã100ã120ã«ç°¡åã«åãŸããŸãã
||
ãããªãã®ãå®è£
ãããå Žåãgofmtã¯ããããããã1è¡ã«æžã蟌ãããã«åŒ·å¶ããã¹ãã§ã¯ãããŸããã å Žåã«ãã£ãŠã¯ãã¹ããŒã¹ãããããããããšããããŸãã
@erwbgy ãããã¯ç§ã«ã¯æé«ã«èŠããŸãããæ¯æããããã»ã©çŽ æŽããããšã¯ç¢ºä¿¡ããŠããŸããã
@ object88ç§ã«ãšã£ãŠã®
val, err := func()
if err != nil {
return nil, errors.WithStack(err)
}
ããåçŽïŒ
val, err? := func()
ããè€éãªãšã©ãŒåŠçãçŸåšã®æ¹æ³ã§å®è¡ãããããšã劚ãããã®ã¯ãããŸããã
ãšã©ãŒä»¥å€ã®æ»ãå€ã¯äœã§ããïŒ ãããã¯åžžã«ãŒãå€ã§ããïŒ ååä»ããªã¿ãŒã³ã«ä»¥åã«å²ãåœãŠãããå€ããã£ãå Žåãããã¯ãªãŒããŒã©ã€ããããŸããïŒ ååä»ãã®å€ããšã©ãŒé¢æ°ã®çµæãæ ŒçŽããããã«äœ¿çšãããå Žåãããã¯è¿ãããŸããïŒ
ä»ã®ãã¹ãŠã®æ»ããã©ã¡ãŒã¿ãŒã¯é©åãªnilå€ã§ãã ååä»ããã©ã¡ãŒã¿ãŒã®å Žåããã§ã«äœããã®å€ãå²ãåœãŠãããŠããããšãä¿èšŒãããŠããããã以åã«å²ãåœãŠãããå€ãä¿æããããšæããŸãã
ã§ããŸããïŒ æŒç®åã¯ãšã©ãŒä»¥å€ã®å€ã«é©çšãããŸããïŒ ïŒïŒokïŒã®ãããªããšãããŠãããã§ããïŒ ãŸãã¯OK !? ïŒå²ãåœãŠãšæäœããã³ãã«ããŠããã®ã§ãããã¯å°ãå¥åŠã§ãïŒïŒ ãããšãããã®æ§æã¯ãšã©ãŒã«å¯ŸããŠã®ã¿æå¹ã§ããïŒ
ãããããšã©ãŒå€ä»¥å€ã«ãã®æ§æã䜿çšããããšã¯æå³ããªããšæããŸãã
ãå¿ é ãã®é¢æ°ã¯ãããèªã¿ãããã³ãŒããæ±ããŠå¿ æ»ã«ãªã£ãŠå¢æ®ããŠãããšæããŸãã
sqlx
db.MustExec(schema)
htmlãã³ãã¬ãŒã
var t = template.Must(template.New("name").Parse("html"))
ãããã¯æŒç®åãææ¡ããŸãïŒãæŒç®åããšåŒã¶ã¹ããã©ããããããŸããïŒ
a, ð± := someFunc(b)
ãšåãã§ãããããããããå³æ
a, err := someFunc(b)
if err != nil {
panic(err)
}
ð±å ¥åããã®ã¯ããããé£ããããã®ã§ãïŒã!!ããŸãã¯
a, !! := someFunc(b)
!! = maybeReturnsError()
å€å ïŒïŒ ãããã¯ãšïŒ æ»ãå€
ç§ã®2ã»ã³ãã®æéã ã¹ã¿ãã¯ãã¬ãŒã¹ã«æšæºã©ã€ãã©ãªã®debug.PrintStack()
ã ãã䜿çšã§ããªãã®ã¯ãªãã§ããïŒ ãšã©ãŒãçºçããæãæ·±ãã¬ãã«ã§ã®ã¿ã¹ã¿ãã¯ãã¬ãŒã¹ãåºåãããšããèãæ¹ã§ãã
ã¹ã¿ãã¯ãã¬ãŒã¹ã«æšæºã©ã€ãã©ãªã®
debug.PrintStack()
ã ãã䜿çšã§ããªãã®ã¯ãªãã§ããïŒ
ãšã©ãŒã¯å€ãã®ã¹ã¿ãã¯ãééããå¯èœæ§ããããŸãã ãããã¯ãã£ãã«ãä»ããŠéä¿¡ããããå€æ°ã«æ ŒçŽãããããããšãã§ããŸãããšã©ãŒãæåã«çæããããã©ã°ã¡ã³ããç¥ããããããããã®é·ç§»ç¹ãç¥ãæ¹ã圹ç«ã€ããšããããããŸãã
ããã«ãã¹ã¿ãã¯ãã¬ãŒã¹èªäœã«ã¯ãå€ãã®å Žåãå éšïŒãšã¯ã¹ããŒããããŠããªãïŒãã«ããŒé¢æ°ãå«ãŸããŠããŸãã ããã¯ãäºæããªãã¯ã©ãã·ã¥ããããã°ããããšããŠãããšãã«äŸ¿å©ã§ãããéåžžã®æäœäžã«çºçãããšã©ãŒã«ã¯åœ¹ç«ã¡ãŸããã
å®å šãªããã°ã©ãã³ã°åå¿è ã«ãšã£ãŠæããŠãŒã¶ãŒãã¬ã³ããªãŒãªã¢ãããŒãã¯äœã§ããïŒ
ç§ã¯ããåçŽãªããŒãžã§ã³ãèŠã€ããŸããã if !err
1ã€ã ãå¿
èŠã§ã
ç¹å¥ãªãã®ãçŽæçãªãã®ãäœåãªå¥èªç¹ãéåžžã«å°ããªã³ãŒãã¯ãããŸãã
`` `è¡ã
absPathãerrïŒ= p.preparePathïŒïŒ
nilãè¿ãããšã©ãŒã®å Žåã¯ãšã©ãŒ
errïŒ= doSomethingWithïŒabsPathïŒifïŒerr
doSomethingElseïŒïŒifïŒerr
doSomethingRegardlessOfErrïŒïŒ
//ãšã©ãŒã1ãæã§åŠçããŸãã å¿
èŠã«å¿ããŠ; ã€ã³ãã³ããªãã®ãã£ããã®ãããª
ãšã©ãŒã®å Žå{
ãã³ãŒãæ±æã®ãªããšã©ãŒããè¿ãããšã©ãŒ
}
`` `
err := doSomethingWith(absPath) if !err
doSomethingElse() if !err
ãããããªãããå€ãè¯ããããµã颚éªã®æçš¿æ¡ä»¶;-)
ããããšããã§ããããŸããã
@dmajkicããã¯ããè¿œå ã®ã³ã³ããã¹ãæ å ±ãšãšãã«ãšã©ãŒãè¿ããã®ã«åœ¹ç«ã€ããšã¯äœãããŸããã
@erwbgyãã®åé¡ã®ã¿ã€ãã«ã¯_proposalã§ãïŒGo 2ïŒ||ã§ãšã©ãŒåŠçãç°¡çŽ åããŸããšã©ãŒsuffix_ç§ã®ã³ã¡ã³ãã¯ãã®æèã«ãããŸããã åã®è°è«ã«è¶³ãèžã¿å ¥ãããããããªããã
@cznicããã äºåŸæ¡ä»¶ã¯é 調ã§ã¯ãããŸããããäºåæ¡ä»¶ãæ±æãããŠããããã«èŠããŸãã
if !err; err := doSomethingWith(absPath)
if !err; doSomethingElse()
@dmajkicææ¡ã«ã¯ãã¿ã€ãã«ã ãã§ã¯ãããŸãããianlancetaylorã¯ããšã©ãŒãåŠçãã3ã€ã®æ¹æ³ã説æããè¿œå æ å ±ã䜿çšããŠãšã©ãŒãç°¡åã«è¿ãããšãã§ããææ¡ã¯ã»ãšãã©ãªãããšãå ·äœçã«ææããŠããŸãã
@erwbgyç§ã¯çµéšããŸããããããã¯ãã¹ãŠãæ°ããããŒã¯ãŒãïŒ try()
ïŒã®è¿œå ãŸãã¯ç¹æ®ãªè±æ°å以å€ã®æåã®äœ¿çšãäžç¶ããŸãã å人çã«-ç§ã¯ããã奜ãã§ã¯ãããŸãããã³ãŒããïŒ "ïŒ$ïŒ
ïŒã§ãªãŒããŒããŒããããŠãããšã眵åã®ããã«äžå¿«ã«èŠããåŸåãããããã§ãã
ç§ã¯ããã®åé¡ã®æåã®æ°è¡ãäœãè¿°ã¹ãŠãããã«åæããæããŠããŸããGoã³ãŒããå€ããããšãšã©ãŒåŠçãè¡ãããŸãã ç§ãè¡ã£ãææ¡ã¯ãã®ææ ã«æ²¿ã£ããã®ã§ãããè¿œå ã®ããŒã¯ãŒããããŒæåãå¿ èŠãšããã«ãGoãçŸåšæããŠãããã®ã«éåžžã«è¿ãææ¡ãããŠããŸãã
æ¡ä»¶ä»ã延æã¯ã©ãã§ãã
func something() (int, error) {
var error err
var oth err
defer err != nil {
return 0, mycustomerror("More Info", err)
}
defer oth != nil {
return 1, mycustomerror("Some other case", oth)
}
_, err = a()
_, err = b()
_, err = c()
_, oth = d()
_, err = e()
return 2, nil
}
func something() (int, error) {
var error err
var oth err
_, err = a()
if err != nil {
return 0, mycustomerror("More Info", err)
}
_, err = b()
if err != nil {
return 0, mycustomerror("More Info", err)
}
_, err = c()
if err != nil {
return 0, mycustomerror("More Info", err)
}
_, oth = d()
if oth != nil {
return 1, mycustomerror("Some other case", oth)
}
_, err = e()
if err != nil {
return 0, mycustomerror("More Info", err)
}
return 2, nil
}
ããã«ããã defer
ã®æå³ã倧å¹
ã«å€ãããŸããããã¯ãã¹ã³ãŒãã®æåŸã§å®è¡ããããã®ã§ãããã¹ã³ãŒããæ©æã«çµäºããããã®ã§ã¯ãããŸããã
圌ãããã®èšèªã§TryCatchãå°å ¥ããã°ãããããã¹ãŠã®åé¡ã¯éåžžã«ç°¡åãªæ¹æ³ã§è§£æ±ºãããŸãã
圌ãã¯ãã®ãããªãã®ã玹ä»ããå¿ èŠããããŸãã errorã®å€ãnil以å€ã«èšå®ãããŠããå ŽåãçŸåšã®ã¯ãŒã¯ãããŒãäžæãããcatchã»ã¯ã·ã§ã³ãèªåçã«ããªã¬ãŒãããfinallyã»ã¯ã·ã§ã³ãšçŸåšã®ã©ã€ãã©ãªãå€æŽãªãã§æ©èœããå¯èœæ§ããããŸãã åé¡ã解決ããŸããïŒ
try (var err error){
i, err:=DoSomething1()
i, err=DoSomething2()
i, err=DoSomething3()
} catch (err error){
HandleError(err)
// return err // similar to throw err
} finally{
// Do something
}
ãã«ã»ã«ã¯ãããã®æ¹éã«æ²¿ã£ãŠèããŠããããã§ãã
@sbinetããã¯äœããªãããã¯ãŸãã§ããã誰ããæ £ã芪ããã§ããã®ãšåãtry-catchãã©ãã€ã ã䜿çšããã ãã®å Žåã¯ãã¯ããã«åªããŠããŸãã
@KamyarMå€æ°ããŒã以å€ã®å€ã«èšå®ãããŠããå Žåã¯åžžã«ãäŸå€ãã¹ããŒããã¡ã«ããºã ãè¿œå ããããšãææ¡ããŠããããã§ãã ããã¯ã誰ããããç¥ã£ãŠãããã©ãã€ã ãã§ã¯ãããŸããã ç§ã¯ãã®ããã«æ©èœããèšèªãç¥ããŸããã
äŸå€ã®ããã«ã¯æ©èœããªããäŸå€ããããSwiftã«äŒŒãŠããŸãã
ããŸããŸãªèšèªã§ãtry catchã¯å®éã«ã¯ã»ã«ã³ãã¯ã©ã¹ã®ãœãªã¥ãŒã·ã§ã³ã§ããããšã瀺ãããŠããŸãããGoã¯Maybeã¢ãããªã©ã®ããã«ããã解決ã§ããªããšæããŸãã
@ianlancetaylor C ++ãJavaãCïŒãªã©ã®ä»ã®ããã°ã©ãã³ã°èšèªã§Try-Catchãåç §ããŸããããããã§ã®è§£æ±ºçã§ã¯ãããŸããã§ããã GoLangã«1æ¥ç®ããTry-Catchããã£ãæ¹ãè¯ãã£ãã®ã§ããã®æ¹æ³ã®ãšã©ãŒåŠçãåŠçããå¿ èŠã¯ãããŸããã§ããïŒããã¯å®éã«ã¯æ°ãããã®ã§ã¯ãããŸããã§ãããå¿ èŠã«å¿ããŠãä»ã®ããã°ã©ãã³ã°èšèªã§åãGoLangãšã©ãŒåŠçãèšè¿°ã§ããŸãããã®ããã«ã³ãŒãã£ã³ã°ããïŒããç§ãææ¡ããã®ã¯ããšã©ãŒãªããžã§ã¯ããè¿ãå¯èœæ§ã®ããçŸåšã®ã©ã€ãã©ãªãšã®äžäœäºææ§ãæãããæ¹æ³ã§ããã
Javaã®äŸå€ã¯åè»äºæ ã§ããããããã@KamyarMã§ã¯å®å šã«å察ããå¿ èŠããããŸãã ãªãã¿ã®ãããã®ã ãããšãã£ãŠããããè¯ãéžæã ãšã¯éããŸããã
ç§ãæå³ããã®ã¯ã
@KamyarM説æããŠãããŠããããšãã äŸå€ãæ瀺çã«æ€èšããŠæåŠããŸããã ãšã©ãŒã¯äŸå€ã§ã¯ãããŸããã ãããã¯ããããçš®é¡ã®å®å šã«éåžžã®çç±ã§èµ·ãããŸãã https://blog.golang.org/errors-are-values
äŸå€çãã©ããã¯ããããŸãããããã€ã©ãŒãã¬ãŒãã®åŠçãšã©ãŒã«ããã³ãŒãã®èšåŒµã®åé¡ã¯è§£æ±ºãããŸãã åãåé¡ã«ãããGoãšã»ãŒåãããã«æ©èœããObjective-Cãæ©èœããªããªããŸããã ãšã©ãŒã¯NSErrorã¿ã€ãã®å€ã§ãããç¹å¥ãªããšã¯äœããããŸããã ãŸããifã®ããŒããšãšã©ãŒã©ããã³ã°ã§ãåãåé¡ãçºçããŸãã ãããSwiftãç¶æ³ãå€ããçç±ã§ãã ãããã¯2ã€ã®çµã¿åããã§çµãããŸãã-ããã¯å®è¡ãçµäºããããšãæå³ããäŸå€ã®ããã«æ©èœããããªãã¯äŸå€ããã£ããããå¿ èŠããããŸãã ãã ããã¹ã¿ãã¯ãå·»ãæ»ãããšã¯ãªããéåžžã®ãªã¿ãŒã³ã®ããã«æ©èœããŸãã ãããã£ãŠãå¶åŸ¡ãããŒã«äŸå€ã䜿çšããããšã«å察ããæè¡çãªè°è«ã¯ãããã«ã¯åœãŠã¯ãŸããŸããããããã®ãäŸå€ãã¯ãéåžžã®æ»ããšåããããé«éã§ãã ç³è¡£æ§æã®ãããªãã®ã§ãã ããããSwiftã«ã¯åºæã®åé¡ããããŸãã Cocoa APIã®å€ãã¯éåæïŒã³ãŒã«ããã¯ãšGCDïŒã§ããããã®çš®ã®ãšã©ãŒåŠçãšã¯äºææ§ããããŸãããäŸå€ã¯ãawaitã®ãããªãã®ããªããã°åœ¹ã«ç«ã¡ãŸããã ããããã»ãšãã©ãã¹ãŠã®Goã³ãŒãã¯åæããŠããããããã®ãäŸå€ãã¯å®éã«æ©èœããå¯èœæ§ããããŸãã
@urandom
Javaã®äŸå€ã¯æªããããŸããã åé¡ã¯ãããã䜿çšããæ¹æ³ãç¥ããªãæªãããã°ã©ããŒã«ãããŸãã
ããªãã®èšèªã«ã²ã©ãæ©èœãããå Žåã誰ããæçµçã«ãã®æ©èœã䜿çšããã§ãããã ããªãã®èšèªã«ãã®ãããªæ©èœããªãå Žåã0ïŒ ã®å¯èœæ§ããããŸãã ç°¡åãªæ°åŠã§ãã
@ try-catchãã²ã©ãæ©èœã§ããããšã«åæããŸããã ããã¯éåžžã«äŸ¿å©ãªæ©èœã§ãããç§ãã¡ã®ç掻ãã¯ããã«æ¥œã«ããŠãããŸãããããããã§ã³ã¡ã³ãããŠããçç±ã§ããGoogleGoLangããŒã ãåæ§ã®æ©èœãè¿œå ããŠããå¯èœæ§ããããŸãã ç§ã¯å人çã«GoLangã®if-elsesãšã©ãŒåŠçã³ãŒããå«ãã§ããã®defer-panic-recoverã®æŠå¿µã¯ããŸã奜ãã§ã¯ãããŸããïŒtry-catchã«äŒŒãŠããŸãããTry-Catch-Finallyãããã¯ã®å Žåã»ã©æŽçãããŠããŸããïŒ ã å€ãã®å Žåãã³ãŒãã«éåžžã«å€ãã®ãã€ãºãè¿œå ãããã³ãŒããèªã¿åããªããªããŸãã
ãã€ã©ãŒãã¬ãŒããªãã§ãšã©ãŒãåŠçããæ©èœã¯ãèšèªã«ãã§ã«ååšããŸãã äŸå€ããŒã¹ã®èšèªã䜿çšããåå¿è ãæºè¶³ãããããã«æ©èœãè¿œå ããããšã¯ãè¯ãèãã§ã¯ãªãããã§ãã
ãããŠããã€ã©ãŒãã¬ãŒãã§ãŸã£ããåãåé¡ãæ±ããŠããC / C ++ãObjective-Cããæ¥ãŠããã®ã¯èª°ã§ããïŒ ãããŠãGoã®ãããªçŸä»£èªããŸã£ããåãåé¡ã«èŠããã§ããã®ãèŠãã®ã¯ã€ã©ã€ã©ããŸãã ã ããããã䟡å€èŠ³ããšãŠãåœç©ã§ã°ãããŠãããšæããã®ã§ããšã©ãŒã«é¢ãããã®å šäœçãªèªå€§å®£äŒã¯ããã§ã«äœå¹Žããäœå幎ãè¡ãããŠããŸãã å²ç¢ã¯ãã®çµéšããäœãåŠã°ãªãã£ããããªæ°ãããŸãã ç¹ã«ãå®éã«ãã£ãšè¯ãæ¹æ³ãèŠã€ããããšããŠããSwift / RustãèŠãŠãã ããã äŸå€ãé€ããŠè§£æ±ºãããJava / CïŒã®ãããªæ¢åã®ãœãªã¥ãŒã·ã§ã³ã§è§£æ±ºããŸãããå°ãªããšããããã¯ã¯ããã«å€ãèšèªã§ãã
@KamyarMééæåããã°ã©ãã³ã°ã䜿çšããããšããããŸããïŒ ããŒã ïŒ
äŸå€ãããŸã称è³ããªãã§ããããããããªãããããã䜿ããªããç§èŠã
@ShalokShalomããŸããããŸããã ããããããã¯åãªãã¹ããŒããã·ã³ã§ã¯ãããŸãããïŒ å€±æããå Žåã¯ãããè¡ããæåããå Žåã¯ãããè¡ããŸããïŒ ãã¹ãŠã®ã¿ã€ãã®ãšã©ãŒãäŸå€ã®ããã«åŠçãããããã§ã¯ãªããšæããŸãã ãŠãŒã¶ãŒå ¥åã®æ€èšŒã®ã¿ãå¿ èŠãªå Žåã¯ãæ€èšŒãšã©ãŒã®è©³çŽ°ãå«ãããŒã«å€ãè¿ãã ãã§ãã äŸå€ã¯ãIOãŸãã¯ãããã¯ãŒã¯ã¢ã¯ã»ã¹ãŸãã¯äžæ£ãªé¢æ°å ¥åã«éå®ããå¿ èŠããããŸãããšã©ãŒãéåžžã«é倧ã§ãããå®è¡ãã¹ã®æ£åžžãªå®è¡ãåæ¢ãããå Žåã«åããŠãã ããã
Try-Catchãè¯ããªããšèšã人ãããçç±ã®1ã€ã¯ããã®ããã©ãŒãã³ã¹ã®ããã§ãã ãããããäŸå€ãçºçããå¯èœæ§ã®ããå Žæããšã«ãã³ãã©ãŒãããããŒãã«ã䜿çšããããšãåå ã§ãã If Error checkïŒãšã©ãŒã®æç¡ã«é¢ä¿ãªãåžžã«ãã§ãã¯ãããŸãïŒãšæ¯èŒãããšãäŸå€ã§ããé«éïŒäŸå€ãçºçããªãå Žåã¯ãŒãã³ã¹ãã§ãããå®éã«çºçããå Žåã¯ã¯ããã«ã³ã¹ããããããŸãïŒã§ãããšã©ããã§èªã¿ãŸããã ãã以å€ã¯ãTry-Catchæ§æã«åé¡ã¯ãªããšæããŸãã æ§æã§ã¯ãªããã³ã³ãã€ã©ã«ãã£ãŠå®è£ ãããæ¹æ³ã ããç°ãªããŸãã
@ShalokShalomããã確èªããŠãã ããïŒ
https://mortoray.com/2013/09/12/the-true-cost-of-zero-cost-exceptions/
C / C ++ããæ¥ã人ã
ã¯ãäŸå€ããªãã
è³¢æãªéžæãããããããçŸä»£çãã§ãããšäž»åŒµãã人ã
ã«æµæãã
èªã¿ãããã¯ãŒã¯ãããŒã«ã€ããŠç¥ã«æè¬ããŸãïŒç¹ã«C ++ã®åŸïŒã
åå3æ46åã§ç«ã2018幎4æ17æ¥ã«ã¯ãAntonenkoã¢ã«ãã [email protected]
æžããŸããïŒ
ãããŠãç§ãã¡ãåããã®ãæã£ãŠããC / C ++ãObjective-Cããæ¥ãŠããã®ã¯ã©ãã§ããïŒ
ãã€ã©ãŒãã¬ãŒãã®æ£ç¢ºãªåé¡ïŒ ãããŠçŸä»£èªãèŠãã®ã¯ã€ã©ã€ã©ãã
Goã®ããã«ãŸã£ããåãåé¡ã«èŠããã§ããŸãã ã ãããã®å šäœã®èªå€§å®£äŒ
å€ããšãŠãåœç©ã§ã°ãããŠãããšæããã®ã§ãšã©ãŒã®åšã-ããã¯ãã§ã«è¡ãããŠããŸã
äœå¹Žããäœå幎ãã å²ç¢ã¯ããããäœãåŠã°ãªãã£ããããªæ°ãããŸã
çµéšã ç¹ã«å®éã«èŠã€ããããšããŠããSwift / RustãèŠã
ããè¯ãæ¹æ³ã Java / CïŒã®ãããªæ¢åã®ãœãªã¥ãŒã·ã§ã³ã§è§£æ±ºããŸã
äŸå€ã§ãããå°ãªããšããããã¯ã¯ããã«å€ãèšèªã§ããâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/21161#issuecomment-381793840 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AICzv9w608ea2fwPq_wNpTDBnKMAdAKTks5tpTtsgaJpZM4Oi1c-
ã
@kirillx C ++ã®ããã«äŸå€ã欲ãããšèšã£ãããšã¯äžåºŠããããŸããã ç§ã®ã³ã¡ã³ããããäžåºŠèªãã§ãã ããã ãããŠãããã¯ãšã©ãŒåŠçãããã«ã²ã©ãCãšäœã®é¢ä¿ãããã®ã§ããããïŒ ãã€ã©ãŒãã¬ãŒããããããããã ãã§ãªãã延æãšè€æ°ã®æ»ãå€ããªãããããã€ã³ã¿ãŒåŒæ°ã䜿çšããŠå€ãè¿ããgotoã䜿çšããŠã¯ãªãŒã³ã¢ããããžãã¯ãæŽçããå¿ èŠããããŸãã Goã¯åããšã©ãŒã®æŠå¿µã䜿çšããŸãããé 延ãšè€æ°ã®æ»ãå€ã«é¢ããåé¡ã®ããã€ãã解決ããŸãã ããããå®åæã¯ãŸã ããã«ãããŸãã ä»ã®çŸä»£èšèªãäŸå€ãæãã§ããŸãããããã®åé·æ§ã®ããã«Cã¹ã¿ã€ã«ã§è§£æ±ºããããšãæãã§ããŸããã ããããç§ãã¡ããã®ææ¡ãæã¡ããã®åé¡ã«éåžžã«é¢å¿ãæã£ãŠããçç±ã§ãã
äŸå€ãæå±ãã人ã ã¯ãã®èšäºãèªãã¹ãã§ãïŒ https ïŒ
Java / C ++ã¹ã¿ã€ã«ã®äŸå€ãæ¬è³ªçã«æªãçç±ã¯ãç¹å®ã®å®è£ ã®ããã©ãŒãã³ã¹ãšã¯äœã®é¢ä¿ããããŸããã äŸå€ã¯ãBASICã®ããšã©ãŒæã®gotoãã§ãããgotoãæå¹ã«ãªãå¯èœæ§ã®ããã³ã³ããã¹ãã§ã¯è¡šç€ºãããªããããåé¡ããããŸãã äŸå€ã¯ããšã©ãŒåŠçãç°¡åã«å¿ããŠããŸãå Žæã«é ããŸãã Javaã®ãã§ãã¯ãããäŸå€ã¯ãã®åé¡ã解決ããã¯ãã§ããããå®éã«ã¯ã人ã ãäŸå€ããã£ããããŠé£ã¹ãããã¹ã¿ãã¯ãã¬ãŒã¹ãã©ãã«ã§ããã³ããããããããã解決ããŸããã§ããã
ç§ã¯ã»ãšãã©ã®é±ã«JavaãäœæããŠããŸãããããã©ãŒãã³ã¹ãã©ãã»ã©é«ããŠããGoã§Javaã¹ã¿ã€ã«ã®äŸå€ã確èªããããªãããšã匷調ããŠããŸãã
@lparã¯ãã¹ãŠã®forã«ãŒãã§ã¯ãããŸããããwhileã«ãŒãã¯ã
äžæ¹ãforããã³if / elseã¯ãå®è¡ã®æµããç®ã«èŠããªã圢ã§ä»ã®å Žæã«ãžã£ã³ãããããšã䌎ãããããŒã«ãŒããªãããšã瀺ããŸãã
誰ããGoLangã§åã®åŒã³åºãå ã«ãšã©ãŒãæž¡ãããã®åŒã³åºãå ãåã®åŒã³åºãå ã«ãšã©ãŒãè¿ããªã©ïŒå€ãã®ã³ãŒããã€ãºãé€ãïŒã®å Žåã¯ã©ããªããŸããïŒ èª°ããšã©ãŒãåŠçããã®ãã確èªããããã«ãã©ã®ãããã®ã³ãŒãã調ã¹ãŠãã©ããŒã¹ããå¿ èŠããããŸããïŒ åãããšãtry-catchã«ãåœãŠã¯ãŸããŸãã
äœãããã°ã©ããŒãæ¢ããããšãã§ããŸããïŒ é¢æ°ãå®éã«ãšã©ãŒãåŠçããå¿ èŠããªãå ŽåããããŸãã ãŠãŒã¶ãŒãŸãã¯ã·ã¹ãã 管çè ããšã©ãŒã解決ããããåé¿çãèŠã€ãããã§ããããã«ããšã©ãŒãUIã«æž¡ãããã ãã§ãã
é¢æ°ãäŸå€ãåŠçããããªãå Žåã¯ãtry-catchãããã¯ã䜿çšããªããããåã®åŒã³åºãå ãäŸå€ãåŠçã§ããŸãã æ§æã«åé¡ã¯ãªããšæããŸãã ããã¯ãŸãã¯ããã«ãããã§ãã ãã ããããã©ãŒãã³ã¹ãšãã®èšèªã§ã®å®è£ æ¹æ³ã¯ç°ãªããŸãã
以äžã«ç€ºãããã«ããšã©ãŒãåŠçããªãããã«4è¡ã®ã³ãŒããè¿œå ããå¿ èŠããããŸãã
func myFunc1() error{
// ...
if (err){
return err
}
return nil
}
ãšã©ãŒãåŒã³åºãå ã«è¿ããŠåŠçãããå Žåã¯ãããã§åé¡ãããŸããã éèŠãªã®ã¯ããšã©ãŒãè¿ãããæç¹ã§ãããããŠããããšãèŠãããšããããšã§ãã
æ€èšïŒ
x, err := lib.SomeFunc(100, 4)
if err != nil {
// A
}
// B
ã³ãŒããèŠããšãé¢æ°ã®åŒã³åºãæã«ãšã©ãŒãçºçããå¯èœæ§ãããããšãããããŸãã ãšã©ãŒãçºçããå Žåãã³ãŒããããŒã¯ãã€ã³ãAã§çµäºããŸããä»ã®å Žæã®ã³ãŒããããŒã¯ãã€ã³ãBã§ããããšãããããŸãããŸããerrãnilã®å Žåãxã¯æå¹ãªå€ã§ãããšããæé»ã®ã³ã³ãã©ã¯ãããããŸãããŒããŸãã¯ãã以å€ã®å Žåã
Javaãšã®å¯Ÿæ¯ïŒ
x = SomeFunc(100, 4)
ã³ãŒããèŠãŠããé¢æ°ãåŒã³åºããããšãã«ãšã©ãŒãçºçããå¯èœæ§ããããã©ããã¯ããããŸããã ãšã©ãŒãçºçããŠäŸå€ãšããŠè¡šçŸãããå Žåã goto
ãçºçããåšå²ã®ã³ãŒãã®äžéšã«å°éããå¯èœæ§ããããŸã...ãŸãã¯ãäŸå€ããã£ãããããªãå Žåã¯ãæçµçã«çºçããå¯èœæ§ããããŸãã³ãŒãã®ãŸã£ããç°ãªãéšåã®äžéšã®ã©ããã«ãããŸãã ãŸãã¯ãä»ã®èª°ãã®ã³ãŒãã«ãªã£ãŠããŸãå¯èœæ§ããããŸãã å®éãããã©ã«ãã®äŸå€ãã³ãã©ãŒã¯çœ®ãæããããšãã§ãããããä»ã®èª°ãã®ã³ãŒãã«ãã£ãŠè¡ãããããšã«åºã¥ããŠãæåéãã©ãã«ã§ãå°éããå¯èœæ§ããããŸãã
ããã«ãxãæå¹ã§ãããšããæé»ã®å¥çŽã¯ãããŸãããé¢æ°ãnullãè¿ãããšã©ãŒãå€ã®æ¬ èœã瀺ãã®ãäžè¬çã§ãã
Javaã§ã¯ããããã®åé¡ã¯ãã¹ãŠã®åŒã³åºãã§çºçããå¯èœæ§ããããŸããæªãã³ãŒãã ãã§ãªãã_all_Javaã³ãŒãã§ãå¿é
ããå¿
èŠããããŸãã ãã®ãããJavaéçºç°å¢ã«ã¯ããã€ã³ãããŠããé¢æ°ãäŸå€ãåŒãèµ·ããå¯èœæ§ããããã©ãããããã³ãããåŒãèµ·ããå¯èœæ§ã®ããäŸå€ã瀺ããããã¢ãããã«ãããããŸãã Javaããã§ãã¯äŸå€ãè¿œå ããã®ã¯ãã®ããã§ãããã®ãããäžè¬çãªãšã©ãŒã«ã€ããŠã¯ãé¢æ°åŒã³åºãã«ãã£ãŠäŸå€ãçºçããããã°ã©ã ãããŒãè¿åãããå¯èœæ§ãããããšãå°ãªããšãèŠåããå¿
èŠããããŸããã äžæ¹ãè¿ãããnullãšNullPointerException
ã®ãã§ãã¯ãããŠããªãæ§è³ªã¯ãã³ã¹ããæ瀺çã«ã©ããããå¿
èŠãããå Žåã§ããJava 8ã«Optional
ã¯ã©ã¹ãè¿œå ããŠJava8ãæ¹åããããšããã»ã©ã®åé¡ã§ãããªããžã§ã¯ããè¿ããã¹ãŠã®é¢æ°ã®æ»ãå€ã
ç§ã®çµéšã§ã¯ãæž¡ãããäºæããªãnullå€ããã®NullPointerException
ã¯ãJavaã³ãŒããã¯ã©ãã·ã¥ããæãäžè¬çãªæ¹æ³ã§ãããéåžžãã»ãšãã©å®å
šã«åœ¹ã«ç«ããªã倧ããªããã¯ãã¬ãŒã¹ãçºçããŸããé害ã®ããã³ãŒãããé ãé¢ããŠçæããããããåå ã瀺ããªããšã©ãŒã¡ãã»ãŒãžã Goã§ã¯ãGoã®çµéšãã¯ããã«å°ãªãã«ãããããããæ£çŽãªãšãããniléåç
§ãããã¯ãé倧ãªåé¡ã§ãããšã¯æã£ãŠããŸããã ããã¯ãç§ã«ãšã£ãŠãJavaã¯ãã®éã§ã¯ãªãGoããåŠã¶ã¹ãã§ããããšã瀺ããŠããŸãã
æ§æã«åé¡ã¯ãªããšæããŸãã
æ§æãJavaã¹ã¿ã€ã«ã®äŸå€ã®åé¡ã ãšèšã£ãŠãã人ã¯ããªããšæããŸãã
@ lpar ãGoã§ã®niléåç §ãããã¯ããJavaã§ã®NullPointerExceptionãããåªããŠããã®ã¯ãªãã§ããïŒ ããããã¯ããšãã¹ããŒãã®éãã¯äœã§ããïŒ ãããã®ã»ãã³ãã£ã¯ã¹ã®éãã¯äœã§ããïŒ
ãããã¯ã¯å埩å¯èœã§ãããã¹ããŒã¯ãã£ããå¯èœã§ããïŒ å³ïŒ
ç§ã¯ã¡ããã©1ã€ã®éããæãåºããŸããããããã¯ã§ããªãã¯ãšã©ãŒãªããžã§ã¯ããŸãã¯æååãªããžã§ã¯ããŸãã¯ä»ã®ã¿ã€ãã®ãªããžã§ã¯ãã§ãããã¯ã«ãªãããšãã§ããŸãïŒç§ãééã£ãŠãããªãç§ãèšæ£ããŠãã ããïŒããthrowã§ããªãã¯ã¿ã€ãExceptionãŸãã¯ãµãã¯ã©ã¹ã®ãªããžã§ã¯ããæããããšãã§ããŸãäŸå€ã®ã¿ã
Goã§ã®niléåç §ãããã¯ããJavaã§ã®NullPointerExceptionãããåªããŠããã®ã¯ãªãã§ããïŒ
åè ã¯ç§ã®çµéšã§ã¯ã»ãšãã©èµ·ãããªãã®ã«å¯ŸããåŸè ã¯ãã€ãèµ·ããã®ã§ãç§ã説æããçç±ã§ã
@lparæè¿Javaã§ããã°ã©ãã³ã°ããŠããªãã®ã§ãããã¯æ°ããããšã ãšæããŸãïŒéå»5幎éïŒããCïŒã«ã¯ãäŸå€ãäœæããããã®nullåç §ãåé¿ããããã®å®å šãªããã²ãŒã·ã§ã³æŒç®åããããŸãããGoã«ã¯äœããããŸããïŒ ããããããŸãããããã®ãããªç¶æ³ã«å¯ŸåŠãããã®ã¯äœããªããšæããŸãã ãããã£ãŠããããã¯ãåé¿ãããå Žåã§ãããããã®éããã¹ããããif-not-nil-elseã¹ããŒãã¡ã³ããã³ãŒãã«è¿œå ããå¿ èŠããããŸãã
ãšã©ãŒã®æ»ãå€ã確èªããéããéåžžãæ»ãå€ã確èªããŠGoã§nilã§ãããã©ããã確èªããå¿ èŠã¯ãããŸããã ãããã£ãŠãéããã¹ããããifã¹ããŒãã¡ã³ãã¯ãããŸããã
ãã«éåç §ã¯æªãäŸã§ããã ããªãããããæãŸããªããã°ãGoãšJavaã¯ãŸã£ããåãããã«æ©èœããŸã-ã¹ã¿ãã¯ãã¬ãŒã¹ã§ã¯ã©ãã·ã¥ããŸãã ã¹ã¿ãã¯ãã¬ãŒã¹ã圹ã«ç«ããªãã®ã¯ã©ãããŠã§ããã ããªãã¯ãããèµ·ãã£ãæ£ç¢ºãªå Žæãç¥ã£ãŠããŸãã ç§ã®çµéšã§ã¯ãnulléåç §ã¯åçŽãªããã°ã©ããŒã®ãšã©ãŒãåå ã§ãããããCïŒãšGo for meã®äž¡æ¹ã§ããã®çš®ã®ã¯ã©ãã·ã¥ãä¿®æ£ããã®ã¯éåžžç°¡åã§ãã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ã誰ãããåŠã¶ããšã¯äœããããŸããã
@lpar
åè ã¯ç§ã®çµéšã§ã¯ã»ãšãã©èµ·ãããªãã®ã«å¯ŸããåŸè ã¯ãã€ãèµ·ããã®ã§ãç§ã説æããçç±ã§ã
ããã¯å¶ç¶ã§ãããJavaãGoãããnil / nullã®æ¹ãã©ããããããæªããšããçç±ã¯ã³ã¡ã³ãã«ãããŸããã§ããã Goã³ãŒãã§å€æ°ã®niléåç §ã¯ã©ãã·ã¥ãçºçããŸããã ãããã¯ãCïŒ/ Javaã®nulléåç §ãšãŸã£ããåãã§ãã Goã§ããå€ãã®å€åã䜿çšããŠããå¯èœæ§ããããŸããããã¯åœ¹ç«ã¡ãŸããïŒCïŒã«ããããŸãïŒãäœãå€æŽãããŸããã
äŸå€ãšããŠãSwiftãèŠãŠã¿ãŸãããã ãšã©ãŒãã¹ããŒããå¯èœæ§ã®ããé¢æ°ã®ããŒã¯ãŒãthrows
ããããŸãã ãããªãã§æ©èœããããšã¯ã§ããŸããã å®è£
ã«é¢ããŠã¯ãreturnã®ããã«æ©èœããŸãããããããäžéšã®ã¬ãžã¹ã¿ã¯ãšã©ãŒãè¿ãããã«äºçŽãããŠãããé¢æ°ãã¹ããŒãããã³ã«éåžžã©ããã«æ»ããŸããããšã©ãŒå€ãå«ãŸããŸãã ãããã£ãŠãäºæããªããšã©ãŒã®åé¡ã解決ãããŸããã ã©ã®é¢æ°ãã¹ããŒãããããæ£ç¢ºã«ç¥ã£ãŠããããããçºçããå¯èœæ§ã®ããæ£ç¢ºãªå Žæãç¥ã£ãŠããŸãã ãšã©ãŒã¯å€ã§ãããã¹ã¿ãã¯ã®å·»ãæ»ãã¯å¿
èŠãããŸããã ããªãããããæãŸãããŸã§ã圌ãã¯ãã è¿ãããŸãã
ãŸãã¯ãçµæãšãšã©ãŒãéã¶ç¹å¥ãªçµæã¿ã€ããããRustã«äŒŒããã®ã ãšã©ãŒã¯ãæ瀺çãªæ¡ä»¶ã¹ããŒãã¡ã³ããªãã§äŒæã§ããŸãã ããã«å ããŠããã¿ãŒã³ãããã³ã°ã®è¯ãããããããããŸãããããã¯ããããGoã«ã¯åœãŠã¯ãŸããŸããã
ãããã®èšèªã¯äž¡æ¹ãšããäž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ïŒCãšJavaïŒãæ¡çšããããããçµã¿åãããŠããåªãããã®ã«ããŸãã äŸå€ããã®ãšã©ãŒäŒæ+ãšã©ãŒå€ãšCããã®æãããªã³ãŒããããŒ+äœã圹ã«ç«ããªãéããã€ã©ãŒãã¬ãŒãã³ãŒãã¯ãããŸããã ãããã£ãŠããããã®ç¹å®ã®å®è£ ãæ€èšããäœããã®åœ¢ã§äŸå€ã«äŒŒãŠãããšããçç±ã ãã§å®å šã«ç¡å¹ã«ããªãããšãè³¢æã ãšæããŸãã äŸå€ãéåžžã«å€ãã®èšèªã§äœ¿çšãããŠããã®ã«ã¯çç±ããããŸããäŸå€ã«ã¯ãã©ã¹é¢ãããããã§ãã ããã§ãªããã°ãèšèªã¯ããããç¡èŠããŸãã ç¹ã«C ++ã®åŸã
ã¹ã¿ãã¯ãã¬ãŒã¹ã圹ã«ç«ããªãã®ã¯ã©ãããŠã§ããã
ç§ã¯ãã»ãšãã©å®å šã«åœ¹ã«ç«ããªãããšèšããŸããã ã®ããã«ãç§ã¯ãããã1è¡ã®æ å ±ããå¿ èŠãšããŸããããããã¯æ°åè¡ã®é·ãã§ãã
ããã¯å¶ç¶ã§ãããJavaãGoãããnil / nullã®æ¹ãã©ããããããæªããšããçç±ã¯ã³ã¡ã³ãã«ãããŸããã§ããã
ãã®åŸãããªãã¯èããŠããŸããã æ»ã£ãŠãæé»ã®å¥çŽã«é¢ããéšåãèªãã§ãã ããã
ãšã©ãŒã¯ãæ瀺çãªæ¡ä»¶ã¹ããŒãã¡ã³ããªãã§äŒæã§ããŸãã
ãããŠãããããŸãã«åé¡ã§ãããšã©ãŒãäŒæããå¶åŸ¡ãããŒãå€åãããããçºçããããšã瀺ãæ瀺çãªãã®ã¯äœããããŸããã ã©ãããããªãã¯ãããåé¡ã ãšã¯æããªãããä»ã®äººã¯åæããªãã
RustãŸãã¯Swiftã«ãã£ãŠå®è£ ãããäŸå€ããç§ãç¥ããªãJavaãšåãåé¡ã«èŠããã§ãããã©ããã«ããããããåé¡ã®èšèªã«ç²Ÿéãã誰ãã«ãããä»»ããŸãã
@KamyarMåºæ¬çã«nilã
ãããŠãããããŸãã«åé¡ã§ãããšã©ãŒãäŒæããå¶åŸ¡ãããŒãå€åãããããçºçããããšã瀺ãæ瀺çãªãã®ã¯äœããããŸããã
ããã¯ç§ã«åœãŠã¯ãŸããŸãã å¥ã®ããã±ãŒãžãæ¶è²»ããããã±ãŒãžãéçºãããã®ããã±ãŒãžãäŸå€ãã¹ããŒããå Žåããã®æ©èœã䜿çšãããã©ããã«é¢ä¿ãªãã_I_ããã®ããšãèªèããŠããå¿ èŠããããŸãã ããã¯ãææ¡ãããŠããèšèªæ©èœã®äžã§çããåŽé¢ã§ãã ã»ãšãã©ã¯ãããã°ã©ããŒããªããã€ã³ã§ãããã®ããŸãã¯èªåã®è£éã§äœ¿çšããªããã®ã§ãã äŸå€ã¯ããã®æå³ã«ãããäºæ³ããããã©ããã«ããããããããããçš®é¡ã®å¢çãè¶ããŸãã
ç§ã¯ãã»ãšãã©å®å šã«åœ¹ã«ç«ããªãããšèšããŸããã ã®ããã«ãç§ã¯ãããã1è¡ã®æ å ±ããå¿ èŠãšããŸããããããã¯æ°åè¡ã®é·ãã§ãã
ãããŠãäœçŸãã®ãŽã«ãŒãã³ãå«ã巚倧ãªGoãã¬ãŒã¹ã¯ãã©ãããããããã£ãšäŸ¿å©ã§ããïŒ ããã§ã©ãã«è¡ãã®ãããããŸããã ããã§ã¯ãJavaãšGoã¯ãŸã£ããåãã§ãã ãŸãããã«ã¹ã¿ãã¯ã芳å¯ããŠãã³ãŒããã¯ã©ãã·ã¥ããå Žæã§ã©ã®ããã«çµäºããããç解ãããšäŸ¿å©ãªå ŽåããããŸãã CïŒãšGoã®ãã¬ãŒã¹ã¯ããããäœåºŠãå©ããŠãããŸããã
ãã®åŸãããªãã¯èããŠããŸããã æ»ã£ãŠãæé»ã®å¥çŽã«é¢ããéšåãèªãã§ãã ããã
ç§ã¯ãããèªã¿ãŸãããäœãå€ãããŸããã§ããã ç§ã®çµéšã§ã¯ãããã¯åé¡ã§ã¯ãããŸããã ããããäž¡æ¹ã®èšèªã§ã®ããã¥ã¡ã³ãã®ç®çã§ãïŒããšãã°ã net.ParseIP
ïŒã å€ãnil / nullã§ãããã©ããã確èªããã®ãå¿ããå Žåã¯ãäž¡æ¹ã®èšèªã§ãŸã£ããåãåé¡ãçºçããŸãã ã»ãšãã©ã®å ŽåãGoã¯ãšã©ãŒãè¿ããCïŒã¯äŸå€ãã¹ããŒãããããnilã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸããã åªããAPIã¯ãäŸå€ãäœãåé¡ãªã®ãã瀺ãäœããã¹ããŒããã«nullãè¿ãã ãã§ã¯ãããŸããã ãã以å€ã®å Žåã¯ãæ瀺çã«ãã§ãã¯ããŸãã ç§ã®çµéšã§nullãçºçããæãäžè¬çãªã¿ã€ãã®ãšã©ãŒã¯ãåãã£ãŒã«ãããã€ã³ã¿/ãªããžã§ã¯ãã§ãããããã³ã«ãããã¡ãããå ŽåããŸãã¯å
éšç¶æ
ã«å¿ããŠã¯ã©ã¹/æ§é äœãã£ãŒã«ããnilã«ãªãå¯èœæ§ãããå
éšããžãã¯ããããåã«ãã§ãã¯ããã®ãå¿ããå Žåã§ããã¢ã¯ã»ã¹ã ããã¯ç§ã«ãšã£ãŠæãäžè¬çãªãã¿ãŒã³ã§ãããGoã§ã¯ãã®åé¡ã倧å¹
ã«è»œæžãããã®ã¯ãããŸããã å°ã圹ç«ã€2ã€ã®ååãä»ããããšãã§ããŸã-䟿å©ãªç©ºã®å€ãšå€ã®åã§ãã ãã ãã䜿çšããåã«ãã¹ãŠã®å€æ°ãäœæããå¿
èŠããªããããããã°ã©ãã³ã°ã®ãããããéèŠã«ãªããŸãã
ãããŠãããããŸãã«åé¡ã§ãããšã©ãŒãäŒæããå¶åŸ¡ãããŒãå€åãããããçºçããããšã瀺ãæ瀺çãªãã®ã¯äœããããŸããã ã©ãããããªãã¯ãããåé¡ã ãšã¯æããªãããä»ã®äººã¯åæããªãã
ããã¯åé¡ã§ããä»ã®ããšãèšã£ãããšã¯ãããŸããããããã®äººã
ã¯Java / CïŒ/ C ++ã®äŸå€ã«åºå·ããŠãããããå°ã䌌ãŠãããã®ã¯ãã¹ãŠç¡èŠããŸãã Swiftã§é¢æ°ã«throws
ããŒã¯ãä»ããå¿
èŠãããã®ã¯ãé¢æ°ã«äœãæåŸ
ãã¹ãããå¶åŸ¡ãããŒãã©ãã§å£ããããRustã§äœ¿çšããããæ£ç¢ºã«ç¢ºèªã§ããçç±ã§ãã ããŸããŸãªãã«ããŒã¡ãœããã䜿çšããŠãšã©ãŒãæ瀺çã«äŒæããããå€ãã®ã³ã³ããã¹ããæäŸããŸãã ã©ã¡ããå€ãšåããšã©ãŒã®æŠå¿µã䜿çšããŸããããã€ã©ãŒãã¬ãŒããæžããããã«æ§æç³è¡£ã§ã©ããããŸãã
ãããŠãäœçŸãã®ãŽã«ãŒãã³ãå«ã巚倧ãªGoãã¬ãŒã¹ã¯ãã©ãããããããã£ãšäŸ¿å©ã§ããïŒ
Goã䜿çšãããšããšã©ãŒãæ€åºãããæç¹ã®å Žæãšãšãã«ãšã©ãŒããã°ã«èšé²ããããšã§ããšã©ãŒã«å¯ŸåŠã§ããŸãã è¿œå ããããšãéžæããªãéããããã¯ãã¬ãŒã¹ã¯ãããŸããã ç§ã¯äžåºŠã ããããããå¿ èŠããããŸããã
ç§ã®çµéšã§ã¯ãããã¯åé¡ã§ã¯ãããŸããã
ãããšãç§ã®çµéšã¯ç°ãªããŸããã»ãšãã©ã®äººã®çµéšã¯ç°ãªããšæããŸãããã®èšŒæ ãšããŠãJava8ããªãã·ã§ã³åãè¿œå ãããšããäºå®ãåŒçšããŸãã
ãã®ã¹ã¬ããã§ã¯ãäŸå€ã®æç¡ã«ã€ããŠã®èª¬æãå«ããGoãšãã®ãšã©ãŒåŠçã·ã¹ãã ã®å€ãã®é·æãšçæã«ã€ããŠèª¬æããŸããããããèªãããšã匷ããå§ãããŸãã
https://elixirforum.com/t/discussing-go-split-thread/13006/2
ãšã©ãŒåŠçã«2ã»ã³ãïŒãã®ãããªã¢ã€ãã¢ãäžèšã§èšåãããŠããå Žåã¯ç³ãèš³ãããŸããïŒã
ã»ãšãã©ã®å Žåããšã©ãŒãåã¹ããŒããããšæããŸãã ããã«ããã次ã®ãããªã¹ãããããäœæãããŸãã
a, err := fn()
if err != nil {
return err
}
use(a)
return nil
å€æ°ã«å²ãåœãŠãããŠããªãå ŽåïŒäœåãªæ§æãªãã§ïŒãnil以å€ã®ãšã©ãŒãèªåçã«åã¹ããŒããŸãããã äžèšã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
a := fn()
use(a)
// or just
use(fn())
ã³ã³ãã€ã©ãä¿åãããŸãerr
æé»çã«ïŒèŠããªãïŒå€æ°ãã®ããã«ããã確èªããããã«nil
çµãããšé²ãïŒERR == nilã®å ŽåïŒãŸãã¯ïŒERRïŒ= nilã®å ŽåïŒãããè¿ããšãæ»ãã¯niléåžžã®ããã«ããããèªåçãã€æé»çã«ãé¢æ°ã®å®è¡äžã«ãšã©ãŒãçºçããªãã£ãå Žåã®é¢æ°ã®ã
err
åŠçããå¿
èŠãããå Žåã¯ãæ瀺çãªå€æ°ã«å²ãåœãŠãŠäœ¿çšããå¿
èŠããããŸãã
a, err := fn()
if err != nil {
doSomething(err)
} else {
use(a)
}
return nil
ãšã©ãŒã¯æ¬¡ã®ããã«æå¶ã§ããŸãã
a, _ := fn()
use(a)
è€æ°ã®ãšã©ãŒãè¿ããããŸããªïŒçŽ æŽãããïŒã±ãŒã¹ã§ã¯ãæ瀺çãªãšã©ãŒåŠçãå¿ é ã«ãªããŸãïŒä»ã®ããã«ïŒïŒ
err1, err2 := fn2()
if err1 != nil || err2 != nil {
return err1, err2
}
return nil, nil
ããã¯ç§ã®äž»åŒµã§ããããŸã-ã»ãšãã©ã®å Žåããšã©ãŒãåã¹ããŒãããã®ã§ãããããã¯éåžžããã©ã«ãã®ã±ãŒã¹ã§ãã ãããŠå€åããã«ããã€ãã®ã³ã³ããã¹ããäžããŸãã äŸå€ãé€ããŠãã³ã³ããã¹ãã¯ã¹ã¿ãã¯ãã¬ãŒã¹ã«ãã£ãŠèªåçã«è¿œå ãããŸãã Goã®ãããªãšã©ãŒã®å Žåã¯ããšã©ãŒã¡ãã»ãŒãžãè¿œå ããŠæåã§è¡ããŸãã ãã£ãšã·ã³ãã«ã«ããŠã¿ãŸãããã ãããŠããã¯ãä»ã®èšèªãæå¿«ãã®åé¡ãšãã©ã³ã¹ãåããªããããããšããŠããããšã§ãã
ãããã£ãŠããå€æ°ã«å²ãåœãŠãããŠããªãå ŽåïŒè¿œå ã®æ§æãªãã§ïŒãnil以å€ã®ãšã©ãŒãèªåçã«åã¹ããŒãããããšã«åæããŸãããåŸåã®éšåã§ãã°ãçºçããŸãã ãããäŸå€ãé€ããåé¡ã®æ ¹æºã§ããããªã人ã ã¯åœŒãã«ãããã«é¢é£ããããšã«ã€ããŠè©±ãããšã«å察ããŠããã®ã ãšæããŸãã ãããã¯ãäœåãªæ§æãªãã§å¶åŸ¡ãããŒãå€æŽããŸãã ããã¯æªãããšã§ãã
ããšãã°ãSwiftãèŠããšããã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸããã
func a() throws {}
func b() throws {
a()
}
a
ã¯ãšã©ãŒãã¹ããŒããå¯èœæ§ãããããããšã©ãŒãäŒæããããã«ãtry a()
ãæžã蟌ãå¿
èŠããããŸãã ããªããåé€ãããšthrows
ããb
ããããããŠã³ã³ãã€ã«ãããŸããtry a()
ã b
å
ã§ãšã©ãŒãåŠçããå¿
èŠããããŸãã ããã¯ãäŸå€ã®äžæ確ãªå¶åŸ¡ãããŒã®åé¡ãšObjective-Cãšã©ãŒã®åé·æ§ã®äž¡æ¹ã解決ããããšã©ãŒãåŠçããããã®ã¯ããã«åªããæ¹æ³ã§ãã åŸè
ã¯ãGoã®ãšã©ãŒãšã»ãŒåãã§ãããSwiftã眮ãæããããšãæå³ããŠããŸãã ç§ãå«ããªã®ã¯ãSwiftã䜿çšããŠããtry, catch
ãã®ã§ãã æ»ãå€ã®äžéšãšããŠãšã©ãŒãæ®ããããšæããŸãã
ãããã£ãŠãç§ãææ¡ããã®ã¯ãå®éã«è¿œå ã®æ§æã䜿çšããããšã§ãã åŒã³åºããµã€ããããèªäœã§ãå¶åŸ¡ãããŒãå€æŽãããå¯èœæ§ã®ããæœåšçãªå Žæã§ããããšãéç¥ããããã«ããŸãã ãŸãããã®äœåãªæ§æãèšè¿°ããªããšãã³ã³ãã€ã«ãšã©ãŒãçºçããããšãææ¡ããŸãã ããã¯ãGoãçŸåšã©ã®ããã«æ©èœããããšã¯ç°ãªãããšã©ãŒãåŠçããããšã匷å¶ããŸãã _
ãããªãã®ã§ãšã©ãŒããµã€ã¬ã³ãã«ããæ©èœãæå
¥ããããšãã§ããŸããããã¯ãå°ããªãšã©ãŒããã¹ãŠåŠçããã®ãéåžžã«ã€ã©ã€ã©ããå Žåãããããã§ãã ããšãã°ã printf
ã äœããèšé²ã§ããªããŠãããŸããŸããã Goã«ã¯ãã§ã«ãããã®åä»ãªã€ã³ããŒãããããŸãã ããããããã¯å°ãªããšãããŒã«ã§è§£æ±ºããŸããã
ç§ãä»èããããšãã§ããã³ã³ãã€ã«æãšã©ãŒã«ã¯2ã€ã®éžæè¢ããããŸãã Go nowã®ããã«ããšã©ãŒãé»ã£ãŠç¡èŠããŸãã ç§ã¯ããã奜ãã§ã¯ãããŸããããããŠããã¯åžžã«Goãšã©ãŒåŠçã«é¢ããç§ã®åé¡ã§ããã äœã匷å¶ãããŸãããããã©ã«ãã®åäœã§ã¯ããšã©ãŒãé»ã£ãŠç¡èŠããŸãã ããã¯æªãããšã§ããããã¯ããªããé 匷ã§ãããã°ããããããã°ã©ã ãæžãæ¹æ³ã§ã¯ãããŸããã ç§ãæ æ°ã§ãããæéåãã§ãããšãã«Objective-Cã§ããŸãã«ãå€ãã®ã±ãŒã¹ããããåãã³ãŒãã®ãã°ã«ã¶ã€ãã£ãã ãã§ãšã©ãŒãç¡èŠããŸãããããªããããèµ·ãã£ãã®ãã«ã€ããŠã®èšºææ å ±ã¯ãããŸããã§ããã å°ãªããšããã°ãèšé²ããããšã§ãå€ãã®å Žåããã®å Žã§åé¡ã解決ããããšãã§ããŸãã
æ¬ ç¹ã¯ã人ã
ããšã©ãŒãç¡èŠãå§ããããã°ã©ãã«ã§ãtry, catch(...)
é
眮ããå¯èœæ§ãããããšã§ãã ããã¯å¯èœæ§ã§ãããåæã«ãããã©ã«ãã§ãšã©ãŒãç¡èŠãããã®ã§ãããããã®ã¯ããã«ç°¡åã§ãã äŸå€ã«ã€ããŠã®è°è«ã¯ããã§ã¯åœãŠã¯ãŸããªããšæããŸãã äŸå€ãé€ããŠãäœäººãã®äººã
ãéæããããšããŠããã®ã¯ã圌ãã®ããã°ã©ã ãããå®å®ããŠãããšããå¹»æ³ã§ãã æªåŠçã®äŸå€ãããã°ã©ã ãã¯ã©ãã·ã¥ããããšããäºå®ãããã§ã®åé¡ã§ãã
ä»ã®éžæè¢ã¯ãããã¯ã«ãªãã§ãããã ããããããã¯ãã ã€ã©ã€ã©ããã ãã§ãäŸå€ã®èšæ¶ããããããŸãã ããã¯ééããªã人ã ã圌ãã®ããã°ã©ã ãã¯ã©ãã·ã¥ããªãããã«ãé²åŸ¡çãªãã³ãŒãã£ã³ã°ãããããã«å°ãã§ãããã ç§ã«ãšã£ãŠãçŸä»£èªã¯ã³ã³ãã€ã«æã«å¯èœãªéãå€ãã®ããšãè¡ããå®è¡æã«å¯èœãªéãå°ãªã決å®ãæ®ãå¿ èŠããããŸãã ãããã¯ãé©åã§ããå¯èœæ§ãããã®ã¯ãã³ãŒã«ã¹ã¿ãã¯ã®æäžäœã§ãã ããšãã°ãmainé¢æ°ã§ãšã©ãŒãåŠçããªããšãèªåçã«ãããã¯ãçºçããŸãã ããã¯ãŽã«ãŒãã³ã«ãåœãŠã¯ãŸããŸããïŒ ãããããã¹ãã§ã¯ãããŸããã
ãªã劥åãæ€èšããã®ã§ããïŒ
@ nick-korsakovå ã®ææ¡ïŒãã®åé¡ïŒã¯ããšã©ãŒã«ã³ã³ããã¹ããè¿œå ããããšèããŠããŸãã
ãšã©ãŒãç¡èŠããããšã¯ãã§ã«ç°¡åã§ãïŒããããç°¡åãããŸãïŒïŒïŒ20803ãåç §ïŒã ãšã©ãŒåŠçã«é¢ããæ¢åã®ææ¡ã®å€ãã¯ãå€æŽããã«ãšã©ãŒãè¿ãã®ã容æã«ããŸãïŒããšãã°ãïŒ16225ãïŒ18721ãïŒ21146ãïŒ21155ïŒã è¿œå æ å ±ã䜿çšããŠãšã©ãŒãç°¡åã«è¿ãããšãã§ãããã®ã¯ã»ãšãã©ãããŸããã
ãã®ã³ã¡ã³ããåç §ããŠãã ããã
ãã®ã³ã¡ã³ãã§ã¯ãïŒã«ãŒãã§å®è¡ããã®ã§ã¯ãªãïŒãã®è°è«ãé²ããããã«ãæ éã«åŠçããããšã©ãŒã¡ãã»ãŒãžãªã©ã®ç®æšãããé©åã«å®çŸ©ããå¿ èŠãããããšããå§ãããŸãã å šäœãèªãã®ã¯ããªãèå³æ·±ãã§ããã3ç§éã®ééã®èšæ¶ã®åé¡ã®åœ±é¿ãåããŠããããã§ãïŒããŸãçŠç¹ãçµã£ãŠããªã/åé²ããŠããªããçŽ æŽãããåµé çãªæ§æã®å€æŽãç¹°ãè¿ããŠãããäŸå€/ãããã¯ãªã©ã«ã€ããŠã®è°è«ïŒã
å¥ã®èªè»¢è»å°å±ïŒ
func makeFile(url string) (size int, err error){
rsp, err := http.Get(url)
try err
defer rsp.Body.Close()
var data dataStruct
dec := json.NewDecoder(rsp.Body)
err := dec.Decode(&data)
try errors.Errorf("could not decode %s: %v", url, err)
f, err := os.Create(data.Path)
try errors.Errorf("could not open file %s: %v", data.Path, err)
defer f.Close()
return f.Write([]byte(data.Rows))
}
try
ã¯ãã空ã®å€ã§ãªãå Žåã¯è¿ããããšãæå³ããŸãã ããã§ã¯ãerrãnilã®å Žåã errors.Errorf
ãnil
ãè¿ããšæ³å®ããŠããŸãã ããã¯ãç°¡åãªã©ããã³ã°ãç®æšã«ããªãããæåŸ
ã§ããã»ã©ã®ç¯çŽã«ãªããšæããŸãã
æšæºã©ã€ãã©ãªã®ã¹ãã£ããŒã¿ã€ãã¯ãæ§é å ã«ãšã©ãŒç¶æ ãæ ŒçŽããŸããæ§é ã®ã¡ãœããã¯ãç¶è¡ããåã«ãšã©ãŒã®ååšã責任ãæã£ãŠãã§ãã¯ã§ããŸãã
type Scanner struct{
err error
}
func (s *Scanner) Scan() bool{
if s.err != nil{
return false
}
// scanning logic
}
func (s *Scanner) Err() error{ return s.err }
ã¿ã€ãã䜿çšããŠãšã©ãŒç¶æ ãæ ŒçŽããããšã«ããããã®ãããªã¿ã€ãã䜿çšããã³ãŒãã«åé·ãªãšã©ãŒãã§ãã¯ããªãããã«ããããšãã§ããŸãã
ãŸããèšèªã§ã®åµé çã§å¥åŠãªæ§æã®å€æŽãäºæããªãå¶åŸ¡ã®è»¢éãå¿ èŠãããŸããã
ãŸããtry / catchã®ãããªãã®ãææ¡ããå¿ èŠããããŸããããã§ãerrã¯try {}å ã§å®çŸ©ãããerrãnil以å€ã®å€ã«èšå®ãããŠããå ŽåããããŒã¯try {}ããerrãã³ãã©ãŒãããã¯ïŒååšããå ŽåïŒã«ãã¬ãŒã¯ããŸãã
å
éšçã«ã¯äŸå€ã¯ãããŸããããå
šäœãè¿ã¥ããå¿
èŠããããŸã
errãå²ãåœãŠãããšãã§ãããã¹ãŠã®è¡ã®åŸã«if err != nil break
ãã§ãã¯ãå®è¡ããæ§æã«ã
äŸãã°ïŒ
...
try(err) {
err = doSomethig()
err, value := doSomethingElse()
doSomethingObliviousToErr()
err = thirdErrorProneThing()
}
catch(err SomeErrorType) {
handleSomeSpecificErr(err)
}
catch(err Error) {
panic(err)
}
ç§ã¯ãããC ++ã®ããã«èŠããããšãç¥ã£ãŠããŸããããã¹ãŠã®è¡ã®åŸã«æåã®if err != nil {...}
ãããããç¥ãããŠããŠãããã§ãã
@ãªã®ã§
ã¹ãã£ããŒã¿ã€ãã¯ããã¹ãŠã®äœæ¥ãå®è¡ããŠããããæ©èœããŸãããããã£ãŠãéäžã§èªèº«ã®ãšã©ãŒã远跡ããäœè£ããããŸãã ãããæ®éçãªè§£æ±ºçã§ãããšèªåèªèº«ããããã£ãŠã¯ãããŸããã
@carlmjohnson
åçŽãªãšã©ãŒã«å¯ŸããŠ1ã€ã®ã©ã€ããŒãåŠçããå¿
èŠãããå Žåã¯ãæ§æãå€æŽããŠãreturnã¹ããŒãã¡ã³ãã1è¡ã®ãããã¯ã®å
é ã«ãªãããã«ããããšãã§ããŸãã
ããã¯äººã
ãæžãããšãå¯èœã«ããã§ãããïŒ
func makeFile(url string) (size int, err error){
rsp, err := http.Get(url)
if err != nil return err
defer rsp.Body.Close()
var data dataStruct
dec := json.NewDecoder(rsp.Body)
err := dec.Decode(&data)
if err != nil return errors.Errorf("could not decode %s: %v", url, err)
f, err := os.Create(data.Path)
if err != nil return errors.Errorf("could not open file %s: %v", data.Path, err)
defer f.Close()
return f.Write([]byte(data.Rows))
}
ã¹ããã¯ã次ã®ããã«å€æŽããå¿ èŠããããšæããŸãïŒããã¯ããªããã€ãŒããããããŸãã:)ïŒ
Block = "{" StatementList "}" | "return" Expression .
errã3è¡ã§ã¯ãªã1è¡ããã§ãã¯ããå ŽåãgofmtãåçŽã«å€æŽããããããç¹å¥ãªã±ãŒã·ã³ã°ãªã¿ãŒã³ã®æ¹ãæ¬åœã«åªããŠãããšã¯æããŸããã
@urandom
1ã€ã®ããã¯ã¹åå¯èœãªã¿ã€ããè¶ ããŠåäœãããšã©ãŒãšãã®ã¢ã¯ã·ã§ã³ã¯æšå¥šãããã¹ãã§ã¯ãããŸããã ç§ã«ãšã£ãŠã¯ãé¢ä¿ã®ãªãããŸããŸãªã¢ã¯ã·ã§ã³ããçºçãããšã©ãŒéã§ãšã©ãŒã³ã³ããã¹ããã©ãããŸãã¯è¿œå ããåªåãäžè¶³ããŠããããšã瀺ããŠããŸãã
ã¹ãã£ããŒã®ã¢ãããŒãã¯ããã®ããšã©ãŒã¯äŸ¡å€èŠ³ããšãããã³ãã©å šäœã®æèã§ç§ãèªãã ææªã®ããšã®1ã€ã§ãã
å Žåã«ãã£ãŠã¯ãã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ã浪費ããŸãã
ãã³ãããŒã¯ïŒ ãèšç®ãªãœãŒã¹ããšã¯æ£ç¢ºã«ã¯äœã§ããïŒ
ãšã©ãŒãçºçããæ£ç¢ºãªå Žæãé衚瀺ã«ããŸãã
ããããããã§ã¯ãããŸãããnil以å€ã®ãšã©ãŒã¯äžæžããããªãããã§ãã
è€æ°ã®å€éšããã±ãŒãžãåŒã³åºãé¢æ°ã¯ããã®æ©æµãåããŸããã
ããã¯è€éã§ãªãã¿ã®ãªãæŠå¿µã§ã
ã¹ãã£ããŒã®ã¢ãããŒãã¯ããã®ããšã©ãŒã¯äŸ¡å€èŠ³ãå šäœã®æèã§ç§ãèªãã ææªã®ããšã®1ã€ã§ãã
ç§ã®å°è±¡ã§ã¯ãããªãã¯ã¢ãããŒããç解ããŠããŸããã ããã¯ãèªå·±å®çµåã®éåžžã®ãšã©ãŒãã§ãã¯ãšè«ççã«åçã§ããäŸã詳ãã調ã¹ãŠã_èªãã _ææªã®ããšã§ã¯ãªããç解ã§ããææªã®ããšã«ãªãå¯èœæ§ãããããšããå§ãããŸãã
ç³ãèš³ãããŸããããç§èªèº«ã®ææ¡ãå±±ã«è¿œå ããŸãã ç§ã¯ããã«ãããã®ã®ã»ãšãã©ãèªã¿éããŸããããããŠç§ã¯ããã€ãã®ææ¡ã奜ãã§ããã圌ããããããã ãšæããŠããŸãã åé¡ã¯ãšã©ãŒãã€ã©ãŒãã¬ãŒãã§ãã ç§ã®ææ¡ã¯ãæ§æã¬ãã«ã§ãã®å®åæãæé€ãããšã©ãŒãæž¡ãããæ¹æ³ããã®ãŸãŸã«ããŠããããšã§ãã
_!
ããŒã¯ã³ãã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãšããŠäœ¿çšã§ããããã«ããããšã§ãšã©ãŒãã€ã©ãŒãã¬ãŒããæžããããŒã以å€ã®error
å€ãå²ãåœãŠããããšãã«ãããã¯ãåŒãèµ·ãããŸã
val, err := something.MayError()
if err != nil {
panic(err)
}
ã«ãªãå¯èœæ§ããããŸã
val, _! := something.MayError()
ãš
if err := something.MayError(); err != nil {
panic(err)
}
ã«ãªãå¯èœæ§ããããŸã
_! = something.MayError()
ãã¡ãããç¹å®ã®ã·ã³ãã«ã¯è°è«ã®äœå°ããããŸãã _^
ã _*
ã @
ãªã©ãæ€èšããŸããã äžç®ã§æã銎æã¿ããããšæã£ãã®ã§ãäºå®äžã®ææ¡ãšããŠ_!
ãéžã³ãŸããã
æ§æçã«ã¯ã _!
ïŒãŸãã¯éžæãããããŒã¯ã³ïŒã¯ãããã䜿çšãããã¹ã³ãŒãã§äœ¿çšå¯èœãªã¿ã€ãerror
ã·ã³ãã«ã«ãªããŸãã ããã¯nil
ãšããŠå§ãŸããå²ãåœãŠããããã³ã«nil
ãã§ãã¯ãå®è¡ãããŸãã nil以å€ã®error
å€ã«èšå®ãããŠããå Žåããããã¯ãéå§ãããŸãã _!
ïŒãŸãã¯éžæããããŒã¯ã³ïŒã¯goã§æ§æçã«æå¹ãªèå¥åã§ã¯ãªããããååã®è¡çªã¯åé¡ã«ãªããŸããã ãã®ãšãŒãã«å€æ°ã¯ãååä»ãã®æ»ãå€ãšåæ§ã«ãããã䜿çšãããã¹ã³ãŒãã«ã®ã¿å°å
¥ãããŸãã æ§æçã«æå¹ãªèå¥åãå¿
èŠãªå Žåã¯ãã³ã³ãã€ã«æã«äžæã®ååã«æžãæãããããã¬ãŒã¹ãã«ããŒã䜿çšã§ããŸãã
ç§ãèŠãŠããæãäžè¬çãªæ¹å€ã®1ã€ã¯ããšã©ãŒåŠçã®åé·æ§ã§ãã APIå¢çã§ã®ãšã©ãŒã¯æªãããšã§ã¯ãããŸããã ãã ããç¹ã«ååž°çãªã¢ã«ãŽãªãºã ã®å ŽåãAPIå¢çã«ãšã©ãŒãçºçãããå¿ èŠãããã®ã¯é¢åã§ãã ååž°ã³ãŒãã«å°å ¥ãããè¿œå ã®åé·æ§ãšã©ãŒã®äŒæãåé¿ããããã«ããããã¯ã䜿çšã§ããŸãã ããã¯ããªãäžè¬çã«äœ¿çšãããŠããææ³ã ãšæããŸãã ç§ã¯ãããèªåã®ã³ãŒãã§äœ¿çšããŸããããgoã®ããŒãµãŒãå«ãå®éã®ã³ãŒãã§äœ¿çšãããŠããã®ãèŠãŸããã ããã°ã©ã ã®ä»ã®å Žæã§æ€èšŒãè¡ãããšã©ãŒããŒãã«ãªãããšãæåŸ ããŠããå ŽåããããŸãã nil以å€ã®ãšã©ãŒãåãåã£ãå Žåãããã¯äžå€æ¡ä»¶ã«éåããŸãã äžå€æ¡ä»¶ã«éåããå Žåããããã¯ã«é¥ãããšã¯èš±å®¹ãããŸãã è€éãªåæåã³ãŒãã§ã¯ããšã©ãŒããããã¯ã«å€ããŠå埩ããã³ã³ããã¹ãã®ç¥èãè±å¯ãªå Žæã«è¿ãããããã«ããããšãçã«ããªã£ãŠããå ŽåããããŸãã ããããã¹ãŠã®ã·ããªãªã§ããšã©ãŒã®å®åæãæžããæ©äŒããããŸãã
ãããã¯ãã§ããã ãé¿ããããšãgoã®å²åŠã ãšæããŸãã ãããã¯ãAPIã®å¢çãè¶ããŠãšã©ãŒãäŒæããããã®ããŒã«ã§ã¯ãããŸããã ãã ãããããã¯èšèªã®æ©èœã§ãããäžèšã®ãããªæ£åœãªãŠãŒã¹ã±ãŒã¹ããããŸãã ãããã¯ã¯ããã©ã€ããŒãã³ãŒãã§ã®ãšã©ãŒã®äŒæãåçŽåããããã®çŽ æŽãããæ¹æ³ã§ãããæ§æãåçŽåããããšã§ãã³ãŒããããã¯ãªãŒã³ã§ãééããªãããæ確ã«ããããšãã§ããŸãã ãif-error-panicããã©ãŒã ããããäžç®ã§_!
ïŒãŸãã¯@
ããŸã㯠`_ ^ãªã©ïŒãèªèãããããšæããŸãã ããŒã¯ã³ã䜿çšãããšãäŒé/ç解ããããã«èšè¿°/èªã¿åãããå¿
èŠã®ããã³ãŒãã®éã倧å¹
ã«æžããããšãã§ããŸãã
ä»ã®æ§ææ©èœãšåæ§ã«ãæªçšãããå¯èœæ§ããããŸãã ãã®å Žåãgoã³ãã¥ããã£ã«ã¯ããããã¯ã«å¯ŸåŠããããã®äžé£ã®ãã¹ããã©ã¯ãã£ã¹ããã§ã«ãããŸãã ãã®æ§æã®è¿œå ã¯ãããã¯ã®æ§æç³è¡£ã§ããããããã®äžé£ã®ãã¹ããã©ã¯ãã£ã¹ããã®äœ¿çšã«é©çšã§ããŸãã
ãããã¯ã®èš±å®¹å¯èœãªãŠãŒã¹ã±ãŒã¹ã®ç°¡çŽ åã«å ããŠãããã«ãããã©ããããããã¿ã€ãã³ã°ã容æã«ãªããŸãã ã³ãŒããæžãçããããšæã£ãŠããŠãããã¡ãã§éãã§ãããšãã«ãšã©ãŒã§ããã°ã©ã ãã¯ã©ãã·ã¥ããããå Žåã¯ããif-error-panicã圢åŒã§ã¯ãªãããã®æ§æã®è¿œå ãå©çšã§ããŸãã éçºã®åæ段éã§èªåèªèº«ãããå°ãªãè¡ã§è¡šçŸã§ããã°ãèªåã®ã¢ã€ãã¢ãããæ©ãã³ãŒãã«åãå ¥ããããšãã§ããŸãã ã³ãŒãã®å®å šãªã¢ã€ãã¢ãåŸãããããæ»ã£ãŠã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããé©åãªå¢çã§ãšã©ãŒãè¿ããŸãã æ¬çªã³ãŒãã«ç¡æã®ãããã¯ãæ®ãããšã¯ããŸãããã匷åãªéçºããŒã«ã«ãªãå¯èœæ§ããããŸãã
ãããã¯ã¯å¥ã®ååã«ããåãªãäŸå€ã§ãããGoã«ã€ããŠç§ãæ°ã«å ¥ã£ãŠããããšã®1ã€ã¯ãäŸå€ãäŸå€çã§ãããšããããšã§ãã æ§æç³è¡£ãäžããããšã«ãã£ãŠããã以äžã®äŸå€ã奚å±ããããããŸããã
@carlmjohnson次ã®2ã€ã®ãã¡ã®1ã€ãåœãŠã¯ãŸãå¿ èŠããããŸãã
çãã¯1ã ãšæããŸãã
ãŸããããããã¯ã¯å¥ã®ååã«ããåãªãäŸå€ã§ããããšããããšã«ãåæããŸããã ããããææ¯ãã¯æ¬åœã®è°è«ã劚ãããšæããŸãã ä»ã®ã»ãšãã©ã®èšèªã§èŠãããããã«ããããã¯ãšäŸå€ã®éã«ã¯éèŠãªéãããããŸãã
ã²ããŸããããããã¯ã¯æªãããšããåå¿ã¯ç解ããŠããŸããããããã¯ã®äœ¿çšã«å¯Ÿããå人çãªææ
ã¯ããããã¯ã䜿çšãããŠãããšããäºå®ãå€ããããšã¯ãªããå®éã«åœ¹ç«ã¡ãŸãã goã³ã³ãã€ã©ã¯ããããã¯ã䜿çšããŠãããŒãµãŒãšåãã§ãã¯ãã§ãŒãºïŒæåŸã«èª¿ã¹ããã§ãŒãºïŒã®äž¡æ¹ã§ãæ·±ãååž°çãªããã»ã¹ãåé¿ããŸãã
ãããã䜿çšããŠãæ·±ãååž°çãªã³ãŒããä»ããŠãšã©ãŒãäŒæããããšã¯ã蚱容ã§ãã䜿çšæ³ã§ããã ãã§ãªããgoéçºè
ã«ãã£ãŠæ¿èªããã䜿çšæ³ã®ããã§ãã
ãããã¯ã¯ç¹å®ã®äœããäŒããŸãïŒ
ããã§äœããããŸããããªãã£ãã®ã§ãããã§åŠçããæºåãã§ããŠããŸããã§ãã
ã³ãŒãã«ã¯ããããåœãŠã¯ãŸãå Žæãåžžã«ãããŸãã ç¹ã«éçºã®åæ段éã Goã¯ã以åã®ãªãã¡ã¯ã¿ãªã³ã°ãšã¯ã¹ããªãšã³ã¹ãæ¹åããããã«å€æŽãããŸããïŒã¿ã€ããšã€ãªã¢ã¹ã®è¿œå ã ãœãŒã¹ã«è¿ãã¬ãã«ã§ãšã©ãŒãåŠçã§ãããã©ããããŸãã©ã®ããã«åŠçããããå ·äœåã§ãããŸã§ããããã¯ã䌎ãäžèŠãªãšã©ãŒãäŒæã§ãããšãã³ãŒãã®èšè¿°ãšæ®µéçãªãªãã¡ã¯ã¿ãªã³ã°ã®åé·æ§ãå€§å¹ ã«äœäžããŸãã
ããã§ã®ã»ãšãã©ã®ææ¡ã¯ãèšèªã®å€§å¹ ãªå€æŽãææ¡ããŠããããã«æããŸãã ããã¯ç§ãæãã€ããæãéæãªã¢ãããŒãã§ãã ããã«ãããçŸåšã®ãšã©ãŒåŠçã®èªç¥ã¢ãã«å šäœããã®ãŸãŸç¶æããªãããç¹å®ã®ããããäžè¬çãªã±ãŒã¹ã®æ§æãæžããããšãã§ããŸãã çŸåšã®ãã¹ããã©ã¯ãã£ã¹ã§ã¯ããgoã³ãŒãã¯APIã®å¢çãè¶ããŠãããã¯ã«ãªããªãããã«ããå¿ èŠããããŸãããšèŠå®ãããŠããŸãã ããã±ãŒãžã«ãããªãã¯ã¡ãœãããããå Žåããšã©ãŒãå埩ã§ããªããŸããªå ŽåïŒããšãã°ãäžå€ã®éåïŒãé€ããŠãåé¡ãçºçããå Žåã«ãšã©ãŒãè¿ãå¿ èŠããããŸãã ãã®èšèªãžã®è¿œå ã¯ããã®ãã¹ããã©ã¯ãã£ã¹ã«åã£ãŠä»£ãããã®ã§ã¯ãããŸããã ããã¯ãå éšã³ãŒãã®å®åæãæžãããã¹ã±ããã®ã¢ã€ãã¢ãããæ確ã«ããæ¹æ³ã«ãããŸããã ããã¯ç¢ºãã«ã³ãŒããçŽç·çã«èªã¿ãããããŸãã
var1, _! := trySomeTask1()
var2, _! := trySomeTask2(var1)
var3, _! := trySomeTask3(var2)
var4, _! := trySomeTask4(var3)
ãããã¯ããã«èªã¿ããã
var1, err := trySomeTask1()
if err != nil {
panic(err)
}
var2, err := trySomeTask2(var1)
if err != nil {
panic(err)
}
var3, err := trySomeTask3(var2)
if err != nil {
panic(err)
}
var4, err := trySomeTask4(var3)
if err != nil {
panic(err)
}
æ§æãšãªããžã§ã¯ãéå±€ã®æ¬ åŠïŒGoã«ã¯ç¶æ¿ããªããããããã¯çã«ããªã£ãŠããŸãïŒãé€ãã°ãGoã®ãããã¯ãšJavaãPythonãªã©ã®äŸå€ã®éã«åºæ¬çãªéãã¯ãããŸããã ããããã©ã®ããã«æ©èœããã©ã®ããã«äœ¿çšããããã¯åãã§ãã
ãã¡ããããããã¯ã¯èšèªã®æ£åœãªå Žæãæã£ãŠããŸãã ãããã¯ã¯ãä»ã®æ¹æ³ã§ã¯å埩ã§ããªãããã°ã©ããŒã®ãšã©ãŒãåå ã§ã®ã¿çºçããã¯ãã®ãšã©ãŒãåŠçããããã®ãã®ã§ãã ããšãã°ãæŽæ°ã®ã³ã³ããã¹ãã§ãŒãã§é€ç®ããå Žåãå¯èœãªæ»ãå€ã¯ãªããæåã«ãŒãããã§ãã¯ããªãã®ã¯ããªãèªèº«ã®è²¬ä»»ã§ããããããããã¯ã«ãªããŸãã åæ§ã«ãç¯å²å€ã®ã¹ã©ã€ã¹ãèªã¿åãå Žåã¯ãå€ãšããŠnilã䜿çšããŠã¿ãŠãã ããããããã¯ããããã¯ãŒã¯ãããŠã³ããŠããããã¡ã€ã«ã®ã¢ã¯ã»ã¹èš±å¯ãæªããªã©ã®äºæãããç¶æ ã§ã¯ãªããããã°ã©ããŒã®ãšã©ãŒãåå ã§ããããããããã¯ã«é¥ããŸããã¹ã¿ãã¯ãçç ŽããŸãã Goã¯ããã³ãã¬ãŒãã®ããã«ãããã¯ã«ãªãããã€ãã®ãã«ããŒé¢æ°ãæäŸããŸãããããã¯ãããã°ã©ããŒã®ãšã©ãŒã«ãã£ãŠãšã©ãŒãçºçããå¿ èŠãããããŒãã³ãŒããããæååã§äœ¿çšãããããšãäºæ³ãããããã§ãã ã¡ã¢ãªäžè¶³ã¯ããèªäœãããã°ã©ããŒã®é害ã§ã¯ãããŸããããå埩äžèœã§ãããã©ãã§ãçºçããå¯èœæ§ãããããããšã©ãŒã§ã¯ãªããããã¯ã«ãªããŸãã
ã¹ã¿ãã¯ãç絡ããæ¹æ³ãšããŠãããã¯ã䜿çšããããšããããŸãããèªã¿ããããšããã©ãŒãã³ã¹ã®çç±ããäžè¬çã«çãã²ãããŠããŸããGoããã®äœ¿çšã奚å±ããããã«å€æŽãããå¯èœæ§ã¯ãããŸããã
ãããã¯ã«é¥ããJavaã®ãã§ãã¯ãããŠããªãäŸå€ã¯ã»ãšãã©åãã§ãããåãçç±ã§åããŠãŒã¹ã±ãŒã¹ãåŠçããããã«ååšããŸãã ä»ã®èšèªã®äŸå€ãšåãåé¡ããããããä»ã®å Žåã«ãããã¯ã䜿çšããããã«äººã ã«å§ããªãã§ãã ããã
ã¹ã¿ãã¯ãç絡ããæ¹æ³ãšããŠãããã¯ã䜿çšããããšããããŸãããèªã¿ããããšããã©ãŒãã³ã¹ã®çç±ãããäžè¬çã«ã¯çãã²ãããŠããŸãã
ãŸã第äžã«ãèªã¿ãããã®åé¡ã¯ããã®æ§æã®å€æŽãçŽæ¥å¯ŸåŠãããã®ã§ãã
// clearly, linearly shows that these steps must occur in order,
// and any errors returned cause a panic, because this piece of
// code isn't responsible for reporting or handling possible failures:
// - IO Error: either network or disk read/write failed
// - External service error: some unexpected response from the external service
// - etc...
// It's not this code's responsibility to be aware of or handle those scenarios.
// That's perhaps the parent process's job.
var1, _! := trySomeTask1()
var2, _! := trySomeTask2(var1)
var3, _! := trySomeTask3(var2)
var4, _! := trySomeTask4(var3)
vs
var1, err := trySomeTask1()
if err != nil {
panic(err)
}
var2, err := trySomeTask2(var1)
if err != nil {
panic(err)
}
var3, err := trySomeTask3(var2)
if err != nil {
panic(err)
}
var4, err := trySomeTask4(var3)
if err != nil {
panic(err)
}
èªã¿ãããã¯ããŠãããä»ã®çç±ã¯ããã©ãŒãã³ã¹ã§ãã
ã¯ãããããã¯ãšå»¶æã¹ããŒãã¡ã³ãã䜿çšãããšããã©ãŒãã³ã¹ãäœäžããããšã¯äºå®ã§ãããå€ãã®å Žåããã®éãã¯å®è¡äžã®æäœã«ã¯ç¡èŠã§ããŸãã ãã£ã¹ã¯ãšãããã¯ãŒã¯ã®IOã¯ãå¹³åããŠãé
延/ãããã¯ã管çããããã®æœåšçãªã¹ã¿ãã¯ããžãã¯ãããã¯ããã«é·ãæéãããããŸãã
ãããã¯ã«ã€ããŠè©±ãåããšãããã®ç¹ãããè³ã«ããŸããããããã¯ãããã©ãŒãã³ã¹ã®äœäžã§ãããšèšãã®ã¯äžèª å®ã ãšæããŸãã 確ãã«å¯èœã§ãããããã§ããå¿ èŠã¯ãããŸããã èšèªã®ä»ã®å€ãã®ãã®ãšåãããã«ã ããã©ãŒãã³ã¹ã®äœäžãéåžžã«éèŠãšãªãã¿ã€ããªã«ãŒãå ã§ãããã¯ã«é¥ã£ãŠããå Žåã¯ããã®ã«ãŒãå ã§ã延æããã¹ãã§ã¯ãããŸããã å®éãããèªäœããããã¯ãéžæããé¢æ°ã¯ãéåžžãããèªäœã®ãããã¯ããã£ããããã¹ãã§ã¯ãããŸããã åæ§ã«ãä»æ¥äœæãããgoé¢æ°ã¯ããšã©ãŒãšãããã¯ã®äž¡æ¹ãè¿ãããšã¯ãããŸããã ããã¯äžæ確ã§ãã°ãããŠããããã¹ããã©ã¯ãã£ã¹ã§ã¯ãããŸããã ãããããJavaãPythonãJavascriptãªã©ã§äœ¿çšãããäŸå€ã確èªããã®ã«æ £ããŠãããããããŸããããgoã³ãŒãã§ãããã¯ãäžè¬çã«äœ¿çšãããæ¹æ³ã§ã¯ãªãããšã©ãŒãäŒæããå Žåã«ç¹ã«æŒç®åãè¿œå ããããšã¯ãªããšæããŸããããã¯ãä»ããŠã³ãŒã«ã¹ã¿ãã¯ãå¢ãããšã人ã ããããã¯ã䜿çšããæ¹æ³ãå€ãããŸãã 圌ãã¯ãšã«ãããããã¯ã䜿çšããŠããŸãã ãã®æ§ææ¡åŒµã®ãã€ã³ãã¯ãéçºè ããããã¯ã䜿çšããŠãããšããäºå®ãèªããããšã§ãããå®å šã«æ£åœãªäœ¿çšæ³ãããããã®åšãã®å®åæãæžãããŸãã
ãã®æ§ææ©èœã«ãã£ãŠå¯èœã«ãªããšæããããçŸåšã¯äžå¯èœã§ãã/ãã¹ããã©ã¯ãã£ã¹ã«åããåé¡ã®ããã³ãŒãã®äŸãããã€ãæããŠãã ããã 誰ãããããã¯/å埩ãä»ããŠã³ãŒãã®ãŠãŒã¶ãŒã«ãšã©ãŒãäŒããŠããå Žåãããã¯çŸåšçãã²ããããã®ãããªæ§æãè¿œå ããããšããŠããæããã«ç¶ç¶ããŸãã å¯èœã§ããã°ã次ã®ããã«çããŠãã ããã
var1, err := trySomeTask1(); if err != nil { panic(err) }
ã var1, _! := trySomeTask1()
ãäŒããªãããšãäœãäŒããŸããïŒ ã©ãããŠïŒããªãã®è°è«ã®æ žå¿ã¯ããããã¯ã¯ã²ã©ãã®ã§ãç§ãã¡ã¯ãããã䜿ãã¹ãã§ã¯ãªãããšããããšã ãšç§ã«ã¯æããŸãã
ããããå
±æãããŠããªãå Žåãç§ã¯ãã®èåŸã«ããçç±ãé梱ããŠè°è«ããããšã¯ã§ããŸããã
ãããã®åå ã¯ããããã¯ãŒã¯ã®ããŠã³ããã¡ã€ã«ã®ã¢ã¯ã»ã¹èš±å¯ã®æªããªã©ãäºæãããç¶æ ã§ã¯ãªããããã°ã©ããŒã®ãšã©ãŒãåå ã§ããããããããã¯ã«é¥ã£ãŠã¹ã¿ãã¯ãçç ŽãããŸãã
ç§ã¯ãã»ãšãã©ã®ãŽãã¡ãŒã®ããã«ãå€ãšããŠã®ãšã©ãŒã®èãæ¹ã奜ãã§ãã ããã¥ã¡ã³ããèŠãªããŠããAPIã®ã©ã®éšåãçµæãä¿èšŒããã©ã®éšåã倱æããå¯èœæ§ãããããæ確ã«äŒããã®ã«åœ¹ç«ã€ãšæããŸãã
ããã«ããããšã©ãŒã®åéããšã©ãŒã®è©³çŽ°æ å ±ã®æ¡åŒµãªã©ãå¯èœã«ãªããŸãã ããã¯ãã¹ãŠãã³ãŒãããŠãŒã¶ãŒã³ãŒããšäº€å·®ããAPIå¢çã§éåžžã«éèŠã§ãã ãã ãããããã®APIå¢çå ã§ã¯ãå€ãã®
ãšã©ãŒãåŠçããã®ãã³ãŒãã®ä»äºã§ã¯ãªãå ŽåããããŸãã
ã©ã€ãã©ãªãäœæããŠããå Žåããããã¯ãŒã¯ã¹ã¿ãã¯ãããŠã³ããŠãããã©ããã¯é¢ä¿ãããŸãããããã¯ãã©ã€ãã©ãªéçºè
ãšããŠã®ç§ã®å¶åŸ¡ã®ç¯å²å€ã§ãã ãããã®ãšã©ãŒããŠãŒã¶ãŒã³ãŒãã«æ»ããŸãã
ç§èªèº«ã®ã³ãŒãã§ãããšã©ãŒã芪é¢æ°ã«è¿ãããšãå¯äžã®ä»äºã§ããã³ãŒããæžãããšããããŸãã
ããšãã°ãhttp.HandlerFuncãå¿çãšããŠãã£ã¹ã¯ãããã¡ã€ã«ãèªã¿åã£ããšããŸããããã¯ã»ãšãã©ã®å Žåæ©èœããŸãã倱æããå Žåã¯ãããã°ã©ã ãæ£ããæžã蟌ãŸããŠããªããïŒããã°ã©ããŒãšã©ãŒïŒããã¡ã€ã«ã·ã¹ãã ã«åé¡ãããå¯èœæ§ããããŸããããã°ã©ã ã®è²¬ä»»ç¯å²å€ã http.HandlerFuncããããã¯ã«ãªããšãããã¯çµäºããäžéšã®ããŒã¹ãã³ãã©ãŒããã®ãããã¯ããã£ããããŠãã¯ã©ã€ã¢ã³ãã«500ãæžã蟌ã¿ãŸãã å°æ¥ããã®ãšã©ãŒãå¥ã®æ¹æ³ã§åŠçãããå Žåã¯ã _!
ãerr
眮ãæããŠããšã©ãŒå€ã§ããããããšãã§ããŸãã åé¡ã¯ãããã°ã©ã ã®åç¶æéäžãç§ã¯ãããããããããå¿
èŠã¯ãªãã ãããšããããšã§ãã ãã®ãããªåé¡ãçºçããå Žåããã³ãã©ãŒã¯ãã®ãšã©ãŒã®åŠçãæ
åœããã³ãŒãã®äžéšã§ã¯ãããŸããã
IOé害ããããã¯ãŒã¯é害ãªã©ã®ããã«ããã³ãã©ãŒã«if err != nil { panic(err) }
ãŸãã¯if err != nil { return ..., err }
ãæžã蟌ãããšãã§ããéåžžã¯ããããŸãããšã©ãŒããã§ãã¯ããå¿
èŠãããå Žåã§ãããããè¡ãããšãã§ããŸãã ãã ããã»ãšãã©ã®å Žåãç§ã¯if err != nil { panic(err) }
æžããŠããã ãã§ãã
ãŸãã¯ãå¥ã®äŸãšããŠããã©ã€ãååž°çã«æ€çŽ¢ããŠããå ŽåïŒããšãã°ãhttpã«ãŒã¿ãŒã®å®è£
ã§ïŒãé¢æ°func (root *Node) Find(path string) (found Value, err error)
宣èšããŸãã ãã®é¢æ°ã¯ãããªãŒãäžã£ãŠçæããããããã¯ãå埩ããé¢æ°ã延æããŸãã ããã°ã©ã ãäžæ£ãªè©Šè¡ãäœæããŠããå Žåã¯ã©ããªããŸããïŒ ããã°ã©ã ãæ£ããæš©éãæã€ãŠãŒã¶ãŒãšããŠå®è¡ãããŠããªãããã«äžéšã®IOã倱æããå Žåã¯ã©ããªããŸããïŒ ãããã®åé¡ã¯ãç§ã®ãã©ã€æ€çŽ¢ã¢ã«ãŽãªãºã ã®åââé¡ã§ã¯ãããŸãã-åŸã§æ瀺çã«ããããªãéã-ãããããããã¯ç§ãééããå¯èœæ§ã®ãããšã©ãŒã§ããå¯èœæ§ããããŸãã ããããã¹ã¿ãã¯ã®äžçªäžãŸã§æ»ããšãã¹ã¿ãã¯äžã§çæ³çã«ã¯ããã€ãã®nilãšã©ãŒå€ã«ãªããã®ãä¿æãããªã©ãå€ãã®äœåãªåé·æ§ãçããŸãã 代ããã«ããã®ãããªãã¯APIé¢æ°ãŸã§ãšã©ãŒããããã¯ã«ããŠããŠãŒã¶ãŒã«è¿ãããšãéžæã§ããŸãã çŸæç¹ã§ã¯ãããã§ãäœåãªåé·æ§ãçºçããŸãããå¿
ãããããããå¿
èŠã¯ãããŸããã
ä»ã®ææ¡ã§ã¯ã1ã€ã®æ»ãå€ãç¹å¥ãªãã®ãšããŠæ±ãæ¹æ³ã«ã€ããŠè°è«ããŠããŸãã ããã¯åºæ¬çã«åãèãã§ãããèšèªã«ãã§ã«çµã¿èŸŒãŸããŠããæ©èœã䜿çšãã代ããã«ãç¹å®ã®å Žåã«èšèªã®åäœãå€æŽããããšããŸãã å®è£ ã®ãããããšããç¹ã§ã¯ããã®ã¿ã€ãã®ææ¡ïŒãã§ã«ãµããŒããããŠãããã®ã®æ§æç³è¡£æ§æïŒãæãç°¡åã«ãªããŸãã
ç·šéããŠè¿œå ïŒ
ç§ã¯ãç§ãæžããææ¡ãšã¯çµå©ããŠããŸãããããšã©ãŒåŠçã®åé¡ãæ°ããè§åºŠããèŠãããšãéèŠã ãšæããŸãã 誰ããã®å°èª¬ãææ¡ããŠããããã§ã¯ãªãã®ã§ããã®åé¡ã®ç解ãåæ§ç¯ã§ãããã©ããã確èªããããšæããŸãã åé¡ã¯ããšã©ãŒãå¿
èŠã®ãªããšãã«æ瀺çã«åŠçãããŠããå Žæãå€ãããããšã§ããéçºè
ã¯ãè¿œå ã®å®åã³ãŒããªãã§ãšã©ãŒãã¹ã¿ãã¯ã«äŒæããæ¹æ³ãæãã§ããŸãã Goã«ã¯ãã§ã«ãã®æ©èœãããããšãããããŸãããããã®ããã®é©åãªæ§æã¯ãããŸããã ããã¯ãåäœãå€æŽããã«èšèªãããåé·ã«ããããã«ãæ¢åã®æ©èœãããåé·ã§ãªãæ§æã§ã©ããããããšã«ã€ããŠã®èª¬æã§ãã ç§ãã¡ããããéæã§ããã°ãããã¯åå©ã§ã¯ãããŸãããïŒ
@mccolljrããããšãããããŸããããã®ææ¡ã®ç®æšã®1ã€ã¯ããšã©ãŒåŠçã®3ã€ã®ã±ãŒã¹ãã¹ãŠãåŠçããæ°ããæ¹æ³ãéçºããããã«äººã ãä¿ãããšã§ãããšã©ãŒãç¡èŠããå€æŽããã«ãšã©ãŒãè¿ããè¿œå ã®ã³ã³ããã¹ãæ å ±ãšãšãã«ãšã©ãŒãè¿ããŸãã ããªãã®ãããã¯ææ¡ã¯3çªç®ã®ã±ãŒã¹ã«å¯ŸåŠããŠããŸããã ããã¯éèŠãªãã®ã§ãã
@mccolljr APIã®å¢çã¯ãããªããæ³å®ããŠãããããã¯ããã«äžè¬çã ãšæããŸãã APIå
åŒã³åºãã¯äžè¬çãªã±ãŒã¹ã§ã¯ãããŸããã ã©ã¡ãããšããã°ãããã¯éãããããŸããïŒããã€ãã®ããŒã¿ã¯ããã§èå³æ·±ãã§ãããïŒã ãããã£ãŠãAPIå
åŒã³åºãçšã®ç¹å¥ãªæ§æãéçºããããšãæ£ããæ¹åã§ãããã©ããã¯ããããŸããã ããã«ãAPIå
ã§panic
return
edãšã©ãŒã§ã¯ãªãã panic
edãšã©ãŒã«ã¯çšéããããŸãããæããã«åªããŠããç¶æ³ã¯ãŸãã«æãããŸãã
ãããã¯ãä»ããŠã³ãŒã«ã¹ã¿ãã¯ã«ãšã©ãŒãäŒæããå Žåã«ç¹ã«æŒç®åãè¿œå ããŠãã人ã ããããã¯ã䜿çšããæ¹æ³ãå€ãããšã¯æããŸããã
ç§ã¯ããªããééã£ãŠãããšæããŸãã ããã¯ãšãŠã䟿å©ãªã®ã§ã人ã ã¯ããªãã®éèšè ã«æãå·®ã䌞ã¹ãã§ãããããããŠãããã圌ãã¯ä»¥åãããã£ãšãããã¯ã䜿ãããšã«ãªããŸãã
ãããã¯ãæã ãŸãã¯ãŸãã«åœ¹ç«ã€ãã©ãããããã³APIã®å¢çãè¶ããŠããŸãã¯APIã®å¢çå ã§åœ¹ç«ã€ãã©ããã¯ãèµ€ãã·ã³ã§ãã ãšã©ãŒã«å¯ŸããŠå®è¡ããå¯èœæ§ã®ããã¢ã¯ã·ã§ã³ã¯ãããããããŸãã ããã¢ã¯ã·ã§ã³ãä»ã®ã¢ã¯ã·ã§ã³ãããåªå ããããšãªãããšã©ãŒåŠçã³ãŒããççž®ããæ¹æ³ãæ¢ããŠããŸãã
ããããå€ãã®å Žåããã®éãã¯å®è¡ãããŠããæäœã«ã¯ç¡èŠã§ããŸãã
確ãã«ãå±éºãªéã ãšæããŸãã æåã¯ãããããã«èŠããŸãããããã¯ç©ã¿éãªã£ãŠãæçµçã«ã¯ãã§ã«é ããŠãããšãã«ããã«ããã¯ãåŒãèµ·ãããŸãã æåããããã©ãŒãã³ã¹ã念é ã«çœ®ããŠãããè¯ã解決çãèŠã€ããããšãã¹ãã ãšæããŸãã ãã§ã«è¿°ã¹ãããã«ãSwiftãšRustã«ã¯ãšã©ãŒã®äŒæããããŸãããåºæ¬çã«ã¯ãåçŽãªãªã¿ãŒã³ãæ§æç³è¡£ã«ã©ããããŠå®è£ ããŸãã ã¯ããæ¢åã®ãœãªã¥ãŒã·ã§ã³ãåå©çšããã®ã¯ç°¡åã§ãããåºæ¬çã«äŸå€ã§ãããšããäºå®ãé ãããšããèŠæ £ããªãæ§æç³è¡£ã®èåŸã«é ããããããã¯ãåçŽåããŠäœ¿çšããããã«äººã ãä¿ããããããã¹ãŠããã®ãŸãŸã«ããŠããããšããå§ãããŸãã
æåã¯ãããããã«èŠããŸãããããã¯ç©ã¿éãªã£ãŠãæçµçã«ã¯ãã§ã«é ããŠãããšãã«ããã«ããã¯ãåŒãèµ·ãããŸãã
çµæ§ã§ãã æ¶ç©ºã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ã¯ã幟äœåŠçã«ç¡èŠã§ããããã©ãŒãã³ã¹ã®ããã«ããã¯ã§ãã
çµæ§ã§ãã æ¶ç©ºã®ããã©ãŒãã³ã¹ã®ããã«ããã¯ã¯ã幟äœåŠçã«ç¡èŠã§ããããã©ãŒãã³ã¹ã®ããã«ããã¯ã§ãã
ãã®ãããã¯ããããªãã®å人çãªææ ãæ®ããŠãã ããã ããªãã¯æããã«ç§ã«åé¡ããããäœãæçšãªãã®ãæã¡èŸŒã¿ãããªãã®ã§ãç§ã®ã³ã¡ã³ããç¡èŠããŠã以åã®ã»ãšãã©ãã¹ãŠã®ã³ã¡ã³ãã§è¡ã£ãããã«å察祚ãæ®ããŠãã ããã ãããã®ç¡æå³ãªçããæçš¿ãç¶ããå¿ èŠã¯ãããŸããã
ç§ã¯ããªãã«åé¡ã¯ãããŸãããããªãã¯ãããè£ä»ããããŒã¿ãªãã§ããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ã€ããŠäž»åŒµããŠããã ãã§ãããããŠç§ã¯ãããèšèãšèŠªæã§ææããŠããŸãã
çãããäŒè©±ãå°éãã話é¡ã«ããŠãã ããã ãã®åé¡ã¯ãGoãšã©ãŒã®åŠçã«é¢ãããã®ã§ãã
ãšã©ãŒãç¡èŠããããšã¯æ¢åã®_
ãã§ã«ã«ããŒãããŠãããšæ³å®ããŠããã®ã§ãããšã©ãŒãè¿ã/è¿œå ã®ã³ã³ããã¹ãã䜿çšãããã®éšåãããäžåºŠç¢ºèªããããšæããŸãã
æååãç¶ãå¯èœæ§ã®ãã2èªã®ããŒã¯ãŒããææ¡ããŠããŸãïŒãªãã·ã§ã³ïŒã ããã2èªã®ããŒã¯ãŒãã§ããçç±ã¯2ã€ãããŸãã ãŸããæ¬è³ªçã«äžå¯è§£ãªæŒç®åãšã¯ç°ãªããäºåã®ç¥èãããŸããªããŠããæŒç®åãäœãããã®ããç解ããã®ã¯ç°¡åã§ãã ããŸãã¯ããã«ããéžæããã®ã¯ããšã©ãŒãå²ãåœãŠãããŠããªãor
ãšããåèªãããšã©ãŒãnilã§ãªãå Žåãããã§åŠçãããŠããããšããŠãŒã¶ãŒã«ç€ºãããšãæåŸ
ããŠããããã§ãã äžéšã®ãŠãŒã¶ãŒã¯æ¢ã«é¢é£ä»ããŸãor
ä»ã®èšèªïŒPerlãPythonïŒããfalsyå€ãåŠçãããããŠèªæžãšdata := Foo() or ...
ç¡æèã®ãã¡ã«ãšããããšãäŒãããããããªãdata
䜿çšã§ããªãå Žåã¯or
ã¹ããŒãã¡ã³ãã®bubble
ããŒã¯ãŒãã¯æ¯èŒççãã§ãããäœããèµ·ããŠããããšïŒã¹ã¿ãã¯ïŒããŠãŒã¶ãŒã«ç€ºããŠããå¯èœæ§ããããŸãã up
ãšããåèªãé©åãããããŸãããã or up
å
šäœãååã«ç解ã§ãããã©ããã¯ããããŸããã æåŸã«ããã¹ãŠãããŒã¯ãŒãã§ããäœããããŸãèªã¿ãããããã次ã«ãã®åäœãé¢æ°èªäœã§èšè¿°ã§ããªãããã§ãïŒãããã¯ãåŒã³åºããŠãçŸåšã®é¢æ°ããšã¹ã±ãŒãã§ããå ŽåããããŸãããããããããšã¯ã§ããŸããèªåãæ¢ããŠãã ãããä»ã®èª°ããå埩ããªããã°ãªããŸããïŒã
以äžã¯ãšã©ãŒäŒæå°çšã§ããããããšã©ãŒãè¿ãé¢æ°ã§ã®ã¿äœ¿çšã§ããä»ã®æ»ãåŒæ°ã®ãŒãå€ã¯æ¬¡ã®ãšããã§ãã
ãšã©ãŒãå€æŽããã«è¿ãå ŽåïŒ
func Worker(path string) ([]byte, error) {
data := ioutil.ReadFile(path) or bubble
return data;
}
è¿œå ã®ã¡ãã»ãŒãžãšãšãã«ãšã©ãŒãè¿ãå ŽåïŒ
func Worker(path string) ([]byte, error) {
data := ioutil.ReadFile(path) or bubble fmt.Sprintf("reading file %s", path)
modified := modifyData(data) or bubble "modifying the data"
return data;
}
ãããŠæåŸã«ãã«ã¹ã¿ãã€ãºããããšã©ãŒä¿®æ£ã®ããã®ã°ããŒãã«ã¢ããã¿ã¡ã«ããºã ãå°å ¥ããŸãã
// Default Bubble Processor
errors.BubbleProcessor(func(msg string, err error) error {
return fmt.Errorf("%s: %v", msg, err)
})
// Some program might register the following:
errors.BubbleProcessor(func(msg string, err error) error {
return errors.WithMessage(err, msg)
})
æåŸã«ãæ¬åœã«è€éãªåŠçãå¿ èŠãªããã€ãã®å Žæã§ã¯ãæ¢åã®åé·ãªæ¹æ³ããã§ã«æè¯ã®æ¹æ³ã§ãã
é¢çœãã ã°ããŒãã«ããã«ãã³ãã©ãŒããããšãã¹ã¿ãã¯ãã¬ãŒã¹ãå¿
èŠãªäººã«ããã¬ãŒã¹ãåŒã³åºãå ŽæãäžããããŸããããã¯ããã®ã¡ãœããã®åªããå©ç¹ã§ãã OTOHãã·ã°ããã£func(string, error) error
ãããå Žåããããªã³ã°ã¯çµã¿èŸŒã¿ã®ãšã©ãŒã¿ã€ãã§è¡ãããå¿
èŠãããã error
å®è£
ããå
·è±¡ã¿ã€ããªã©ã®ä»ã®ã¿ã€ãã§ã¯è¡ãããªãããšãæå³ããŸãã
ãŸãã or bubble
ã®ååšã¯ã or die
ãŸãã¯or panic
ã®å¯èœæ§ã瀺åããŠããŸãã ãããæ©èœãªã®ããã°ãªã®ãããããŸããã
æ¬è³ªçã«äžå¯è§£ãªæŒç®åãšã¯ç°ãªããäºåã®ç¥èãããŸããªããŠããæŒç®åãäœãããã®ããç解ããã®ã¯ç°¡åã§ãã
ããªããæåã«ããã«ééãããšããããã¯è¯ããããããŸããã ãããããããäœåºŠãèªã¿æžããã-ããã¯åé·ãããããã«èŠããéåžžã«åçŽãªããšãäŒããã«ã¯ããŸãã«ãå€ãã®ã¹ããŒã¹ãå¿
èŠãšããŸã-ã¹ã¿ãã¯ãããã«ã¢ããããæªåŠçã®ãšã©ãŒã æŒç®åã¯æåã¯äžå¯è§£ã§ãããç°¡æœã§ãä»ã®ãã¹ãŠã®ã³ãŒããšã¯å¯Ÿç
§çã§ãã ã¡ã€ã³ããžãã¯ã¯å®éã«ã¯ã»ãã¬ãŒã¿ã§ããããããšã©ãŒåŠçããæ確ã«åé¢ãããŸãã äžè¡ã«ããããã®åèªããããšãç§ã®æèŠã§ã¯èªã¿ããããæãªãããŸãã å°ãªããšãããããorbubble
ããŒãžãããããã®ãã¡ã®1ã€ãåé€ããŠãã ããã ããã«2ã€ã®ããŒã¯ãŒããããæå³ãããããŸããã ããã¯Goã話ãèšèã«å€ããŸãããããŠãããã©ããªãããç§ãã¡ã¯ç¥ã£ãŠããŸãïŒäŸãã°VBïŒ
ç§ã¯ã°ããŒãã«ã¢ããã¿ãŒã®ãã¡ã³ã§ã¯ãããŸããã ç§ã®ããã±ãŒãžãã«ã¹ã¿ã ããã»ããµãèšå®ããããªãã®ããã±ãŒãžãã«ã¹ã¿ã ããã»ããµãèšå®ããŠããå Žåã誰ãåã¡ãŸããïŒ
@ object88
ããã©ã«ãã®ãã¬ãŒã«äŒŒãŠãããšæããŸãã ïŒããã°ã©ã ã§ïŒåºåãèšå®ããã®ã¯1åã ãã§ãããã¯äœ¿çšãããã¹ãŠã®ããã±ãŒãžã«åœ±é¿ããŸãã
ãšã©ãŒåŠçã¯ãã®ã³ã°ãšã¯å€§ããç°ãªããŸãã 1ã€ã¯ããã°ã©ã ã®æçãªåºåãèšè¿°ãããã1ã€ã¯ããã°ã©ã ã®ãããŒã管çããŸãã ããã±ãŒãžå ã§è«çãããŒãé©åã«ç®¡çããå¿ èŠãããããšãè¡ãããã«ã¢ããã¿ãŒãã»ããã¢ããããå¥ã®ããã±ãŒãžãŸãã¯ããã°ã©ã ããããå€æŽããå Žåãããªãã¯æªãå Žæã«ããŸãã
ãã©ã€ãã£ãããã¡ã€ãã«ããæã¡åž°ããã ãããããæŠãã¯å¿ èŠãããŸããã ããã¯ã¿ããªã幞ãã«ããŸãã ä»ã®ããã°ã©ãã³ã°èšèªããæ©èœãæ§æãåçšããããšã«äœã®åé¡ããããŸããã Javaããããè¡ããCïŒããããè¡ããŸãããã©ã¡ãããæ¬åœã«æåããããã°ã©ãã³ã°èšèªã§ãã GOã³ãã¥ããã£ïŒãŸãã¯äœæè ïŒã¯ãå¿ èŠã«å¿ããŠå€æŽãåãå ¥ããŠãã ããã
@KamyarM ãç§ã¯æ¬æãè¡šããŠåæããŸããã try / catchã¯ã¿ããªã幞ãã«ããŸããã ãããã³ãŒãã«å®è£ ãããå Žåã§ããã¹ããŒãããäŸå€ã¯ãã³ãŒãã䜿çšãããã¹ãŠã®äººãäŸå€ãåŠçããå¿ èŠãããããšãæå³ããŸãã ããã¯ãã³ãŒãã«ããŒã«ã©ã€ãºã§ããèšèªã®å€æŽã§ã¯ãããŸããã
@ object88
å®éãããã«ããã»ããµã¯ããã°ã©ã ã®æçãªãšã©ãŒåºåãèšè¿°ããŠããããã«èŠãããã¬ãŒãšããã»ã©éãã¯ãããŸããã ãŸããã¢ããªã±ãŒã·ã§ã³å
šäœã§åäžã®ãšã©ãŒè¡šçŸãå¿
èŠã§ãããããã±ãŒãžããšã«ç°ãªãããšã¯ãªããšæããŸãã
ç°¡åãªäŸãæäŸã§ãããããããŸããããç§ãèŠéããŠããããšããããããããŸããã
芪æãç«ãŠãŠãããŠããããšãã ããã¯ãŸãã«ç§ã話ããŠããåé¡ã§ãã GOã³ãã¥ããã£ã¯å€åã«å¯ŸããŠãªãŒãã³ã§ã¯ãªããç§ã¯ãããæããŠãããç§ã¯ãããæ¬åœã«å¥œãã§ã¯ãããŸããã
ããã¯ãããããã®ã±ãŒã¹ãšã¯é¢ä¿ãããŸããããC ++ã®äžé æŒç®åã«çžåœããGoãå¥ã®æ¥ã«æ¢ããŠãããšããããã®ä»£æ¿ã¢ãããŒãã«åºããããŸããã
vïŒ= map [bool] int {trueïŒfirst_expressionãfalseïŒsecond_expression} [æ¡ä»¶]
åã«ã§ã¯ãªã
v =ç¶æ
ïŒ first_expressionïŒsecond_expression;
ããªããã¡ã奜ã2ã€ã®ãã©ãŒã ã®ã©ã¡ãã§ããïŒ äžèšã®å€èªäžèœãªã³ãŒãïŒGo My WayïŒã«ã¯ãããããå€ãã®ããã©ãŒãã³ã¹ã®åé¡ããããŸããããããšãC ++ïŒHighwayïŒã®2çªç®ã®åçŽãªæ§æã§ããïŒ ç§ã¯é«ééè·¯ã®äººã奜ãã§ãã ç§ã¯ããªãã®ããšãç¥ããŸããã
èŠçŽãããšãæ°ããæ§æãæã£ãŠããŠãä»ã®ããã°ã©ãã³ã°èšèªããåããŠãã ããã ããã¯äœãæªãããšã§ã¯ãããŸããã
ãããããé¡ãããŸãã
GOã³ãã¥ããã£ã¯å€åã«å¯ŸããŠãªãŒãã³ã§ã¯ãªããç§ã¯ãããæããŠãããç§ã¯ãããæ¬åœã«å¥œãã§ã¯ãããŸããã
ããã¯ããªããçµéšããŠããããšã®æ ¹åºã«ããæ 床ã誀解ããŠãããšæããŸãã ã¯ãã誰ããtry / catchãŸãã¯ïŒïŒãææ¡ãããšãã³ãã¥ããã£ã¯å€ãã®åçºãçã¿åºããŸãã ãããããã®çç±ã¯ãç§ãã¡ãæ°ããã¢ã€ãã¢ã«æµæããŠããããã§ã¯ãããŸããã ç§ãã¡ã¯ã»ãšãã©ãã¹ãŠããããã®æ©èœãåããèšèªã䜿çšããçµéšããããŸãã ç§ãã¡ã¯ãããã«éåžžã«ç²ŸéããŠãããç§ãã¡ã®èª°ããäœå¹Žãã®éããããæ¥åžžçã«äœ¿çšããŠããŸãã ç§ãã¡ã®æµæã¯ããããã_å€ãã¢ã€ãã¢_ã§ãããæ°ããã¢ã€ãã¢ã§ã¯ãªããšããäºå®ã«åºã¥ããŠããŸãã ç§ãã¡ã¯ãã§ã«å€æŽãåãå ¥ããŸããïŒtry / catchããã®å€æŽãšïŒïŒã®äœ¿çšããã®å€æŽã ç§ãã¡ãæµæããŠããã®ã¯ãç§ãã¡ããã§ã«äœ¿çšããŠããŠæ°ã«å ¥ããªãã£ããã®ã䜿çšããããã«_æ»ã_ãå€æŽããããšã§ãã
å®éãããã«ããã»ããµã¯ããã°ã©ã ã®æçãªãšã©ãŒåºåãèšè¿°ããŠããããã«èŠãããã¬ãŒãšããã»ã©éãã¯ãããŸããã ãŸããã¢ããªã±ãŒã·ã§ã³å šäœã§åäžã®ãšã©ãŒè¡šçŸãå¿ èŠã§ãããããã±ãŒãžããšã«ç°ãªãããšã¯ãªããšæããŸãã
誰ãããããªã³ã°ã䜿çšããŠã¹ã¿ãã¯ãã¬ãŒã¹ãæž¡ããããã䜿çšããŠæ±ºå®ãäžãããå Žåã¯ã©ããªããŸããã ããšãã°ããšã©ãŒããã¡ã€ã«æäœã«èµ·å ããå Žåã¯å€±æããŸããããããã¯ãŒã¯ã«èµ·å ããå Žåã¯ãåŸ æ©ããŠããåè©Šè¡ããŠãã ããã ãã®ããã®ããžãã¯ããšã©ãŒãã³ãã©ãŒã«çµã¿èŸŒãããšã¯ã§ããŸããããã©ã³ã¿ã€ã ããšã«ãšã©ãŒãã³ãã©ãŒã1ã€ãããªãå Žåã¯ã競åã®ã¬ã·ãã«ãªããŸãã
@urandom ãããã¯äºçŽ°ãªäŸãããããŸããããç§ã®ã¢ããã¿ãŒãerror
ãå®è£
ããå¥ã®æ§é äœãè¿ãããšããŸããããããã¯ãã³ãŒãã®ä»ã®å Žæã§æ¶è²»ããããšäºæ³ãããŸãã å¥ã®ã¢ããã¿ãŒãä»å±ããŠã¢ããã¿ãŒã眮ãæãããšãã³ãŒããæ£ããæ©èœããªããªããŸãã
@KamyarMèšèªãšãã®ã€ãã£ãªã ã¯äžç·ã«ãªããŸãã ãšã©ãŒåŠçã®å€æŽãæ€èšãããšãã¯ãæ§æã®å€æŽã ãã§ãªããïŒæœåšçã«ïŒã³ãŒãã®æ§é ãã®ãã®ã«ã€ããŠã話ããŸãã
Try-catch-finallyã¯ããã®ãããªéåžžã«äŸµè¥²çãªå€æŽã«ãªããŸããããã«ãããGoããã°ã©ã ã®æ§é ãæ ¹æ¬çã«å€æŽãããŸãã å¯Ÿç §çã«ãããã«è¡šç€ºãããä»ã®ææ¡ã®ã»ãšãã©ã¯ãåé¢æ°ã«å¯ŸããŠããŒã«ã«ã§ãããšã©ãŒã¯åŒãç¶ãæ瀺çã«è¿ãããå€ã§ãããå¶åŸ¡ãããŒã¯éããŒã«ã«ãžã£ã³ããåé¿ããŸãã
äžé æŒç®åã®äŸã䜿çšããã«ã¯ïŒã¯ããä»æ¥ã¯ãããã䜿çšããŠåœã®æŒç®åã䜿çšã§ããŸãããå®éã«ã¯æ¬çªã³ãŒãã§ãããèŠã€ãããªãããšãé¡ã£ãŠããŸãã ããã¯ã€ãã£ãªã ã«åŸããªãã 代ããã«ãéåžžã¯æ¬¡ã®ãããªãã®ã衚瀺ãããŸãã
var v int
if condition {
v = first_expression
} else {
v = second_expression
}
æ§æãåçšããããªããšããããšã§ã¯ãªãããããèšèªã®æ®ãã®éšåãä»æ¥ãã§ã«ååšããã³ãŒãã®æ®ãã®éšåã«ã©ã®ããã«é©åããããæ€èšããå¿ èŠããããšããããšã§ãã
@KamyarMç§ã¯GoãšJavaã®äž¡æ¹ã䜿çšããŠããŸãããJavaããäŸå€åŠçãã³ããŒããããšãGoã«åŒ·ãæãã§ããŸããã Javaãå¿ èŠãªå Žåã¯ãJavaã䜿çšããŠãã ããã ãããŠãé©åãªåé¡ãäŸãã°ïŒ23248ã«äžé æŒç®åã®è°è«ãããŠãã ããã
@lparã§ããããç§ãäŒç€Ÿã§åããŠããŠãäœããã®çç±ã§åœŒããããã°ã©ãã³ã°èšèªãšããŠGoLangãéžãã å Žåãç§ã¯ä»äºãèŸããŠJavaã«ç³ã蟌ãå¿ èŠããããŸãïŒïŒ ç·ã«æ¥ãŠïŒ
@bcmillsããã§ææ¡ããã³ãŒããæ°ããããšãã§ããŸãã ããã¯1è¡ã§ã¯ãªã6è¡ã®ã³ãŒãã ãšæããŸãããããããã³ãŒãã®åŸªç°çè€é床ã®ãã€ã³ãã2ã€åŸãããŸãïŒçããã¯Linterã䜿çšããŠããŸãããïŒïŒã
@carlmjohnsonãš@bcmillså€ããŠæçããæ§æã¯ããããæªãããšãæå³ããããã§ã¯ãããŸããã å®éãifelseæ§æã¯äžé æŒç®åæ§æãããã¯ããã«å€ããšæããŸãã
ãã®GOã€ãã£ãªã ã®ãã®ãæã£ãŠããŠããã£ãã§ãã ããã¯ãã®èšèªã®åé¡ã®1ã€ã«ãããªããšæããŸãã å€æŽã®ãªã¯ãšã¹ãããããšãã¯ãã€ã§ãã誰ããGoã€ãã£ãªã ã«å察ã ãšèšããŸãã ç§ã¯ããããå€åã«æµæããæ°ããã¢ã€ãã¢ãé»æ¢ããããã®åãªãèšãèš³ã ãšèããŠããŸãã
@KamyarMã¯ç€Œåæ£ããããŠãã ããã èšèªãå°ããä¿ã€ããšã®èåŸã«ããèãæ¹ã«ã€ããŠè©³ããç¥ãããå Žåã¯ã httpsïŒ//commandcenter.blogspot.com/2012/06/less-is-exponentially-more.htmlããå§ãã
ãŸããtry / catchã®æè¿ã®è°è«ãšã¯é¢ä¿ã®ãªãäžè¬çãªã³ã¡ã³ãã
ãã®ã¹ã¬ããã«ã¯å€ãã®ææ¡ããããŸãã èªåèªèº«ã§èšãã°ããŸã 解決ãã¹ãåé¡ããã£ãããšææ¡ããŠãããšã¯æããŠããŸããã ç§ã¯ãããã«ã€ããŠãã£ãšèãããã§ãã
ãŸããè°è«ãããåé¡ã®æŽçããèŠçŽããããªã¹ããç¶æãããšãããããããŸãããéèŠãªã¿ã¹ã¯ã誰ããåŒãåããããšæã£ãããç§ã¯è奮ããŸãã
@josharianç§ã¯ããã§ççŽã«è©±ããŠããŸããã èšèªãã³ãã¥ããã£ã§æ£ç¢ºãªåé¡ã瀺ãããã£ãã®ã§ãã ããããã£ãšæ¹å€ãšããŠèããŠãã ããã GoLangã¯æ¹å€ãåããããã§ãããïŒ
@KamyarMããã°ã©ãã³ã°èšèªã«Rustãéžãã äŒç€Ÿã§åããŠããå ŽåãRust Githubã«ã¢ã¯ã»ã¹ããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã¡ã¢ãªç®¡çãšC ++ã¹ã¿ã€ã«ã®ãã€ã³ã¿ãŒãèŠæ±ãå§ããŠããããŒãã§ãã«ãŒã«å¯ŸåŠããå¿ èŠããªããªããŸããïŒ
Goããã°ã©ããŒãJavaã¹ã¿ã€ã«ã®äŸå€ãæãŸãªãçç±ã¯ããããã«ç²ŸéããŠããªãããšãšã¯äœã®é¢ä¿ããããŸããã ç§ã¯1988幎ã«Lispãä»ããŠæåã«äŸå€ã«ééããŸãããããã®ã¹ã¬ããã«ã¯ãã£ãšæ©ãäŸå€ã«ééãã人ããããšç¢ºä¿¡ããŠããŸããã¢ã€ãã¢ã¯1970幎代åé ã«ããã®ãŒããŸãã
åãããšãäžé åŒã«ãåœãŠã¯ãŸããŸãã Goã®æŽå²ãèªã-Goã®äœæè ã®1人ã§ããKenThompsonã¯ã1969幎ã«ãã«ç 究æã§BèšèªïŒCã®å身ïŒã§äžé æŒç®åãå®è£ ããŸããã Goã«å«ãããã©ããã
Goã¯æ¹å€ãåããããã§ãããGoãã©ãŒã©ã ã§ã®è°è«ã¯äžå¯§ã§ããå¿ èŠããããŸãã ççŽã§ããããšã¯å€±ç€Œã§ããããšãšåãã§ã¯ãããŸããã https://golang.org/conductã®ãGopherValuesãã»ã¯ã·ã§ã³ã
@lparã¯ããRustã«ãã®ãããªãã©ãŒã©ã ãããå Žåãç§ã¯ãããè¡ããŸã;-)çå£ã«ç§ã¯ãããè¡ããŸãã èªåã®å£°ãèãããããã
@ianlancetayloräžåãªèšèãèšèã䜿çšããŸãããïŒ å·®å¥çãªèšèã誰ãã®ãããããŸãã¯æè¿ãããªãæ§çé²æ©ã䜿çšããŸãããïŒ ããã¯æããŸããã
ãããããã§ã¯Goããã°ã©ãã³ã°èšèªã«ã€ããŠè©±ããŠããã ãã§ãã å®æãæ¿æ²»ãªã©ã§ã¯ãããŸããã
ççŽã§ããã èªåã®å£°ãèãããŠã»ããã£ãã ããããããã§ãã®ãã©ãŒã©ã ããããšæããŸãã 声ãèãããããã«ã ããªãã¯ç§ã®ææ¡ãç§ã®æ¹å€ãæ°ã«å
¥ããªããããããŸããã ããã§å€§äžå€«ã§ãã ããããç§ã«è©±ããããŠè©±ãåãå¿
èŠããããšæããŸããããããªããšããã¹ãŠãå®ç§ã§åé¡ããªããããããã«è©±ãåãå¿
èŠã¯ãªããšçµè«ä»ããããšãã§ããŸãã
@josharianèšäºãããããšãããããŸããããèŠãŠãããŸãã
ããŠãç§ã¯èªåã®ã³ã¡ã³ããæ¯ãè¿ã£ãŠãããã«äœãæªãããšããããã©ããã確èªããŸããã ç§ã䟮蟱ãããããããªãå¯äžã®ãã®ïŒç§ã¯ãŸã ãã®æ¹å€ããšããã§åŒãã§ããŸãïŒã¯GoLangããã°ã©ãã³ã°èšèªã€ãã£ãªã ã§ãïŒ ã¯ã¯ã¯ïŒ
ç§ãã¡ã®ãããã¯ã«æ»ãã«ã¯ãç§ã®å£°ãèãããããGoAuthorsã¯Trycatchãããã¯ãæ»ãããšãæ€èšããŠãã ããã ããã°ã©ããŒã«ä»»ããŠãé©åãªå Žæã§äœ¿çšãããã©ããã決å®ããŠãã ããïŒãã§ã«äŒŒããããªãã®ããããŸããã€ãŸãããããã¯ãå埩ããã®ã延æããããã°ã©ããŒã«éŠŽæã¿ã®ããCatchãè©ŠããŠã¿ãŸãããïŒïŒã
äžäœäºææ§ã®ããã«ãçŸåšã®Goãšã©ãŒåŠçã®åé¿çãææ¡ããŸããã ãããæåã®éžæè¢ã ãšèšã£ãŠããããã§ã¯ãããŸããããå®è¡å¯èœã ãšæããŸãã
ç§ã¯ãã®ãããã¯ã«ã€ããŠãã以äžè°è«ããããšããããŸãã
æ©äŒãäžããããããšãããããŸãã
@KamyarMããªãã¯ãããªããããªãã®è°è«ã«å¯Ÿããç§ãã¡ã®æèŠã®çžéã§ç€Œåæ£ãããŸãŸã§ãããšããç§ãã¡ã®èŠæ±ãæ··ä¹±ãããŠããŸãã 人ã ãããªãã«å察ãããšããããªãã¯ã芪æãäžãããŠãããŠããããšããããã¯ãŸãã«ç§ã話ããŠããåé¡ã§ããGOã³ãã¥ããã£ã¯å€åã«ãªãŒãã³ã§ã¯ãªããç§ã¯ãããæããŸãããããŠç§ã¯æ¬åœã«ããŸãããã®ãããªã³ã¡ã³ãã§å人çãªèšèã§çããŠããŸãããããªæãã ã
ããäžåºŠïŒç€Œåæ£ããããŠãã ããã æè¡çãªè°è«ã«åºå·ããã ã¢ã€ãã¢ã§ã¯ãªã人ãæ»æãã人身æ»æã®è°è«ã¯é¿ããŠãã ããã ããªããæ¬ç©ã®ç§ãäœãæå³ããã®ãç解ããŠããªãã®ãªããç§ã¯ããããªãã©ã€ã³ã§è©±ãåãã€ããã§ãã ã¡ãŒã«ãéã£ãŠãã ããã ããããšãã
ç§ã¯èªåã®2cãæå ¥ãããããä»ã®N 100ã®ã³ã¡ã³ãã§æåéãäœããç¹°ãè¿ããŠããªãããšãé¡ã£ãŠããŸãïŒãŸãã¯urandomã®ææ¡ã®è°è«ãèžãã§ããŸãïŒã
ç§ã¯æçš¿ãããå ã®ã¢ã€ãã¢ã奜ãã§ããã2ã€ã®äž»èŠãªèª¿æŽããããŸãïŒ
æ§æäžã®ãã€ã¯ã·ã§ãã£ã³ã°ïŒæé»ã®å¶åŸ¡ãããŒãæã€ãã®ã¯ãã¹ãŠãæ¢åã®ãªãã¬ãŒã¿ãŒã®éè² è·ã§ã¯ãªããããèªäœããªãã¬ãŒã¿ãŒã§ããã¹ãã ãšåŒ·ãä¿¡ããŠããŸãã ?!
æããŸãããGoã®æ¢åã®æŒç®åãšç°¡åã«æ··åãããªããã®ã«ã¯æºè¶³ããŠããŸãã
ãã®æŒç®åã®RHSã¯ãä»»æã«æ¿å ¥ãããå€ãæã€åŒã§ã¯ãªããé¢æ°ãåãå¿ èŠããããŸãã ããã«ãããéçºè ã¯ãæå³ãæ確ã«ããªãããããªãç°¡æœãªãšã©ãŒåŠçã³ãŒããèšè¿°ã§ããããã«ãªããŸãã
func returnErrorf(s string, args ...interface{}) func(error) error {
return func(err error) error {
return errors.New(fmt.Sprintf(s, args...) + ": " + err.Error())
}
}
func foo(r io.ReadCloser, callAfterClosing func() error, bs []byte) ([]byte, error) {
// If r.Read fails, returns `nil, errors.New("reading from r: " + err.Error())`
n := r.Read(bs) ?! returnErrorf("reading from r")
bs = bs[:n]
// If r.Close() fails, returns `nil, errors.New("closing r after reading [[bs's contents]]: " + err.Error())`
r.Close() ?! returnErrorf("closing r after reading %q", string(bs))
// Not that I advocate this inline-func approach, but...
callAfterClosing() ?! func(err error) error { return errors.New("oh no!") }
return bs, nil
}
ãšã©ãŒãçºçããªãå Žåã¯RHSãè©äŸ¡ããªãã§ãã ããããã®ããããã®ã³ãŒãã¯ã¯ããŒãžã£ãŒãªã©ãããããŒãã¹ã«å²ãåœãŠãŸããã
ãã®ãã¿ãŒã³ãããªãŒããŒããŒããããŠãããèå³æ·±ãã±ãŒã¹ã§æ©èœãããããšãéåžžã«ç°¡åã§ãã ç§ã¯3ã€ã®äŸã念é ã«çœ®ããŠããŸãã
ãŸããRHSãfunc(error) (error, bool)
å Žåã return
ãæ¡ä»¶ä»ãã«ããããšãã§ããŸãïŒãããèš±å¯ããå Žåã¯ãç¡æ¡ä»¶ã®æ»ãå€ãšã¯ç°ãªãæŒç®åã䜿çšããå¿
èŠããããšæããŸãã ??
䜿çšããŸãããç§ã®ãæ確ã§ããéãæ°ã«ããŸããããšããã¹ããŒãã¡ã³ãã¯åŒãç¶ãé©çšãããŸãïŒïŒ
func maybeReturnError(err error) (error, bool) {
if err == io.EOF {
return nil, false
}
return err, true
}
func id(err error) error { return err }
func ignoreError(err error) (error, bool) { return nil, false }
func foo(n int) error {
// Does nothing
id(io.EOF) ?? ignoreError
// Still does nothing
id(io.EOF) ?? maybeReturnError
// Returns the given error
id(errors.New("oh no")) ?? maybeReturnError
return nil
}
ãŸãã¯ã次ã®ããã«ãå€éšé¢æ°ã®æ»ãåãšäžèŽããæ»ãåãæã€RHSé¢æ°ãåãå ¥ããããšãã§ããŸãã
func foo(r io.Reader) ([]int, error) {
returnError := func(err error) ([]int, error) { return []int{0}, err }
// returns `[]int{0}, err` on a Read failure
n := r.Read(make([]byte, 4)) ?! returnError
return []int{n}, nil
}
ãããŠæåŸã«ãæ¬åœã«å¿ èŠãªå Žåã¯ãåŒæ°ã®åãå€æŽããããšã§ããããäžè¬åããŠãåãªããšã©ãŒä»¥äžã®ãã®ãåŠçã§ããŸãã
func returnOpFailed(name string) func(bool) error {
return func(_ bool) error {
return errors.New(name + " failed")
}
}
func returnErrOpFailed(name string) func(error) error {
return func(err error) error {
return errors.New(name + " failed: " + err.Error())
}
}
func foo(c chan int, readInt func() (int, error), d map[int]string) (string, error) {
n := <-c ?! returnOpFailed("receiving from channel")
m := readInt() ?! returnErrOpFailed("reading an int")
result := d[n + m] ?! returnOpFailed("looking up the number")
return result, nil
}
... map[string]interface{}
æåã§ãã³ãŒããããªã©ãã²ã©ãããšãããªããã°ãªããªããšãã«ãå人çã«æ¬åœã«åœ¹ç«ã€ãšæããŸãã
æ確ã«ããããã«ãç§ã¯äž»ã«æ¡åŒµæ©èœãäŸãšããŠç€ºããŠããŸãã ãããã®ã©ããïŒããããã°ïŒåçŽããæå¿«ãããããŠäžè¬çãªæçšæ§ã®éã§è¯ããã©ã³ã¹ããšã£ãŠããã®ãããããŸããã
ãšã©ãŒãç¡èŠããããšã¯ãã§ã«æ¢åã®_ã§ã«ããŒãããŠãããšæ³å®ããŠããã®ã§ãããšã©ãŒãè¿ã/è¿œå ã®ã³ã³ããã¹ãã䜿çšããŠãã®éšåãããäžåºŠç¢ºèªããããšæããŸãã
æååãç¶ãå¯èœæ§ã®ãã2èªã®ããŒã¯ãŒããææ¡ããŠããŸãïŒãªãã·ã§ã³ïŒã
@urandomææ¡ã®æåã®éšåã¯è³æã§ãããã€ã§ãããããå§ããŠã2çªç®ã®æ¹èšã®ããã«BubbleProcessor
ãæ®ãããšãã§ããŸãã @ object88ã«ãã£ãŠæèµ·ãããæžå¿µã¯æå¹ãªIMOã§ãã æè¿ãã http
ã®ããã©ã«ãã®ã¯ã©ã€ã¢ã³ã/ãã©ã³ã¹ããŒããäžæžãããªãã§ãã ããããªã©ã®ã¢ããã€ã¹ãç®ã«ããŸãããããã¯å¥ã®ã¢ããã€ã¹ã«ãªããŸãã
ãã®ã¹ã¬ããã«ã¯å€ãã®ææ¡ããããŸãã èªåèªèº«ã§èšãã°ããŸã 解決ãã¹ãåé¡ããã£ãããšææ¡ããŠãããšã¯æããŠããŸããã ç§ã¯ãããã«ã€ããŠãã£ãšèãããã§ãã
ãŸããè°è«ãããåé¡ã®æŽçããèŠçŽããããªã¹ããç¶æãããšãããããããŸãããéèŠãªã¿ã¹ã¯ã誰ããåŒãåããããšæã£ãããç§ã¯è奮ããŸãã
@ianlancetaylorãããªããä»»åœããŠããå Žåããã¯ããªã@josharianã ãããïŒ ïŒblushïŒä»ã®åé¡ãã©ã®ããã«èšç»/è°è«ãããŠããã®ãããããŸãããããããããã®è°è«ã¯ãææ¡ããã¯ã¹ããšããŠäœ¿çšãããŠããã ãã§ããïŒ
@KamyarM
@bcmillsããã§ææ¡ããã³ãŒããæ°ããããšãã§ããŸãã ããã¯1è¡ã§ã¯ãªã6è¡ã®ã³ãŒãã ãšæããŸãããããããã³ãŒãã®åŸªç°çè€é床ã®ãã€ã³ãã2ã€åŸãããŸãïŒçããã¯Linterã䜿çšããŠããŸãããïŒïŒã
埪ç°çè€é床ãé衚瀺ã«ãããšèŠã«ãããªããŸãããåé€ãããŸããïŒ strlen
èŠããŠããŸããïŒïŒã ãšã©ãŒåŠçããççž®ããããšããšã©ãŒåŠçã®ã»ãã³ãã£ã¯ã¹ãç¡èŠããããããªããŸãããèŠã¥ãããªããŸãã
ãããŒå¶åŸ¡ãåã«ãŒãã£ã³ã°ãããœãŒã¹å ã®ã¹ããŒãã¡ã³ããŸãã¯åŒã¯ãæçœã§ç°¡æœã§ããå¿ èŠããããŸããããããæçœã§ãããç°¡æœã§ãããã®æ±ºå®ã§ããå Žåããã®å Žåã¯æçœã§ããããšãåªå ãããŸãã
ãã®GOã€ãã£ãªã ã®ãã®ãæã£ãŠããŠããã£ãã§ãã ããã¯ãã®èšèªã®åé¡ã®1ã€ã«ãããªããšæããŸãã å€æŽã®ãªã¯ãšã¹ãããããšãã¯ãã€ã§ãã誰ããGoã€ãã£ãªã ã«å察ã ãšèšããŸãã ç§ã¯ããããå€åã«æµæããæ°ããã¢ã€ãã¢ãé»æ¢ããããã®åãªãèšãèš³ã ãšèããŠããŸãã
æ°ãããã®ãšæçãªãã®ã«ã¯éãããããŸãã ããªãã¯ã¢ã€ãã¢ãæã£ãŠããã®ã§ããã®ååšèªäœãæ¿èªã«å€ãããšæããŸããïŒ æŒç¿ãšããŠãåé¡è¿œè·¡ã·ã¹ãã ãèŠãŠãã³ãã¥ããã£ã®èãã«é¢ä¿ãªãããã¹ãŠã®ã¢ã€ãã¢ãæ¿èªãããå Žåã¯ãä»æ¥ã®Goãæ³åããŠã¿ãŠãã ããã
ããããããªãã¯èªåã®ã¢ã€ãã¢ãä»ã®ã¢ã€ãã¢ãããåªããŠãããšä¿¡ããŠããŸãã ããã§è°è«ãå§ãŸããŸããã€ãã£ãªã ã®ããã«ã·ã¹ãã å šäœãã©ã®ããã«å£ããŠãããã«ã€ããŠè©±ãããã«äŒè©±ãéåããã代ããã«ãæ¹å€ã«çŽæ¥ããã€ã³ãããšã«å¯ŸåŠããããããªããšããªãã®ä»²éã®éã®äžéç¹ãèŠã€ããŠãã ããã
@ gdm85
è¿ããããšã©ãŒã®äžéšã§ãããçš®ã®ã«ã¹ã¿ãã€ãºã®ããã«ããã»ããµãè¿œå ããŸããã ãŸããããã©ã«ãã®ãã¬ãŒã䜿çšããã®ãšå°ã䌌ãŠãããšæããŸãããã»ãšãã©ã®å Žåã¯äœ¿çšããããããšãã§ããŸãããç§ã¯ææ¡ãåãå
¥ãããšèšã£ãŠããŸããã ãããŠãèšé²ãšããŠãããã©ã«ãã®ãã¬ãŒãšããã©ã«ãã®httpã¯ã©ã€ã¢ã³ãããªã¢ãŒãã§åãã«ããŽãªã«ãããšã¯æããªãã
ç§ã¯@gburgessivã®ææ¡ã奜ãã§ãããç§ã¯äžå¯è§£ãªæŒç®åèªäœã®å€§ãã¡ã³ã§ã¯ãããŸããïŒRustã®ããã«å°ãªããšã?
éžã¶ãããããŸããããããã§ãäžå¯è§£ã ãšæããŸãïŒã ããã¯ãã£ãšèªã¿ãããèŠããŸããïŒ
func foo(r io.ReadCloser, callAfterClosing func() error, bs []byte) ([]byte, error) {
// If r.Read fails, returns `nil, errors.New("reading from r: " + err.Error())`
n := r.Read(bs) or returnErrorf("reading from r")
bs = bs[:n]
// If r.Close() fails, returns `nil, errors.New("closing r after reading [[bs's contents]]: " + err.Error())`
r.Close() or returnErrorf("closing r after reading %q", string(bs))
// Not that I advocate this inline-func approach, but...
callAfterClosing() or func(err error) error { return errors.New("oh no!") }
return bs, nil
}
ãããŠããŸãããã°ã圌ã®ææ¡ã«ã¯ã errors
ããã±ãŒãžã®ã©ããã«åœŒã®returnErrorfã«äŒŒãé¢æ°ã®ããã©ã«ãã®å®è£
ãå«ãŸããã§ãããã å€åerrors.Returnf()
ã
@KamyarM
ããªãã¯ãã§ã«ããã§ããªãã®æèŠãè¡šæããŠãããäŸå€ã®åå ã«å
±æããã³ã¡ã³ããåå¿ã¯ãããŸããã§ããã ä»ã®è°è«ãæ··ä¹±ããã以å€ã«ãåãããšãç¹°ãè¿ãããšã§äœãéæãããã®ãããããŸããã ãããŠãããããªãã®ç®æšã§ãããªããããã¯ãã ã¯ãŒã«ã§ã¯ãããŸããã
@josharian ãç°¡åã«è°è«ãèŠçŽããããšæããŸãã ç§ã¯ããã¯ã¹ã«ææ¡ãããã®ã§ãã€ã¢ã¹ãããããã¹ã¬ããå šäœãèªã¿çŽãã€ããããªãã®ã§äžå®å šã§ãã
ç§ãã¡ã察åŠããããšããŠããåé¡ã¯ãGoãšã©ãŒåŠçã«ãã£ãŠåŒãèµ·ããããèŠèŠçãªæ··ä¹±ã§ãã ãããè¯ãäŸã§ãïŒãœãŒã¹ïŒïŒ
func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {
if err := createFolderIfNotExist(to); err != nil {
return nil, err
}
if err := clearFolder(to); err != nil {
return nil, err
}
if err := cloneRepo(to, from); err != nil {
return nil, err
}
dirs, err := getContentFolders(to)
if err != nil {
return nil, err
}
return dirs, nil
}
ãã®ã¹ã¬ããã®äœäººãã®ã³ã¡ã³ãæçš¿è ã¯ããããä¿®æ£ããå¿ èŠã¯ãªããšèããŠããŸãã ãšã©ãŒã®åŠçã¯ãšã©ãŒä»¥å€ã®ã±ãŒã¹ã®åŠçãšåããããéèŠã§ããããããšã©ãŒåŠçãç ©ãããããšãåãã§ããŸãã 圌ãã«ãšã£ãŠãããã§ã®ææ¡ã¯ã©ãã䟡å€ããããŸããã
ãã®ãããªã³ãŒããåçŽåããããšããææ¡ã¯ãããã€ãã®ã°ã«ãŒãã«åããããŸãã
äŸå€åŠçã®åœ¢åŒãææ¡ãã人ãããŸãã Goãæåã«äŸå€åŠçãéžæããéžæããªãããšãéžæããå¯èœæ§ãããããšãèãããšããããã¯åãå ¥ãããããã«ãªãããã§ãã
ããã§ã®ææ¡ã®å€ãã¯ãé¢æ°ããã®åŸ©åž°ïŒå
ã®ææ¡ïŒããããã¯ãªã©ã®ããã©ã«ãã®ã¢ã¯ã·ã§ã³ãéžæãããã®ã¢ã¯ã·ã§ã³ãç°¡åã«è¡šçŸã§ããããã«ããããã®æ§æãææ¡ããŸãã ç§ã®æèŠã§ã¯ããããã®ææ¡ã¯ãã¹ãŠå€±æããŸãããªããªãããããã¯ä»ã®äººãç ç²ã«ããŠ1ã€ã®è¡åã«ç¹æš©ãäžããããã§ãã ç§ã¯å®æçã«è¿åã t.Fatal
ãšlog.Fatal
ã䜿çšããŠãšã©ãŒãåŠçããŸããããã¹ãŠåãæ¥ã«è¡ãããããšããããŸãã
ä»ã®ææ¡ã§ã¯ãå ã®ãšã©ãŒãè£åŒ·ãŸãã¯ã©ããããæ¹æ³ãæäŸãããŠããªãããããã§ãªãå Žåãããã©ãããå€§å¹ ã«å°é£ã«ãªã£ãŠããŸãã ãšã©ãŒã«ã³ã³ããã¹ããè¿œå ããå¯äžã®æ¹æ³ã¯ã©ããã³ã°ã§ãããããããããäžååã§ããã¹ããããããããããšãçŸåšãããé »åºŠãäœããªããŸãã
æ®ãã®ææ¡ã®ã»ãšãã©ã¯ãå¯èœãªã¢ã¯ã·ã§ã³ãã©ããããæ©èœãå¶éããããšãªãç©äºãåçŽåããããã«ãç ç³ãšæã«ã¯å°ãã®éæ³ãè¿œå ããŸãã ç§ãš@bcmillsã®ææ¡ã¯ãæå°éã®ç ç³ãšãŒãã®éæ³ãè¿œå ããŠãèªã¿ãããããããã«åäžãããåä»ãªçš®é¡ã®ãã°ãé²ããŸãã
ä»ã®ããã€ãã®ææ¡ã§ã¯ãé¢æ°ã®æåãŸãã¯æåŸã®ãšã©ãŒåŠçã»ã¯ã·ã§ã³ãªã©ãããçš®ã®å¶çŽãããéããŒã«ã«å¶åŸ¡ãããŒãè¿œå ãããŠããŸãã
æåŸã«ãªããŸãããã @ mpvlã¯ãã¯ãèªã¿ãããã ãã§ãªãæ£ç¢ºããåäžãããããã«ãGoãšã©ãŒåŠçãžã®ããæ ¹æ¬çãªå€æŽãæ¢åã®ã¡ã«ããºã ã§åŠçã§ãããšæããŸãã
ã¢ã€ãã¢ãããã«è¡šç€ºãããŠããªã人ã«ã¯ãè©«ã³ããŸãã
ç ç³ãšéæ³ã®éãã«ã€ããŠèª°ãã«èãããããªæ°ãããŸãã ïŒç§ã¯ãããèªåã§å°ããŠããŸããïŒ
ã·ã¥ã¬ãŒã¯ãèšèªã®ã«ãŒã«ãæ ¹æ¬çã«å€æŽããããšãªãã³ãŒããççž®ããå°ãã®æ§æã§ãã çã代å
¥æŒç®å:=
ã¯ç ç³ã§ãã Cã®äžé
æŒç®å?:
ã§ãã
ããžãã¯ã¯ãå€æ°ã宣èšããã«ã¹ã³ãŒãã«å°å ¥ããããéããŒã«ã«å¶åŸ¡è»¢éãå®è¡ããããããªã©ãèšèªã«å¯ŸããããæŽåçãªæ··ä¹±ã§ãã
ç·ã¯ééããªããŒãããŠããŸãã
ãããããŠãããŠããããšãã@ jbaã éåžžã«åœ¹ç«ã¡ãŸãã ãã€ã©ã€ããåŒãåºãããã«ããããŸã§ã«ç¹å®ãããåé¡ã¯æ¬¡ã®ãšããã§ãã
Goãšã©ãŒåŠçã«ãã£ãŠåŒãèµ·ããããèŠèŠçãªæ··ä¹±
ãš
ãããã¯ãçºçãããšããšã©ãŒåŠçãéåžžã«é£ãããªãå¯èœæ§ããããŸã
@jbaãšç§ãèŠéããä»ã®æ ¹æ¬çã«ç°ãªãåé¡ïŒè§£æ±ºçã§ã¯ãªãïŒããã
@josharianã¹ã³ãŒãã³ã°ã®åé¡ïŒhttps://github.com/golang/go/issues/21161#issuecomment-319277657ïŒããèŠèŠçãªæ··ä¹±ãã®åé¡ã®å€åœ¢ãšèŠãªããŸããããããšãå¥ã®åé¡ãšèŠãªããŸããïŒ
@bcmillsã¯ãçŸåŠ/人éå·¥åŠïŒãŸãã¯ããããã³ãŒãã®ãã«ã¯ãå«ãæ£ç¢ºæ§ã®åé¡ïŒãšã¯å¯Ÿç §çã«ã埮åŠãªæ£ç¢ºæ§ã®åé¡ã«é¢ãããã®ã§ãããããç§ã«ã¯æ確ã«æããŸãã ããããšãïŒ ã³ã¡ã³ããç·šéããŠããã®1è¡ã®æŠèŠãè¿œå ããŸããïŒ
ç ç³ãšéæ³ã®éãã«ã€ããŠèª°ãã«èãããããªæ°ãããŸãã ïŒç§ã¯ãããèªåã§å°ããŠããŸããïŒ
ç§ã¯ãã®éæ³ã®å®çŸ©ã䜿çšããŸãããœãŒã¹ã³ãŒããå°ãèŠãŠã次ã®ã¢ã«ãŽãªãºã ã®å€åœ¢ã«ãã£ãŠäœãè¡ãããããç解ã§ãããã©ããã確èªããŸãã
ãã®ã¢ã«ãŽãªãºã ã_確å®ã«_ã³ãŒããäœãããããšããŠããã®ããæ£ããç解ããã®ã§ããã°ãããã¯éæ³ã§ã¯ãããŸããã ããã§ãªãå Žåã¯ãããçšåºŠã®éæ³ãå«ãŸããŠããŸãã ããã¥ã¡ã³ãã®åç §ãšèå¥åã®å®çŸ©ãä»ã®èå¥åã®å®çŸ©ãŸã§ãã©ãããšãããšãã«ãã©ãã ãååž°çã«é©çšããå¿ èŠããããã¯ãåé¡ã®æ§æ/ã³ãŒãã®_è€éã_ã«ã¯åœ±é¿ããŸããã_éæ³ã«ã¯åœ±é¿ããŸããã
éæ³ã®äŸã¯æ¬¡ã®ãšããã§ããåå空éãªãã§ã€ã³ããŒãããããã«å ã®å Žæã«æ»ãæ確ãªãã¹ããªãèå¥åïŒç¹ã«è€æ°ããå Žåã¯ãGoã§ããããã€ã³ããŒãããŸãïŒã ã³ãŒããé¢æ°åç §ãéããŒã«ã«ã§å®å šã«åå®çŸ©ã§ããåçèšèªããååšããªãèå¥åã«å¯ŸããŠèšèªãè¡ãããšãåå®çŸ©ã§ããåçèšèªãªã©ãèšèªãéããŒã«ã«ã§è§£æ±ºãã察象ãéããŒã«ã«ã§å®çŸ©ããå¿ èŠãããå ŽåããããŸãã å®è¡æã«ããŒã¿ããŒã¹ããããŒããããã¹ããŒãã«ãã£ãŠæ§ç¯ããããªããžã§ã¯ãããããã£ãŠãã³ãŒãæã«ããªããžã§ã¯ããããã«ããããšãå€ããå°ãªããç²ç®çã«æãã§ããŸãã
ããã®è¯ããšããã¯ãã»ãšãã©ãã¹ãŠã®äž»èŠ³æ§ãåé¡ããåãé€ãããšã§ãã
ç®åã®ãããã¯ã«æ»ããšããã§ã«ããããã®ææ¡ããªãããŠããããã§ãä»ã®èª°ããå¥ã®ææ¡ã§ããã解決ããå¯èœæ§ãããã誰ãããã¯ãïŒããã ãã§ãïŒã ãŒãã«è¿ã¥ãã
ãããããããã§è¡ãããææ¡ã®ããŸããŸãªåŽé¢ãåé¡ããåªå é äœãç解ããæ¹åã«äŒè©±ãé²ããå¿ èŠãããããã«æãããŸãã ç¹ã«ãããã®äººã ãæŒ ç¶ãšé©çšããŠããççŸããèŠä»¶ãæããã«ããããšãèŠéã«å ¥ããŠããããèŠãããšæããŸãã
ããšãã°ãå¶åŸ¡ãããŒã«è¿œå ã®ãžã£ã³ããè¿œå ãããŠãããšããèŠæ
ãããã€ããããŸãã ããããç§èªèº«ãéåžžã«ç¬åµçãªææ¡ã®çšèªã§ã¯ã || &PathError{"chdir", dir, err}
ãäžè¬çã§ããå Žåãé¢æ°å
ã«8åè¿œå ããå¿
èŠããªãããšã倧åã«ããŠããŸãã ïŒGoã¯ä»ã®èšèªã»ã©ç¹°ãè¿ãã³ãŒãã«ã¢ã¬ã«ã®ãŒããªãããšã¯ç¥ã£ãŠããŸãããããã§ããç¹°ãè¿ãã³ãŒãã¯çºæ£ãã°ã®ãªã¹ã¯ãéåžžã«é«ããªããŸããïŒããããå®çŸ©äžããã®ãããªãšã©ãŒåŠçãé€å€ããã¡ã«ããºã ãããå Žåã¯ãã³ãŒãã¯ããžã£ã³ããªãã§äžããäžãå·Šããå³ã«æµããããšã¯ã§ããŸããã äžè¬çã«ã©ã¡ããããéèŠã§ãããšèããããŠããŸããïŒ äººã
ãæé»ã®ãã¡ã«ã³ãŒãã«èª²ããŠããèŠä»¶ã泚ææ·±ã調ã¹ããšãä»ã®çžäºã«ççŸããèŠä»¶ãæããã«ãªããšæããŸãã
ããããäžè¬çã«ããã®ãã¹ãŠã®åæã®åŸã§ã³ãã¥ããã£ãèŠä»¶ã«åæã§ããã°ãæ£ãããœãªã¥ãŒã·ã§ã³ã¯æããã«èŠä»¶ããå€ããå¯èœæ§ããããŸããå°ãªããšããæ£ãããœãªã¥ãŒã·ã§ã³ã»ããã¯æããã«å¶çŽãããŠãããããåé¡ã¯æ±ãããããªããŸãã
ïŒããã¯ææ¡ã§ãããããçŸåšã®åäœã¯äžè¬ã«æ°ããææ¡ãšåãåæãè¡ãå¿ èŠãããããšãææããŠãããŸããç®æšã¯å®å šã§ã¯ãªãå€§å¹ ãªæ¹åã§ãã2ã€ãŸãã¯3ã€ã®éèŠãªæ¹åããªãããæåŠããŸããå®ç§ã¯éº»çºãžã®éã§ãããã¹ãŠã®ææ¡ã¯ãšã«ããäžäœäºææ§ãããã®ã§ãçŸåšã®ã¢ãããŒãããšã«ãããã§ã«æåã§ããå ŽåïŒç§èŠããã¹ãŠã®ãšã©ãŒãåæ³çã«ç°ãªãæ¹æ³ã§åŠçãããå Žåãããã¯ç§ã®çµéšã§ã¯ãŸãã§ããçºçããŸãïŒ ãçŸåšã®ã¢ãããŒãã¯åŒãç¶ãå©çšã§ããŸããïŒ
é¢æ°ã§errïŒ= nilã2åæžãããšãããããã«ã€ããŠèããŠããŸããããããªãåçŽãªè§£æ±ºçã¯ãäžé ã®æåã®éšåã®ããã«èŠããæ¡ä»¶ä»ãæ»ããèš±å¯ããããšã§ãããšæããŸããæ¡ä»¶ã倱æãããšãæ»ããŸããã
ããã解æ/ã³ã³ãã€ã«ã®èŠ³ç¹ããã©ãã»ã©ããŸãæ©èœãããã¯ããããŸãããããïŒããã©ãã«ããããifã¹ããŒãã¡ã³ããšããŠè§£éããã®ã¯ç°¡åãªã¯ãã§ãã èŠããªããšããã¯äºææ§ã厩ããã«èŠããã®ã§ããªãã·ã§ã³ã§æšãŠãŠã¿ãããšæããŸããã
ããã«ãããã«ã¯ãšã©ãŒåŠç以å€ã®çšéããããŸãã
ãããã£ãŠã次ã®ãããªããšãè¡ãããšãã§ããŸãã
func example1() error {
err := doSomething()
return err != nil ? err
//more code
}
func example2() (*Mything, error) {
err := doSomething()
return err != nil ? nil, err
//more code
}
handleErrãerrãè¿ãããšä»®å®ããŠãã¯ãªãŒã³ã¢ããã³ãŒããããå Žåã¯ã次ã®ãããªããšãã§ããŸãã
func example3() error {
err := doSomething()
return err !=nil ? handleErr(err)
//more code
}
func example4() (*Mything, error) {
err := doSomething()
return err != nil ? nil, handleErr(err)
//more code
}
ãããããå¿ èŠã«å¿ããŠãããã1ã€ã®ã©ã€ããŒã«æžããããšãã§ãããšããããšã«ããªããŸãã
func example5() error {
return err := doSomething(); err !=nil ? handleErr(err)
//more code
}
func example6() (*Mything, error) {
return err := doSomething(); err !=nil ? nil, handleErr(err)
//more code
}
@jbaããã®ä»¥åã®ãã§ããã®äŸã¯ã
func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {
return err := createFolderIfNotExist(to); err != nil ? nil, err
return err := clearFolder(to); err != nil ? nil, err
return err := cloneRepo(to, from); err != nil ? nil, err
dirs, err := getContentFolders(to)
return dirs, err
}
ãã®ææ¡ãžã®åå¿ã«èå³ãããã§ãããããããããã€ã©ãŒãã¬ãŒããç¯çŽããäžã§å€§ããªåå©ã§ã¯ãããŸããããéåžžã«æ確ã§ãããããŸãããã°ãå°ããªäžäœäºææ§ã®ããå€æŽã®ã¿ãå¿ èŠã§ãïŒãããããã®åã«ããã€ãã®éåžžã«äžæ£ç¢ºãªä»®å®ïŒã
ããªãã¯ãããããããå¥ã®ãªã¿ãŒã³ã§åé¢ããããšãã§ããŸããïŒ ïŒãã¹ãŠã®ããŒã«ãèããŠïŒreturnãšã®äºææ§ãå¿é ããå¿ èŠããªããšããç¹ã§ãæ確ããå¢ããç掻ãç°¡çŽ åããå¯èœæ§ã®ããããŒã¯ãŒãããããã¯ãif / returnã¹ããŒãã¡ã³ããšããŠå éšçã«æžãçŽããã次ã®ããã«ãªããŸãã
func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {
return? err := createFolderIfNotExist(to); err != nil ? nil, err
return? err := clearFolder(to); err != nil ? nil, err
return? err := cloneRepo(to, from); err != nil ? nil, err
dirs, err := getContentFolders(to)
return dirs, err
}
éãã¯ããŸããªãããã§ã
return err != nil ? err
ãš
if err != nil { return err }
ãŸãã panic
ãlog.Fatal
åŒã³åºããªã©ãè¿å以å€ã®ããšããããå ŽåããããŸãã
ç§ã¯å é±ææ¡ãæåºããŠä»¥æ¥ããããå転ãããŠããŸããããããŠç§ã¯@thejerfã«åæãããšããçµè«ã«éããŸããïŒç§ãã¡ã¯å®éã«äžæ©
æãäžè¬çã«è¿°ã¹ãããŠããèŠä»¶ã¯ã1æ¥ã®çµããã«ãGoã4ã€ã®ãšã©ãŒåŠçã±ãŒã¹ãåŠçã§ããå¿ èŠããããšããããšã§ãã
ææ¡ã¯ã次ã®3ã€ã®ã«ããŽãªã®ããããã«åé¡ãããããã§ãã
try-catch-finally
ã¹ã¿ã€ã«ã®ãšã©ãŒåŠçã«æ»ããŸããäžããããææ¡ã«å¯Ÿããæ¹å€ã¯ãã³ãŒãã®å¯èªæ§ãéèªæãªãžã£ã³ããã¹ã³ãŒããžã®å€æ°ã®æé»çãªè¿œå ãããã³ç°¡æœãã«é¢ããæžå¿µã«åãããŠããããã§ãã å人çã«ã¯ãææ¡ã«å¯Ÿããæ¹å€ã«ã¯å人çãªæèŠããããããã£ããšæããŸãã ãããæªãããšã ãšèšã£ãŠããããã§ã¯ãããŸããããææ¡ãè©äŸ¡ããããã®å®¢èŠ³çãªåºæºã¯å®éã«ã¯ãªãããã«æããŸãã
ç§ã¯ãããããã®åºæºã®ãªã¹ããäœæããããšãã人ã§ã¯ãããŸãããã誰ããããããŸãšããã®ã§ããã°éåžžã«åœ¹ç«ã€ãšæããŸãã ç§ã¯ã1ãèŠããã®ã2ãäœãæªãã®ãã3ã
@jbaã«ã¯ãããå€ãã®ã³ã³ããã¹ãã®ããã«ãäžèšã®å¥ã®çŽ æŽãããèŠçŽã³ã¡ã³ãããããŸãã 圌ã¯ç§ãããã§èšã£ãããšã®å€ããå¥ã®èšèã§èšããŸãã
@ianlancetaylor ããŸãã¯ç§ããããããžã§ã¯ãã«æ·±ãé¢ãã£ãŠãã人ã¯ãæºããå¿ èŠã®ãããæ£åŒãªãïŒãã¹ãŠ1ã€ã®ã³ã¡ã³ãã§ãæŽçãããããçšåºŠå æ¬çã§ãããææåã¯ãããŸããïŒäžé£ã®åºæºãè¿œå ããããšã«
å æ¬çãªæ£åŒãªåºæºã®ã»ãããæžãããšã¯ã§ããªããšæããŸãã ç§ãã§ããæåã®ããšã¯ãããããããšã«å€§ããªå©çãããå Žåã«ã®ã¿ç¡èŠãããã¹ãéèŠãªäºæã®äžå®å šãªãªã¹ãã§ãã
ç§ã¯ããã§ãã€ãã¡ã¢ãåéããããšæã£ãŠããŸããããã®è°è«ã®ãã1ã€ã®å€§ããªé害ã§ãããäŸã®äºçŽ°ãªããšã§ããIMHOã«ã€ããŠèª¬æããããšæããŸãã
ç§ã¯ãããç§ã®å®éã®ãããžã§ã¯ãããæœåºããå€éšãªãªãŒã¹ã®ããã«ã¹ã¯ã©ãããŸããã ïŒstdlibã¯ãç¹ã«ãã®ã³ã°ã®æžå¿µãæ¬ èœããŠãããããæè¯ã®ãœãŒã¹ã§ã¯ãªããšæããŸããïŒ
func NewClient(...) (*Client, error) {
listener, err := net.Listen("tcp4", listenAddr)
if err != nil {
return nil, err
}
defer func() {
if err != nil {
listener.Close()
}
}()
conn, err := ConnectionManager{}.connect(server, tlsConfig)
if err != nil {
return nil, err
}
defer func() {
if err != nil {
conn.Close()
}
}()
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
err = toServer.Send(&client.serverConfig)
if err != nil {
return nil, err
}
err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
if err != nil {
return nil, err
}
session, err := communicationProtocol.FinalProtocol(conn)
if err != nil {
return nil, err
}
client.session = session
return client, nil
}
ïŒã³ãŒããããŸãæµçšããªãããã«ããŸãããããã¡ãããããªããæ¢ããããšã¯ã§ããŸããããããã¯ç§ã®æ¬åœã®ã³ãŒãã§ã¯ãªããå°ãæ··ä¹±ããŠããããšãèŠããŠãããŠãã ããããããŠãããªããããªãèªèº«ã®ãµã³ãã«ã³ãŒããæçš¿ããã®ãæ¢ããããšã¯ã§ããŸãããïŒ
芳å¯ïŒ
if forwardPort == 0
å¥ã¯_deliberately_ã§ãšã©ãŒãçºçãç¶ããŸããã¯ããããã¯å®éã®åäœã§ããããã®äŸã§è¿œå ãããã®ã§ã¯ãããŸããããããèãããããã¹ãŠã®ãšã©ãŒåäœã瀺ããŠãããšã¯èšããŸããããããªãã®ç¯å²ãã«ããŒããŠããŸãã ïŒç§ã¯Go on HNãªã©ãæè·ããããšããããããŸããã³ãŒãã®äœæãå®äºãããŸã§ã«ããããã¯ãŒã¯ãµãŒããŒã§ã¯ãããããçš®é¡ã®ãšã©ãŒåäœãçºçããããšããããããŸããèªåã®æ¬çªã³ãŒãã1/3ãã調ã¹ãŸãããšã©ãŒã®å®å šã«1/2ã«ããããšã¯ãåã«è¿ããã以å€ã®ããšãããŸãããïŒ
ç§ã¯ãŸãããã®ã³ãŒãã«é©çšãããèªåã®ïŒæŽæ°ãããïŒææ¡ãïŒåïŒæçš¿ããŸãïŒèª°ãããã以åã«ãã£ãšè¯ããã®ãæã£ãŠãããšç§ã«çŽåŸãããªãéãïŒããäŒè©±ãç¬å ããªãããã«ç§ã¯åŸ ã€ã€ããã§ãå°ãªããšãé±æ«ã¯ã ïŒããã¯ããœãŒã¹ã®å·šå€§ãªãã£ã³ã¯ã§ãããããèŠãç®ãããå°ãªãããã¹ãã§ãããããã§ã....ïŒ
try
ããã§ã try
ã¯ãïŒ= nil returnãã³ãŒãã59ã®ãã¡6è¡ïŒçŽ10ïŒ
ïŒåæžããå Žåã®ã·ã§ãŒãã«ããã§ãã
func NewClient(...) (*Client, error) {
listener, err := net.Listen("tcp4", listenAddr)
try err
defer func() {
if err != nil {
listener.Close()
}
}()
conn, err := ConnectionManager{}.connect(server, tlsConfig)
try err
defer func() {
if err != nil {
conn.Close()
}
}()
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
err = toServer.Send(&client.serverConfig)
try err
err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
try err
session, err := communicationProtocol.FinalProtocol(conn)
try err
client.session = session
return client, nil
}
ç¹ã«ãããã€ãã®å Žæã§try x()
ãæžãããã£ãã®ã§ãããdefersãæ£ããæ©èœããããã«ãšã©ãŒãèšå®ããå¿
èŠããã£ããããæžã蟌ããŸãã
ãã1ã€ã try
ãå²ãåœãŠè¡ã§çºçããå¯èœæ§ãããå Žåã47è¡ã«ãªããŸãã
func NewClient(...) (*Client, error) {
try listener, err := net.Listen("tcp4", listenAddr)
defer func() {
if err != nil {
listener.Close()
}
}()
try conn, err := ConnectionManager{}.connect(server, tlsConfig)
defer func() {
if err != nil {
conn.Close()
}
}()
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
try err = toServer.Send(&client.serverConfig)
try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
try session, err := communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
}
import "github.com/pkg/errors"
func Func3() (T1, T2, error) {...}
type PathError {
err Error
x T3
y T4
}
type MiscError {
x T5
y T6
err Error
}
func Foo() (T1, T2, error) {
// Old school
a, b, err := Func(3)
if err != nil {
return nil
}
// Simplest form.
// If last unhandled arg's type is same
// as last param of func,
// then use anon variable,
// check and return
a, b := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, err
}
*/
// Simple wrapper
// If wrappers 1st param TypeOf Error - then pass last and only unhandled arg from Func3() there
a, b, errors.WithStack() := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, errors.WithStack(err)
}
*/
// Bit more complex wrapper
a, b, errors.WithMessage("unable to get a and b") := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, errors.WithMessage(err, "unable to get a and b")
}
*/
// More complex wrapper
// If wrappers 1nd param TypeOf is not Error - then pass last and only unhandled arg from Func3() as last
a, b, fmt.Errorf("at %v Func3() return error %v", time.Now()) := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, fmt.Errorf("at %v Func3() return error %v", time.Now(), err)
}
*/
// Wrapping with error types
a, b, &PathError{x,y} := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, &PathError{err, x, y}
}
*/
a, b, &MiscError{x,y} := Func3()
/*
a, b, err := Func3()
if err != nil {
return T1{}, T2{}, &MiscError{x, y, err}
}
*/
return a, b, nil
}
ããéæ³ïŒ-1ãŸã§ãæ°è»œã«ïŒã§ãããæ©æ¢°çãªç¿»èš³ããµããŒãããŠããŸã
ããã¯ç§ã®ææ¡ãïŒããããæŽæ°ãããïŒã©ã®ããã«ãªããã§ãïŒ
func NewClient(...) (*Client, error) {
defer annotateError("client couldn't be created")
listener := pop net.Listen("tcp4", listenAddr)
defer closeOnErr(listener)
conn := pop ConnectionManager{}.connect(server, tlsConfig)
defer closeOnErr(conn)
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
forwardOut = forwarding.NewOut(pop url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort)))
}
client := &Client{listener: listener, conn: conn, forward: forwardOut}
toServer := communicationProtocol.Wrap(conn)
pop toServer.Send(&client.serverConfig)
pop toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
session := pop communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
}
func closeOnErr(c io.Closer) {
if err := erroring(); err != nil {
closeErr := c.Close()
if err != nil {
seterr(multierror.Append(err, closeErr))
}
}
}
func annotateError(annotation string) {
if err := erroring(); err != nil {
log.Printf("%s: %v", annotation, err)
seterr(errwrap.Wrapf(annotation +": {{err}}", err))
}
}
å®çŸ©ïŒ
pop
ã¯ãå³ç«¯ã®å€ããšã©ãŒã§ããé¢æ°åŒã«å¯ŸããŠæå¹ã§ãã ããã¯ãããšã©ãŒãnilã§ãªãå Žåã¯ãçµæå
ã®ä»ã®ãã¹ãŠã®å€ãšãã®ãšã©ãŒã®å€ããŒãã®é¢æ°ããæ»ãããã以å€ã®å Žåã¯ãšã©ãŒã®ãªãå€ã®ã»ãããçæããããšå®çŸ©ãããŠããŸãã pop
ã¯ã erroring()
ãšã®ç¹æš©çãªããåãã¯ãããŸããã ãšã©ãŒã®éåžžã®æ»ãå€ã¯ãåŒãç¶ãerroring()
ãŸãã ããã¯ãä»ã®æ»ãå€ã«å¯ŸããŠãŒã以å€ã®å€ãè¿ãããšãã§ããããã§ãé
延ãšã©ãŒåŠçã䜿çšã§ããããšãæå³ããŸãã æ¯å©ã¯ãæ»ãå€ã®ããªã¹ããããå³ç«¯ã®èŠçŽ ããããããŠããŸãã
erroring()
ã¯ãã¹ã¿ãã¯ãäžã£ãŠå®è¡äžã®é
延é¢æ°ã«ç§»åãã次ã«åã®ã¹ã¿ãã¯èŠçŽ ïŒé
延ãå®è¡ãããŠããé¢æ°ããã®å Žåã¯NewClientïŒã«ç§»åããŠãçŸåšè¿ããããšã©ãŒã®å€ã«ã¢ã¯ã»ã¹ããããšãšããŠå®çŸ©ãããŸããé²è¡äžã é¢æ°ã«ãã®ãããªãã©ã¡ãŒã¿ãŒããªãå Žåã¯ããããã¯ã«ãªãããnilãè¿ããŸãïŒã©ã¡ããæå³ã®ããæ¹ïŒã ãã®ãšã©ãŒå€ã¯pop
ããã®ãã®ã§ããå¿
èŠã¯ãããŸããã ã¿ãŒã²ããé¢æ°ãããšã©ãŒãè¿ããã®ã§ãã
seterr(error)
䜿çšãããšãè¿ããããšã©ãŒå€ãå€æŽã§ããŸãã ããã¯ãå°æ¥ã®erroring()
åŒã³åºãã§èŠããããšã©ãŒã«ãªããŸããããã«ãããããã«ç€ºãããã«ãçŸåšå®è¡ã§ããã®ãšåãé
延ããŒã¹ã®ãã§ãŒã³ãå¯èœã«ãªããŸãã
ããã§ã¯ãhashicorpã©ããã³ã°ãšãã«ããšã©ãŒã䜿çšããŠããŸãã å¿ èŠã«å¿ããŠãç¬èªã®å·§åŠãªããã±ãŒãžãæ¿å ¥ããŸãã
è¿œå ã®é¢æ°ãå®çŸ©ããŠããåèšã¯çããªããŸãã è¿œå ã®çšéã§2ã€ã®é¢æ°ãååŽããããšãæåŸ ããŠããã®ã§ããããã¯éšåçã«ããã«ãŠã³ããããŸããã
æ§æãããã«è©°ã蟌ãã®ã§ã¯ãªããforwardPortã®åŠçããã®ãŸãŸã«ããŠããããšã«æ³šæããŠãã ããã äŸå€çãªã±ãŒã¹ãšããŠããããããåé·ã§ãã£ãŠãåé¡ãããŸããã
ãã®ææ¡IMHOã®æãèå³æ·±ãç¹ã¯ãåŸæ¥ã®äŸå€ãé€ããŠãããæžã蟌ãããšããŠããããšãæ³åããå Žåã«ã®ã¿èŠãããšãã§ããŸãã æçµçã«ã¯ããªãæ·±ããã¹ããããçºçããå¯èœæ§ã®ãããšã©ãŒã®_ã³ã¬ã¯ã·ã§ã³_ãåŠçããããšã¯ãäŸå€åŠçã§ã¯éåžžã«é¢åã§ãã ïŒå®éã®Goã³ãŒããšåæ§ã«ã.Closeãšã©ãŒã¯ç¡èŠãããåŸåããããäŸå€ãã³ãã©ãŒèªäœã§çºçãããšã©ãŒã¯ãäŸå€ããŒã¹ã®ã³ãŒãã§ã¯ç¡èŠãããåŸåããããŸããïŒ
ããã«ããã defer
ãªã©ã®æ¢åã®Goãã¿ãŒã³ãæ¡åŒµãããå€ãšããŠã®ãšã©ãŒã䜿çšããŠãçŸåšã®GoãŸãã¯äŸå€ã®ããããã§è¡šçŸããã®ãå°é£ãªå Žåã«ãæ ¹æ¬çãªæè¡ãå¿
èŠãšããªããšã©ãŒåŠçãã¿ãŒã³ãç°¡åã«ä¿®æ£ã§ããŸããã©ã³ã¿ã€ã ã«ïŒç§ã¯æããŸãããïŒããŸããå®éã«ã¯Go2.0ã_å¿
èŠãšããŸãã_ã
æ¬ ç¹ã«ã¯ã erroring
ã pop
ãããã³seterr
ãããŒã¯ãŒããšããŠèŠæ±ããããšããããã®æ©èœã«defer
ãªãŒããŒããããçºçããããšãå«ãŸããŸããããã¯ãå æ°å解ããããšã©ãŒåŠçãäžéšãé£ã³åããšããäºå®ã§ããåŠçæ©èœã«ããããŠãããæ£ããåŠçãã匷å¶ãããããã«äœãããªãããšã æåŸãå¯èœãã©ããã¯ããããŸããããäžäœäºææ§ããããšããïŒæ£ããïŒèŠä»¶ã«ãããåžžã«çŸåšã®ããšãå®è¡ã§ããŸãã
ããã§éåžžã«èå³æ·±ãè°è«ã
éæ³ã®ããã«çŸããå€æ°ãå°å
¥ãããªãããã«ããšã©ãŒå€æ°ãå·ŠåŽã«æ®ããŠãããããšæããŸãã å
ã®ææ¡ãšåæ§ã«ãåãè¡ã§ãšã©ãŒãåŠçããããšæããŸãã ||
æŒç®åã¯ãããŒã«å€ã倧ãããããããã«èŠããã©ããããããããªã¿ãŒã³ããé ãããã䜿çšããŸããã
ãããã£ãŠãæ¡åŒµããŒã¯ãŒããreturnïŒãã䜿çšããŠèªã¿ãããããŸãã CïŒã§ã¯ãã·ã§ãŒãã«ãããäœæããããã«ããã€ãã®å Žæã§çå笊ã䜿çšãããŸãã äŸïŒ æžã代ããã«ïŒ
if(foo != null)
{ foo.Bar(); }
ããªãã¯ãã æžãããšãã§ããŸãïŒ
foo?.Bar();
ãããã£ãŠãGo 2ã®å Žåããã®ãœãªã¥ãŒã·ã§ã³ãææ¡ããããšæããŸãã
func foobar() error {
return fmt.Errorf("Some error happened")
}
// Implicitly return err (there must be exactly one error variable on the left side)
err := foobar() return?
// Explicitly return err
err := foobar() return? err
// Return extended error info
err := foobar() return? &PathError{"chdir", dir, err}
// Return tuple
err := foobar() return? -1, err
// Return result of function (e. g. for logging the error)
err := foobar() return? handleError(err)
// This doesn't compile as you ignore the error intentionally
foobar() return?
ã¡ãã£ãšããèãïŒ
fooãerrïŒ= myFuncïŒïŒ
errïŒ= nilïŒ return wrapïŒerrïŒ
ãŸãã¯
errïŒ= nilïŒ return wrapïŒerrïŒ
ãã®åšãã«äžãã£ããä»ããŠãæ§ããªããšæã£ãŠãããªããäœãå€æŽããå¿ èŠã¯ãããŸããïŒ
if err != nil { return wrap(err) }
å¿
èŠãªã«ã¹ã¿ã åŠçã_ãã¹ãŠ_è¡ãããšãã§ãïŒãŸãã¯ãŸã£ããè¡ããªãïŒãéåžžã®å Žåãã2è¡ã®ã³ãŒããç¯çŽãã100ïŒ
äžäœäºææ§ãããïŒèšèªã«å€æŽããªãããïŒãããã³ã³ãã¯ãã§ãç°¡åã ããã¯ã€ã¢ã³ã®ãã©ã€ãã³ã°ãã€ã³ãã®å€ãã«gofmt
ããŒã«ãããããŸãããïŒ
ç§ã¯carlmjohnsonã®ææ¡ãèªãåã«ãããæžããŸãããããã¯äŒŒãŠããŸã...
ãšã©ãŒã®åã«#
ã ãã
ãã ããå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããšã©ãŒããã°ã«èšé²ã§ããããã«éåžžã®if err != nil { ... }
ããå¿
èŠããããŸããããã«ããã after
ãšããã¢ãããŒã·ã§ã³ã䜿çšããŠãªã¿ãŒã³ããã«ãŠã§ã¢ãè¿œå ã§ããªãéããæå°éã®ãšã©ãŒåŠçã¯åœ¹ã«ç«ã¡ãŸããã ãé¢æ°ãæ»ã£ãåŸã«å®è¡ãããŸã...ïŒ defer
åæ§ã§ãããåŒæ°ã䜿çšããŸãïŒã
@after(func (data string, err error) {
if err != nil {
log.Error("error", data, " - ", err)
}
})
func alo() (string, error) {
// this is the equivalent of
// data, err := db.Find()
// if err != nil {
// return "", err
// }
str, #err := db.Find()
// ...
#err = db.Create()
// ...
return str, nil
}
func alo2() ([]byte, []byte, error, error) {
// this is the equivalent of
// data, data2, err, errNotFound := db.Find()
// if err != nil {
// return nil, nil, err, nil
// } else if errNotFound != nil {
// return nil, nil, nil, errNotFound
// }
data, data2, #err, #errNotFound := db.Find()
// ...
return data, data2, nil, nil
}
ããã¯ãªãŒã³ïŒ
func alo() (string, error) {
str, err := db.Find()
if err != nil {
log.Error("error on find in database", err)
return "", err
}
// ...
if err := db.Create(); err != nil {
log.Error("error on create", err)
return "", err
}
// ...
return str, nil
}
func alo2() ([]byte, []byte, error, error) {
data, data2, err, errNotFound := db.Find()
if err != nil {
return nil, nil, err, nil
} else if errNotFound != nil {
return nil, nil, nil, errNotFound
}
// ...
return data, data2, nil, nil
}
以äžã®ãããªã¹ãŠã£ããã«ã€ããŠã©ã®ããã«guard
æã§ã代ããã«é€ãå€guard...else
ããã®guard...return
ïŒ
file, err := os.Open("fails.txt")
guard err return &FooError{"Couldn't foo fails.txt", err}
guard os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}
ç§ã¯goãšã©ãŒåŠçã®æ瀺æ§ã奜ãã§ãã å¯äžã®åé¡ãimhoã¯ãã©ãã ãã®ã¹ããŒã¹ãå¿ èŠããšããããšã§ãã ç§ã¯2ã€ã®åŸ®èª¿æŽãææ¡ããŸãïŒ
nil
ã¯false
ãšåçã§ããã nil
ããtrue
å ŽåãããŒã«åã®ã³ã³ããã¹ãã§nil-ableã¢ã€ãã ã䜿çšã§ããããã«ããŸãã&&
ã||
åäžè¡ã®æ¡ä»¶ä»ãã¹ããŒãã¡ã³ãæŒç®åããµããŒãããŸããã
file, err := os.Open("fails.txt")
if err != nil {
return &FooError{"Couldn't foo fails.txt", err}
}
ã«ãªãããšãã§ãã
file, err := os.Open("fails.txt")
if err {
return &FooError{"Couldn't foo fails.txt", err}
}
ãŸãã¯ããã«çã
file, err := os.Open("fails.txt")
err && return &FooError{"Couldn't foo fails.txt", err}
ãããŠãç§ãã¡ã¯ããããšãã§ããŸã
i,ok := v.(int)
ok || return fmt.Errorf("not a number")
å€å
i,ok := v.(int)
ok && s *= i
&&
ãš||
ããªãŒããŒããŒããããšãããŸããã倧ãããªããããå Žåã¯ãä»ã®æåïŒ2ã€ä»¥äžïŒãéžæã§ããŸããããšãã°ã ?
ãš#
ãŸãã¯??
ãš##
ããŸãã¯??
ãš!!
ãªã©ã éèŠãªã®ã¯ãæå°éã®ããã€ãºã®å€ããæåïŒæ¬åŒ§ãäžæ¬åŒ§ãªã©ã¯äžèŠïŒãå«ã1è¡ã®æ¡ä»¶æããµããŒãããããšã§ãã æŒç®å&&
ãš||
ã¯ããã®äœ¿çšæ³ãä»ã®èšèªã§åäŸããããããé©åã§ãã
ããã¯ãè€éãª1è¡ã®æ¡ä»¶åŒããµããŒãããããã®ææ¡ã§ã¯ãªãã1è¡ã®æ¡ä»¶ã¹ããŒãã¡ã³ãã®ã¿ããµããŒããããã®ã§ãã
ãŸããããã¯ä»ã®ããã€ãã®èšèªã®ãçå®ãã®å šç¯å²ããµããŒãããããã®ææ¡ã§ã¯ãããŸããã ãããã®æ¡ä»¶ã¯ã nil / non-nilããŸãã¯ããŒã«å€
ãããã®æ¡ä»¶æŒç®åã®å ŽåãåŒããµããŒãããã«åäžã®å€æ°ã«å¶éããããšãé©åãªå ŽåããããŸãã ããè€éãªãã®ããŸãã¯else
å¥ã䜿çšãããã®ã¯ãæšæºã®if ...
æ§é ã§åŠçãããŸãã
@mattnãåã«èšã£ãããã«ããªããã€ãŒã«ãçºæããŠæ¢ç¥ã®try..catch
ãã©ãŒã ã䜿çšããªãã®ã§ããïŒ ïŒã
try {
a := foo() // func foo(string, error)
b := bar() // func bar(string, error)
} catch (err) {
// handle error
}
ããªããæ¬åœã«ãããå¿
èŠãšããå Žåã¯ãå¿
ãå€ã圢åŒã䜿çšããå¯èœæ§ããããããcatchedãšã©ãŒæºãåºå¥ããçç±ã¯ãªãããã«æããif err != nil
ããã«try..catch
ã
ãŸããããã«ã€ããŠã¯ããããããŸãããããšã©ãŒãåŠçãããªãå Žåã«ãšã©ãŒããã¹ããŒãããæ©èœãè¿œå ããå¯èœæ§ããããŸããïŒ
func foo() (string, error) {
f := bar() // similar to if err != nil { return "", err }
}
func baz() string {
// Compilation error.
// bar's error must be handled because baz() does not return error.
return bar()
}
èªã¿ãããã®èŠ³ç¹ããã @ gobwasã¯å¶åŸ¡ãããŒãå®å
šã«ç解ããããšãéåžžã«éèŠã§ãã ããªãã®äŸãèŠããšãã©ã®è¡ããã£ãããããã¯ã«ãžã£ã³ãããå¯èœæ§ããããã¯ããããŸããã ããã¯ãé ãããgoto
ã¹ããŒãã¡ã³ãã®ãããªãã®ã§ãã çŸä»£èªãããã«ã€ããŠæ瀺çã«ããããšãããšã©ãŒãã¹ããŒãããããã«å¶åŸ¡ãããŒãåå²ããå¯èœæ§ã®ããå Žæãæ瀺çã«ããŒã¯ããããã«ããã°ã©ããŒã«èŠæ±ããã®ãäžæè°ã§ã¯ãããŸããã return
ãŸãã¯goto
ãšã»ãšãã©åãã§ãããæ§æãã¯ããã«åªããŠããŸãã
@crekerã¯ããç§ã¯ããªãã«å®å šã«åæããŸãã äžèšã®äŸã§ãããŒå¶åŸ¡ãèããŠããŸããããç°¡åãªåœ¢ã§ãããè¡ãæ¹æ³ãç解ããŠããŸããã§ããã
å€å次ã®ãããªãã®ã§ãïŒ
try {
a ::= foo() // func foo(string, error)
b ::= bar() // func bar(string, error)
} catch (err) {
// handle error
}
ãŸãã¯try a := foo()
..ã®ãããªåã®ä»ã®ææ¡ïŒ
@gobwas
catchãããã¯ã«å°éãããšããtryãããã¯ã®ã©ã®é¢æ°ããšã©ãŒã®åå ã§ããããã©ã®ããã«ç¥ãããšãã§ããŸããïŒ
@urandomãããç¥ãå¿
èŠãããå Žåã¯ãããããif err != nil
ãªãã§try..catch
if err != nil
ãå®è¡ããããšæãã§ãããã
@ robert-wallisïŒã¹ã¬ããã®ååã§Swiftã®ã¬ãŒãã¹ããŒãã¡ã³ãã«ã€ããŠèª¬æ
@pdk
nilå¯èœãªã¢ã€ãã ãããŒã«ã³ã³ããã¹ãã§äœ¿çšã§ããããã«ããŸããnilã¯falseã«çžåœããnil以å€ã¯trueã«çžåœããŸãã
ããã«ããããã©ã°ããã±ãŒãžã䜿çšããŠå€ãã®ãã°ãçºçãã人ã
ã¯if myflag { ... }
ãæžã蟌ã¿ãŸããã if *myflag { ... }
ãæžã蟌ãããšãæå³ããã³ã³ãã€ã©ã«ãã£ãŠæ€åºãããŸããã
try / catchã¯ãè€æ°ã®ããšãé£ç¶ããŠè©Šè¡ããå Žåã®if / elseãããçãã ãã§ããããã¯ãå¶åŸ¡ãããŒã®åé¡ãªã©ã®ããã«ãå€ããå°ãªãã誰ããåæãããã®ã§ãã
FWIWãSwiftã®try / catchã¯ãå°ãªããšããã©ã®ã¹ããŒãã¡ã³ããã¹ããŒããããããããªããšããèŠèŠçãªåé¡ã解決ããŸãã
do {
let dragon = try summonDefaultDragon()
try dragon.breathFire()
} catch DragonError.dragonIsMissing {
// ...
} catch DragonError.halatosis {
// ...
}
@ robert-wallisãäŸããããŸãïŒ
file, err := os.Open("fails.txt")
guard err return &FooError{"Couldn't foo fails.txt", err}
guard os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}
guard
åããŠäœ¿çšãããšãã¯ã if err != nil { return &FooError{"Couldn't foo fails.txt", err}}
ã«éåžžã«ãã䌌ãŠããã®ã§ãããã倧ããªææãã©ããã¯ããããŸããã
2åç®ã®äœ¿çšã§ã¯ã err
ãã©ãããæ¥ãã®ãããã«ã¯ããããŸããã os.Open
ããè¿ããããã®ã®ããã«èŠããŸãããããã¯ããªãã®æå³ã§ã¯ãªãã£ããšæããŸããïŒ ããã¯ãã£ãšæ£ç¢ºã§ããããïŒ
guard err = os.Remove("fails.txt") return &FooError{"Couldn't remove fails.txt", err}
ãã®å Žåãããã¯æ¬¡ã®ããã«ãªããŸã...
if err = os.Remove("fails.txt"); err != nil { return &FooError{"Couldn't remove fails.txt", err}}
ããããããã§ãèŠèŠçãªæ··ä¹±ã¯å°ãªããªããŸãã if err =
ã ; err != nil {
-ããšããããã¯ã³ã©ã€ããŒã§ãã£ãŠãããã®ãããªåçŽãªããšã«ã¯ãŸã å€ãã®ããšãèµ·ãã£ãŠããŸã
æ£ããã£ãŠããªãããšã«åæããŸããã ããããèšèªã«è¿œå ããããšãä¿èšŒããããã«ãããªãå°ãªãã§ããïŒ ããã«åæãããã©ããã¯ããããŸããã
Java / CïŒ/ ...ã®try-catchãããã¯ã®å¯èªæ§ã¯ããšã©ãŒåŠçã«ãã£ãŠäžæãããããšãªããããããŒãã¹ãã·ãŒã±ã³ã¹ããã©ãããšãã§ãããããéåžžã«åªããŠãããšæããŸãã æ¬ ç¹ã¯ãåºæ¬çã«é ãããgotoã¡ã«ããºã ãããããšã§ãã
Goã§ã¯ããšã©ãŒãã³ãã©ã®åŸã«ç©ºã®è¡ãæ¿å ¥ããŠããããããŒãã¹ãããžãã¯ã®ç¶ç¶ãããæ確ã«ããŸãã ãããã£ãŠãgolang.orgããã®ãã®ãµã³ãã«ããïŒ9è¡ïŒ
record := new(Record)
err := datastore.Get(c, key, record)
if err != nil {
return &appError{err, "Record not found", 404}
}
err := viewTemplate.Execute(w, record)
if err != nil {
return &appError{err, "Can't display record", 500}
}
ç§ã¯ãããããããŸãïŒ11è¡ïŒ
record := new(Record)
err := datastore.Get(c, key, record)
if err != nil {
return &appError{err, "Record not found", 404}
}
err := viewTemplate.Execute(w, record)
if err != nil {
return &appError{err, "Can't display record", 500}
}
ããŠãææ¡ã«æ»ããŸããããç§ã¯ãã§ã«ãã®ãããªãã®ãæçš¿ããŠããã®ã§ãããã§ãããïŒ3è¡ïŒ
record := new(Record)
err := datastore.Get(c, key, record) return? &appError{err, "Record not found", 404}
err := viewTemplate.Execute(w, record) return? &appError{err, "Can't display record", 500}
ä»ãç§ã¯å¹žããªéãã¯ã£ãããšèŠãŠããŸãã ç§ã®ç®ã¯ãå³åŽã«ãšã©ãŒåŠççšã®ã³ãŒããããããšããŸã èªèããŠããŸãããæ¬åœã«å¿ èŠãªå Žåã«ã®ã¿ãç®ã§è§£æãããå¿ èŠããããŸãã
åŽã®ãã¹ãŠã®äººãžã®è³ªåïŒãã®ã³ãŒãã¯ã³ã³ãã€ã«ããå¿ èŠããããŸããïŒ
func foobar() error {
return fmt.Errorf("Some error")
}
func main() {
foobar()
}
IMHOãŠãŒã¶ãŒã¯ã次ã®ãšã©ãŒãæå³çã«ç¡èŠããŠãããšèšããããåŸãªãã¯ãã§ãã
func main() {
_ := foobar()
}
@ianlancetaylorã®å ã®æçš¿ã®ãã€ã³ã3ã«é¢é£ãããããšã¯ã¹ããªãšã³ã¹ã¬ããŒããè¿œå ããè¿œå ã®ã³ã³ããã¹ãæ å ±ãšãšãã«ãšã©ãŒãè¿ããŸãã
Goçšã®flacã©ã€ãã©ãªãéçºãããšãã @ davecheney pkg / errorsããã±ãŒãžïŒhttps://github.com/mewkiz/flac/issues/22ïŒã䜿çšããŠãšã©ãŒã«ã³ã³ããã¹ãæ å ±ãè¿œå ããããšæããŸããã å ·äœçã«ã¯ããšã©ãŒãã¹ã¿ãã¯ãã¬ãŒã¹æ å ±ã§æ³šéããerrors.WithStackã䜿çšããŠ
ãšã©ãŒã«ã¯æ³šéãä»ããããŠãããããerrors.WithStackã®å Žåããã®è¿œå æ å ±ãæ ŒçŽããããã®æ°ããåºã«ãªãã¿ã€ããäœæããå¿ èŠããããŸããã¿ã€ãã¯errors.withStackã§ãã
type withStack struct {
error
*stack
}
ããã§ãå
ã®ãšã©ãŒãååŸããããã®èŠåã¯ã errors.Causeã䜿çšããããšio.EOF
ãšæ¯èŒã§ããŸãã
ã©ã€ãã©ãªã®ãŠãŒã¶ãŒã¯ã httpsïŒ//github.com/mewkiz/flac/blob/0884ed715ef801ce2ce0c262d1e674fdda6c3d94/cmd/flac2wav/flac2wav.go#L78ã«æ²¿ã£ãŠã errors.Cause
ã䜿çšããŠå
ã®ãšã©ãŒã確èªããããã«äœããæžãããšãã§ããŸãã䟡å€ïŒ
frame, err := stream.ParseNext()
if err != nil {
if errors.Cause(err) == io.EOF {
break
}
return errors.WithStack(err)
}
ããã¯ã»ãšãã©ãã¹ãŠã®å Žåã«ããŸãæ©èœããŸãã
ãšã©ãŒåŠçããªãã¡ã¯ã¿ãªã³ã°ããŠãã³ã³ããã¹ãæ å ±ãè¿œå ããããã«pkg / errorsãäžè²«ããŠäœ¿çšããå Žåãããªãæ·±å»ãªåé¡ãçºçããŸããã ãŒãããã£ã³ã°ãæ€èšŒããããã«ãèªã¿åããã€ãããŒããã©ããããã§ãã¯ããã ãã®io.Readerãã倱æãå§ããããšã§ãã
åé¡ã¯ã zeros.Read
ã«ãã£ãŠè¿ããããšã©ãŒã®æ ¹æ¬çãªã¿ã€ãããio.EOFã§ã¯ãªãerrors.withStackã§ãããšããããšã§ããã ãããã£ãŠããã®åŸãæã
ã¯ãšã®çµã¿åããã§ãã®ãªãŒããŒã䜿çšããéã®åé¡ãåŒãèµ·ãããio.Copy
ã®ããã«ããããã§ãã¯ãã io.EOF
å
·äœçã«ã¯ãããã³äœ¿çšããããšãç¥ããªãerrors.Cause
ãã¢ã³ã©ããããžã®æ³šéãä»ããšã©ãŒãã³ã³ããã¹ãæ
å ±ã æšæºã©ã€ãã©ãªãæŽæ°ã§ããªãããã解決çã¯æ³šéä»ãã®æ
å ±ãªãã§ãšã©ãŒãè¿ãããšã§ããïŒhttps://github.com/mewkiz/flac/commit/6805a34d854d57b12f72fd74304ac296fd0c07beïŒã
å ·äœçãªå€ãè¿ãã€ã³ã¿ãŒãã§ã€ã¹ã®æ³šéä»ãæ å ±ã倱ãããšã¯æ倱ã§ãããäžç·ã«æ®ããããšã¯å¯èœã§ãã
ç§ãã¡ã®çµéšããã®è±åŽã¯ãç§ãã¡ã®ãã¹ãã±ãŒã¹ããããæãããã®ã§ãç§ãã¡ã幞éã ã£ããšããããšã§ãã zeros
ã¿ã€ãã¯ãŸã io.Reader
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããŠãããããã³ã³ãã€ã©ãŒã¯ãšã©ãŒãçæããŸãã
ããããããã¯å®çŸããŸããããã®ãããç§ãã¡ã¯çµéšã¬ããŒããæ€èšã®ããã«æäŸããããšèããŠããŸãã ã³ã³ããã¹ãæ å ±ã®è¿œå ãGo2ã®ãšã©ãŒåŠçã«çµ±åããæ¹æ³ãèãããšãããšã©ãŒæ¯èŒïŒã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãã©ã¯ãã§äœ¿çšãããïŒãã·ãŒã ã¬ã¹ã«ä¿æãããããã«ããŸãã
芪åã«ã
ããã³
@mewmew ããšã©ãŒåŠçã®å¶åŸ¡ãããŒã®åŽé¢ã«ã€ããŠãã®åé¡ãç¶æããŸãããã ãšã©ãŒã®ã©ãããšã¢ã³ã©ããã®æé©ãªæ¹æ³ã«ã€ããŠã¯ãå¶åŸ¡ãããŒãšã»ãŒçŽäº€ããŠãããããä»ã®å Žæã§èª¬æããå¿ èŠããããŸãã
ç§ã¯ããªãã®ã³ãŒãããŒã¹ã«ç²ŸéããŠããããèªåãªãã¡ã¯ã¿ãªã³ã°ã ãšèšã£ãŠãããšæããŸããããªãEOFã«ã³ã³ããã¹ãæ
å ±ãå«ããå¿
èŠããã£ãã®ã§ããïŒ åã·ã¹ãã ã§ã¯ãšã©ãŒãšããŠæ±ãããŸãããEOFã¯å®éã®ãšã©ãŒã§ã¯ãªããå®éã«ã¯ã·ã°ãã«å€ã§ãã ç¹ã«io.Reader
å®è£
ã§ã¯ãã»ãšãã©ã®å Žåãããã¯æåŸ
å€ã§ãã io.EOF
ãªãå Žåã«ã®ã¿ãšã©ãŒãã©ããããããšã§ãããè¯ãä¿®æ£ã¯ãããŸãããïŒ
ãããç§ã¯ç©äºããã®ãŸãŸã«ããŠããããšãææ¡ããŸãã Goã®ãšã©ãŒã·ã¹ãã ã¯ãéçºè ãã³ãŒã«ã¹ã¿ãã¯ã«ãšã©ãŒããã³ãããã®ãæããšã©ãŸãããããã«ããã®ããã«æå³çã«èšèšãããŠãããšããå°è±¡ãåããŸããã ãã®ãšã©ãŒã¯ãçºçããå Žæã§è§£æ±ºãããã§ããªããšãã«ãããã¯ã䜿çšããæ¹ãé©åãªå Žåãç¥ãããšãç®çãšããŠããŸãã
ã€ãŸããtry-catch-throwã¯ããšã«ããpanicïŒïŒãšrecoverïŒïŒã®åäœãšæ¬è³ªçã«åãã§ã¯ãããŸãããïŒ
ããæ¯ãã€ããããç§ãã¡ãæ¬åœã«ãã®éãäžãå§ããããšããŠããã®ãªãã ãªãç§ãã¡ã¯ãã ã®ãããªããšãããããšãã§ããªãã®ã§ãã
_, ? := foo()
x?, err? := bar()
ãŸãã¯ããããäœãã®ãããªãã®
_, err := foo(); return err?
x, err := bar(); return x? || err?
x, y, err := baz(); return (x? && y?) || err?
ã©ã ïŒ if varïŒ= nil {returnvar}ã®çç¥åœ¢ã®ãšã€ãªã¢ã¹ã«ãªããŸãã
ã¡ãœããã«ãã£ãŠæºããããå¥ã®ç¹å¥ãªçµã¿èŸŒã¿ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããããšãã§ããŸã
func ?() bool //looks funky but avoids breakage.
ããã䜿çšããŠãæ°ããæ¹è¯ãããæ¡ä»¶æŒç®åã®ããã©ã«ãã®åäœãåºæ¬çã«ãªãŒããŒã©ã€ãã§ããŸãã
@mortdeus
åæãããšæããŸãã
åé¡ãããããŒãã¹ãæ瀺ããããã®åªããæ¹æ³ãæã€ããšã§ããå ŽåãIDEã®ãã©ã°ã€ã³ã¯ã·ã§ãŒãã«ããã䜿çšããŠif err != nil { return [...] }
ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãæãããã/å±éããããšãã§ããŸããïŒ
ä»ã¯ãã¹ãŠã®éšåãéèŠã ãšæããŠããŸãã err != nil
ã¯éèŠã§ãã return ...
ã¯éèŠã§ãã
æžãã®ã¯å°ãé¢åã§ãããæžããªããã°ãªããŸããã ãããŠãããã¯æ¬åœã«äººã
ãé
ãããŸããïŒ æéããããã®ã¯ããšã©ãŒãæžãã®ã§ã¯ãªãããšã©ãŒãšäœãè¿ãããèããããšã§ãã
err
å€æ°ã®ç¯å²ãå¶éã§ããææ¡ã«ãã£ãšèå³ããããŸãã
ç§ã®æ¡ä»¶ä»ãã®ã¢ã€ãã¢ã¯ããã®åé¡ã解決ããããã®æãè¯ãæ¹æ³ã ãšæããŸãã ãã®æ©èœãGoã«å«ããã®ã«ååãªäŸ¡å€ãããããã«ããä»ã®ããã€ãã®ããšãèããŸããã ç§ã¯å¥ã®ææ¡ã§ç§ã®èããæžãçããã€ããã§ãã
ãããã©ã®ããã«æ©èœãããããããŸããïŒ
xãyãerrïŒ= bazïŒïŒ; returnïŒ x?
&& y?
ïŒ|| err?
ã©ã ïŒ if var == nil {returnvar}ã®çç¥åœ¢ã®ãšã€ãªã¢ã¹ã«ãªããŸãã
xãyãerrïŒ= bazïŒïŒ; returnïŒ if x == nil{ return x}
&& if y== nil{ return y}
ïŒ|| if err == nil{ return err}
xãyãerrïŒ= bazïŒïŒ; returnïŒxïŒ&& yïŒïŒ|| ãïŒ
ã«ãªããŸã
xãyãerrïŒ= bazïŒïŒ;
ifïŒïŒxïŒ= nil && yïŒ= nilïŒ|| errïŒ= nilïŒïŒ{
xãyãerrãè¿ã
}
xãèŠããïŒ && yïŒ || ãïŒ ãxãšyã¯æå¹ã§ããïŒãšã©ãŒã¯ã©ãã§ããïŒããšèããå¿ èŠããããŸãã
ããã§ãªãå Žåãreturné¢æ°ã¯å®è¡ãããŸããã ãã®ã¢ã€ãã¢ã«ã€ããŠãæ°ããç¹å¥ãªçµã¿èŸŒã¿ã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ãã§ã¢ã€ãã¢ãå°ãé²ããæ°ããææ¡ãæžããŸããã
GoããŒãžã§ã³2ã§ããã©ã«ãã®ãšã©ãŒåŠçãè¿œå ããããšããå§ãããŸãã
ãŠãŒã¶ãŒããšã©ãŒãåŠçããªãå Žåãã³ã³ãã€ã©ã¯nilã§ãªãå Žåã¯ãšã©ãŒãè¿ãããããŠãŒã¶ãŒã次ã®ããã«èšè¿°ããŸãã
func Func() error {
func1()
func2()
return nil
}
func func1() error {
...
}
func func2() error {
...
}
ã³ã³ãã€ã«ããŠæ¬¡ã®ããã«å€æããŸãã
func Func() error {
err := func1()
if err != nil {
return err
}
err = func2()
if err != nil {
return err
}
return nil
}
func func1() error {
...
}
func func2() error {
...
}
ãŠãŒã¶ãŒããšã©ãŒãåŠçãããã_ã䜿çšããŠç¡èŠããå Žåãã³ã³ãã€ã©ã¯äœãããŸããã
_ = func1()
ãŸã
err := func1()
è€æ°ã®æ»ãå€ã®å Žåã次ã®ããã«ãªããŸãã
func Func() (*YYY, error) {
ch, x := func1()
return yyy, nil
}
func func1() (chan int, *XXX, error) {
...
}
ã³ã³ãã€ã©ã¯æ¬¡ã®ããã«å€æãããŸãã
func Func() (*YYY, error) {
ch, x, err := func1()
if err != nil {
return nil, err
}
return yyy, nil
}
func func1() (chan int, *XXX, error) {
...
}
FuncïŒïŒã®ã·ã°ããã£ããšã©ãŒãè¿ããªããããšã©ãŒãè¿ãé¢æ°ãåŒã³åºãå Žåãã³ã³ãã€ã©ã¯ãšã©ãŒãå ±åããŸãïŒãFuncïŒïŒã§ãšã©ãŒãåŠçããŠãã ããã
ãã®åŸããŠãŒã¶ãŒã¯FuncïŒïŒã§ãšã©ãŒããã°ã«èšé²ã§ããŸãã
ãããŠããŠãŒã¶ãŒãããã€ãã®æ å ±ããšã©ãŒã«ã©ãããããå ŽåïŒ
func Func() (*YYY, error) {
ch, x := func1() ? Wrap(err, "xxxxx", ch, "abc", ...)
return yyy, nil
}
ãŸã
func Func() (*YYY, error) {
ch, x := func1() ? errors.New("another error")
return yyy, nil
}
å©ç¹ã¯ã
Goã¯è€æ°ã®æ»ãå€ãæã€å¯èœæ§ããããéçºè ãäœãèµ·ãã£ãŠããã®ããæ瀺çã«èªèããªãéããèšèªã¯æ»ãåŒæ°ã®ããã©ã«ãå€ã«æ¬è³ªçã«çãããã®ãå²ãåœãŠãã¹ãã§ã¯ãªããããããã»ã©ç°¡åã§ã¯ãããŸããã
ä»£å ¥æ§æã«ãšã©ãŒåŠçãå ¥ããŠããããšã©ãŒåŠçã¯ç¹°ãè¿ãããããšããåé¡ã®æ ¹æ¬ã¯è§£æ±ºããªããšæããŸãã
ã³ãŒãã®å€ãã®è¡ã®åŸã«if (err != nil) { return nil }
ïŒãŸãã¯åæ§ã®ãã®ïŒã䜿çšãããšïŒããããããšãçã«ããªã£ãŠããå ŽåïŒãDRYïŒèªåèªèº«ãç¹°ãè¿ããªãã§ãã ããïŒããªã³ã·ãã«ã«åããŸãã ãããç§ãã¡ããããå«ãçç±ã ãšæããŸãã
try ... catch
ãåé¡ããããŸãã ãšã©ãŒãçºçããã®ãšåãé¢æ°ã§ãšã©ãŒãæ瀺çã«åŠçããå¿
èŠã¯ãããŸããã ãããç§ãã¡ãtry...catch
ãå«ã泚ç®ãã¹ãçç±ã ãšæããŸãã
ãããã¯çžäºã«æä»çã§ã¯ãªããšæããŸãã æã
ã¯äžçš®ã®æã€ããšãã§ããŸãtry...catch
ããã«throws
ã
ç§ãå人çã«try...catch
ã«ã€ããŠå«ããªããäžã€ã®ããšã¯ã try
ããŒã¯ãŒãã®æ£æçãªå¿
èŠæ§ã§ãã åäœããææ³ã«é¢ããéããã¹ã³ãŒããªããã¿ãŒã®åŸã§catch
å®è¡ã§ããªãçç±ã¯ãããŸããã ïŒç§ãããã«ã€ããŠééã£ãŠãããªã誰ãããããåŒã³ãŸãïŒ
ããã¯ç§ãææ¡ãããã®ã§ãïŒ
?
ã䜿çšããŸããããã§ã _
ã¯ãããç¡èŠããããã«äœ¿çšãããŸãcatch
以äžã®ç§ã®äŸã®ããã«ã error?
ãå®å
šãªåŸæ¹äºææ§ã®ããã«ä»£ããã«äœ¿çšããããšãã§ã^ããããäžäœäºææ§ããããšããç§ã®ä»®å®ãæ£ãããªãå Žåã¯ããããåŒã³åºããŠãã ããã
func example() {
{
// The following line will invoke the catch block
data, ? := foopkg.buyIt()
// The next two lines handle an error differently
otherData, err := foopkg.useIt()
if err != nil {
// Here we eliminated deeper indentation
otherData, ? = foopkg.breakIt()
}
if data == "" || otherData == "" {
}
} catch (err) {
return errors.Label("fix it", err)
// Aside: why not add Label() to the error package?
}
}
ç§ã¯ããã«å察ããè°è«ãèããŸããããã®ããã«æžããšããã®catch
ãããã¯ãå€æŽãããšãããæ·±ãã¹ã³ãŒãã®ã³ãŒãã«æå³ããªã圱é¿ãäžããå¯èœæ§ããããŸãã ããã¯ã try...catch
çºçããã®ãšåãåé¡ã§ãã
åäžã®é¢æ°ã®ç¯å²å ã§ã®ã¿ãããå®è¡ã§ããå Žåããªã¹ã¯ã¯ç®¡çå¯èœã§ãããšæããŸããããããããšã©ãŒåŠçã³ãŒãã®å€ããå€æŽããããšãããšãã«ããšã©ãŒåŠçã³ãŒãã®è¡ãå€æŽããã®ãå¿ãããšããçŸåšã®ãªã¹ã¯ãšåãã§ãã ããã¯ãã³ãŒãã®åå©çšã®çµæãšãDRYã«åŸããªãã£ãå Žåã®çµæïŒã€ãŸãã圌ããèšãããã«ç¡æã®æŒé£ããªãïŒãšã®åãéãã ãšæããŸãã
ç·šéïŒç§ã®äŸã§éèŠãªåäœãæå®ããã®ãå¿ããŸããã ?
ãcatch
ãªãã¹ã³ãŒãã§äœ¿çšãããŠããå Žåãããã¯ã³ã³ãã€ã©ãšã©ãŒã§ãããšæããŸãïŒç§ãæåã«èããã®ã¯ç¢ºãã«ãããã¯ãã¹ããŒããã®ã§ã¯ãªãïŒ
ç·šé2ïŒã¯ã¬ã€ãžãŒãªã¢ã€ãã¢ïŒããããcatch
ãããã¯ã¯å¶åŸ¡ãããŒã«åœ±é¿ãäžããªãã§ããã...ããã¯æåéãããšã©ãŒãçºçããåŸã catch { ... }
å
ã®ã³ãŒããã³ããŒããŠè¡ã«è²Œãä»ãããããªãã®ã§ã?
edïŒå®å
šã§ã¯ãããŸãã-ããã§ãç¬èªã®ã¹ã³ãŒãããããŸãïŒã ç§ãã¡ã®èª°ããããã«æ
£ããŠããªãã®ã§å¥åŠã«æããŸããããã§ããããã®ããã«è¡ããããªãã°catch
ééããªãããŒã¯ãŒãã§ããã¹ãã§ã¯ãããŸããããããããã§ãªããã°...ãªãã§ããïŒ
@mewmew ããšã©ãŒåŠçã®å¶åŸ¡ãããŒã®åŽé¢ã«ã€ããŠãã®åé¡ãç¶æããŸãããã ãšã©ãŒã®ã©ãããšã¢ã³ã©ããã®æé©ãªæ¹æ³ã«ã€ããŠã¯ãå¶åŸ¡ãããŒãšã»ãŒçŽäº€ããŠãããããä»ã®å Žæã§èª¬æããå¿ èŠããããŸãã
ããŠããã®ã¹ã¬ãããç¶æããŠãããŒãå¶åŸ¡ããŸãããã ãã€ã³ã3ã®å ·äœçãªäœ¿çšæ³ã«é¢é£ããåé¡ã§ãããšããçç±ã ãã§è¿œå ããŸããããè¿œå ã®ã³ã³ããã¹ãæ å ±ãšãšãã«ãšã©ãŒãè¿ãããŸãã
@jbaãšã©ãŒã®ã³ã³ããã¹ãæ å ±ã®ã©ããã³ã°/ã¢ã³ã©ããã³ã°ã«ç¹åããåé¡ãç¥ã£ãŠããŸããïŒ
ç§ã¯ããªãã®ã³ãŒãããŒã¹ã«ç²ŸéããŠããããèªåãªãã¡ã¯ã¿ãªã³ã°ã ãšèšã£ãŠãããšæããŸããããªãEOFã«ã³ã³ããã¹ãæ å ±ãå«ããå¿ èŠããã£ãã®ã§ããïŒ åã·ã¹ãã ã§ã¯ãšã©ãŒãšããŠæ±ãããŸãããEOFã¯å®éã®ãšã©ãŒã§ã¯ãªããå®éã«ã¯ã·ã°ãã«å€ã§ãã ç¹ã«io.Readerã®å®è£ ã§ã¯ãã»ãšãã©ã®å Žåãããã¯æåŸ å€ã§ãã ãšã©ãŒãio.EOFã§ãªãå Žåã«ã®ã¿ãšã©ãŒãã©ããããããšã§ãã£ãæ¹ããããè¯ãä¿®æ£ã§ã¯ãªãã§ããããã
@DeedleFakeå°ã詳ãã説æããããšã¯ã§ããŸããããããã¯ã«ãšã©ãŸãããã«ããšã©ãŒã®ã³ã³ããã¹ãæ å ±ã®ã©ããã³ã°/ã¢ã³ã©ããã³ã°ã«é¢ããåè¿°ã®åé¡ã§ããããŸãã
ç§ããã¹ãŠã®ææ¡ïŒç§ã®ãã®ãå«ãïŒãèªãã°èªãã»ã©ãgoã§ã®ãšã©ãŒåŠçã«å®éã«åé¡ããããšã¯æããŸããã
ç§ã欲ããã®ã¯ããšã©ãŒã®æ»ãå€ã誀ã£ãŠç¡èŠããã®ã§ã¯ãªããå°ãªããšã匷å¶ããããã®åŒ·å¶ã§ãã
_ := returnsError()
ãããã®åé¡ãèŠã€ããããã®ããŒã«ãããããšã¯ç¥ã£ãŠããŸãããèšèªã®ç¬¬1ã¬ãã«ã®ãµããŒãã§ããã€ãã®ãã°ãèŠã€ããããšãã§ããŸãã ãšã©ãŒããŸã£ããåŠçããªãããšã¯ãç§ã«ãšã£ãŠæªäœ¿çšã®å€æ°ãæã£ãŠãããããªãã®ã§ã-ããã¯ãã§ã«ãšã©ãŒã§ãã ãŸãããšã©ãŒãªã¿ãŒã³åãé¢æ°ã«å°å ¥ããå Žåããã¹ãŠã®å Žæã§åŠçããå¿ èŠãããããããªãã¡ã¯ã¿ãªã³ã°ã«ã圹ç«ã¡ãŸãã
ããã§ã»ãšãã©ã®äººã解決ããããšããŠããäž»ãªåé¡ã¯ããå ¥åéããŸãã¯ãè¡æ°ãã®ããã§ãã è¡æ°ãæžããæ§æã«ã¯åæããŸãããããã¯ã»ãšãã©ãgofmtã®åé¡ã§ãã ã€ã³ã©ã€ã³ã®ãåäžè¡ã¹ã³ãŒãããèš±å¯ããã ãã§ãåé¡ãããŸããã
ã¿ã€ãã³ã°ãç¯çŽããããã®ãã1ã€ã®ææ¡ã¯ãããŒã«å€ã®ããã«æé»çã«nil
ãã§ãã¯ããããšã§ãã
err := returnsError()
if err { return err }
ãããã¯
if err := returnsError(); err { return err }
ããã¯ããã¹ãŠã®ãã€ã³ã¿ãŒã¿ã€ãã®åå ã§æ©èœããŸãã
ç§ã®èãã§ã¯ãé¢æ°åŒã³åºããšãšã©ãŒåŠçã1è¡ã«æžãããšãã³ãŒããèªã¿ã«ãããªããæ§æãè€éã«ãªããŸãã
èªã¿ã«ããã³ãŒããšããè€éãªæ§æã
åé·ãªãšã©ãŒåŠçã®ããããã§ã«èªã¿ã«ããã³ãŒãããããŸãã ãã®åé·æ§ãé ãããšã«ãªã£ãŠããåè¿°ã®ScannerAPIããªãã¯ãè¿œå ãããšãããã«æªåããŸãã ããè€éãªæ§æãè¿œå ãããšãèªã¿ããããåäžããå¯èœæ§ããããŸããã€ãŸããæçµçã«ã¯ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒãäœã®ããã«ããã®ããšããããšã§ãã ããã§ãªããã°ããã®è°è«ã«ã¯æå³ããããŸããã ç§ã®æèŠã§ã¯ããšã©ãŒããããªã³ã°ããä»ã®ãã¹ãŠã«å¯ŸããŠãŒãå€ãè¿ããšãããã¿ãŒã³ã¯ãèšèªã®å€æŽãæ£åœåããã®ã«ååäžè¬çã§ãã
ãšã©ãŒããããªã³ã°ãããã¹ãŠã«å¯ŸããŠãŒãå€ãè¿ããã¿ãŒã³
ãŸããçµéšå ±åãããŠããã@mewmewã«æè¬ããŸãã ç¹å®ã®çš®é¡ã®ãšã©ãŒåŠçèšèšã«ãããå±éºæ§ã«é¢é£ããéããããã¯ééããªããã®ã¹ã¬ããã«é¢é£ããŠããŸãã ãããããã£ãšèŠããã§ãã
èªåã®èããããŸã説æã§ããŠããªãã®ã§ãèŠç¹ãäœæããŸããïŒãããŠæ°ä»ããã°ããã®æ¬ ç¹ã®å€ããä¿®æ£ããŸããïŒ
https://gist.github.com/KernelDeimos/384aabd36e1789efe8cbce3c17ffa390
ãã®èŠç¹ã«ã¯è€æ°ã®ã¢ã€ãã¢ãããã®ã§ãããããå¥ã ã«è°è«ã§ããããšãé¡ã£ãŠããŸã
ããã§ã®ææ¡ã¯æ瀺çã«ãšã©ãŒåŠçã«é¢ãããã®ã§ãªããã°ãªããªããšããèããå°ãèã«çœ®ããŠãGoãcollect
ã¹ããŒãã¡ã³ãã®ãããªãã®ãå°å
¥ããå Žåã¯ã©ããªãã§ããããã
collect
ã¹ããŒãã¡ã³ãã¯collect [IDENT] [BLOCK STMT]
ã®åœ¢åŒã«ãªããŸããããã§ãidentã¯nil
ã¿ã€ãã®ã¹ã³ãŒãå
å€æ°ã§ããå¿
èŠããããŸãã collect
ã¹ããŒãã¡ã³ãå
ã§ãç¹å¥ãªå€æ°_!
ããåéãããå€æ°ã®ãšã€ãªã¢ã¹ãšããŠäœ¿çšã§ããŸãã _!
ã¯ã _
ãšåãããã«ãå²ãåœãŠãšããŠä»¥å€ã¯äœ¿çšã§ããŸããã _!
ãå²ãåœãŠããããšãæé»ã®nil
ãã§ãã¯ãå®è¡ããã _!
ãnilã§ãªãå Žåããããã¯ã¯å®è¡ãåæ¢ããæ®ãã®ã³ãŒããç¶è¡ããŸãã
çè«çã«ã¯ãããã¯æ¬¡ã®ããã«ãªããŸãã
func TryComplexOperation() (*Result, error) {
var result *Result
var err error
collect err {
intermediate1, _! := Step1()
intermediate2, _! := Step2(intermediate1, "something")
// assign to result from the outer scope
result, _! = Step3(intermediate2, 12)
}
return result, err
}
ããã¯
func TryComplexOperation() (*Result, error) {
var result *Result
var err error
{
var intermediate1 SomeType
intermediate1, err = Step1()
if err != nil { goto collectEnd }
var intermediate2 SomeOtherType
intermediate2, err = Step2(intermediate1, "something")
if err != nil { goto collectEnd }
result, err = Step3(intermediate2, 12)
// if err != nil { goto collectEnd }, but since we're at the end already we can omit this
}
collectEnd:
return result, err
}
ãã®ãããªæ§ææ©èœãå¯èœã«ããä»ã®ããã€ãã®çŽ æŽãããããšïŒ
// try several approaches for acquiring a value
func GetSomething() (s *Something) {
collect s {
_! = fetchOrNil1()
_! = fetchOrNil2()
_! = new(Something)
}
return s
}
å¿ èŠãªæ°ããæ§ææ©èœïŒ
collect
_!
ïŒããŒãµãŒã§ãããè©ŠããŠã¿ãŸããããä»ã«äœãå£ããã«ãã®äžèŽãIDãšããŠäœæããã®ã¯é£ãããããŸããïŒç§ããã®ãããªããšãææ¡ããŠããçç±ã¯ãããšã©ãŒåŠçãç¹°ãè¿ããããããšããè°è«ã¯ãããŒããã§ãã¯ãç¹°ãè¿ãããããã«èŠçŽã§ããããã§ãã Goã«ã¯ããã®ãŸãŸæ©èœãããšã©ãŒåŠçæ©èœããã§ã«ãããããããŸãã _
ãšã©ãŒãç¡èŠããïŒãŸãã¯æ»ãå€ããã£ããã£ããªãïŒãã if err != nil { return err }
ã§å€æŽããã«ãšã©ãŒãè¿ãããã³ã³ããã¹ããè¿œå ããŠif err != nil { return wrap(err) }
è¿ãããšãã§ããŸãã ãããã®æ¹æ³ã¯ãããèªäœã§ã¯ããŸãã«ãå埩çã§ã¯ãããŸããã å埩æ§ïŒæããã«ïŒã¯ãã³ãŒãå
šäœã§ããããŸãã¯åæ§ã®æ§æã¹ããŒãã¡ã³ããç¹°ãè¿ããªããã°ãªããªãããšã«èµ·å ããŸãã nil以å€ã®å€ãæ€åºããããŸã§ã¹ããŒãã¡ã³ããå®è¡ããæ¹æ³ãå°å
¥ããããšã¯ããšã©ãŒåŠçãåãã«ä¿ã€ããã®è¯ãæ¹æ³ã ãšæããŸãããããããããã«å¿
èŠãªå®åæã®éãæžãããŸãã
ããã¯åããŸãŸãªã®ã§ïŒã»ãšãã©ïŒãã§ãã¯ããŠãã ãã
ãšã©ãŒåŠçã³ãŒãã¯å¿ èŠã«å¿ããŠ1ã€ã®å Žæã«é 眮ã§ããããã«ãªããŸããããé¢æ°ã®èŠç¹ã¯çŽç·çã«èªã¿åãå¯èœãªæ¹æ³ã§å®è¡ã§ããããã確èªããŠãã ããã
ãã§ãã¯ãããã¯è¿œå ã§ãããå€æŽã§ã¯ãããŸãã
ãšã©ãŒåŠçã®ã¡ã«ããºã ã«éãã¯ãªãã®ã§ããã§ãã¯ããŠãã ãããäžé£ã®å®è¡ãšå²ãåœãŠããæåã®nil以å€ã®å€ããåéãããããã®æ§æããããããã䜿çšããŠããšã©ãŒåŠçã³ãŒããé¢æ°ã«èšè¿°ããªããã°ãªããªãå Žæ
ææ¡ãããæ©èœã¯ãšã©ãŒåŠç以å€ã«ãé©çšãããããããããããã«é©çšããããã©ããã¯ããããŸããã nilãã§ãã¯ãæ©æãªã¿ãŒã³ãä¹±éã«ããããšãªãããšã©ãŒãçæããå¯èœæ§ã®ããã³ãŒããççž®ããŠæ確ã«ããããšãã§ãããšæããŸã
åæããã®ã§ããšã©ãŒåŠçã ãã«ãšã©ãŸããªãç¯å²ã®å€æŽãé©åã§ãããšæãããŸãã æ ¹æ¬çãªåé¡ã¯ã nil
ãã§ãã¯ã€ã³ãç¹°ãè¿ããŠåé·ã«ãªãããšã ãšæããŸããã error
ã¯nil
ã¿ã€ãã§ãã
@KernelDeimosåºæ¬çã«åãããšãæãã€ããã ããããç§ã¯ãããããã«äžæ©é²ããŠã x, ? := doSomething()
æ¹æ³ãå®éã«ã¯ããã»ã©ããŸãæ©èœããªãçç±ã説æããŸããã è¿œå ãèããŠããã®ã¯ç§ã ãã§ã¯ãªãããšã確èªããã®ã¯è¯ãããšã§ããïŒ èå³æ·±ãæ¹æ³ã§èšèªã«æŒç®åã
ããã¯åºæ¬çã«ãã ã®çœ ã§ã¯ãããŸãããïŒ
ãããã¹ãããããŒã«ã§ãïŒ
func NewClient(...) (*Client, error) {
trap(err error) {
return nil, err
}
listener, err? := net.Listen("tcp4", listenAddr)
trap(_ error) {
listener.Close()
}
conn, err? := ConnectionManager{}.connect(server, tlsConfig)
trap(_ error) {
conn.Close()
}
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
toServer.Send(&client.serverConfig)?
toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})?
session, err? := communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
}
59è¡â44
trap
ã¯ããæå®ãããã¿ã€ãã®?
ã§ããŒã¯ãããå€æ°ããŒãå€ã§ãªãå Žåããã®ã³ãŒããã¹ã¿ãã¯é ã«å®è¡ãããããšãæå³ããŸãã defer
䌌ãŠããŸãããå¶åŸ¡ãããŒã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
ç§ã¯trap
ã¢ã€ãã¢ã奜ãã§ãããæ§æã«ã¯å°ããã°ããããŸãã ãããäžçš®ã®å®£èšã ã£ããšãããïŒ ããšãã°ã trap err error {}
ã¯ãã¿ã€ãerror
err
ãšåŒã°ããtrap
trap err error {}
宣èšããŸããããã¯ãå²ãåœãŠããããšãæå®ãããã³ãŒããå®è¡ããŸãã ã³ãŒããè¿ãå¿
èŠã¯ãããŸããã ããããããšãèš±ãããŠããã ãã§ãã ããã¯ãŸãã nil
ãç¹å¥ã§ãããšããäŸåãæã¡ç ŽããŸãã
ç·šéïŒç§ãé»è©±ãããŠããªãã®ã§ãå±éããŠäŸã瀺ããŸãã
func Example(r io.Reader) error {
trap err error {
if err != nil {
return err
}
}
n, err? := io.Copy(ioutil.Discard, r)
fmt.Printf("Read %v bytes.\n", n)
}
åºæ¬çã«ã trap
ã¯var
ãšåãããã«æ©èœããŸããã ?
æŒç®åãå²ãåœãŠãããŠããå Žåã¯åžžã«ãã³ãŒããããã¯ãå®è¡ãããŸãã ?
æŒç®åã¯ã :=
ãšäžç·ã«äœ¿çšãããšãã«ã·ã£ããŠãããããšãé²ããŸãã var
ãšã¯ç°ãªããåãã¹ã³ãŒãã§trap
ãå宣èšããããšã¯èš±å¯ãããŠããŸãããæ¢åã®ãã®ãšåãã¿ã€ãã§ããå¿
èŠããããŸãã ããã«ãããé¢é£ããã³ãŒããããã¯ãå€æŽã§ããŸãã å®è¡äžã®ãããã¯ã¯å¿
ãããæ»ããšã¯éããªãããã err == io.EOF
ãã©ããã確èªãããªã©ãç¹å®ã®ãã®ã«å¯ŸããŠåå¥ã®ãã¹ãèšå®ããããšãã§ããŸãã
ãã®ã¢ãããŒãã§ç§ãæ°ã«å
¥ã£ãŠããã®ã¯ã Errors areValuesã®errWriter
äŸã«äŒŒãŠããããã«èŠããããšã§ãããæ°ããã¿ã€ãã®å®£èšãå¿
èŠãšããªããããäžè¬çãªèšå®ã§ãã
@carlmjohnson誰ã«è¿ä¿¡ããŸãããïŒ
ãšã«ããããã®trap
æŠå¿µã¯ã defer
ã¹ããŒãã¡ã³ããæžãããã®å¥ã®æ¹æ³ã®ããã§ãã èšè¿°ãããŠããã³ãŒãã¯ãnil以å€ã®ãšã©ãŒã§panic
'dããé
延ã¯ããŒãžã£ã䜿çšããŠååä»ãæ»ãå€ãèšå®ããã¯ãªãŒã³ã¢ãããå®è¡ããå Žåãåºæ¬çã«åãã«ãªããŸãã ããã¯ã _!
ã䜿çšããŠèªåçã«ãããã¯ãèµ·ãããšãã以åã®ææ¡ãšåãåé¡ã«ã¶ã€ãããšæããŸããããã¯ããããšã©ãŒåŠçæ¹æ³ãå¥ã®æ¹æ³ãããåªå
ããããã§ãã FWIWç§ã¯ãŸããæžãããŠããã³ãŒãã¯ãå
ã®ã³ãŒããããæšè«ããã®ãã¯ããã«é£ãããšæããŸããã ãã®trap
æŠå¿µã¯ãæ§æãæ確ã§ãªãå Žåã§ããä»æ¥ã®goã§æš¡å£ã§ããŸããïŒ å¯èœã ãšæããŸããããããã£ããã£ããŠåŠçããã«ã¯ã if err != nil { panic (err) }
ãšdefer
ã«ãªããŸãã
äžã§ææ¡ããcollect
ãããã¯ã®æŠå¿µã«äŒŒãŠããããã§ããããã¯ãåãã¢ã€ãã¢ãè¡šçŸããããã®ããã¯ãªãŒã³ãªæ¹æ³ãæäŸãããšå人çã«æããŠããŸãïŒããã®å€ããŒãã§ãªãå Žåã¯ãããããã£ããã£ããŠäœããå®è¡ãããããããš"ïŒã Goã¯ãç·åœ¢ã§æ瀺çã§ããããšã奜ãã§ãã trap
ã¯ã panic
/ defer
æ°ããæ§æã®ããã«æããŸãããå¶åŸ¡ãããŒãããŸãæ確ã§ã¯ãããŸããã
@mccolljr ãããã¯ç§ãžã®recover
ã§æ¡åŒµããã延æã¹ããŒãã¡ã³ãã䜿çšãããããç§ã®ææ¡ã¯è¡šç€ºãããªãã£ããšæšæž¬ãããŸãïŒçŸåšã¯ãé ãã¢ã€ãã ãã«ãããŸãããããã»ã©é ãã¯ãããŸããïŒããšã©ãŒåŠçã®ããã®é¢æ°ã®ãããªãã®ã
ãŸããããã©ãããã®æžãæãã«ãã£ãŠãææ¡ã«ãã£ãå€ãã®æ©èœãäœäžããããšãããããŸããïŒ_éåžžã«_ç°ãªããšã©ãŒãçºçããŸããïŒãããã«ããã©ããã¹ããŒãã¡ã³ãã§ãšã©ãŒåŠçãé€å€ããæ¹æ³ãããããŸããã ç§ã®ææ¡ããã®ãã®åæžã®å€ãã¯ããšã©ãŒåŠçã®æ£ç¢ºããèœãšããšãã圢ã§ããããããä»ã®äœããããšã©ãŒãçŽæ¥è¿ãã®ãç°¡åã«ãªããšç§ã¯ä¿¡ããŠããŸãã
æµããç¶ç¶ããèœåãå€æŽã«ãã£ãŠèš±å¯ãããŠããtrap
ç§ãäžããäŸä»¥äžã åŸã§ç·šéããã®ã§ãèŠããã©ããããããŸããã collect
ãšéåžžã«ãã䌌ãŠããŸãããããå°ãå¶åŸ¡ã§ãããšæããŸãã ã¹ã³ãŒãã®ã«ãŒã«ãã©ã®ããã«æ©èœãããã«ãã£ãŠã¯ãå°ãã¹ãã²ããã£ã£ãœããªããããããŸãããããã©ã³ã¹ãåããŠãããšæããŸãã
@thejerfãããããã¯ãã£ãšçã«ããªã£ãŠããŸãã ãããããªãã®ææ¡ãžã®è¿äºã ãšã¯æããŸããã§ããã ãã ãã recover
ãpanic
å¿çãããšããäºå®ãé€ãã°ã erroring()
ãšrecover()
ã®éããã©ããªããã¯ããããŸããã ãšã©ãŒãè¿ãå¿
èŠããããšãã«ãäœããã®åœ¢ã§ãããã¯ãæé»çã«å®è¡ããŠããããã§ãã 延æãããã³ã¹ãã®ãããæäœã§ããããããšã©ãŒãçºçããå¯èœæ§ã®ãããã¹ãŠã®é¢æ°ã§å»¶æãã©ã®ããã«äœ¿çšããããããããŸããã
@DeedleFakeåãããšãtrap
ã«ãåœãŠã¯ãŸããŸããããã¯ã trap
ã¯æ¬è³ªçã«ã ?
æŒç®åã䜿çšããããšãã«ã³ãŒããæ¿å
¥ãããã¯ãã§ãããç¬èªã®æžå¿µäºé
ãæ瀺ããããã§ããããã³èæ
®äºé
ããŸãã¯goto
ãšããŠå®è£
ãããŸã...ããã¯ããŠãŒã¶ãŒãtrap
ãããã¯ã«æ»ããªãå ŽåããŸãã¯æ§æçã«ç°ãªãdefer
å Žåã¯ã©ããªããŸããã ãŸããé¢æ°ã§è€æ°ã®ãã©ãããããã¯ã宣èšãããšã©ããªããŸããïŒ ããã¯èš±å¯ãããŠããŸããïŒ ãããããªããã©ã¡ããå®è¡ãããŸããïŒ ããã«ãããå®è£
ãè€éã«ãªããŸãã ãŽãŒã¯æèŠãè¿°ã¹ãã®ã奜ãã§ãããããŠç§ã¯ããã«ã€ããŠããã奜ãã§ãã collect
ãŸãã¯åæ§ã®ç·åœ¢æ§é ã¯ã trap
ãããGoã®ã€ããªãã®ãŒã«æ²¿ã£ãŠãããšæããŸããããã¯ãç§ã®æåã®ææ¡ã®åŸã§ææãããããã«ã try-catch
è¡£è£
ã§æ§ç¯ããŸãã
ãŠãŒã¶ãŒããã©ãããããã¯ã«æ»ããªãå Žåã¯ã©ããªããŸãã
trap
ãå¶åŸ¡ãããŒïŒ goto
ã continue
ã break
ãªã©ïŒãè¿ããªãããå€æŽããªãå Žåãå¶åŸ¡ãããŒã¯ã³ãŒãã®å Žæã«æ»ããŸããããã¯ã¯ãããåŒã³åºãããŸãããã ãããã¯èªäœã¯ãå¶åŸ¡ãããŒã¡ã«ããºã ã«ã¢ã¯ã»ã¹ã§ããããšãé€ããŠãã¯ããŒãžã£ã®åŒã³åºããšåæ§ã«æ©èœããŸãã ã¡ã«ããºã ã¯ããããã¯ãåŒã³åºãããå Žæã§ã¯ãªãããããã¯ã宣èšãããå Žæã§æ©èœããŸãã
for {
trap err error {
break
}
err? = errors.New("Example")
}
åäœããŸãã
ãŸããé¢æ°ã§è€æ°ã®ãã©ãããããã¯ã宣èšãããšã©ããªããŸããïŒ ããã¯èš±å¯ãããŠããŸããïŒ ãããããªããã©ã¡ããå®è¡ãããŸããïŒ
ã¯ããèš±å¯ãããŠããŸãã ãããã¯ã¯ãã©ããã«ãã£ãŠååãä»ããããŠããã®ã§ãã©ããåŒã³åºãã¹ãããå€æããã®ã¯ããªãç°¡åã§ãã ããšãã°ã
trap err error {
// Block 1.
}
trap n int {
// Block 2.
}
n? = 3
ãããã¯2ãåŒã³åºãããŸãã ãã®å Žåã®å€§ããªåé¡ã¯ãããããn?, err? = 3, errors.New("Example")
ã®å Žåã«äœãèµ·ããããšããããšã§ããããã«ã¯ãïŒ25609ã§åãäžããããã«ãå²ãåœãŠã®é åºãæå®ããå¿
èŠããããŸãã
åéãŸãã¯åæ§ã®ç·åœ¢æ§é ã¯ããã©ãããããGoã®ã€ããªãã®ãŒã«æ²¿ã£ãŠãããšæããŸãããã©ããã¯ãç§ã®æåã®ææ¡ã®åŸã§ææãããããã«ãè¡£è£ ãçããã©ã€ãã£ããæ§é ã®ããã§ãã
collect
ãštrap
ã¯ã©ã¡ãããåºæ¬çã«ã¯éã«try-catch
ã ãšæããŸãã æšæºã®try-catch
ã¯ãããã©ã«ãã§å€±æããããªã·ãŒã§ããããã§ãã¯ããå¿
èŠããããŸããããããªããšãççºããŸãã ããã¯ããã©ã«ãã§æåããã·ã¹ãã ã§ãããåºæ¬çã«é害ãã¹ãæå®ã§ããŸãã
å
šäœãè€éã«ãã1ã€ã®ããšã¯ããšã©ãŒãæ¬è³ªçã«å€±æãšããŠæ±ãããªããšããäºå®ã§ãããŸãã io.EOF
ãªã©ã®äžéšã®ãšã©ãŒã¯ãå®éã«ã¯å€±æããŸã£ããæå®ããŠããŸããã ããããããã§ã collect
ãtrap
ããã«ãç¹ã«ãšã©ãŒã«çµã³ä»ããããŠããªãã·ã¹ãã ãé²ãã¹ãéã ãšæããŸãã
ããããããã¯ãã£ãšçã«ããªã£ãŠããŸãããããããªãã®ææ¡ãžã®è¿ä¿¡ã ãšã¯æããŸããã§ãããããããrecoverããããã¯ã"
倧ããªéãããªãããšããã€ã³ãã§ãã ç§ã¯ããããããå¯èœãªéãå€ãã®åãåŸãªãããäœæãããæ°ããæŠå¿µã®æ°ãæå°éã«æããããšããŠããŸãã ç§ã¯ãæ¢åã®æ©èœããã°ã§ã¯ãªãæ©èœã«åºã¥ããŠæ§ç¯ããããšãæ€èšããŠããŸãã
ç§ã®ææ¡ã®ãã€ã³ãã®äžã€ã¯ãã¡ããã©ãç§ãã¡ã¯ãç§ãã¡äžè¡ã®ãã®ç¹°ãè¿ããã£ã³ã¯ä¿®æ£ããå Žåãè¶
ããŠæ¢ãããšã§ããreturn err
ããããã眮ãæãã?
ãã©ã®ããã«åœ±é¿ããªããã«èšèªã®æ®ãã®éšåïŒããã¯ã©ã®ãããªæ°ãããã¿ãŒã³ãå¯èœã«ããŸããïŒããã¯ã©ã®ãããªæ°ããããã¹ããã©ã¯ãã£ã¹ããäœæããŸããïŒã©ã®å€ãããã¹ããã©ã¯ãã£ã¹ãããã¹ããã©ã¯ãã£ã¹ã§ãªããªããŸããïŒã ç§ã¯ãã®ä»äºãçµãããšèšã£ãŠããã®ã§ã¯ãããŸããã ãããŠããã®ã¢ã€ãã¢ãå®éã«Goã®å¥œã¿ã«å¯ŸããŠããŸãã«ã匷åã§ãããšå€æããããšããŠãïŒGoã¯é»åãæ倧åããèšèªã§ã¯ãªããã¿ã€ããerror
ã«å¶éããèšèšã®éžæããã£ãŠããããããæã匷åã§ãïŒãã®ã¹ã¬ããã§è¡ãããææ¡ã¯ãã匷åããšããè¯ãæå³ãšæªãæå³ã®äž¡æ¹ã§å®å
šã«æå³ããŸãïŒãæ°ããæ§æãããã°ã©ã å
šäœã«å¯ŸããŠäœãããã®ãã§ã¯ãªããããã°ã©ã å
šäœã«å¯ŸããŠäœãããã®ããšããåé¡ãæ¢æ±ããããšã«ç«ã€ããšãã§ãããšæããŸãã 7è¡ã®ãµã³ãã«é¢æ°ãå®è¡ããŸãããã®ãããå°ãªããšããµã³ãã«ããå®éã®ã³ãŒããã®ç¯å²ã®50ã100è¡ãŸã§äžããããšããŸããã Go 1.0ãšã©ãŒåŠçãå«ãããã¹ãŠã5è¡ã§åãããã«èŠããŸããããã¯ãç§ãã¡èªèº«ã®çµéšããããã«å®éã®åé¡ãããããšãç§ãã¡å
šå¡ãç¥ã£ãŠããçç±ã®äžéšã§ããå¯èœæ§ããããŸããäžéšã®äººã
ãèªåèªèº«ãçŽåŸããå§ãããŸã§ã¯ãèŠæš¡ãå°ããããã®ã§ãçµå±åé¡ã¯ãªããããããŸããã ïŒ5è¡ã®ãµã³ãã«ã§ã¯ãªããå®éã®ã³ãŒãã£ã³ã°çµéšãä¿¡é ŒããŠãã ããïŒïŒ
ããšã©ãŒãè¿ãå¿ èŠããããšãã«ãäœããã®åœ¢ã§ãããã¯ãæé»çã«å®è¡ããŠããããã§ããã
æé»çã§ã¯ãããŸããã ããã¯æçœã§ãã pop
æŒç®åã¯ãå¿
èŠãªåŠçãè¡ããšãã«äœ¿çšããŸãã ãããããªããæãããšãããªããšããããªãã¯ããã䜿ããŸããã ãããè¡ãããšã¯ãåäžã®åçŽãªæã§ãã£ããã£ããã®ã«åååçŽã§ãããä»æ§ã¯ãããããã®ãããªãã®ãã©ã®ããã«æ©èœãããã§ãããããå®å
šãªæ®µèœãåããŸãã æé»çãªãã®ã¯ãããŸããã ããã«ããªã¿ãŒã³ãšãŸã£ããåãããã«ãã¹ã¿ãã¯ã®1ã€ã®ã¬ãã«ãå·»ãæ»ãã ããªã®ã§ããããã¯ã«ã¯ãªããŸããã ããã¯ãªã¿ãŒã³ãšåãããããããã¯ã§ãããããã¯ãŸã£ãããããŸããã
pop
ã次ã®ããã«ç¶Žã£ãŠãããŸããŸããã ãŸãã¯äœã§ãã å人çã«ã¯ãGoã¯çŸåšã·ã³ãã«ãè±å¯ãªèšèªã§ã¯ãªããããåèªã¯ããå°ãGoã«äŒŒãŠãããšæããŸãããã·ã³ãã«ã«ã¯æ¢åã®ãœãŒã¹ã³ãŒããšç«¶åããªããšããå©ç¹ãããããšãåŠå®ã§ããŸããã ç§ã¯ãã»ãã³ãã£ã¯ã¹ãšããããã«åºã¥ããŠæ§ç¯ã§ãããã®ãããã³æ°ããã»ãã³ãã£ã¯ã¹ããã¹ããªã³ã°ãããæ°ããçµéšè±å¯ãªããã°ã©ããŒã«ã©ã®ãããªåäœãæäŸãããã«èå³ããããŸãã
ã延æãããã³ã¹ãã®ãããæäœã§ããããããšã©ãŒãçºçããå¯èœæ§ã®ãããã¹ãŠã®é¢æ°ã§å»¶æãã©ã®ããã«äœ¿çšããããããããŸãããã
ç§ã¯ãã§ã«ãããèªããŸããã äžè¬çã«ã¯ããã»ã©é«äŸ¡ã§ã¯ãªãããšããå§ãããŸãããæé©åã®ç®çã§ãããããªé¢æ°ãããå Žåã¯ãçŸåšã®æ¹æ³ã§èšè¿°ããŠãã ããã ãã¹ãŠã®ãšã©ãŒåŠçé¢æ°ã100ïŒ
å€æŽããããšããã®ã¯æããã«ç§ã®ç®æšã§ã¯ãããŸãããããããã®80ïŒ
ãã¯ããã«åçŽã§æ£ç¢ºã«ãã20ïŒ
ã®ã±ãŒã¹ïŒããããæ£çŽã«èšã£ãŠ98/2ã®ããã«ïŒããã®ãŸãŸã«ããŠããããšã§ããããã¯ã Goã³ãŒãã®å€§éšåã¯ã延æã®äœ¿çšã«ææã§ã¯ãããŸãããããããçµå±ã®ãšããã defer
ãããããååšããçç±ã§ãã
å®éãdeferã䜿çšããªãããã«ããããŒã¶ã«ãç°¡åã«å€æŽãã trap
ãããªããŒã¯ãŒããã衚瀺ãããå Žæã«é¢ä¿ãªã1åã ãå®è¡ããã宣èšãšããŠäœ¿çšã§ããŸããããã¯ãdeferãå®éã«ããã·ã¥ããã¹ããŒãã¡ã³ãã§ããæ¹æ³ã§ã¯ãããŸãããé
延é¢æ°ã®ã¹ã¿ãã¯ãžã®ãã³ãã©ãŒã èšèªã«æ°ããæŠå¿µãè¿œå ããªãããã«ãæå³çã«defer
ãåå©çšããããšãéžæããŸãã...äºæãã人ã
ãåãã«ãŒãã®å»¶æããçããå¯èœæ§ã®ããçœ ãç解ããããšããã§ããŸãã ããããããã§ãç解ã§ããã®ã¯1ã€ã®defer
æŠå¿µã«ãããŸããã
èšèªã«æ°ããããŒã¯ãŒããè¿œå ããããšã¯é倧ãªå€æŽã§ããããšãæ確ã«ããããã ãã«ã
package main
import (
"fmt"
)
func return(i int)int{
return i
}
func main() {
return(1)
}
çµæã¯
prog.go:7:6: syntax error: unexpected select, expecting name or (
ã€ãŸãã try
ã trap
ã assert
ä»»æã®ããŒã¯ãŒããèšèªã«è¿œå ããããšãããšã倧éã®ã³ãŒããç Žæãããªã¹ã¯ããããŸãã ãã¯ãç¶æãããªãå¯èœæ§ã®ããã³ãŒãã
ãã®ãããç§ã¯æåã«ãã¹ããŒãã¡ã³ãã®ã³ã³ããã¹ãã§å€æ°ã«é©çšã§ããç¹å¥ãª?
goæŒç®åãè¿œå ããããšãææ¡ããŸããã çŸåšã®?
æåã¯ãå€æ°åã®äžæ£ãªæåãšããŠæå®ãããŠããŸãã ã€ãŸããçŸåšã®Goã³ãŒãã§ã¯çŸåšäœ¿çšãããŠããªããããé倧ãªå€æŽãå ããããšãªãå°å
¥ã§ããŸãã
å²ãåœãŠã®å·ŠåŽã§ããã䜿çšããéã®åé¡ã¯ãGoãè€æ°ã®æ»ãåŒæ°ãèš±å¯ããããšãèæ ®ããŠããªãããšã§ãã
ããšãã°ããã®é¢æ°ã«ã€ããŠèããŠã¿ãŸã
func getCoord() x int, y int, z int, err error{
x, err = getX()
if err != nil{
return
}
y, err = getY()
if err != nil{
return
}
z, err = getZ()
if err != nil{
return
}
return
}
䜿çšããå ŽåïŒ ãŸãã¯ãå²ãåœãŠã®lhsãè©ŠããŠãif errïŒ= nilãããã¯ãåé€ããŸãããšã©ãŒã¯ãä»ã®ãã¹ãŠã®å€ããŽãç®±ã«ãªã£ãããšãæå³ãããšèªåçã«æšå®ããŸããïŒ ãã®ããã«ãããã©ããªãã§ããã
func GetCoord() (x, y, z int, err error) {
err = try GetX(&x) // or err? = GetX(&x)
err = try GetY(&y) // or err? = GetY(&x)
err = try GetZ(&z) // or err? = GetZ(&x)
}
ããã§ã¯ã©ã®ãããªä»®å®ãããŸããïŒ äŸ¡å€ãæšãŠãŠã倧äžå€«ã ãšæã£ãŠã害ã¯ãªããšããããšã§ããïŒ ãšã©ãŒãããå€ãã®èŠåã§ãããå€xãé©åã§ããå Žåã¯ã©ããªããŸããïŒ ãšã©ãŒãã¹ããŒããå¯äžã®é¢æ°ãGetZïŒïŒã®åŒã³åºãã§ãããxãyã®å€ãå®éã«é©åã§ããå Žåã¯ã©ããªããŸããïŒ ç§ãã¡ã¯ããããè¿ããšæããŸããïŒ ååä»ãã®æ»ãåŒæ°ã䜿çšããªãå Žåã¯ã©ããªããŸããïŒ æ»ãåŒæ°ããããããã£ãã«ãªã©ã®åç §åã§ããå Žåã¯ã©ããªããŸããïŒåŒã³åºãå ã«nilãè¿ãã®ãå®å šã§ãããšæ³å®ããå¿ èŠããããŸããïŒ
TLDR; è¿œå ããŸããïŒ ãŸãã¯ãåé€ããããã«å²ãåœãŠã«try
if err != nil{
return err
}
ç¹å žãããæ··ä¹±ãå€ãããŸãã
ãããŠã trap
ææ¡ã®ãããªãã®ãè¿œå ãããšãç Žæã®å¯èœæ§ãçããŸãã
ãã®ãããå¥å·ã§ææ¡ããŸããã ä»»æã®åã§func ?() bool
ã宣èšã§ããããã«ããã®ã§ã
x, err := doSomething; return x, err?
ãã©ããã®å¯äœçšã¯ãã©ã®ã¿ã€ãã«ãåœãŠã¯ãŸãæ¹æ³ã§çºçãããããšãã§ããŸãã
ãããŠïŒãé©çšããŸãç§ã瀺ããããã«ã¹ããŒãã¡ã³ãã®ã¿ãåŠçããããšã§ãã¹ããŒãã¡ã³ãã®ããã°ã©ã å¯èœæ§ãå¯èœã«ãªããŸãã ç§ã®ææ¡ã§ã¯ã誰ããããŒã¯ãŒã+ïŒã§ããã±ãŒã¹ãåãæ¿ããããšãã§ããç¹å¥ãªswitchã¹ããŒãã¡ã³ããèš±å¯ããããšãææ¡ããŸãã
switch {
case select?:
//side effect/trap code specific to select
case return?:
//side effect/trap code specific to returns
case for?:
//side effect/trap code specific to for?
//etc...
}
䜿çšããŠããå Žåã¯ïŒ æ瀺çãªãã®ããªãã¿ã€ãã§ã¯ïŒ 宣èšãããé¢æ°ãŸãã¯çµã¿èŸŒã¿åã®å Žåãvar == nil ||ãã©ããããã§ãã¯ããããã©ã«ãã®åäœãŒãã®å€{ã¹ããŒãã¡ã³ããå®è¡}ã¯æšå®ãããæå³ã§ãã
Idkãããã°ã©ãã³ã°èšèªèšèšã®å°é家ã§ã¯ãããŸããããããã§ã¯ãããŸãã
ããšãã°ãos.Chdiré¢æ°ã¯çŸåš
func Chdir(dir string) error { if e := syscall.Chdir(dir); e != nil { return &PathError{"chdir", dir, e} } return nil }
ãã®ææ¡ã®äžã§ã¯ã次ã®ããã«æžãããšãã§ããŸã
func Chdir(dir string) error { syscall.Chdir(dir) || &PathError{"chdir", dir, err} return nil }
javascriptã®ç¢å°é¢æ°ãŸãã¯Dartãå®çŸ©ããã倪ãç¢å°æ§æããšæ¬è³ªçã«åããã®
äŸãã°
func Chdir(dir string) error {
syscall.Chdir(dir) => &PathError{"chdir", dir, err}
return nil
}
ããŒããã¢ãŒããã
åŒã1ã€ã ãå«ãé¢æ°ã®å Žåãç°¡ç¥æ§æã䜿çšã§ããŸãã
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
=> expræ§æã¯ã{returnexpr;ã®çç¥åœ¢ã§ãã }ã =>è¡šèšã¯ã倪ãç¢å°æ§æãšåŒã°ããããšããããŸãã
@mortdeus ãããŒãç¢å°ã®å·ŠåŽã¯é¢æ°ã®ã·ã°ããã£ã§ããã syscall.Chdir(dir)
ã¯åŒã§ãã ãããã¯å€ããå°ãªããç¡é¢ä¿ã®ããã§ãã
@mortdeuså
ã»ã©æ確ã«ããã®ãå¿ããŸããããããã§ã³ã¡ã³ãããã¢ã€ãã¢ã¯ãããªããã¿ã°ä»ãããææ¡ãšã»ãšãã©äŒŒãŠããŸããã ãã¬ãŒã¹ãã«ããŒãšããŠ?
ã®ã¢ã€ãã¢ã奜ããªã®ã§ããããã³ããŒããŸããããç§ã®ã¢ã€ãã¢ã¯ã try...catch
ã®æ¢ç¥ã®åé¡ã®ããã€ããåé¿ããªããããšã©ãŒãåŠçããããã«åäžã®ã³ãŒããããã¯ãåå©çšããããšã匷調ããŸããã æ°ããã¢ã€ãã¢ãæäŸã§ããããã«ããããŸã§è©±ãããŠããªãã£ããã®ãæãã€ãããã«çŽ°å¿ã®æ³šæãæããŸããã
æ°ããæ¡ä»¶ä»ãreturn
ïŒãŸãã¯returnIf
ïŒã¹ããŒãã¡ã³ãã¯ã©ãã§ããïŒ
return(bool expression) ...
ããªãã¡ã
err := syscall.Chdir(dir)
return(err != nil) &PathError{"chdir", dir, e}
a, b, err := Foo() // signature: func Foo() (string, string, error)
return(err != nil) "", "", err
ãŸãã¯ã fmt
ã«ã3ã€ã§ã¯ãªã1ã€ã®è¡ã§1ã€ã®ã©ã€ããŒã®æ»ãå€ã®ã¿ã®é¢æ°ããã©ãŒããããããŸãã
err := syscall.Chdir(dir)
if err != nil { return &PathError{"chdir", dir, e} }
a, b, err := Foo() // signature: func Foo() (string, string, error)
if err != nil { return "", "", err }
ååä»ããã©ã¡ãŒã¿ãŒãšçµã¿åããããšãå³ç«¯ã®ãšã©ãŒãnilã§ãªãå Žåã«æ©æã«æ»ãæŒç®åãè¿œå ããã ãã§ãå¿ èŠãªãã¹ãŠãååŸã§ããããšãããããŸãã
func NewClient(...) (c *Client, err error) {
defer annotateError(&err, "client couldn't be created")
listener := net.Listen("tcp4", listenAddr)?
defer closeOnErr(&err, listener)
conn := ConnectionManager{}.connect(server, tlsConfig)?
defer closeOnErr(&err, conn)
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
forwardOut = forwarding.NewOut(pop url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort)))
}
client := &Client{listener: listener, conn: conn, forward: forwardOut}
toServer := communicationProtocol.Wrap(conn)
toServer.Send(&client.serverConfig)?
toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})?
session := communicationProtocol.FinalProtocol(conn)?
client.session = session
return client, nil
}
func closeOnErr(err *error, c io.Closer) {
if *err != nil {
closeErr := c.Close()
if err != nil {
*err = multierror.Append(*err, closeErr)
}
}
}
func annotateError(err *error, annotation string) {
if *err != nil {
log.Printf("%s: %v", annotation, *err)
*err = errwrap.Wrapf(annotation +": {{err}}", err)
}
}
çŸåšãGoã®ã³ã³ã»ã³ãµã¹ã«ã€ããŠã®ç§ã®ç解ã¯ãååä»ããã©ã¡ãŒã¿ãŒã«åããŠããŸãããååãã©ã¡ãŒã¿ãŒã®ã¢ãã©ãŒãã³ã¹ãå€æŽããããšãã³ã³ã»ã³ãµã¹ãå€æŽãããŸãã ãã¡ãããã³ã³ã»ã³ãµã¹ãããã«å¯ŸããŠååã«åŒ·ãå Žåã¯ãã¢ã¯ã»ãµãŒãå«ãããªãã·ã§ã³ããããŸãã
ãã®ã¢ãããŒãã«ãããç§ãæ¢ããŠãããã®ïŒé¢æ°ã®å é ã§ãšã©ãŒãäœç³»çã«åŠçããããããããã®ãããªã³ãŒããå æ°å解ããæ©èœãè¡æ°ã®åæžïŒããå ã®ææ¡ãå«ãä»ã®ã»ãšãã©ã®ææ¡ã§åŸãããšãã§ããŸãã ã ãŸããGoã³ãã¥ããã£ãæ°ã«å ¥ããªããšå€æããå Žåã§ããæ©èœããšã«ã³ãŒãã«å«ãŸããŠãããã©ã¡ãã®æ¹åã«ãã€ã³ããŒãã³ã¹ã®äžäžèŽããªããããæ°ã«ããå¿ èŠã¯ãããŸããã
眲åfunc GetInt() (x int, err error)
é¢æ°ãOtherFunc(GetInt()?, "...")
ïŒãŸãã¯æçµçãªçµæãäœã§ããïŒã®ã³ãŒãã§äœ¿çšã§ããããã«ããææ¡ããæ§æã§ããªããã®ãããåªå
ããããšãè¡šæããŸããè¡šçŸã ç¹°ãè¿ãçºçããåçŽãªãšã©ãŒåŠçå¥ã®ç
©ãããã¯å°ãªããªããŸãããæåã®çµæãåŸãããšãã§ããããã«arity 2ã®é¢æ°ãã¢ã³ããã¯ããã³ãŒãã®éã¯ãäŸç¶ãšããŠåä»ãªã»ã©å€§ãããå®éã«ã¯äœãè¿œå ãããŸãããçµæã®ã³ãŒãã
@thejerf ãããã«ã¯å¥åŠãªæ¯ãèãããããããããããªæ°ãããŸãã net.Listen
åŒã³åºããŠããŸããããã¯ãšã©ãŒãè¿ããŸãããå²ãåœãŠãããŠããŸããã 次ã«ã延æããŠerr
ãæž¡ããŸãã æ°ããdefer
ã¯ããããæåŸã®ãã®ãäžæžãããŠã annotateError
ãåŒã³åºãããªãããã«ããŸããïŒ ãŸãã¯ãã¹ã¿ãã¯ããŠãããšãã°toServer.Send
ãããšã©ãŒãè¿ãããå Žåã closeOnErr
ã2ååŒã³åºããã次ã«annotateError
ãåŒã³åºãããŸããïŒ closeOnErr
ã¯ãåã®åŒã³åºãã«äžèŽãã眲åãããå Žåã«ã®ã¿åŒã³åºãããŸããïŒ ãã®å Žåã¯ã©ãã§ããïŒ
conn := ConnectionManager{}.connect(server, tlsConfig)?
fmt.Printf("Attempted to connect to server %#v", server)
defer closeOnErr(&err, conn)
ã³ãŒããèªãã§ãããšãæ··ä¹±ããŸããããšãã°ããªãç§ã¯ãã èšãããšãã§ããªãã®ããªã©ã§ãã
client.session = communicationProtocol.FinalProtocol(conn)?
ããããã FinalProtocol
ããšã©ãŒãè¿ããŠããããã§ããïŒ ããããããã¯èªè
ã«ã¯é ãããŠããŸãã
æåŸã«ããšã©ãŒãå ±åããŠé¢æ°å ã§ãšã©ãŒããå埩ãããå Žåã¯ã©ããªããŸããïŒ ããªãã®äŸã¯ãã®ã±ãŒã¹ãé²ãããã«æãããŸããïŒ
_è£éº_
OKããšã©ãŒããå埩ããããšãã¯ãäŸãšããŠã次ã®ããã«å²ãåœãŠãŸãã
env, err := environment.GetRuntimeEnvironment()
ãšã©ãŒãã·ã£ããŠãããŠããã®ã§åé¡ãããŸããããå€æŽããå Žåã¯...
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
ãã
forwardPort = env.PortToForward()
次ã«ãã¹ã³ãŒãå
ã§äœæãããerr
ã䜿çšããŠãããããåŠçãããé
延ãšã©ãŒã¯ããããã£ããããŸããã ãããšãç§ã¯äœãã足ããªãã®ã§ããïŒ
é¢æ°ã倱æããå¯èœæ§ãããããšã瀺ãæ§æãžã®è¿œå ã¯ãè¯ãã¹ã¿ãŒãã ãšæããŸãã ç§ã¯ãããã®ç·ã«æ²¿ã£ãŠäœããææ¡ããŸãïŒ
func (r Reader) Read(b []byte) (n int) fails {
if somethingFailed {
fail errors.New("something failed")
}
return 0
}
é¢æ°ã倱æããå ŽåïŒ return
代ããã«fail
ããŒã¯ãŒãã䜿çšããŠïŒãåæ»ããã©ã¡ãŒã¿ãŒã®ãŒãå€ãè¿ããŸãã
func (c EmailClient) SendEmail(to, content string) fails {
if !c.connected() {
fail errors.New("could not connect")
}
// You can handle it and execution will continue if you don't fail or return
n := r.Read(b) handle (err) {
fmt.Printf("failed to read: %s", err)
}
// This shouldn't compile and should complain about an unhandled error
n := r.Read(b)
}
ãã®ã¢ãããŒãã«ã¯ãçŸåšã®ã³ãŒããæ©èœããããšåæã«ãïŒå°ãªããšãæ§æã§ã¯ïŒãšã©ãŒåŠçãæ¹åããããã®æ°ããã¡ã«ããºã ãæå¹ã«ãããšããå©ç¹ããããŸãã
ããŒã¯ãŒããžã®ã³ã¡ã³ãïŒ
fails
ã¯æè¯ã®éžæè¢ã§ã¯ãªããããããŸããããçŸåšç§ãèããããšãã§ããæè¯ã®éžæè¢ã§ãã err
ïŒãŸãã¯errs
ïŒã䜿çšããããšãèããŸããããçŸåšã®äœ¿çšæ¹æ³ã«ãããçŸåšã®æåŸ
ããæªãéžæã«ãªãå¯èœæ§ããããŸãïŒ err
ã¯å€æ°åã§ããå¯èœæ§ãé«ãã§ãã errs
ã¯ãã¹ã©ã€ã¹ãé
åããŸãã¯ãšã©ãŒãšèŠãªãããå ŽåããããŸãïŒãhandle
ã¯å°ã誀解ãæãå¯èœæ§ããããŸãã recover
ã䜿çšãããã£ãã®ã§ããã panic
䜿çšãããŠããŸã...ç·šéïŒ io.Reader.Read()
ã«äžèŽããããã«r.ReadåŒã³åºããå€æŽããŸããã
ãã®ææ¡ã®çç±ã®äžéšã¯ãGoã®çŸåšã®ã¢ãããŒãã¯ãè¿ãããerror
å€ãé¢æ°ã®å€±æã瀺ããŠããã®ããé¢æ°ã®äžéšãšããŠãšã©ãŒå€ãè¿ããŠããã®ãïŒ github.com/pkg/errors
ãããŒã«ãç解ããã®ã«åœ¹ç«ããªãããã§ãã
é¢æ°ã倱æãæ瀺çã«è¡šçŸã§ããããã«ããããšãããšã©ãŒåŠçãæ¹åããããã®æåã®ã¹ãããã ãšæããŸãã
@ibrasho ãããªãã¯ã©ã®ããã«äŸãéãã®ã§ãã...
func (c EmailClient) SendEmail(to, content string) error {
// ...
// You can handle it and execution will continue if you don't fail or return
_, _, err := r.Read()
if err != nil {
fmt.Printf("failed to read: %s", err)
}
// This shouldn't compile and should complain about an unhandled error
_, _, err := r.Read()
}
... error
æªåŠçã®ã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠã³ã³ãã€ã©ã®èŠåãŸãã¯lintãäžããå Žåã¯ã©ããªããŸããïŒ èšèªã®å€æŽã¯å¿
èŠãããŸããã
2ã€ã®ããšïŒ
error
å€ãè¿ãé¢æ°ã¯ãã€ã§ã倱æãšããŠæ±ãããšãã§ããŸãããããã¯åææ¡ä»¶ã§ãã é¢æ°ã2ã€ã®error
å€ãè¿ãå Žåã¯ã©ããªããŸããïŒç§ã®ææ¡ã«ã¯ãç§ãåé€ãããã®ããããŸãããããã¯èªåäŒæã§ããã
func (c EmailClient) SendEmail(to, content string) fails {
n := r.Read(b)
// Would automaticaly propgate the error, so it will be equivlent to this:
// n := r.Read(b) handle (err) {
// fail err
// }
}
ãšã©ãŒåŠçã¯æ瀺çã§ããå¿ èŠããããšæãã®ã§ããããåé€ããŸããã
ç·šéïŒ io.Reader.Read()
ã«äžèŽããããã«r.ReadåŒã³åºããå€æŽããŸããã
ããã§ãããã¯æå¹ãªçœ²åãŸãã¯ãããã¿ã€ãã«ãªããŸããïŒ
func (r *MyFileReader) Read(b []byte) (n int, err error) fails
ïŒ io.Reader
å®è£
ã§ã¯ãèªã¿åããã®ããªããªã£ãå Žåãé害ç¶æ
ã«é¢ãããã®ä»ã®ãšã©ãŒãçºçããå Žåã«ã io.EOF
å²ãåœãŠãããŸããïŒ
ã¯ãã ãããã err
ããã®ä»äºãããŠããé¢æ°ã®å€±æã瀺ãããšãæåŸ
ããã¹ãã§ã¯ãããŸããã èªã¿åã倱æãšã©ãŒã¯ããã³ãã«ãããã¯ã«æž¡ãå¿
èŠããããŸãã ãšã©ãŒã¯Goã®å€ã§ããããã®é¢æ°ã«ãã£ãŠè¿ããããšã©ãŒã¯ããã®é¢æ°ãè¿ããã®ã§ãã以å€ã«ç¹å¥ãªæå³ãæã€ã¹ãã§ã¯ãããŸããïŒäœããã®å¥åŠãªçç±ã§ïŒã
ç§ã¯ã倱æãããšæ»ãå€ããŒãå€ãšããŠè¿ãããããšã«ãªããšææ¡ããŠããŸããã çŸåšã®Reader.Readã¯ããã®æ°ããã¢ãããŒãã§ã¯äžå¯èœãªå¯èœæ§ã®ããããã€ãã®çŽæããã§ã«è¡ã£ãŠããŸãã
n> 0ãã€ãã®èªã¿åãã«æåããåŸãReadã§ãšã©ãŒãŸãã¯ãã¡ã€ã«ã®çµããã®ç¶æ ãçºçãããšãèªã¿åããããã€ãæ°ãè¿ãããŸãã åãåŒã³åºãããïŒnil以å€ã®ïŒãšã©ãŒãè¿ãããåŸç¶ã®åŒã³åºããããšã©ãŒïŒããã³n == 0ïŒãè¿ãå ŽåããããŸãã ãã®äžè¬çãªã±ãŒã¹ã®äŸã¯ãå ¥åã¹ããªãŒã ã®æåŸã«ãŒã以å€ã®ãã€ãæ°ãè¿ããªãŒããŒãerr == EOFãŸãã¯err == nilã®ãããããè¿ãå ŽåããããŸãã 次ã®èªã¿åãã¯0ãEOFãè¿ãå¿ èŠããããŸãã
åŒã³åºãå ã¯ããšã©ãŒãšã©ãŒãèæ ®ããåã«ãè¿ãããn> 0ãã€ããåžžã«åŠçããå¿ èŠããããŸãã ããããããšã§ãããã€ãã®ãã€ããèªã¿åã£ãåŸã«çºçããI / Oãšã©ãŒãšãèš±å¯ãããŠããäž¡æ¹ã®EOFåäœãæ£ããåŠçã§ããŸãã
Readã®å®è£ ã¯ãlenïŒpïŒ== 0ã®å Žåãé€ããŠãnilãšã©ãŒã§ãŒããã€ãã«ãŠã³ããè¿ãããšããå§ãããŸãããåŒã³åºãå ã¯ã0ãšnilã®æ»ããäœãèµ·ãããªãã£ãããšã瀺ããã®ãšããŠæ±ãå¿ èŠããããŸãã ç¹ã«ãEOFã瀺ããã®ã§ã¯ãããŸããã
çŸåšææ¡ãããŠããã¢ãããŒãã§ã¯ããã®åäœã®ãã¹ãŠãå¯èœãšããããã§ã¯ãããŸããã çŸåšã®èªã¿åãã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ãã©ã¯ããããéšåçãªèªã¿åãã®åŠçæ¹æ³ãªã©ãããã€ãã®æ¬ ç¹ããããŸãã
äžè¬ã«ãé¢æ°ã倱æãããŸã§ã«éšåçã«å®è¡ãããå Žåãé¢æ°ã¯ã©ã®ããã«åäœããå¿ èŠããããŸããïŒ æ£çŽããŸã èããŠããŸããã§ããã
io.EOFã®å Žåã¯åçŽã§ãã
func DoSomething(r io.Reader) fails {
// I'm using rerr so that I don't shadow the err returned from the function
n, err := r.Read(b) handle (rerr) {
if rerr != io.EOF {
fail err
}
// Else do nothing?
}
}
@thejerf ãããã«ã¯å¥åŠãªæ¯ãèãããããããããããªæ°ãããŸãã ãšã©ãŒãè¿ãnet.ListenãåŒã³åºããŠããŸãããå²ãåœãŠãããŠããŸããã
ãšã©ãŒãnilã§ãªãå Žåãä»ã®å€ã«å¯ŸããŠãŒãå€ã§ãšã©ãŒãè¿ãããšã瀺ãããã«ãè€æ°ã®äººã«ãã£ãŠææ¡ãããäžè¬çãª?
æŒç®åã䜿çšããŠããŸãã Goã¯æŒç®åãå€çšããèšèªã§ã¯ãªããšæãã®ã§ãæŒç®åãããçãåèªã®æ¹ãå°ã奜ãã§ããã ?
ããã®èšèªã«å
¥ãå Žåã§ãã足ãèžã¿å
¥ããã®ã§ã¯ãªããè³éãæ°ããŸããããã
æ°ãã延æã¯ããããæåŸã®å»¶æãäžæžãããã®ã§ãannotateErrorã¯åŒã³åºãããŸãããïŒ ãŸãã¯ããããã¯ã¹ã¿ãã¯ããã®ã§ãããšãã°toServer.Sendãããšã©ãŒãè¿ãããå ŽåãcloseOnErrã2ååŒã³åºããã次ã«annotateErrorãåŒã³åºãããŸããïŒ
ããã¯deferãšåãããã«æ©èœããŸãïŒ https ïŒ
çŽãããããããããªã1ã€ã®åŽé¢ã¯ãçŸåšã®Goã§ã¯ãååä»ããã©ã¡ãŒã¿ãŒããå®éã«è¿ããããã®ã¯äœã§ããã«ãªããšããããšã§ãããã®ãããç§ãè¡ã£ãããšãå®è¡ãããã€ã³ã¿ãŒãååŸããŠæž¡ãããšãã§ããŸãã return errors.New(...)
ãããªå€ãçŽæ¥è¿ããã©ããã«é¢ä¿ãªãããããé
延é¢æ°ã«é©çšããŠæäœããŸããããã¯ãååä»ãå€æ°ã§ã¯ãªããæ°ããå€æ°ãã®ããã«çŽæçã«èŠãããããããŸããããå®éã«ã¯Goã«ãªããŸãã延æãå®è¡ããããŸã§ã«ãååä»ãå€æ°ã«å²ãåœãŠãããŸãã çŸåšã®Goã®ãã®ç¹å®ã®è©³çŽ°ãä»ããç¡èŠããã®ã¯ç°¡åã§ãã ä»ã¯æ··ä¹±ãããããããŸãããããã®ã€ãã£ãªã ã䜿çšããã³ãŒãããŒã¹ã§ããäœæ¥ããå ŽåïŒã€ãŸãããããããã¹ããã©ã¯ãã£ã¹ã«ç§»è¡ãããå¿
èŠããããšèšã£ãŠããããã§ã¯ãããŸããããã»ãã®æ°åã®é²åºã§ååã§ãïŒã dãããããªãæ©ãç解ããŸãã ãªããªããããäžåºŠæ確ã«ããããã«ãææ¡ãããå€æŽã§ã¯ãªããGoããã§ã«æ©èœããŠããæ¹æ³ã§ãã
ããã¯ããããŸã§ææ¡ãããŠããªãã£ããšæãææ¡ã§ãã äŸã䜿çšããŠïŒ
r, !handleError := something()
ããã®æå³ã¯ãããšåãã§ãïŒ
r, _xyzzy := something()
if ok, R := handleError(_xyzzy); !ok { return R }
ïŒããã§ã _xyzzy
ã¯ãã¹ã³ãŒãããããã®2è¡ã®ã³ãŒãã«ã®ã¿æ¡åŒµãããæ°ããå€æ°ã§ããã R
ã¯è€æ°ã®å€ã§ããå¯èœæ§ããããŸãïŒã
ãã®ææ¡ã®å©ç¹ã¯ããšã©ãŒã«åºæã®ãã®ã§ã¯ãªãããŒãå€ãç¹å¥ã«åŠçãããç¹å®ã®ã³ãŒããããã¯å ã§ãšã©ãŒãã©ããããæ¹æ³ãç°¡æœã«æå®ããã®ãç°¡åã§ãã æ§æã®å€æŽã¯ãããã§ãã ç°¡åãªç¿»èš³ãèãããšããã®æ©èœãã©ã®ããã«æ©èœããããç解ããã®ã¯ç°¡åã§ãã
æ¬ ç¹ã¯ãæé»çãªæ»ãå€ãå°å ¥ãããããšããšã©ãŒãè¿ãã ãã®ãžã§ããªãã¯ãã³ãã©ãŒãèšè¿°ã§ããªãããšãïŒæ»ãå€ã¯åŒã³åºãå ã®é¢æ°ã«åºã¥ãå¿ èŠãããããïŒããã³ãã©ãŒã«æž¡ãããå€ãåŒã³åºãå ã®ã³ãŒãã§ã¯äœ¿çšã§ããŸããã
䜿çšæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
func Read(filename string) error {
herr := func(err error) (bool, error) {
if err != nil { return true, fmt.Errorf("Read failed: %s", err) }
return false, nil
}
f, !herr := OpenFile(filename)
b, !herr := ReadBytes(f)
!herr := ProcessBytes(b)
return nil
}
ãŸãã¯ãåæåã³ãŒãã倱æããå Žåã«t.FatalãåŒã³åºãããã®ãã¹ãã§äœ¿çšããããšãã§ããŸãã
func TestSomething(t *testing.T) {
must := func(err error) bool { t.Fatalf("init code failed: %s", err); return true }
!must := setupTest()
!must := clearDatabase()
...
}
é¢æ°ã®ã·ã°ããã£ãfunc(error) error
ã ãã«å€æŽããããšããå§ãããŸãã ããã«ããã倧å€æ°ã®ã±ãŒã¹ãåçŽåããããšã©ãŒãããã«åæããå¿
èŠãããå Žåã¯ãçŸåšã®ã¡ã«ããºã ã䜿çšããã ãã§ãã
æ§æã®è³ªåïŒé¢æ°ãã€ã³ã©ã€ã³ã§å®çŸ©ã§ããŸããïŒ
func Read(filename string) error {
f, !func(err error) error {
if err != nil { return true, fmt.Errorf("... %s", err) }
return false, nil
} := OpenFile(filename)
/...
ç§ã¯ãããããªãã§ãã ãããã«æ £ããŠããŸãããæ§æã«ãã£ãŠãç¹æ®ãªã±ãŒã¹ã®æ°ãæžããããšãã§ããã¯ãã§ãã ããã«ããã次ã®ããšãå¯èœã«ãªããŸãã
func failed(s string) func(error) error {
return func(err error) {
// returns a decorated error with the given string
}
}
func Read(filename string) error {
f, !failed("couldn't open file") := OpenFile(filename)
b, !failed("couldn't read file") := ReadBytes(f)
!failed("couldn't process file") := ProcessBytes(b)
return nil
}
ããã¯ãå°ãªããšããã®ãããªãã®ãç°¡æœã«åã蟌ããšããç¹ã§ããã®çš®ã®ããšã«å¯Ÿããããè¯ãææ¡ã®1ã€ãšããŠç§ãé©ãããŸãã ããã¯ããã®æç¹ã§äŸå€ããŒã¹ã®ã³ãŒããããåªãããšã©ãŒãåºåããŠããIMHOã®å¥ã®ã±ãŒã¹ã§ããäŸå€ãäŒæãããã®ã¯éåžžã«ç°¡åã§ããããããšã©ãŒã®æ§è³ªã«é¢ãã詳现ãååŸã§ããªãããšããããããŸãã
ãŸããããã©ãŒãã³ã¹äžã®çç±ããããã³ã°ãšã©ãŒé¢æ°ã¯ãŒãå€ã§åŒã³åºãããªããã®ãšããŠå®çŸ©ããããšããå§ãããŸãã ããã«ãããããã©ãŒãã³ã¹ãžã®åœ±é¿ãæå°éã«æããããšãã§ããŸãã å
ã»ã©ç€ºããå Žåãèªã¿åããæ£åžžã«æåããå Žåããã¹ãŠã®ãšã©ãŒã§ãã§ã«if
çºçãã if
å¥ã倱æããŠããçŸåšã®èªã¿åãå®è£
ãããã³ã¹ããããããŸããã åžžã«nil
é¢æ°ãåŒã³åºããŠããå Žåãã€ã³ã©ã€ã³åã§ããªãå Žåã¯åžžã«éåžžã«é«é¡ã«ãªããæéã®ç¡é§ã«ãªãããšã¯ãããŸããã ïŒãšã©ãŒãã¢ã¯ãã£ãã«çºçããŠããå Žåã¯ãã»ãšãã©ãã¹ãŠã®ç¶æ³ã§é¢æ°åŒã³åºããæ£åœåããŠäœè£ãæãããããšãã§ããŸãïŒçŸåšã®ã¡ãœããã«ãã©ãŒã«ããã¯ã§ããªãå ŽåïŒãããšã©ãŒãçºçããªãå Žåã¯å®éã«ã¯å¿
èŠãããŸãããïŒãŸããbangé¢æ°ã¯ãå®è£
æã«ãŒã以å€ã®å€ãæ³å®ã§ããããšãæå³ããŸããããã«ãããé¢æ°ãåçŽåãããŸãã
@thejerfçŽ æµã§ããã幞ããªéã¯å€§ããå€ãããŸããã
å€ãã®ã¡ãã»ãŒãžã®åã«ãããŸãã¯ãsintaxã®ãããªRubyã䜿çšãããšããææ¡ããããŸãã- f := OpenFile(filename) or failed("couldn't open file")
ã
è¿œå ã®æžå¿µäºé -ããã¯ãä»»æã®ã¿ã€ãã®ãã©ã¡ãŒã¿ã®å Žåã§ããããããšããšã©ãŒã®å Žåã®ã¿ã§ããïŒ ãšã©ãŒã®å Žåã®ã¿-ã¿ã€ããšã©ãŒã¯ã³ã³ãã€ã©ã«ãšã£ãŠç¹å¥ãªæå³ãæã€å¿ èŠããããŸãã
@thejerfçŽ æµã§ããã幞ããªéã¯å€§ããå€ãããŸããã
ããŒã«ãã³ãã³ã®å ã®ææ¡ã®ããã«èŠããå ã®ææ¡ã®ããããäžè¬çãªãã¹ãåºå¥ããããšããå§ãããŸãã
func Read(filename string) error {
herr := func(err error) (bool, error) {
if err != nil { return true, fmt.Errorf("Read failed: %s", err) }
return false, nil
}
f, !herr := OpenFile(filename)
b, !herr := ReadBytes(f)
!herr := ProcessBytes(b)
return nil
}
ããããherr
ã©ããã§èæ
®ãããŠããŠããããå®å
šã«ç¹å®ããããã«äœãå¿
èŠããæ¢æ±ããããšã¯ããã®äŒè©±ã®å¿
èŠæ§ã§ãããç§èªèº«ã®å人çãªã³ãŒãã§ãããã©ã®ããã«äœ¿çšãããã«ã€ããŠã®ç§èªèº«ã®èãã§ããããã¯ãææ¡ã«ãã£ãŠä»ã«äœãå¯èœã«ãªããæäŸãããããæ¢æ±ããã ãã§ãã é¢æ°ãæåéãã€ã³ã©ã€ã³åããããšã¯ããããæªãèãã ãšãã§ã«èšããŸããããææ³ã¯ããããææ³ãåçŽã«ä¿ã€ããšãå¯èœã«ããã¯ãã§ãã ç§ã¯ãã§ã«3ã€ã®é¢æ°ãåãåãGoé¢æ°ãèšè¿°ããããããã¹ãŠãåŒã³åºãã«ã€ã³ã©ã€ã³åããããšãã§ããŸãã ããã¯ãGoãå£ããŠããããŸãã¯Goããããé²ãããã«äœããããå¿
èŠããããšããæå³ã§ã¯ãããŸããã ã³ãŒãã®æå¿«ããéèŠãããªãããããã¹ãã§ã¯ãªããšããããšã§ãã Goãã³ãŒããæ確ã«ããã®ã奜ãã§ãããã³ãŒããæ確ã«ä¿ã€ããã«éçºè
ã«ã¯äŸç¶ãšããŠããçšåºŠã®è²¬ä»»ããããŸãã
ããªããç§ã«ãã®ã幞ããªéããèšãã€ãããªã
func Read(filename string) error {
f, !failed("couldn't open file") := OpenFile(filename)
b, !failed("couldn't read file") := ReadBytes(f)
!failed("couldn't process file") := ProcessBytes(b)
return nil
}
ããããã§èªã¿ã«ããã§ããã幞ããªéã¯èªã¿ãããã§ã
func Read(filename string) error {
f, err := OpenFile(filename)
if err != nil {
return fmt.Errorf("Read failed: %s", err)
}
b, err := ReadBytes(f)
if err != nil {
return fmt.Errorf("Read failed: %s", err)
}
err = ProcessBytes(b)
if err != nil {
return fmt.Errorf("Read failed: %s", err)
}
return nil
}
ããããç§ã¯2çªç®ãèªã¿ãããå¯äžã®å¯èœãªæ¹æ³ãæåºããŸããããã¯ããªãããã§ã«ãããèªãããšã«æ £ããŠããŠãããªãã®ç®ã幞ããªéãèŠãããã«æ£ç¢ºã«æ£ããéãã¹ãããããããã«èšç·ŽãããŠãããšããããšã§ãã ç§ããããªã®ã§ãç§ã¯ãããæšæž¬ããããšãã§ããŸãã ãã ããå¥ã®æ§æã«æ £ãããããã®ããã®ãã¬ãŒãã³ã°ãåããããŸãã æ§æã¯ãçŸåšã®æãæ¹ã§ã¯ãªãããã§ã«æ £ããŠãããšãã®æãæ¹ã«åºã¥ããŠåæããå¿ èŠããããŸãã
ãŸãã2çªç®ã®äŸã§è¿œå ãããæ¹è¡ã¯ãå®éã®ã³ãŒãã«äœãèµ·ããããè¡šããŠããããšã«ã泚æããŠãã ããã çŸåšã®Goãšã©ãŒåŠçãã³ãŒãã«è¿œå ããåŸåãããã®ã¯ã³ãŒãã®ãè¡ãã ãã§ã¯ãªãããã以å€ã®å Žåã¯éåžžã«åçŽãªé¢æ°ã§ããã¯ãã®ã³ãŒãã«å€ãã®ã段èœããè¿œå ããŸãã ãã¡ã€ã«ãéããŠãããã€ãã®ãã€ããèªã¿åããããããåŠçããããšæããŸãã ããããªã
ãã¡ã€ã«ãéããŸãã
ãããŠãããã§ãããã°ãããã€ãã®ãã€ããèªã¿åããŸãã
ãããŠãããã§ãããã°ãããããåŠçããŸãã
æ £ããŠæµæ¢ã«äœ¿ããšãå®éã®ã³ãŒãã§ã©ã®ããã«æ©èœããããå®éã«åæããã®ã§ã¯ãªãããããã¯ç§ãæ £ããŠãããã®ã§ã¯ãªãããšããå察祚ãããããããããã«æããŸãã ã
returnã¹ããŒãã¡ã³ããé衚瀺ã«ãããšããã¢ã€ãã¢ã¯å¥œãã§ã¯ãããŸããã
f := OpenFile(filename) or return failed("couldn't open file")
....
func failed(msg string, err error) error { ... }
ãã®å Žåã or
ã¯ãŒãæ¡ä»¶ä»ã転éæŒç®åã§ãã
ãŒã以å€ã®å Žåã¯ãæåŸã®ãªã¿ãŒã³ã転éããŸãã
æŒç®å?>
ã䜿çšããCïŒã«ãåæ§ã®ææ¡ããããŸã
f := OpenFile(filename) ?> return failed("couldn't open file")
@thejerf "happy path"ã¯ãfailedïŒ...ïŒã®åŒã³åºããåã«
ãshiftãããŒã§å ¥åããã@rodcorsiæåã¯æªã
ãã®æ¹æ³ãçŸåšãããè€éã«ããªãã§ãã ããã åãã³ãŒããïŒ3ã€ä»¥äžã§ã¯ãªãïŒ1è¡ã§å®éã«ç§»åããããšã¯ãå®éã«ã¯è§£æ±ºçã§ã¯ãããŸããã ç§ã¯å人çã«ããããã®ææ¡ã®ã©ããããã»ã©å®è¡å¯èœã§ãããšã¯æããŸããã ã¿ããªãæ°åŠã¯ãšãŠãç°¡åã§ãã ãTry-catchãã®ã¢ã€ãã¢ãæ¡çšããããçŸåšã®ç¶æ ãç¶æããŸããããã¯ãå€ãã®ãif then elseããšã³ãŒããã€ãºãæå³ããFluentInterfaceã®ãããªOOãã¿ãŒã³ã§ã®äœ¿çšã«ã¯ããŸãé©ããŠããŸããã
ãã¹ãŠã®ãã³ãããŠã³ãšããããããã€ãã®ãã³ãã¢ãããããããšãããããŸãã;-ïŒïŒåè«ã§ãïŒ
@KamyarM IMOããæãããç¥ãããŠãã代æ¿æ段ã䜿çšãããããŸã£ããå€æŽãå ããªãããšããã®ã¯ãããŸãçç£çãªçºèšã§ã¯ãããŸããã ããã¯ã€ãããŒã·ã§ã³ãæ¢ãã埪ç°è«æ³ãä¿é²ããŸãã
@KernelDeimosç§ã¯ããªãã«åæããŸããããã®ã¹ã¬ããã«ã¯ãæ£ç¢ºãª4 5è¡ã1è¡ã«ç§»åãããšããå€ããã®ãæ¬è³ªçã«æ¯æããŠããå€ãã®ã³ã¡ã³ãããããŸãããããã¯å®éã®è§£æ±ºçãšã¯èŠãªãããŸãããè©ŠããŠã¿ãŠãã ãã-ä»ã®æèŠã®ããã«ãã¢ãéãããã£ããã å人çã«ã¯ããã®try-catchã®æŠå¿µãçºæãã人ã¯æ¬åœã«èããŠãããšæããŸããæ¬ é¥ã¯ã»ãšãã©ãªããããããŸãããããããã®æ¬ é¥ã¯ããã°ã©ãã³ã°ã®ç¿æ
£ãæªãããã«çºçãããã®ã§ãããåé€ãŸãã¯å¶éããŠããããã°ã©ããŒã«é©åãªã³ãŒããèšè¿°ãããæ¹æ³ã¯ãããŸãããããã°ã©ãã³ã°èšèªãæã€ãããããªããã¹ãŠã®è¯ããŸãã¯ããã€ãã¯æªãæ©èœãèšããããããŸããã
ç§ã¯ä»¥åã«ãã®ãããªãã®ãææ¡ããŸããããããã¯æ£ç¢ºã«ã¯javaãŸãã¯CïŒã®try-catchã§ã¯ãªããçŸåšã®ãšã©ãŒåŠçãšã©ã€ãã©ãªããµããŒãã§ãããšæããŸããäžèšã®äŸã®1ã€ã䜿çšããŸãã ãããã£ãŠãåºæ¬çã«ã³ã³ãã€ã©ã¯åè¡ã®åŸã«ãšã©ãŒããã§ãã¯ããerrå€ãnil以å€ã«èšå®ãããŠããå Žåã¯catchãããã¯ã«ãžã£ã³ãããŸãã
try (var err error){
f, err := OpenFile(filename)
b, err := ReadBytes(f)
err = ProcessBytes(b)
return nil
} catch (err error){ //Required
return err
} finally{ // Optional
// Do something else like close the file or connection to DB. Not necessary in this example since we return earlier.
}
@KamyarM
ããªãã®äŸã§ã¯ãïŒã³ãŒããæžããŠããæç¹ã§ïŒã©ã®ã¡ãœããããšã©ãŒãè¿ããããã©ããã£ãŠç¥ãããšãã§ããŸããïŒ ãšã©ãŒãåŠçãã3çªç®ã®æ¹æ³ïŒãè¿œå ã®ã³ã³ããã¹ãæ
å ±ãšãšãã«ãšã©ãŒãè¿ããïŒãå®è¡ããã«ã¯ã©ãããã°ããã§ããïŒ
@urandom
1ã€ã®æ¹æ³ã¯ãGoã¹ã€ããã䜿çšããŠããã£ããã§äŸå€ã®ã¿ã€ããèŠã€ããããšã§ãã ãã®ããã«OpenFileïŒïŒãåå ã§ããããšãããã£ãŠããpathErroräŸå€ããããšããŸãã GoLangã§ã®errïŒ= nilãšã©ãŒåŠçã®å ŽåãçŸåšãšããã»ã©å€ãããªãå¥ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
try (var err error){
f, err := OpenFile(filename)
} catch (err error){ //Required
return err
}
try (var err error){
b, err := ReadBytes(f)
catch (err error){ //Required
return err
}
try (var err error){
err = ProcessBytes(b)
catch (err error){ //Required
return err
}
return nil
ãããã£ãŠããã®æ¹æ³ã§ãªãã·ã§ã³ããããŸãããå¶éã¯ãããŸããã ã©ã®è¡ãåé¡ãåŒãèµ·ãããããæ¬åœã«ç¥ãããå Žåã¯ãä»ã®ããã«å€ãã®if-then-elsesãæžãã®ãšåãæ¹æ³ã§ããã¹ãŠã®è¡ãtrycatchã«å ¥ããŸãã ãšã©ãŒãããªãã«ãšã£ãŠéèŠã§ã¯ãªãããã®ã¹ã¬ããã§èª¬æãããŠããäŸã§å®éã«ããã«ã€ããŠã§ããåŒã³åºãå ã¡ãœããã«ãããæž¡ãããå Žåãç§ã¯ææ¡ãããã³ãŒããã¡ããã©ä»äºãããŠãããšæããŸãã
@KamyarMããªããä»ã©ãããæ¥ãŠããã®ãããããŸãã try ... catchã«å察ãã人ããããããããšããããtry ... catchã¯å®ç§ã§ã¯ãªããæ¬ ç¹ããããšãã蚌æ ã ãšæããŸãã ããã¯åé¡ã®ç°¡åãªè§£æ±ºçã§ãããGo2ãä»ã®èšèªã§èŠããã®ããããšã©ãŒåŠçãæ¹åã§ããã®ã§ããã°ãããã¯æ¬åœã«çŽ æŽãããããšã ãšæããŸãã
å ã»ã©ææ¡ããtry ... catchã®æªããšããããšããªããŠããtry ... catchã®è¯ããšããããšãããšã¯å¯èœã ãšæããŸãã 3è¡ã1è¡ãŸãã¯2è¡ã«å€ããŠãäœã解決ããªãããšã«åæããŸãã
ç§ãèŠãŠããããã«ãæ ¹æ¬çãªåé¡ã¯ãããžãã¯ã®äžéšããåŒã³åºãå
ã«æ»ããå Žåãé¢æ°å
ã®ãšã©ãŒåŠçã³ãŒããç¹°ãè¿ãããããšã§ãã ãã€ã§ãããžãã¯ãå€æŽãããå Žåã¯ã if err != nil { return nil }
ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãå€æŽããå¿
èŠããããŸãã
ããã¯èšã£ãŠããé¢æ°ãæé»çã«äœãthrow
ã§ããªãéããç§ã¯try...catch
ã®ã¢ã€ãã¢ãæ¬åœã«å¥œãã§ãã
catch {}
ã®ããžãã¯ã§ãå¶åŸ¡ãããŒãäžæããããã«break
ããŒã¯ãŒããå¿
èŠãªå Žåã¯ããã1ã€äŸ¿å©ã ãšæããŸãã å¶åŸ¡ãããŒãå£ããã«ãšã©ãŒãåŠçãããå ŽåããããŸãã ïŒäŸïŒããããã®ããŒã¿ã®åé
ç®ã«å¯ŸããŠäœããå®è¡ãããªã¹ãã«nil以å€ã®ãšã©ãŒãè¿œå ããŠç¶è¡ããŸããïŒ
@KernelDeimosç§ã¯
try..catchã䜿çšãããããããŸãã¯returnããïŒ19642ãïŒ21498ãšãã¬ã³ããããïŒdefer / panic / restoreã¯ãã§ã«ååšããŸããåãé¢æ°å ã§ã¹ããŒããããšã¯ãè€æ°ã®gotoã¹ããŒãã¡ã³ããæã£ãŠãããããªãã®ã§ãcatchå ã«ã¿ã€ãã¹ã€ãããè¿œå ãããšé¢åã«ãªããŸãã try..catchãã¹ã¿ãã¯ã®äžäœã«é 眮ããããšã§ããšã©ãŒåŠçãå¿ããããšãã§ããŸãïŒãŸãã¯ãã¹ã³ãŒããåäžé¢æ°å ã§try..catchãå®è¡ããå Žåã¯ãã³ã³ãã€ã©ãŒãå€§å¹ ã«è€éã«ããŸãïŒ
@egorse
@KamyarMã瀺åããŠããtry-catchæ§æã¯ãäŸå€ã®çŽ¹ä»ã§ã¯ãªãããšã©ãŒæ»ãå€æ°ãåŠçããããã®æ§æã·ã¥ã¬ãŒã§ããããã§ãã ç§ã¯ããŸããŸãªçç±ã§ããŸãã¯returnãã¿ã€ãã®æ§æã奜ã¿ãŸãããããã¯æ£åœãªææ¡ã®ããã§ãã
ããã¯èšã£ãŠãã @ KamyarM ããªãtry
å€æ°å®çŸ©éšåãããã®ã§ããïŒ err
å€æ°ãå®çŸ©ããŠããŸããããããã¯èªäœå
ã®ä»ã®err
å€æ°ã«ãã£ãŠã·ã£ããŠãããŠããŸãã ãã®ç®çã¯äœã§ããïŒ
error
ã¿ã€ãããåãé¢ãããšãã§ããããã«ãç£èŠããå€æ°ãæå®ããããšã ãšæããŸãã 人ã
ãæ¬åœã«æ³šæããå¿
èŠããªãéããã·ã£ããŠã€ã³ã°ã«ãŒã«ãå€æŽããå¿
èŠãããã§ãããã ãã ãã catch
ãããã¯ã§ã®å®£èšã«ã€ããŠã¯ããããããŸããã
@DeedleFakeã¯ããã®ç®çãããèšåãŸãã«@egorseã ããã¯ãtryãããã¯ããã®ãªããžã§ã¯ããç£èŠããŠããããšãæå³ããŸãã ãŸãããã®ç¯å²ãå¶éããŸãã ããã¯ãCïŒã®usingã¹ããŒãã¡ã³ãã«äŒŒãŠããŸãã CïŒã§ã¯ãããŒã¯ãŒãã䜿çšããŠå®çŸ©ããããªããžã§ã¯ãã¯ããã®ãããã¯ãå®è¡ããããšèªåçã«ç Žæ£ããããããã®ãªããžã§ã¯ãã®ã¹ã³ãŒãã¯ãUsingããããã¯ã«å¶éãããŸãã
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
ããã°ã©ããŒã«ãšã©ãŒãæ£ããåŠçããæ¹æ³ã決å®ããããã®ã§ãcatchã䜿çšããå¿ èŠããããŸãã CïŒããã³Javaã§ã¯ãcatchãå¿ é ã§ãã CïŒã§ã¯ãäŸå€ãåŠçããããªãå Žåã¯ããã®é¢æ°ã§try-catchããŸã£ãã䜿çšããŸããã äŸå€ãçºçãããšãåŒã³åºãéå±€å ã®ä»»æã®ã¡ãœãããäŸå€ãåŠçããããåã¹ããŒïŒãŸãã¯å¥ã®äŸå€ã§ã©ããïŒãããããããšãã§ããŸãã Javaã§ãåãããšãã§ãããšã¯æããŸããã Javaã§ã¯ãäŸå€ãã¹ããŒããå¯èœæ§ã®ããã¡ãœããã¯ãé¢æ°ã·ã°ããã£ã§ããã宣èšããå¿ èŠããããŸãã
ãã®try-catchãããã¯ã¯æ£ç¢ºãªãã®ã§ã¯ãªãããšã匷調ããããšæããŸãã ãããã®ããŒã¯ãŒãã䜿çšããã®ã¯ããããéæãããããšãšé¡äŒŒããŠãããå€ãã®ããã°ã©ããŒã粟éããŠãããã»ãšãã©ã®ããã°ã©ãã³ã°æŠå¿µã³ãŒã¹ã§æããããŠããããã§ãã
次ã®ããã«ã_ååä»ããšã©ãŒãªã¿ãŒã³ãã©ã¡ãŒã¿_ãããå Žåã«ã®ã¿æ©èœãã_ãšã©ãŒæã®ãªã¿ãŒã³_å²ãåœãŠãååšããå¯èœæ§ããããŸãã
func process(someInput string) (someOutput string, err error) {
err ?= otherAction()
return
}
err
ãnil
å Žåã¯ãæ»ããŸãã
Rustã«try
ç ç³ãè¿œå ãããšãããã®è°è«ã¯ããã®è°è«ã®åå è
ã«å
ãåœãŠããšæããŸãã
FWIWããšã©ãŒåŠçãåçŽåããããšã«é¢ããå€ãèãïŒããããã³ã»ã³ã¹ã§ããå Žåã¯è¬çœªïŒïŒ
ãã£ã¬ããèšå·^ã§ç€ºãããã¬ã€ãºèå¥åã¯ãä»£å ¥ã®å·ŠåŽã«ãããªãã©ã³ãã®1ã€ãšããŠäœ¿çšã§ããŸãã å²ãåœãŠã®ç®çã§ãraiseèå¥åã¯ãå€ã«ååããããã©ããã«é¢ä¿ãªããå«ãŸããŠããé¢æ°ã®æåŸã®æ»ãå€ã®ãšã€ãªã¢ã¹ã§ãã å²ãåœãŠãå®äºãããšãé¢æ°ã¯æåŸã®æ»ãå€ããã®åã®ãŒãå€ïŒnilã0ãfalseã ""ïŒã«å¯ŸããŠãã¹ãããŸãã ãŒããšèŠãªãããå Žåãé¢æ°ã¯å®è¡ãç¶ç¶ããããã§ãªãå Žåã¯æ»ããŸãã
ã¬ã€ãºèå¥åã®äž»ãªç®çã¯ããããçºçããŠãããšããäºå®ãé ãããšãªããåŒã³åºãããé¢æ°ããã®ãšã©ãŒãç¹å®ã®ã³ã³ããã¹ãã§åŒã³åºãå ã«ç°¡æœã«äŒæããããšã§ãã
äŸãšããŠã次ã®ã³ãŒãã«ã€ããŠèããŠã¿ãŸãã
func Alpha() (string, error) {
b, ^ := beta()
g, ^ := gamma()
return b + g, nil
}
ããã¯ããããã次ã®ãã®ãšåçã§ãã
func Alpha() (ret1 string, ret2 error) {
b, ret2 := beta()
if ret2 != nil {
return
}
g, ret2 := gamma()
if ret2 != nil {
return
}
return b + g, nil
}
次ã®å Žåãããã°ã©ã ã®åœ¢åŒãæ£ãããããŸããã
ãã®ææ¡ã¯ããã®äŸ¡å€ããããã®ã«ã€ããŠãããå€ãã®ã³ã³ããã¹ãæ å ±ãæäŸãããšããåé¡ã«å¯ŸåŠããŠããªããšããç¹ã§ä»ã®ææ¡ãšäŒŒãŠããŸãã
@gboyleãã®ãããIMOã®æåŸã®æ»ãå€ã«ã¯ã error
ãšããååãä»ããå¿
èŠããããŸãã ããã«ã¯2ã€ã®éèŠãªæå³ããããŸãã
1-ä»ã®æ»ãå€ã«ãååãä»ããããŠããããã
2-ãããã¯ãã§ã«æå³ã®ãããŒãå€ãæã£ãŠããŸãã
@ object88 context
ããã±ãŒãžã®å±¥æŽã瀺ãããã«ãããã«ã¯ãçµã¿èŸŒã¿ã®error
ã¿ã€ãïŒéåžžã®Go error
ïŒãå®çŸ©ãããªã©ãã³ã¢ããŒã ããã®ã¢ã¯ã·ã§ã³ãå¿
èŠã§ããããã€ãã®äžè¬çãªå±æ§ïŒã¡ãã»ãŒãžïŒã³ãŒã«ã¹ã¿ãã¯ïŒãªã©ïŒã䜿çšããŸãã
AFAIKã«ã¯ãGoã«ã¯ã³ã³ããã¹ãèšèªã®æ§æèŠçŽ ã¯ããŸããããŸããã go
ãšdefer
以å€ã«ä»ã®ãã®ã¯ãªããããã2ã€ã§ããéåžžã«æ確ã§æ確ã§ãïŒæ§æã®ããã-ãããŠç®ã«ã¯-ãããŠã»ãââã³ãã£ã¯ã¹ïŒã
ãã®ãããªãã®ã¯ã©ãã§ããïŒ
ïŒç§ãåãçµãã§ããå®éã®ã³ãŒããã³ããŒããŸããïŒïŒ
func (g *Generator) GenerateDevices(w io.Writer) error {
var err error
catch err {
_, err = io.WriteString(w, "package cc\n\nconst (") // if err != nil { goto Caught }
for _, bd := range g.zwClasses.BasicDevices {
_, err = w.Write([]byte{'\t'}) // if err != nil { goto Caught }
_, err = io.WriteString(w, toGoName(bd.Name)) // if err != nil { goto Caught }
_, err = io.WriteString(w, " BasicDeviceType = ") // if err != nil { goto Caught }
_, err = io.WriteString(w, bd.Key) // if err != nil { goto Caught }
_, err = w.Write([]byte{'\n'}) // if err != nil { goto Caught }
}
_, err = io.WriteString(w, ")\n\nvar BasicDeviceTypeNames = map[BasicDeviceType]string{\n") // if err != nil { goto Caught }
// ...snip
}
// Caught:
return err
}
err
ãnil以å€ã®å Žåããcatchãã¹ããŒãã¡ã³ãã®æåŸãŸã§å£ããŸãã ãcatchãã䜿çšããŠãéåžžã¯åãã¿ã€ãã®ãšã©ãŒãè¿ãé¡äŒŒã®åŒã³åºããã°ã«ãŒãåã§ããŸãã åŒã³åºããé¢é£ããŠããªããŠããåŸã§ãšã©ãŒã¿ã€ãã確èªããŠãé©åã«ã©ããããããšãã§ããŸãã
@lukescottã¯ã èªãã§ããŸãhttps://blog.golang.org/errors-are-values
@davecheneyãã£ããã®ã¢ã€ãã¢ïŒè©Šè¡ãªãïŒã¯ããã®ææ ã®ç²Ÿç¥ãç¶æããŸãã ãšã©ãŒãå€ãšããŠæ±ããŸãã å€ãnilã§ãªããªããšãïŒåãé¢æ°å ã§ïŒåã«å£ããŸãã ããã°ã©ã ãã¯ã©ãã·ã¥ããããšã¯ãããŸããã
@lukescottä»æ¥ã¯Robã®ãã¯ããã¯ã䜿çšã§ããŸããèšèªãå€æŽããå¿ èŠã¯ãããŸããã
äŸå€ãšãšã©ãŒã®éã«ã¯ããªã倧ããªéãããããŸãã
å€ãã®èšèªã¯äž¡æ¹ãäŸå€ãšããŠæ±ããŸãã
ãžã§ããªãã¯ã¹ãšããè¯ããšã©ãŒåŠçã®éã§ãGoã®ã»ãšãã©ã®ã³ãŒãã¯ã©ãã¿ãŒã¯ãšã©ãŒåŠçããæ¥ãã®ã§ãç§ã¯ããè¯ããšã©ãŒåŠçãéžæããŸãã ãã®çš®ã®åé·æ§ã¯åªããŠãããåçŽããåªå ããŠãããšèšããŸãããIMOã¯ãã¯ãŒã¯ãããŒã®ãããããŒãã¹ãããããŸããªã¬ãã«ãŸã§èŠãé ããŸãã
@thejerfããã®ææ¡ãçºå±ãããããšæããŸãã
ãŸãã !
代ããã«ã or
æŒç®åãå°å
¥ãããŸãããã®æŒç®åã¯ãå·ŠåŽã®é¢æ°åŒã³åºãããæåŸã«è¿ãããåŒæ°ã§ãããå³åŽã®returnã¹ããŒãã¡ã³ããåŒã³åºããŸããã·ãããããåŒæ°ããŒã以å€ïŒãšã©ãŒã¿ã€ãã®å Žåã¯nill以å€ïŒã®å Žåã«åŒã³åºãããé¢æ°ã§ããã®åŒæ°ãæž¡ããŸãã ãšã©ãŒã¿ã€ãã®ã¿ã察象ãšãã¹ãã ãšäººã
ãèããå Žåã¯åé¡ãããŸãããããã®æ§é ã¯ãæåŸã®åŒæ°ãšããŠããŒã«å€ãè¿ãé¢æ°ã«ã圹ç«ã€ãšæããŸãïŒããã¯åé¡ãããŸããïŒã
Readã¡ãœããã¯æ¬¡ã®ããã«ãªããŸãã
func Read(filename string) error {
f := OpenFile(filename) or return errors.Contextf("opening file %s", filename)
b := ReadBytes(f) or return errors.Contextf("reading file %s", filename)
ProcessBytes(b) or return errors.Context("processing data")
return nil
}
ãšã©ãŒããã±ãŒãžã¯æ¬¡ã®ãããªäŸ¿å©ãªæ©èœãæäŸãããšæããŸãã
func Noop() func(error) error {
return func(err error) {
return err
}
}
func Context(msg string) func(error) error {
return func(err error) {
return fmt.Errorf("%s: %v", msg, err)
}
}
...
ããã¯ãå¿ èŠãªãã¹ãŠã®ãã€ã³ããã«ããŒããªãããå®å šã«èªã¿ãããããã«èŠããŸãããŸããreturnã¹ããŒãã¡ã³ãã«ç²ŸéããŠãããããããŸãç°è³ªã«èŠããŸããã
@urandomãã®ã¹ããŒãã¡ã³ãã§ã¯f := OpenFile(filename) or return errors.Contextf("opening file %s", filename)
çç±ãã©ã®ããã«ç¥ãããšãã§ããŸããïŒ ããšãã°ãèªã¿åãæš©éããªãã®ã§ããããããããšããã¡ã€ã«ããŸã£ããååšããªãã®ã§ããããã
@ dc0d
äžèšã®äŸã§ãããŠãŒã¶ãŒãæå®ããã¡ãã»ãŒãžã¯ã³ã³ããã¹ããè¿œå ãããã ããªã®ã§ãå
ã®ãšã©ãŒãå«ãŸããŠããŸãã åè¿°ã®ããã«ãå
ã®ææ¡ãã掟çããããã«ã or return
ã¯ãã·ãããããã¿ã€ãã®åäžã®ãã©ã¡ãŒã¿ãŒãåãåãé¢æ°ãæåŸ
ããŸãã ããã¯éèŠã§ãããéåžžã«å€ãã®äººã«é©ãããŠãŒãã£ãªãã£é¢æ°ã ãã§ãªããç¹å®ã®å€ã®å®éã®ã«ã¹ã¿ã åŠçãå¿
èŠãªå Žåã¯ãã»ãšãã©ç¬èªã®é¢æ°ãäœæã§ããŸãã
@urandomIMOããã¯ããŸãã«ãé ããŸãã
ããã§ã®ç§ã®2ã»ã³ããç§ã¯ç°¡åãªã«ãŒã«ãææ¡ããããšæããŸãïŒ
ãé¢æ°ã®æé»ã®çµæãšã©ãŒãã©ã¡ãŒã¿ã
ã©ã®é¢æ°ã§ããçµæãã©ã¡ãŒã¿ãŒãªã¹ãã®æåŸã«ãšã©ãŒãã©ã¡ãŒã¿ãŒãå«ãŸããŸãã
æ瀺çã«å®çŸ©ãããŠããªãå Žåã
説æã®ããã«ã次ã®ããã«å®çŸ©ãããé¢æ°ããããšä»®å®ããŸãã
func fïŒïŒïŒintïŒ{}
ããã¯æ¬¡ãšåãã§ãïŒfunc fïŒïŒïŒintãerrorïŒ{}
æé»ã®çµæãšã©ãŒã«ãŒã«ã«åŸããŸãã
å²ãåœãŠã®å Žåã次ã®ããã«ãããã«ã¢ãããç¡èŠããŸãã¯ãšã©ãŒããã£ããã§ããŸãã
1ïŒããã«ã¢ãã
xïŒ= fïŒïŒ
fããšã©ãŒãè¿ãå ŽåãçŸåšã®é¢æ°ã¯ããã«ãšã©ãŒãè¿ããŸã
ïŒãŸãã¯æ°ãããšã©ãŒã¹ã¿ãã¯ãäœæããŸããïŒïŒ
çŸåšã®æ©èœãã¡ã€ã³ã®å Žåãããã°ã©ã ã¯åæ¢ããŸãã
ããã¯ã次ã®ã³ãŒãã¹ãããããšåçã§ãã
xãerrïŒ= fïŒïŒ
errïŒ= nil {ã®å Žå
æ»ã...ããšã©ãŒ
}
2ïŒç¡èŠãã
xã_ïŒ= fïŒïŒ
ãšã©ãŒã®ç Žæ£ãæ瀺çã«éç¥ããããã®ãä»£å ¥åŒãªã¹ãã®æåŸã«ãã空çœã®èå¥åã
3ïŒãã£ãã
xãerrïŒ= fïŒïŒ
ãšã©ãŒã¯éåžžã©ããã«åŠçããå¿ èŠããããŸãã
ãã®æ
£çšçãªã³ãŒãèŠåã®å€æŽã¯ãã³ã³ãã€ã©ãŒã§æå°éã®å€æŽã®ã¿ãå¿
èŠãšããã¯ãã ãšç§ã¯ä¿¡ããŠããŸã
ãŸãã¯ããªããã»ããµããã®ä»äºãããã¯ãã§ãã
@ dc0dãããäœãé ããŠããã®ãããããŠã©ã®ããã«é ããŠããã®ããäŸãæããŠããã ããŸããïŒ
@urandom以åã®ã³ã¡ã³ãã§å°ããããã«ããå
ã®ãšã©ãŒã¯ã©ãã«ãããŸããïŒããšãã質åãåŒãèµ·ãããã®ã¯ãã®ããã§ãã ãšã©ãŒãæé»çã«æž¡ããŸãããïŒããšãã°ïŒãã®è¡ã®å
ã®ãšã©ãŒãã©ãã«ãããã¯æ確ã§ã¯ãããŸããïŒ f := OpenFile(filename) or return errors.Contextf("opening file %s", filename)
ã OpenFile()
ã«ãã£ãŠè¿ãããå
ã®ãšã©ãŒ-ããã¯ãããã¡ã€ã«åã«åé¡ããããã ãã§ãªããèªã¿åãæš©éã®æ¬ åŠããã¡ã€ã«ã®æ¬ åŠãªã©ã®å¯èœæ§ããããŸãã
@ dc0d
åæããŸããã ããã¯ãhttp.HandlersãåŠçããã®ãšã»ãŒåããããæ確ã§ããåŸã§ããããããã«ããã¬ã¯ãµã«æž¡ããçªç¶ãèŠæ±ãšå¿çã®ã©ã€ã¿ãŒãååŸããŸãã ãããŠã人ã
ã¯ãã®çš®ã®è¡åã«æ
£ããŠããŸãã go
ã¹ããŒãã¡ã³ããäœãããã®ãã人ã
ã¯ã©ããã£ãŠç¥ãã®ã§ããããïŒ ããã¯æåã®åºäŒãã§ã¯æããã«æ確ã§ã¯ãããŸããããããã§ãããªãæ®åããŠããŠãèšèªã§æžãããŠããŸãã
ã»ãšãã©ã®äººã«åœãŠã¯ãŸãã®ã§ããã®æ°ããææ¡ãããããã©ã®ããã«æ©èœããã®ã誰ã«ãããããªããšããçç±ã§ãç§ãã¡ã¯ãããªãææ¡ã«ãå察ãã¹ãã§ã¯ãªããšæããŸãã
@urandomããã§ããå°ãæå³ããããŸãïŒ http.Handler
äŸãå«ãïŒã
ãããŠãç§ãã¡ã¯ç©äºã«ã€ããŠè©±ãåã£ãŠããŸãã ç§ã¯ç¹å®ã®èãã«å察ããããè³æãããããŸããã ããããç§ã¯åçŽãããµããŒãããæ瀺çã§ãããšåæã«ãéçºè ã®çµéšã«ã€ããŠå°ãæ£æ°ãäŒããŠããŸãã
@ dc0d
ããã¯ãèªã¿åãæš©éã®æ¬ åŠããã¡ã€ã«ããªããªã©ã®å¯èœæ§ããããŸã
ãã®å Žåããšã©ãŒãåã¹ããŒããã ãã§ãªããå®éã®å 容ã確èªããŸãã ç§ã«ãšã£ãŠããã®åé¡ã¯æã人æ°ã®ããã±ãŒã¹ãã«ããŒããããšã«ã€ããŠã§ãã ã€ãŸããã³ã³ããã¹ããè¿œå ããŠãšã©ãŒãåã¹ããŒããŸãã ãããŸãã«ããšã©ãŒãå ·äœçãªã¿ã€ãã«å€æããŠãå®éã®å 容ã確èªããŸãã ãããŠããã®çŸåšã®ãšã©ãŒåŠçæ§æã¯å®å šã«åé¡ãªããããã§ã®ææ¡ã®1ã€ãåãå ¥ãããããšããŠãã©ãã«ãè¡ããŸããã
@crekerãšã©ãŒã¯äŸå€ã§ã¯ãããŸããïŒç§ã®ä»¥åã®ã³ã¡ã³ãïŒã ãšã©ãŒã¯å€ã§ããããããšã©ãŒãã¹ããŒãŸãã¯åã¹ããŒããããšã¯ã§ããŸããã è©Šè¡/ãã£ããã®ãããªã·ããªãªã®å ŽåãGoã«ã¯ãããã¯/å埩ããããŸãã
@ dc0dç§ã¯äŸå€ã«ã€ããŠè©±ããŠããŸããã åã¹ããŒãšã¯ãåŒã³åºãå
ã«ãšã©ãŒãè¿ãããšãæå³ããŸãã ææ¡ãããor return errors.Contextf("opening file %s", filename)
åºæ¬çã«ãšã©ãŒãã©ããããŠåã¹ããŒããŸãã
@creker説æããããšãããããŸãã ãŸããã¹ã±ãžã¥ãŒã©ãŒã«åœ±é¿ãäžããããã€ãã®è¿œå ã®é¢æ°åŒã³åºããè¿œå ããŸããããã«ãããç¶æ³ã«ãã£ãŠã¯ç®çã®åäœãçæãããªãå ŽåããããŸãã
@ dc0dã¯å®è£ ã®è©³çŽ°ã§ãããå°æ¥å€æŽãããå¯èœæ§ããããŸãã ãããŠããã¯å®éã«å€ããå¯èœæ§ããããéååçãªããªãšã³ãã·ã§ã³ãçŸåšé²è¡äžã§ãã
@creker
å€æŽããããšã©ãŒãè¿ãã ãã§ãªããããã«å€ãã®ã±ãŒã¹ãã«ããŒã§ãããšæããŸãã
func retryReadErrHandler(filename string, count int) func(error) error {
return func(err error) error {
if os.IsTimeout(err) {
count++
return Read(filename, count)
}
if os.IsPermission(err) {
log.Fatal("Permission")
}
return fmt.Errorf("opening file %s: %v", filename, err)
}
}
func Read(filename string, count int) error {
if count > 3 {
return errors.New("max retries")
}
f := OpenFile(filename) or return retryReadErrHandler(filename, count)
...
}
@ dc0d
äœåãªé¢æ°åŒã³åºãã¯ãããããã³ã³ãã€ã©ã«ãã£ãŠã€ã³ã©ã€ã³åãããŸã
éåžžã«é¢çœãããª@urandom ã æé»ã®è°è«ã§å°ãéæ³ã§ãããããã¯å®éã«ã¯äžè¬çã§ããã¹ãŠãã«ããŒããã®ã«ååç°¡æœã§ããå¯èœæ§ããããŸãã éåžžã«ãŸããªã±ãŒã¹ã§ã®ã¿ãéåžžã®if err != nil
ã«é Œãå¿
èŠããããŸãã
@urandom ãç§ã¯ããªãã®äŸã«æ··ä¹±ããŠããŸãã retryReadErrHandler
ãé¢æ°ãè¿ãã®ã¯ãªãã§ããïŒ
@ object88
ãããor return
æŒç®åã®èåŸã«ããèãæ¹ã§ãã å·ŠåŽããæåŸã«è¿ãããåŒæ°ããŒã以å€ã®å Žåã«åŒã³åºãé¢æ°ãå¿
èŠã§ãã ãã®ç¹ã§ãããã¯http.HandlerãšãŸã£ããåãããã«æ©èœããåŒæ°ãšãã®æ»ãå€ïŒãŸãã¯ããã³ãã©ãŒã®å Žåã¯èŠæ±ãšãã®å¿çïŒãåŠçããæ¹æ³ã®å®éã®ããžãã¯ãã³ãŒã«ããã¯ã«ä»»ããŸãã ãŸããã³ãŒã«ããã¯ã§ç¬èªã®ã«ã¹ã¿ã ããŒã¿ã䜿çšããã«ã¯ããã®ããŒã¿ããã©ã¡ãŒã¿ãŒãšããŠåãåããæåŸ
ããããã®ãè¿ãã©ãããŒé¢æ°ãäœæããŸãã
ãŸãã¯ããã銎æã¿ã®ããèšèã§èšãã°ãããã¯éåžžãã³ãã©ãŒã§è¡ãããšãšäŒŒãŠããŸãã
`` `è¡ã
func nodeHandlerïŒrepo RepoïŒhttp.Handler {
http.HandlerFuncïŒfuncïŒw http.ResponseWriterãr * http.RequestïŒ{ãè¿ã
ããŒã¿ã_ïŒ= json.MarshalïŒrepo.GetNodesïŒïŒïŒ
w.WriteïŒdataïŒ
}ïŒ
}
@ urandom ãLHSãä»æ¥ãšåããŸãŸã«ããŠã or ... return
ãreturnif (cond)
å€æŽããããšã§ãéæ³ãé¿ããããšãã§ããŸãã
func Read(filename string) error {
f, err := OpenFile(filename) returnif(err != nil) errors.Contextf(err, "opening file %s", filename)
b, err := ReadBytes(f) returnif(err != nil) errors.Contextf(err, "reading file %s", filename)
err = ProcessBytes(b) returnif(err != nil) errors.Context(err, "processing data")
return nil
}
ããã«ãããå·ŠåŽã®ãšã©ãŒå€ãšå³åŽã®ããªã¬ãŒæ¡ä»¶ã®äžè¬æ§ãšéææ§ãåäžããŸãã
ãããã®ããŸããŸãªææ¡ãèŠãã°èŠãã»ã©ãgofmtã®ã¿ã®å€æŽãå¿
èŠã«ãªãåŸåããããŸãã èšèªã«ã¯ãã§ã«åããããŸãããã£ãšã¹ãã£ã³ããããããŸãããã @billyh ãç¹ã«ããªãã®ææ¡ãéžã¶ã®ã§ã¯ãªãã returnif(cond) ...
ã¯if cond { return ...}
ãæžãçŽãæ¹æ³ã«ãããŸããã ãªãåŸè
ãæžãããšãã§ããªãã®ã§ããïŒ ãããäœãæå³ããã®ãã¯ãã§ã«ããã£ãŠããŸãã
x, err := foo()
if err != nil { return fmt.Errorf(..., err) }
ãããã¯
if x, err := foo(); err != nil { return fmt.Errorf(..., err) }
ãŸã
x, err := foo(); if err != nil { return fmt.Errorf(..., err) }
æ°ããéæ³ã®ããŒã¯ãŒããæ§æãæŒç®åã¯ãããŸããã
ïŒ :=
ã®äœ¿çšã«æè»æ§ãè¿œå ããããã«ïŒ377ãä¿®æ£ãããšåœ¹ç«ã€å ŽåããããŸããïŒ
@ randall77ç§ããã®ããã«ãªããã¡ã§ãã
@ randall77ãã®ãããã¯ã¯ã©ã®æç¹ã§è¡ã©ãããããŸããïŒ
äžèšã®è§£æ±ºçã¯ãããã§ææ¡ããã代æ¿æ¡ãšæ¯èŒããå Žåãããæºè¶³ã®ãããã®ã§ãããImã¯ãäœãããªããããåªããŠãããšã¯ç¢ºä¿¡ããŠããŸããã Gofmtã¯ãå¯èœãªéã決å®è«çã§ããå¿ èŠããããŸãã
@as ãç§ã¯å®å
šã«ã¯èããŠããŸããããã if
ã¹ããŒãã¡ã³ãã®æ¬äœã«åäžã®return
ã¹ããŒãã¡ã³ããå«ãŸããŠããå Žåã if
ã¹ããŒãã¡ã³ãã¯æ¬¡ã®ããã«ãã©ãŒããããããŸããäžè¡ãã
if
æ¡ä»¶ã«ã¯ãããŒã«å€æ°ãŸãã¯2ã€ã®å€æ°ãŸãã¯å®æ°ã®äºé
æŒç®åã§ããå¿
èŠããããªã©ãè¿œå ã®å¶éãå¿
èŠãªå ŽåããããŸãã
@billyh
or
ã¡ãã£ãšããéæ³ã§æ··ä¹±ãããããªããšã¯äœãèŠãããªãã®ã§ããã£ãšåé·ã«ããå¿
èŠã¯ãªããšæããŸãã @asãšã¯ç°ãªããå€ãã®äººã¯httpãã³ãã©ãŒã®æäœæ¹æ³ã«ãæ··ä¹±ãæããªããšæããŸãã
@ randall77
ããªããææ¡ããããšã¯ãã³ãŒãã¹ã¿ã€ã«ã®ææ¡ãšããŠããäžèŽããŠãããããã«è¡ãããšãéåžžã«é«ãè©äŸ¡ãããŠããŸãã çªç¶2ã€ã®ã¹ã¿ã€ã«ã®ifã¹ããŒãã¡ã³ããååšãããããã³ãã¥ããã£å
šäœã§ããŸãæ©èœããªãå¯èœæ§ããããŸãã
èšããŸã§ããªãããã®ãããª1ã€ã®ã©ã€ããŒã¯ã¯ããã«èªã¿ã«ããã§ãã if != ; { }
ã¯æ°è¡ã§ãå€ãããããããã®ææ¡ã§ãã ãã¿ãŒã³ã¯ã»ãšãã©ãã¹ãŠã®å Žåã«åºå®ãããŠãããèªã¿ãããç解ããããæ§æç³è¡£ã«å€æã§ããŸãã
ãããã®ææ¡ã®ã»ãšãã©ã§ç§ãæ±ããŠããåé¡ã¯ãäœãèµ·ãã£ãŠããã®ããæ確ã§ãªãããšã§ãã åé ã®æçš¿ã§ã¯ããšã©ãŒãè¿ãããã«||
ãåå©çšããããšããå§ãããŸãã ããã§ãªã¿ãŒã³ãèµ·ãã£ãŠãããã©ããã¯ç§ã«ã¯ããããŸããã æ°ããæ§æãçºæãããã®ã§ããã°ãããã¯ã»ãšãã©ã®äººã®æåŸ
ã«æ²¿ã£ããã®ã§ããå¿
èŠããããšæããŸãã ||
衚瀺ãããå Žåãè¿åãå®è¡ã®äžæãããæåŸ
ããŠããŸããã ããã¯ç§ã«ãšã£ãŠäžå¿«ã§ãã
ç§ã¯Goã®ããšã©ãŒã¯äŸ¡å€èŠ³ãã®ææ
ã奜ãã§ãããäž»ã«ã»ãšãã©ãã¹ãŠã®åŒã³åºãã§ãšã©ãŒãè¿ããããšäºæ³ãããããã if err := expression; err != nil { return err }
ãåé·ãããããšã«ãåæããŸãã ããã¯ãããããããããããããšãæå³ããerrã宣èšãããŠããïŒãŸãã¯ã·ã£ããŠãããŠããïŒå Žæã«ãã£ãŠã¯ãç°¡åã«æ··ä¹±ãããããšãã§ããŸãã ããã¯ç§ãã¡ã®ã³ãŒãã§èµ·ãããŸããã
Goã¯try / catchã䜿çšããããäŸå€çãªãç¶æ³ã§panic / deferã䜿çšãããããããã°ã©ã ãã¯ã©ãã·ã¥ãããããšãªããtryããã³/ãŸãã¯catchããŒã¯ãŒããåå©çšããŠããšã©ãŒåŠçãççž®ããæ©äŒããããŸãã
ãããç§ãæã£ãŠããèãã§ãïŒ
func WriteFooBar(w io.Writer) (err error) {
_, try err = io.WriteString(w, "foo")
_, try err = w.Write([]byte{','})
_, try err = io.WriteString(w, "bar")
return
}
LHSã®err
ã«ããŒã¯ãŒãtry
ãä»ãããšèããããŸãã errãnil以å€ã®å Žåãããã«æ»ããŸãã ãªã¿ãŒã³ãå®å
šã«æºããããªãå Žåãé€ããŠãããã§ãã£ããã䜿çšããå¿
èŠã¯ãããŸããã ããã¯ããå®è¡ãäžæããŠã¿ãŠãã ããããšãã人ã
ã®æåŸ
ãšããäžèŽããŸãããããã°ã©ã ãã¯ã©ãã·ã¥ããã代ããã«ãããã°ã©ã ãè¿ãããã ãã§ãã
æ»ãå€ãå®å šã«æºããããŠããªãå ŽåïŒã³ã³ãã€ã«æã®ãã§ãã¯ïŒããŸãã¯ãšã©ãŒãã©ãããããå Žåã¯ãcatchã次ã®ãããªç¹å¥ãªè»¢éå°çšã©ãã«ãšããŠäœ¿çšã§ããŸãã
func WriteFooBar(w io.Writer) (err error) {
_, try err = io.WriteString(w, "foo")
_, try err = w.Write([]byte{','})
_, try err = io.WriteString(w, "bar")
return
catch:
return &CustomError{"some detail", err}
}
ããã«ãããç¹å®ã®ãšã©ãŒã確èªããŠç¡èŠããããšãã§ããŸãã
func WriteFooBar(w io.Writer) (err error) {
_, try err = io.WriteString(w, "foo")
_, try err = w.Write([]byte{','})
_, err = io.WriteString(w, "bar")
if err == io.EOF {
err = nil
} else {
goto catch
}
return
catch:
return &CustomError{"some detail", err}
}
ããããã try
ã§ã©ãã«ãæå®ããããšãã§ããŸãã
func WriteFooBar(w io.Writer) (err error) {
_, try(handle1) err = io.WriteString(w, "foo")
_, try(handle2) err = w.Write([]byte{','})
_, try(handle3) err = io.WriteString(w, "bar")
return
handle1:
return &CustomError1{"...", err}
handle2:
return &CustomError2{"...", err}
handle3:
return &CustomError3{"...", err}
}
ç§ã¯èªåã®ã³ãŒãäŸãäžçš®ã®ãµãã¯ïŒfoo / barãackïŒã§ããããšã«æ°ã¥ããŸããã ããããããŸãããã°ãç§ã¯æ¢åã®æåŸ ã«è³æ/å察ããããšã«ãã£ãŠç§ãäœãæå³ããã®ãã説æããŸããã ãŸããGo 1ã®å Žåãšåãããã«ãšã©ãŒãä¿æããããšãã§ããŸãããã ããæ°ããæ§æãçºæãããå Žåã¯ãGoã ãã§ãªãããã®æ§æããã§ã«ã©ã®ããã«èªèãããŠããããæ éã«æ€èšããå¿ èŠããããŸãã ãã§ã«äœããæå³ããããšãªãæ°ããæ§æãçºæããããšã¯é£ããã®ã§ãæ¢åã®æåŸ ã«å察ããããããæ¢åã®æåŸ ã«æ²¿ã£ãæ¹ãããå ŽåããããããŸãã
ãã¶ããã¡ãœããããã§ãŒã³ããæ¹æ³ã®ãããªããšã©ãŒã®ããã®ããçš®ã®ãã§ãŒã³ã§ããïŒ ãããã©ã®ããã«èŠããã®ãããããããŸãããã®ãã©ããã¯ããããããŸãããããã ã®ã¯ã€ã«ããªã¢ã€ãã¢ã§ãã
æ§é äœå
ã«ããçš®ã®ãšã©ãŒå€ãç¶æãããã§ãŒã³ã®æåŸã§ãããæœåºããããšã«ããããã§ãŒã³ããœãŒãããŠãšã©ãŒãã§ãã¯ã®æ°ãæžããããšãã§ããŸãã
ãã€ã©ãŒãã¬ãŒããå°ããããŸãããããã§ãæå³ããªãããã«ãããããã«åçŽåããæ¹æ³ãããããããªããããããã¯éåžžã«å¥åŠãªç¶æ³ã§ãã
@thejerfã®ãµã³ãã«ã³ãŒãã¯ã @ lukescottã®ææ¡ã§æ¬¡ã®ããã«ãªããŸãã
func NewClient(...) (*Client, error) {
listener, try err := net.Listen("tcp4", listenAddr)
defer func() {
if err != nil {
listener.Close()
}
}()
conn, try err := ConnectionManager{}.connect(server, tlsConfig)
defer func() {
if err != nil {
conn.Close()
}
}()
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
try err = toServer.Send(&client.serverConfig)
try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
session, try err := communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
catch:
return nil, err
}
59è¡ãã47è¡ã«ãªããŸãã
ããã¯åãé·ãã§ããã defer
ã䜿çšãããããå°ãæ確ã ãšæããŸãã
func NewClient(...) (*Client, error) {
var openedListener, openedConn bool
listener, try err := net.Listen("tcp4", listenAddr)
openedListener = true
conn, try err := ConnectionManager{}.connect(server, tlsConfig)
openedConn = true
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
try err = toServer.Send(&client.serverConfig)
try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
session, try err := communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
catch:
if openedConn {
conn.Close()
}
if openedListener {
listener.Close()
}
return nil, err
}
ãã®äŸã¯ãããããdeferifnotnil
ãäœãã§åŸãã»ããç°¡åã§ãããã
ãããããããã®ææ¡ã®å€ããé¢ä¿ããŠããã®ã§ããã°ãããã¯1è¡å
šäœã«æ»ããŸãã
ãµã³ãã«ã³ãŒããå°ãè©ŠããŠã¿ãŸããããä»ã¯try(label) name
ããªã¢ã³ãã«å察ããŠããŸãã è€æ°ã®åã£ãããšãããå Žåã¯ãçŸåšã®if err != nil { ... }
ã·ã¹ãã ã䜿çšããŠãã ããã ã«ã¹ã¿ã ãšã©ãŒã¡ãã»ãŒãžã®èšå®ãªã©ãåºæ¬çã«åãããšãããŠããå Žåã¯ã次ã®ããã«ããããšãã§ããŸãã
func WriteFooBar(w io.Writer) (err error) {
msg := "thing1 went wrong"
_, try err = io.WriteString(w, "foo")
msg = "thing2 went wrong"
_, try err = w.Write([]byte{','})
msg = "thing3 went wrong"
_, try err = io.WriteString(w, "bar")
return nil
catch:
return &CustomError{msg, err}
}
誰ããRubyã䜿çšããããšãããå Žåãããã¯åœŒãã®rescue
æ§æã«ãã䌌ãŠãããããªãããèªãããšæããŸãã
å®è¡ã§ããããšã®1ã€ã¯ã nil
ãåœã®å€ã«ããä»ã®å€ãtrueãšè©äŸ¡ããããšã§ãããã®ããã次ã®ããã«ãªããŸãã
err := doSomething()
if err { return err }
ãããããããå®éã«æ©èœãããã©ããã¯ããããŸãããããã¯ãæ°æåãåãã ãã§ãã
ç§ã¯å€ãã®ããšãã¿ã€ããã¹ããŸãããã != nil
ã¿ã€ããã¹ããããšã¯ãªããšæããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãtrue / falseã«ããããšã«ã€ããŠã¯åã«èª¬æããŸãããããã©ã°ã®ãããã°ãããäžè¬çã«ãªããšèšããŸããã
verbose := flag.Bool("v", false, "verbose logging")
flag.Parse()
if verbose { ... } // should be *verbose!
@carlmjohnson ãäžèšã®äŸã§ã¯ãããããŒãã¹ã³ãŒããæ£åšãããšã©ãŒã¡ãã»ãŒãžããããŸãããããã¯ç§ã«ã¯å°ãå¥åŠã§ãã ãããã®æååããã©ãŒãããããå¿ èŠãããå Žåã¯ãåé¡ãçºçãããã©ããã«é¢ä¿ãªããå€ãã®äœåãªäœæ¥ãè¡ã£ãŠããŸãã
func (f *foo) WriteFooBar(w io.Writer) (err error) {
msg := fmt.Sprintf("While writing %s, thing1 went wrong", f.foo)
_, try err = io.WriteString(w, f.foo)
msg = fmt.Sprintf("While writing %s, thing2 went wrong", f.separator)
_, try err = w.Write(f.separator)
msg = fmt.Sprintf("While writing %s, thing3 went wrong", f.bar)
_, try err = io.WriteString(w, f.bar)
return nil
catch:
return &CustomError{msg, err}
}
@ object88 ãSSAåæã¯ãç¹å®ã®å²ãåœãŠã䜿çšãããŠããªããã©ãããå€æããå¿ èŠããªãå Žåã¯çºçããªãããã«åé 眮ã§ããã¯ãã ãšæããŸãïŒæ¥œèŠ³çãããŸããïŒïŒã ãããæ¬åœãªããããã¯å¹ççã§ããã¯ãã§ãïŒ
func (f *foo) WriteFooBar(w io.Writer) (err error) {
var format string, args []interface{}
msg = "While writing %s, thing1 went wrong",
args = []interface{f.foo}
_, try err = io.WriteString(w, f.foo)
format = "While writing %s, thing2 went wrong"
args = []interface{f.separator}
_, try err = w.Write(f.separator)
format = "While writing %s, thing3 went wrong"
args = []interface{f.bar}
_, try err = io.WriteString(w, f.bar)
return nil
catch:
msg := fmt.Sprintf(format, args...)
return &CustomError{msg, err}
}
ããã¯åæ³ã§ããïŒ
func Foo() error {
catch:
try _ = doThing()
return nil
}
doThing()
ãnilãè¿ããŸã§ã«ãŒãããã¯ãã§ãããããã§ãªãå Žåã¯çŽåŸã§ããŸãã
@carlmjohnson
ãµã³ãã«ã³ãŒããå°ãè©ŠããŠã¿ãŸããããtryïŒlabelïŒnameããªã¢ã³ãã«å察ããŠããŸãã
ãããæ§æã«ã€ããŠã¯ããããããŸããã§ããã é¢æ°åŒã³åºãã®ããã«èŠããã®ã§ãç§ã¯ããã奜ãã§ã¯ãããŸããã ããããå¥ã®ã©ãã«ãæå®ããããšã®äŸ¡å€ã¯ããããŸããã
ããã¯åæ³ã§ããïŒ
tryã¯è»¢éå°çšã§ããå¿ èŠãããããããã¯ãããšèšããŸãã ããªããããããããã®ãªããç§ã¯ããªãããã®ããã«ãããããå¿ èŠããããšèšãã§ãããïŒ
func Foo() error {
tryAgain:
if err := doThing(); err != nil {
goto tryAgain
}
return nil
}
ãŸãã¯ãã®ããã«ïŒ
func Foo() error {
for doThing() != nil {}
return nil
}
@ã¢ã¶ãªã¢ã«
å®è¡ã§ããããšã®1ã€ã¯ãnilãåœã®å€ã«ããä»ã®å€ãtrueãšè©äŸ¡ããããšã§ãããããã£ãŠã次ã®ããã«ãªããŸãã
err := doSomething() if err { return err }
çãããããšã«ã¯äŸ¡å€ããããšæããŸãã ãã ãããã¹ãŠã®ç¶æ³ã§nilã«é©çšããå¿ èŠã¯ãªããšæããŸãã ããããã次ã®ãããªæ°ããã€ã³ã¿ãŒãã§ã€ã¹ãååšããå¯èœæ§ããããŸãã
interface Truthy {
True() bool
}
次ã«ããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããä»»æã®å€ãææ¡ã©ããã«äœ¿çšã§ããŸãã
ããã¯ããšã©ãŒãã€ã³ã¿ãŒãã§ãŒã¹ãå®è£ ããŠããéãæ©èœããŸãã
err := doSomething()
if err { return err }
ããããããã¯æ©èœããŸããïŒ
err := doSomething()
if err == true { return err } // err is not true
ç§ã¯golangãåããŠäœ¿çšããŸããã以äžã®ãããªæ¡ä»¶ä»ãå§ä»»ãå°å ¥ããããšã«ã€ããŠã©ãæããŸããïŒ
func someFunc() error {
errorHandler := delegator(arg1 Arg1, err error) error if err != nil {
// ...
return err // or modifiedErr
}
ret, err := doSomething()
delegate errorHandler(ret, err)
ret, err := doAnotherThing()
delegate errorHandler(ret, err)
return nil
}
å§ä»»è ã¯ãã®ã®ãããªæ©èœã§ãã
return
ã¯return from its caller context
æå³ããŸãã ïŒãªã¿ãŒã³ã¿ã€ãã¯çºä¿¡è
ãšåãã§ããå¿
èŠããããŸãïŒif
å{
ãäžèšã®äŸã§ã¯if err != nil
ãdelegate
ããŒã¯ãŒãã䜿çšããŠçºä¿¡è
ããå§ä»»ããå¿
èŠããããŸãå§ä»»ããããã«delegate
ãçç¥ã§ãããããããŸããããé¢æ°ã®ãããŒãèªã¿ã«ãããããšæããŸãã
ãããŠãããããããã¯ãšã©ãŒåŠçã ãã§ãªããä»ã¯ããããããŸããã
ãã§ãã¯ãè¿œå
result, err := openFile(f);
if err != nil {
log.Println(..., err)
return 0, err
}
ã«ãªããŸã
result, err := openFile(f);
check err
`` `Go
çµæãerrïŒ= openFileïŒfïŒ;
ãšã©ãŒã確èªããŠãã ãã{
log.PrintlnïŒ...ãerrïŒ
}
```Go
reslt, _ := check openFile(f)
// If err is not nil direct return, does not execute the next step.
`` `Go
çµæããšã©ãŒïŒ= openFileïŒfïŒããã§ãã¯{
log.PrintlnïŒ...ãerrïŒ
}
It also attempts simplifying the error handling (#26712):
```Go
result, err := openFile(f);
check !err {
// err is an interface with value nil or holds a nil pointer
// it is unusable
result.C...()
}
ãŸããïŒéå±ãšèŠãªãããããšãããïŒãšã©ãŒåŠçãåçŽåããããšããŸãïŒïŒ21161ïŒã 次ã®ããã«ãªããŸãã
result, err := openFile(f);
check err {
// handle error and return
log.Println(..., err)
}
ãã¡ãããããããããå Žåã¯ã check
代ããã«try
ããã®ä»ã®ããŒã¯ãŒãã䜿çšã§ããŸãã
reslt, _ := try openFile(f)
// If err is not nil direct return, does not execute the next step.
`` `Go
çµæãerrïŒ= openFileïŒfïŒ;
ãšã©ãŒãè©ŠããŠãã ãã{
//ãšã©ãŒãåŠçããŠæ»ããŸã
log.PrintlnïŒ...ãerrïŒ
}
Reference:
A plain idea, with support for error decoration, but requiring a more drastic language change (obviously not for go1.10) is the introduction of a new check keyword.
It would have two forms: check A and check A, B.
Both A and B need to be error. The second form would only be used when error-decorating; people that do not need or wish to decorate their errors will use the simpler form.
1st form (check A)
check A evaluates A. If nil, it does nothing. If not nil, check acts like a return {<zero>}*, A.
Examples
If a function just returns an error, it can be used inline with check, so
```Go
err := UpdateDB() // signature: func UpdateDb() error
if err != nil {
return err
}
ã«ãªããŸã
check UpdateDB()
è€æ°ã®æ»ãå€ãæã€é¢æ°ã®å ŽåãçŸåšã®ããã«å²ãåœãŠãå¿ èŠããããŸãã
a, b, err := Foo() // signature: func Foo() (string, string, error)
if err != nil {
return "", "", err
}
// use a and b
ã«ãªããŸã
a, b, err := Foo()
check err
// use a and b
2çªç®ã®ãã©ãŒã ïŒãã§ãã¯AãBïŒ
ãã§ãã¯AãBã¯Aãè©äŸ¡ããŸããnilã®å ŽåãäœãããŸããã nilã§ãªãå Žåããã§ãã¯ã¯ãªã¿ãŒã³ã®ããã«æ©èœããŸã{
ããã¯ããšã©ãŒãè£ é£Ÿããããã®ãã®ã§ãã åŒãç¶ãAããã§ãã¯ããŸãããæé»ã®ãªã¿ãŒã³ã§äœ¿çšãããã®ã¯Bã§ãã
äŸ
a, err := Bar() // signature: func Bar() (string, error)
if err != nil {
return "", &BarError{"Bar", err}
}
ã«ãªããŸã
a, err := Foo()
check err, &BarError{"Bar", err}
ããŒã
ã³ã³ãã€ã«ãšã©ãŒã§ã
ãšã©ãŒãšè©äŸ¡ãããªããã®ã«ã¯ãã§ãã¯ã¹ããŒãã¡ã³ãã䜿çšããŸã
{type} *ã®åœ¢åŒã§ã¯ãªãæ»ãå€ãæã€é¢æ°ã§checkã䜿çšããŸãããšã©ãŒ
2ã€ã®åŒã®ãã©ãŒã ãã§ãã¯AãBãç絡ããŠããŸãã Aãnilã®å ŽåãBã¯è©äŸ¡ãããŸããã
å®çšæ§ã«é¢ãã泚æ
ãšã©ãŒã®è£
食ã¯ãµããŒããããŠããŸãããå®éã«ãšã©ãŒãè£
食ããå¿
èŠãããå Žåã«ã®ã¿ãããäžæ Œå¥œãªãã§ãã¯AãBæ§æã®æéãæ¯æããŸãã
if err != nil { return nil, nil, err }
ãã€ã©ãŒãã¬ãŒãïŒéåžžã«äžè¬çã§ãïŒã®å Žåããã§ãã¯errã¯ãæ確ããç ç²ã«ããããšãªããå¯èœãªéãçãããŸãïŒä»¥äžã®æ§æã«é¢ãã泚èšãåç
§ïŒã
æ§æã«é¢ãã泚æ
ãã®çš®ã®æ§æïŒè¡ã®å
é ã§ããªã¿ãŒã³ãšåæ§ã«ãã§ãã¯ïŒã¯ãæé»ã®ãªã¿ãŒã³ã«ãã£ãŠçããå¶åŸ¡ãããŒã®äžæãé ãããšãªãããã€ã©ãŒãã¬ãŒãã®ãšã©ãŒãã§ãã¯ãæé€ããããã®è¯ãæ¹æ³ã§ãããšç§ã¯äž»åŒµããŸãã
ã®ãããªã¢ã€ãã¢ã®æ¬ ç¹
ãã§ãã¯ã¹ããŒãã¡ã³ãã¯åžžã«çŸåšã®ãããã¯ã®æäžäœã«ãããå¶åŸ¡ãããŒãå€æŽããä»ã®ã¹ããŒãã¡ã³ããšåãããã«ç®ç«ã¡ãŸãïŒããšãã°ãæ©æãªã¿ãŒã³ïŒã
ããã«å¥ã®èãããããŸãã
ã©ãã«ä»ãã®ãã¯ããå®çŸ©ããagain
ã¹ããŒãã¡ã³ããæ³åããŠã¿ãŠãã ããã ãããã©ãã«ä»ãããã¹ããŒãã¡ã³ãã¹ããŒãã¡ã³ãã¯ãé¢æ°ã®åŸåã§ããã¹ã眮æã«ãã£ãŠå床å±éã§ããŸãïŒconst / iotaã圷圿ãšãããgotoã®è²åãïŒ-]ïŒã
äŸãã°ïŒ
func(foo int) (int, error) {
err := f(foo)
again check:
if err != nil {
return 0, errors.Wrap(err)
}
err = g(foo)
check
x, err := h()
check
return x, nil
}
ãšãŸã£ããåãã§ãïŒ
func(foo int) (int, error) {
err := f(foo)
if err != nil {
return 0, errors.Wrap(err)
}
err = g(foo)
if err != nil {
return 0, errors.Wrap(err)
}
x, err := h()
if err != nil {
return 0, errors.Wrap(err)
}
return x, nil
}
ãã¯ãå±éã«ã¯åŒæ°ããªãããšã«æ³šæããŠãã ãããããã¯ãã³ã³ãã€ã©ãããèªäœã§ã·ã³ãã«ã奜ãŸãªãããããã¯ãã§ãããšããäºå®ã«ã€ããŠã®æ··ä¹±ãå°ãªããªãããšãæå³ããŸãã
gotoã¹ããŒãã¡ã³ããšåæ§ã«ãã©ãã«ã®ã¹ã³ãŒãã¯çŸåšã®é¢æ°å ã«ãããŸãã
é¢çœãã¢ã€ãã¢ã ãã£ããã©ãã«ã®ã¢ã€ãã¢ã¯æ°ã«å
¥ããŸããããGoã¹ã³ãŒãã«ã¯é©ããŠããªããšæããŸãïŒçŸåšã®Goã§ã¯ãã¹ã³ãŒãã«æ°ããå€æ°ãå®çŸ©ãããã©ãã«ãgoto
ããããšã¯ã§ããŸããïŒã again
ã¢ã€ãã¢ã¯ãæ°ããã¹ã³ãŒããå°å
¥ãããåã«ã©ãã«ã衚瀺ãããããããã®åé¡ãä¿®æ£ããŸãã
ãããåã³ã¡ã¬ã®äŸã§ãïŒ
func NewClient(...) (*Client, error) {
var (
err error
listener net.Listener
conn net.Conn
)
catch {
if conn != nil {
conn.Close()
}
if listener != nil {
listener.Close()
}
return nil, err
}
listener, try err = net.Listen("tcp4", listenAddr)
conn, try err = ConnectionManager{}.connect(server, tlsConfig)
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
try err = toServer.Send(&client.serverConfig)
try err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
session, try err := communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
}
ããã¯Rogã®ææ¡ã«è¿ãããŒãžã§ã³ã§ãïŒç§ã¯ãããããŸã奜ãã§ã¯ãããŸããïŒïŒ
func NewClient(...) (*Client, error) {
var (
err error
listener net.Listener
conn net.Conn
)
again:
if err != nil {
if conn != nil {
conn.Close()
}
if listener != nil {
listener.Close()
}
return nil, err
}
listener, err = net.Listen("tcp4", listenAddr)
check
conn, err = ConnectionManager{}.connect(server, tlsConfig)
check
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
err = toServer.Send(&client.serverConfig)
check
err = toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
check
session, err := communicationProtocol.FinalProtocol(conn)
check
client.session = session
return client, nil
}
@carlmjohnsonèšé²ã®ããã«ãããã¯ç§ãææ¡ããŠããããšã§ã¯ãããŸããã ãcheckãèå¥åã¯ç¹å¥ãªãã®ã§ã¯ãããŸããããagainãããŒã¯ãŒãã®åŸã«ââ眮ãããšã§å®£èšããå¿ èŠããããŸãã
ãŸããäžèšã®äŸã¯ãã®äœ¿çšæ³ãããŸã説æããŠããªãããšããå§ãããŸããäžèšã®å床ã©ãã«ä»ããããã¹ããŒãã¡ã³ãã«ã¯ãdeferã¹ããŒãã¡ã³ãã§åæ§ã«å®è¡ã§ããªãã£ããã®ã¯ãããŸããã try / catchã®äŸã§ã¯ããã®ã³ãŒãã¯ïŒããšãã°ïŒãšã©ãŒãªã¿ãŒã³ã®ãœãŒã¹ã®å Žæã«é¢ããæ å ±ã§ãšã©ãŒãã©ããããããšã¯ã§ããŸããã ãŸãããããã®ifã¹ããŒãã¡ã³ãã®1ã€ã«ãtryããè¿œå ããå ŽåïŒããšãã°ãGetRuntimeEnvironmentã«ãã£ãŠè¿ããããšã©ãŒããã§ãã¯ããããïŒãcatchã¹ããŒãã¡ã³ãã«ãã£ãŠåç §ããããerrãã¯ãããšã¯ç°ãªãã¹ã³ãŒãã«ãããããAFAICSã¯æ©èœããŸããããããã¯å ã§å®£èšãããŠããŸãã
check
ããŒã¯ãŒãã«é¢ããç§ã®å¯äžã®åé¡ã¯ãé¢æ°ãžã®ãã¹ãŠã®åºå£ãreturn
å¿
èŠãããããšã ãšæããŸãïŒãŸãã¯ãå°ãªããšããé¢æ°ãé¢ããããšããæå³ããããŸãïŒã become
ïŒTCOã®å ŽåïŒãååŸããå¯èœæ§ããããŸããå°ãªããšãbecome
ã¯ãããçš®ã®ãå¥ã®é¢æ°ã«ãªãã€ã€ãããŸããããããŸã...ããããããã§ãã¯ããšããèšèã¯å®éã«ã¯æ¬¡ã®ããã«ã¯èãããŸãããé¢æ°ã®åºå£ã«ãªããŸãã
é¢æ°ã®åºå£ç¹ã¯éåžžã«éèŠã§ããã check
æ¬åœã«ãã®ãåºå£ç¹ãã®æèŠãæã£ãŠãããã©ããã¯ããããŸããã ãã以å€ã¯ã check
æ©èœã®ã¢ã€ãã¢ãæ¬åœã«æ°ã«å
¥ã£ãŠããŸããããã«ãããã¯ããã«ã³ã³ãã¯ããªãšã©ãŒåŠçãå¯èœã«ãªããŸãããããã§ãåãšã©ãŒãç°ãªãæ¹æ³ã§åŠçãããããšã©ãŒãåžæã©ããã«ã©ãããããã§ããŸãã
ææ¡ãè¿œå ã§ããŸããïŒ
ãã®ãããªãã®ã¯ã©ãã§ããïŒ
func Open(filename string) os.File onerror (string, error) {
f, e := os.Open(filename)
if e != nil {
fail "some reason", e // instead of return keyword to go on the onerror
}
return f
}
f := Open(somefile) onerror reason, e {
log.Prinln(reason)
// try to recover from error and reasign 'f' on success
nf = os.Create(somefile) onerror err {
panic(err)
}
return nf // return here must return whatever Open returns
}
ãšã©ãŒã®å²ãåœãŠã¯ãã©ããªåœ¢ã§ãããŸããŸããã
f := Open(name) =: e
ãŸãã¯ããšã©ãŒã ãã§ãªããšã©ãŒãçºçããå Žåã¯ãå¥ã®å€ã®ã»ãããè¿ããŸãããŸããtrycatchãããã¯ã䟿å©ã§ãã
try {
f := Open("file1") // can fail here
defer f.Close()
f1 := Open("file2") // can fail here
defer f1.Close()
// do something with the files
} onerror err {
log.Println(err)
}
@cthackersç§ã¯å人çã«ãGoã®ãšã©ãŒãç¹å¥ãªæ±ããåããªãã®ã¯ãšãŠãè¯ãããšã ãšä¿¡ããŠããŸãã ãããã¯åãªã䟡å€èŠ³ã§ããããã®ããã«ãšã©ãŸãã¹ãã ãšæããŸãã
ãŸããtry-catchïŒããã³åæ§ã®æ§æïŒã¯ãæªãæ £è¡ãå©é·ããæªãæ§æã®åšãã«ãããŸãã ãã¹ãŠã®ãšã©ãŒã¯ãããã£ãããªãŒã«ããšã©ãŒãã³ãã©ãŒã§ã¯ãªããåå¥ã«åŠçããå¿ èŠããããŸãã
https://go.googlesource.com/proposal/+/master/design/go2draft-error-handling-overview.md
ããã¯è€éãããŸãã
ç§ã®èãïŒ |err|
ã¯ãã§ãã¯ãšã©ãŒãæå³ããŸãïŒif errïŒ= nil {}
// common util func
func parseInt(s string) (i int64, err error){
return strconv.ParseInt(s, 10, 64)
}
// expression check err 1 : check and use err variable
func parseAndSum(a string ,b string) (int64,error) {
sum := parseInt(a) + parseInt(b) |err| return 0,err
return sum,nil
}
// expression check err 2 : unuse variable
func parseAndSum(a string , b string) (int64,error) {
a,err := parseInt(a) |_| return 0, fmt.Errorf("parseInt error: %s", a)
b,err := parseInt(b) |_| { println(b); return 0,fmt.Errorf("parseInt error: %s", b);}
return a+b,nil
}
// block check err
func parseAndSum(a string , b string) ( int64, error) {
{
a := parseInt(a)
b := parseInt(b)
return a+b,nil
}|err| return 0,err
}
@ chen56ããã³ä»åŸã®ãã¹ãŠã®ã³ã¡ã³ãhttps ïŒ //go.googlesource.com/proposal/+/master/design/go2draft.mdãåç §ããŠãã ããã
ããã¯çŸåšãã®ã¹ã¬ãããå»æ¢ããŠãããšæãããããã§ç¶è¡ããæå³ã¯ã»ãšãã©ãããŸããã Wikiãã£ãŒãããã¯ããŒãžã¯ãããããå°æ¥çã«ç©äºãé²ãã¹ãå Žæã§ãã
Go 2ææ¡ã䜿çšããã¡ã¬ã®äŸïŒ
func NewClient(...) (*Client, error) {
var (
listener net.Listener
conn net.Conn
)
handle err {
if conn != nil {
conn.Close()
}
if listener != nil {
listener.Close()
}
return nil, err
}
listener = check net.Listen("tcp4", listenAddr)
conn = check ConnectionManager{}.connect(server, tlsConfig)
if forwardPort == 0 {
env, err := environment.GetRuntimeEnvironment()
if err != nil {
log.Printf("not forwarding because: %v", err)
} else {
forwardPort, err = env.PortToForward()
if err != nil {
log.Printf("env couldn't provide forward port: %v", err)
}
}
}
var forwardOut *forwarding.ForwardOut
if forwardPort != 0 {
u, _ := url.Parse(fmt.Sprintf("http://127.0.0.1:%d", forwardPort))
forwardOut = forwarding.NewOut(u)
}
client := &Client{...}
toServer := communicationProtocol.Wrap(conn)
check toServer.Send(&client.serverConfig)
check toServer.Send(&stprotocol.ClientProtocolAck{ClientVersion: Version})
session := check communicationProtocol.FinalProtocol(conn)
client.session = session
return client, nil
}
ããã¯ç§ãã¡ãæãããšãã§ããã»ã©ãããã ãšæããŸãã handle
ãããã¯ã«ã¯ã again
ã©ãã«ãŸãã¯Rubyã®rescue
ããŒã¯ãŒãã®åªããå質ããããŸãã ç§ã®é ã«æ®ã£ãŠããå¯äžã®è³ªåã¯ãå¥èªç¹ãŸãã¯ããŒã¯ãŒãïŒç§ã¯ããŒã¯ãŒãã ãšæããŸãïŒã䜿çšãããã©ããããããŠãšã©ãŒãè¿ããã«ãšã©ãŒãååŸã§ãããã©ããã§ãã
ç§ã¯ææ¡ãç解ããããšããŠããŸã-é¢æ°ã®å®è¡ããã»ã¹å šäœã§ããŸããŸãªãšã©ãŒã«å¯ŸããŠããŸããŸãªå¿çãäœæããæ©èœã§ã¯ãªããããã¯æ¬åœã®åŒ±ç¹ã®ããã§ãã
ãŸããã·ã¹ãã ã§ãã¹ãããŒãã¹ãéçºãããšããé倧ãªå¿ èŠæ§ãèŠèœãšããŠããã®ã§ã¯ãªãããšæããŸãã ãã¹ãäžã«ãšã©ãŒãã¹ãã©ã®ããã«å®è¡ããããæ€èšããããšãè°è«ã®äžéšã«ãªãã¯ãã§ããããããããããŸããã
@sdwarwickhttpsïŒ//go.googlesource.com/proposal/+/master/design/go2draft-error-handling.mdã§èª¬æãããŠããèšèšãã©ããã«ã€ããŠè°è«ããã®ã«æé©ãªå Žæã§ã¯ãªããšæããŸãã ããè¯ãã¢ãããŒãã¯ã httpsïŒ//github.com/golang/go/wiki/Go2ErrorHandlingFeedbackã®wikiããŒãžã«èšäºãžã®ãªã³ã¯ãè¿œå ããããšã§ãã
ãšã¯èšããã®ã®ããã®èšèšãã©ããã§ã¯ãé¢æ°å ã«è€æ°ã®ãã³ãã«ãããã¯ãèš±å¯ãããŠããŸãã
ãã®åé¡ã¯ãå ·äœçãªææ¡ãšããŠå§ãŸããŸããã ãã®ææ¡ãæ¡çšããã€ããã¯ãããŸããã ãã®åé¡ã«ã€ããŠã¯å€ãã®çŽ æŽãããè°è«ããããŸããã人ã ãè¯ãã¢ã€ãã¢ãå¥ã ã®ææ¡ã«åŒãåºããæè¿ã®èšèšæ¡ã«ã€ããŠè°è«ããããšãé¡ã£ãŠããŸãã ãã®åé¡ã解決ããŸãã ãã¹ãŠã®è°è«ã«æè¬ããŸãã
ãããã®äŸã®ã»ããã§è©±ãå ŽåïŒ
r, err := os.Open(src)
if err != nil {
return err
}
ã»ãŒäžè¡ã§æžããããšæããŸãã
r, err := os.Open(src) try ("blah-blah: %v", err)
ãè©ŠããŠã¿ããã®ä»£ããã«ãçŸããé©åãªèšèãå ¥ããŠãã ããã
ãã®ãããªæ§æã§ã¯ããšã©ãŒãè¿ãããæ®ãã¯ã¿ã€ãã«å¿ããŠããã€ãã®ããã©ã«ãå€ã«ãªããŸãã ããã©ã«ãã§ã¯ãªãããšã©ãŒããã®ä»ã®ç¹å®ã®ãã®ãäžç·ã«è¿ãå¿ èŠãããå ŽåãåŸæ¥ã®ããè€æ°è¡ã®ãªãã·ã§ã³ããã£ã³ã»ã«ãã人ã¯èª°ãããŸããã
ããã«çãéïŒããçš®ã®ãšã©ãŒåŠçãè¿œå ããã«ïŒïŒ
r, err := os.Open(src) try
ïŒã
PSãã¿ãŸããè±èªïŒïŒ
ç§ã®å€çš®ïŒ
func CopyFile(src, dst string) string, error {
r := check os.Open(src) // return nil, error
defer r.Close()
// if error: run 1 defer and retun error message
w := check os.Create(dst) // return nil, error
defer w.Close()
// if error: run 2, 1 defer and retun error message
if check io.Copy(w, r) // return nil, error
}
func StartCopyFile() error {
res := check CopyFile("1.txt", "2.txt")
return nil
}
func main() {
err := StartCopyFile()
if err!= nil{
fmt.printLn(err)
}
}
ããã«ã¡ã¯ã
ç§ã¯åçŽãªèããæã£ãŠããŸããããã¯ãæåã®ææ¡ãšåãããã«ãã·ã§ã«ã§ãšã©ãŒåŠçãã©ã®ããã«æ©èœãããã«å€§ãŸãã«åºã¥ããŠããŸãã ã·ã§ã«ã§ã¯ããšã©ãŒã¯ãŒãã«çãããªãæ»ãå€ã«ãã£ãŠäŒéãããŸãã æåŸã®ã³ãã³ã/åŒã³åºãã®æ»ãå€ã¯$ïŒã«æ ŒçŽãããŸãã ã·ã§ã«ã§ã ãŠãŒã¶ãŒãæå®ããå€æ°åã«å ããŠãææ°ã®åŒã³åºãã®ãšã©ãŒå€ãäºåå®çŸ©ãããå€æ°ã«èªåçã«æ ŒçŽããäºåå®çŸ©ãããæ§æã§ãã§ãã¯ã§ããããã«ããããšãã§ããŸãã ç§ãéžãã ïŒ çŸåšã®ã¹ã³ãŒãã®é¢æ°åŒã³åºãããè¿ãããææ°ã®ãšã©ãŒå€ãåç
§ããããã®æ§æãšããŠã ç§ãéžãã ïŒ ifã®çç¥åœ¢ãšããŠïŒ ïŒ= nil {}ã ã®éžæïŒ ã·ã§ã«ã®åœ±é¿ãåããŸãããããã¯çã«ããªã£ãŠããããã«èŠããããã§ãã ãšã©ãŒãçºçããå Žåãåœç¶ãäœãèµ·ãã£ããã«é¢å¿ããããŸãã ããã¯çåãæããããŠããŸãã ïŒ ã¯æèµ·ããã質åã®äžè¬çãªå
åã§ãããããåãã¹ã³ãŒãã§çæãããææ°ã®ãšã©ãŒå€ãåç
§ããããã«äœ¿çšããŸãã
ïŒ ifïŒã®çç¥åœ¢ãšããŠäœ¿çšãããŸã ïŒ= nilãäœããããŸããããªãã£ãå Žåã«æ³šæãæãå¿
èŠãããããšãæå³ããããã ïŒ ã€ãŸããäœãåé¡ãçºçããå Žåã¯ããããå®è¡ããŠãã ããã ïŒ ææ°ã®ãšã©ãŒå€ãåç
§ããŸãã ãã€ãã®ããã«ïŒã®å€ãšã©ãŒããªãã£ãå Žåã¯nilã«ãªããŸãã
val, err := someFunc(param)
! { return &SpecialError("someFunc", param, ?) }
æ§æãããé
åçã«ããããã«ãïŒãé
眮ããããšãèš±å¯ããŸãã åŒã³åºãã®ããåŸãã«ç·ãåŒããäžæ¬åŒ§ãçç¥ããŸãã
ãã®ææ¡ã䜿çšãããšãããã°ã©ããŒå®çŸ©ã®èå¥åã䜿çšããã«ãšã©ãŒãåŠçããããšãã§ããŸãã
ããã¯èš±å¯ãããŸãïŒ
val, _ := someFunc(param)
! return &SpecialError("someFunc", param, ?)
ããã¯èš±å¯ãããŸã
val, _ := someFunc(param) ! return &SpecialError("someFunc", param, ?)
ãã®ææ¡ã§ã¯ããšã©ãŒãçºçãããšãã«é¢æ°ããæ»ãå¿
èŠã¯ãããŸããã
代ããã«ããšã©ãŒããã®å埩ãè©Šã¿ãããšãã§ããŸãã
val, _ := someFunc(param)
! {
val, _ := someFunc(paramAlternative)
!{ return &SpecialError("someFunc alternative try failed too", paramAlternative, ?) }}
ãã®ææ¡ã®äžã§ããªãã¯äœ¿ãããšãã§ããŸãïŒ ãã®ãããªè€æ°ã®åè©Šè¡ã®forã«ãŒãã§ã
val, _ := someFunc(param)
for i :=0; ! && i <5; i++ {
// Sleep or make a change or both
val, _ := someFunc(param)
} ! { return &SpecialError("someFunc", param, ? }
ç§ã¯ãããç¥ã£ãŠããŸãïŒ ã¯äž»ã«åŒã®åŠå®ã«äœ¿çšããããããææ¡ãããæ§æã¯ãåå¿è ã«æ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸãã ã¢ã€ãã¢ã¯ããã§ãïŒ ããèªäœãã«æ¡åŒµããŸããïŒ ïŒ= nilã¯ãäžèšã®äŸã®ããã«æ¡ä»¶åŒã§äœ¿çšãããç¹å®ã®åŒã«é¢é£ä»ããããŠããªãå Žåã«äœ¿çšãããŸãã è¡ã®äžéšã¯ãã³ã³ããã¹ããªãã§ã¯æå³ããªããããçŸåšã®goã§ã¯ã³ã³ãã€ã«ã§ããŸããã ãã®ææ¡ã®äžã§ïŒ ææ°ã®é¢æ°åŒã³åºãã§ãšã©ãŒãçºçããå Žåãããèªäœãtrueã§ããããšã©ãŒãè¿ãå¯èœæ§ããããŸãã
ä»ã®äººãããã§ã³ã¡ã³ãããããã«ãé¢æ°ãã©ãã«æ»ãããäžç®ã§ç¢ºèªããããšãæãŸããããããšã©ãŒãè¿ãããã®returnã¹ããŒãã¡ã³ãã¯ä¿æãããŸãã ãã®æ§æã¯ããšã©ãŒã«ãã£ãŠé¢æ°ãçµäºããå¿ èŠããªãã·ããªãªã§äœ¿çšã§ããŸãã
ãã®ææ¡ã¯ãä»ã®èšèªã§ç¥ãããŠããæ§æã®ãããªtry and catchãããã¯ã®å€åœ¢ãäœæããåªåããªããããä»ã®ããã€ãã®ææ¡ãããåçŽã§ãã ããã¯ããšã©ãŒãçºçããå Žæã§ãšã©ãŒãçŽæ¥åŠçãããšããgoã®çŸåšã®å²åŠãç¶æãããšã©ãŒãããç°¡æœã«ããŸãã
@tobimenschã¯ãèŠç¹ã«æ°ããææ¡ãæçš¿ããGo2ãšã©ãŒåŠçãã£ãŒãããã¯ãŠã£ãã«ãªã³ã¯ããŠãã ããã ãã®ã¯ããŒãºãããåé¡ã«é¢ããæçš¿ã¯èŠèœãšãããå¯èœæ§ããããŸãã
ãŸã ã芧ã«ãªã£ãŠããªãå Žåã¯ã Go2ãšã©ãŒåŠçãã©ãããã¶ã€ã³ããèªã¿ãã ããã
ãŸãã Go2ãšã©ãŒåŠçã§èæ ®ãã¹ã
ææããã«ã¯å°ãé
ããããããããŸããããJavaScriptã®éæ³ã®ããã«æãããã®ã¯äœã§ãç§ãæ©ãŸããŸãã ç§ã¯||
æŒç®åã«ã€ããŠè©±ããŠããã®ã§ãããããã¯ã©ããããããerror
é¢ã§éæ³ã®ããã«æ©èœããã¯ãã§ãã ç§ã¯ããã奜ãã§ã¯ãããŸããã
æãåèã«ãªãã³ã¡ã³ã
ãšã©ãŒè£ 食ããµããŒãããŠããããããå€§å¹ ãªèšèªå€æŽãå¿ èŠãªïŒæããã«go1.10ã§ã¯ãªãïŒåçŽãªã¢ã€ãã¢ã¯ãæ°ãã
check
ããŒã¯ãŒãã®å°å ¥ã§ããcheck A
ãšcheck A, B
2ã€ã®åœ¢åŒã«ãªããŸããã©ã¡ãã
A
ãšB
ããå¿ èŠãerror
ã 2çªç®ã®åœ¢åŒã¯ããšã©ãŒãè£ é£Ÿããå Žåã«ã®ã¿äœ¿çšãããŸãã ãšã©ãŒãè£ é£Ÿããå¿ èŠããªãããŸãã¯è£ 食ããããªã人ã¯ãããåçŽãªåœ¢åŒã䜿çšããŸãã第1圢æ ïŒãã§ãã¯AïŒ
check A
ã¯A
è©äŸ¡ããŸããnil
å ŽåãäœãããŸãããnil
ã§ãªãå Žåãcheck
ã¯return {<zero>}*, A
ãŸããäŸ
check
ãšã€ã³ã©ã€ã³ã§äœ¿çšã§ãããããã«ãªããŸã
ã«ãªããŸã
2çªç®ã®ãã©ãŒã ïŒãã§ãã¯AãBïŒ
check A, B
ã¯A
è©äŸ¡ããŸããnil
å ŽåãäœãããŸãããnil
ã§ãªãå Žåãcheck
ã¯return {<zero>}*, B
ãŸããããã¯ããšã©ãŒãè£ é£Ÿããããã®ãã®ã§ãã åŒãç¶ã
A
ãã§ãã¯ããŸãããæé»ã®return
䜿çšãããã®ã¯B
ã§ããäŸ
ã«ãªããŸã
ããŒã
ã³ã³ãã€ã«ãšã©ãŒã§ã
error
è©äŸ¡ãããªããã®ã«ã¯ãcheck
ã¹ããŒãã¡ã³ãã䜿çšããŸã{ type }*, error
圢åŒã§ã¯ãªãæ»ãå€ãæã€é¢æ°ã§check
ã䜿çšããŸã2ã€ã®expr圢åŒã®
check A, B
ãç絡ããŠããŸããB
A
ãnil
å ŽåãB
ã¯è©äŸ¡ãããŸãããå®çšæ§ã«é¢ãã泚æ
ãšã©ãŒã®è£ 食ã¯ãµããŒããããŠããŸãããå®éã«ãšã©ãŒãè£ é£Ÿããå¿ èŠãããå Žåã«ã®ã¿ãããäžæ Œå¥œãª
check A, B
æ§æã®æéãæ¯æããŸããif err != nil { return nil, nil, err }
ãã€ã©ãŒãã¬ãŒãïŒããã¯éåžžã«äžè¬çã§ãïŒã®å Žåãcheck err
ã¯ãæ確ããç ç²ã«ããããšãªããå¯èœãªéãç°¡æœã«ãªããŸãïŒä»¥äžã®æ§æã«é¢ãã泚èšãåç §ïŒãæ§æã«é¢ãã泚æ
ãã®çš®ã®æ§æïŒ
check ..
ãè¡ã®å é ãreturn
ãšåæ§ïŒã¯ãå¶åŸ¡ãããŒã®äžæãé ãããšãªãããã€ã©ãŒãã¬ãŒãã®ãšã©ãŒãã§ãã¯ãæé€ããããã®è¯ãæ¹æ³ã§ãããšç§ã¯äž»åŒµããŸããæé»ã®ãªã¿ãŒã³ãå°å ¥ãããŸããäžèšã®
<do-stuff> || <handle-err>
ã<do-stuff> catch <handle-err>
ããŸãã¯å¥ã®ã¹ã¬ããã§ææ¡ãããa, b = foo()?
ãããªã¢ã€ãã¢ã®æ¬ ç¹ã¯ããããŒãå°é£ã«ããæ¹æ³ã§å¶åŸ¡ãããŒã®å€æŽãé衚瀺ã«ããããšã§ãããã©ããŒãã; åè ã¯ãä»ã®ç¹ã§ã¯ããããããè¡ã®æåŸã«|| <handle-err>
æ©æ¢°ãè¿œå ãããåŸè ã¯ãã³ãŒãã®ããããããè¡ã®äžå€®ãšæåŸãå«ããã©ãã«ã§ã衚瀺ã§ããå°ããªèšå·ãä»ããŠããŸããããããè€æ°åãcheck
ã¹ããŒãã¡ã³ãã¯åžžã«çŸåšã®ãããã¯ã®æäžäœã«ãããå¶åŸ¡ãããŒãå€æŽããä»ã®ã¹ããŒãã¡ã³ããšåãããã«ç®ç«ã¡ãŸãïŒããšãã°ãåæã®return
ïŒã