ããã¯ãçµæã¿ã€ããGoã«è¿œå ããããã®ææ¡ã§ãã çµæã¿ã€ãã«ã¯éåžžãæ»ãå€ãŸãã¯ãšã©ãŒã®ãããããå«ãŸããGoããã°ã©ã å
šäœã«éåšããäžè¬çãª(value, err)
ãã¿ãŒã³ã®ãã¡ãŒã¹ãã¯ã©ã¹ã®ã«ãã»ã«åãæäŸã§ããŸãã
ãã®ãããªãã®ã以åã«æåºãããããšãããå Žåã¯ãè©«ã³ããŸãããããŸãããã°ãããã¯ã¢ã€ãã¢ã®ããªãå æ¬çãªèšè¿°ã§ãã
ãã®ã¢ã€ãã¢ã®èæ¯ã¯ãGoã§ã®
ãšã¯èšããã®ã®ãç§ã¯ãGo 2ãã©ãã«ãèªå·±é©çšããŠããŸããããã¯ããããé倧ãªå€æŽã§ããããã§ã¯ãªããç©è°ãéžããã®ã§ãããããçšåºŠãèšèªã®ç²åºŠã«åãããã®ã«ãªããšäºæ³ããŠããããã§ãã
Rust Resultã¿ã€ãã¯ãããã€ãã®åäŸãæäŸããŸãã åæ§ã®ã¢ã€ãã¢ã¯ãHaskellã®Either ãOCamlã®çµæãScalaã®Eitherãªã©ãå€ãã®é¢æ°åèšèªã§èŠã€ããããšãã§ããŸãã Rustã¯ãGoãšãŸã£ããåãããã«ãšã©ãŒã管çããŸãããšã©ãŒã¯åãªãå€ã§ãããéããŒã«ã«ãžã£ã³ãã䜿çšããäŸå€ã®äžæ°å³ãªé éäœçšãšã¯å¯Ÿç §çã«ããšã©ãŒã®ãããªã³ã°ã¯ååŒã³åºããµã€ãã§åŠçãããŸãããšã©ãŒã¿ã€ããå€æãããããšã©ãŒããšã©ãŒãã§ãŒã³ã«ã©ããã
RustãåèšåïŒ Go 2åèšåã®ææ¡ãåç §ïŒãšãžã§ããªãã¯ã¹ã䜿çšããŠçµæåãå®è£ ããå Žåãç¹æ®ãªã±ãŒã¹ã®ã³ã¢èšèªæ©èœãšããŠãGoã®çµæåãå¿ èŠãªããç¹æ®ãªã±ãŒã¹ã®ã³ã³ãã€ã©ãŒããžãã¯ãå©çšã§ãããšæããŸãã ããã«ã¯ãGoã®ã³ã¬ã¯ã·ã§ã³ã¿ã€ããçŸåšäœ¿çšããŠãããããªç¹å¥ãªæ§æãšç¹å¥ãªASTããŒããå«ãŸããŸãã
çµæã¿ã€ããGoã«è¿œå ãããšã次ã®ãããªè¯ãçµæãåŸããããšæããŸãã
if err != nil { return nil, err }
ããã¿ãŒã³ãïŒãŸãã¯ãã®ãã€ããŒãªããªãšãŒã·ã§ã³ïŒã¯ãGoããã°ã©ã ã®ããããšããã«èŠãããŸãã ãã®å®åæã¯äŸ¡å€ãä»å ãããããã°ã©ã ãã¯ããã«é·ãããã®ã«åœ¹ç«ã€ã ãã§ããæåã«ç°¡åãªæ³šæïŒã¢ã€ãã¢ãæ§æã«ãšããããããªãããã«ããŠãã ããã æ§æã¯ãã€ã¯ã·ã§ããããã®ãéåžžã«ç°¡åã§ããããããã®äŸã®ãããã1ã€ã®çã®æ§æãšããŠæ©èœãããšã¯æããªãã®ã§ãããã€ãã®éžæè¢ã瀺ããŸãã
代ããã«ãåé¡ã®äžè¬çãªã圢ãã«æ³šæãæããã¢ã€ãã¢ãããããç解ããããã«ãããã®äŸã ããèŠãŠã»ãããšæããŸãã
åäœããæãç°¡åãªããšïŒæ»ãå€ã¿ãã«ã®åã«ãçµæããè¿œå ããã ãã§ãã
func f1(arg int) result(int, error) {
ããäžè¬çãªã®ã¯ããžã§ããªãã¯ãæ§æã§ãããããã¯ããããGoãå®éã«ãžã§ããªãã¯ãè¿œå ããå Žåã«äºçŽããå¿ èŠããããŸãïŒçµæã¿ã€ãã®æ©èœã¯ããããçºçããå Žåã«ãããã掻çšããããã«é©åãããããšãã§ããŸãïŒã
func f1(arg int) result<int, error> {
çµæãè¿ããšãã¯ãçµæã¿ã€ãã®å€ãŸãã¯ãšã©ãŒãã©ããããæ§æãå¿ èŠã«ãªããŸãã ããã¯ãã¡ãœããã®åŒã³åºãã§ããå¯èœæ§ããããŸãã
return result.Ok(value)
`` `è¡ã
çµæãè¿ããŸããErrïŒãšã©ãŒïŒ
If we allow "result" to be shadowed here, it should avoid breaking any code that already uses "result".
Perhaps "Go 2" could add syntax sugar similar to Rust (although it would be a breaking change, I think?):
```go
return Ok(value)
`` `è¡ã
ErrïŒvalueïŒãè¿ã
### Propagating errors
Rust recently added a `?` operator for propagating errors (see [Rust RFC 243](https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md)). A similar syntax could enable replacing `if err != nil { return _, err }` boilerplate with a shorthand syntax that bubbles the error up the stack.
Here are some prospective examples. I have only done some cursory checking for syntactic ambiguity. Apologies if these are either ambiguous or breaking changes: I assume with a little work you can find a syntax for this which isn't at breaking change.
First, an example with present-day Go syntax:
```go
count, err = fd.Write(bytes)
if err != nil {
return nil, err
}
ããã§ãçµæãæ¶è²»ãããšã©ãŒãã¹ã¿ãã¯ã«ããã«ããæ°ããæ§æãè¿œå ãããŸããã ãããã®äŸã¯èª¬æã®ã¿ãç®çãšããŠããããšã«æ³šæããŠãã ããã
count := fd.Write!(bytes)
`` `è¡ã
countïŒ= fd.WriteïŒbytesïŒïŒ
```go
count := fd.Write?(bytes)
`` `è¡ã
countïŒ= fd.WriteïŒbytesïŒïŒ
```go
count := try(fd.Write(bytes))
泚ïŒRustã¯ä»¥åã¯åŸè ããµããŒãããŠããŸãããããã§ãŒã³åã§ããªããããéåžžã¯Rustããé¢ããŸããã
以éã®ãã¹ãŠã®äŸã§ã¯ããã®æ§æã䜿çšããŸãããããã¯åãªãäŸã§ããããããŸãã§ããããä»ã®åé¡ãããå¯èœæ§ããããç§ã¯ç¢ºãã«ããã«çµå©ããŠããŸããã
count := fd.Write(bytes)!
æ§æææ¡ã¯ãã¹ãŠãã¿ã€ããèå¥ããããã«result
ããŒã¯ãŒãã䜿çšããŸãã å€æ°åãªã©ã®ãçµæãã䜿çšããæ¢åã®ã³ãŒããåé¡ãªããã®ãŸãŸæ©èœãç¶ããããšãå¯èœã«ããã·ã£ããŠã€ã³ã°ã«ãŒã«ãéçºã§ãããšç§ã¯ä¿¡ããŠããŸãïŒããã確ãã§ã¯ãããŸããïŒã
çæ³çã«ã¯ãæ¢åã®ã³ãŒãããã¢ããã°ã¬ãŒããããŠãå®å šã«ã·ãŒã ã¬ã¹ãªæ¹æ³ã§çµæã¿ã€ãã䜿çšã§ããããã«ããå¿ èŠããããŸãã ãããè¡ãããã«ãçµæã2ã¿ãã«ãšããŠæ¶è²»ã§ããããã«ããããšãã§ããŸããã€ãŸãã次ã®ããã«ãªããŸãã
func f1(arg int) result(int, error) {
次ã®ãããããšããŠãããæ¶è²»ããããšãå¯èœã§ããã¯ãã§ãïŒ
result := f1(42)
ãŸãïŒ
(value, err) := f1(42)
ã€ãŸããã³ã³ãã€ã©ãresult(T, E)
ãã(T, E)
ãžã®å²ãåœãŠãæ€åºããå Žåãã³ã³ãã€ã©ã¯èªåçã«åŒ·å¶å€æããå¿
èŠããããŸãã ããã«ãããé¢æ°ãã·ãŒã ã¬ã¹ã«çµæã¿ã€ãã®äœ¿çšã«åãæ¿ããããšãã§ããŸãã
éåžžããšã©ãŒåŠçã¯if err != nil { return _, err }
ãããã¯ããã«è€éã«ãªããŸãã ãããå©ãã«ãªã£ãå¯äžã®ã±ãŒã¹ã§ãããªãã°ããã®ææ¡ã¯ã²ã©ãäžå®å
šã§ãããã
çµæã¿ã€ãã¯ããããããµããŒããããã³ã³ãããŒã¿ãã®ããã«ãé¢æ°åèšèªã§ã®ãšã©ãŒåŠçã®ã¹ã€ã¹ãã€ãã®ãããªãã®ã§ããããšãç¥ãããŠããŸãã å®éããããã®ã³ã³ãããŒã¿ã¯ãçµæã¿ã€ãã«åºã¥ããŠãéåžžã¯ã¯ããŒãžã£ãšã®ãçµã¿åãããã§å€æããéžæçã«åäœããããšãå¯èœã«ããäžé£ã®ã¡ãœããã«ãããŸããã
Then()
ïŒåãçµæã¿ã€ããè¿ãé¢æ°åŒã³åºãããã§ãŒã³ããŸã次ã®ãããªã³ãŒãããã£ããšããŸãããã
resp, err := doThing(a)
if err != nil {
return nil, err
}
resp, err = doAnotherThing(b, resp.foo())
if err != nil {
return nil, err
}
resp, err = FinishUp(c, resp.bar())
if err != nil {
return nil, err
}
çµæã¿ã€ãã䜿çšãããšãã¯ããŒãžã£ããã©ã¡ãŒã¿ãšããŠåãåããçµæãæåããå Žåã«ã®ã¿ã¯ããŒãžã£ãåŒã³åºãé¢æ°ãäœæã§ããŸãããã以å€ã®å Žåã¯ãç絡ããŠãšã©ãŒãè¡šããŸãã ãã®é¢æ°ãThen
ïŒ Goã®and_then
ãšåŒã°ããŸãïŒã ãã®ãããªé¢æ°ã䜿çšãããšãäžèšã®äŸã次ã®ããã«æžãçŽãããšãã§ããŸãã
result := doThing(a).
Then(func(resp) { doAnotherThing(b, resp.foo()) }).
Then(func(resp) { FinishUp(c, resp.bar()) })
if result.isError() {
return result.Error()
}
ãŸãã¯ãäžããææ¡ãããæ§æã®1ã€ã䜿çšããŸãïŒéæ³ã®æŒç®åãšããŠ!
ãéžæããŸãïŒïŒ
final_value := doThing(a).
Then(func(resp) { doAnotherThing(b, resp.foo()) }).
Then(func(resp) { FinishUp(c, resp.bar()) })!
ããã«ãããå ã®äŸã®12è¡ã®ã³ãŒãã3è¡ã«æžããå®éã«æ±ããŠããæçµçãªå€ãæ®ããçµæã®åèªäœãç»åããåé€ãããŸãã ãã®å Žåãçµæã¿ã€ãã«ååãä»ããå¿ èŠãããããŸããã§ããã
確ãã«ããã®å Žåã®ã¯ããŒãžã£æ§æã¯å°ãæ±ãã«ââãã/ JavaScriptã£ãœãæããããŸãã ããããããã軜éãªã¯ããŒãžã£æ§æã®æ©æµãåããå¯èœæ§ããããŸãã ç§ã¯å人çã«ãã®ãããªãã®ã倧奜ãã§ãïŒ
final_value := doThing(a).
Then(|resp| doAnotherThing(b, resp.foo())).
Then(|resp| FinishUp(c, resp.bar()))!
...ãããããã®ãããªãã®ã¯ããããå¥ã®ææ¡ã«å€ããŸãã
Map()
ãšMapErr()
ïŒæåå€ãšãšã©ãŒå€ã®éã§å€æif err != nil { return nil, err }
ãã³ã¹ããããšãã¯ãå®éã«ãšã©ãŒãåŠçããããå¥ã®ã¿ã€ãã«å€æãããããããšããããããŸãã ãã®ãããªãã®ïŒ
resp, err := doThing(a)
if err != nil {
return nil, myerror.Wrap(err)
}
ãã®å Žåã MapErr()
ã䜿çšããŠåãããšãå®è¡ã§ããŸãïŒãšã©ãŒãè¿ãããã«åã³!
æ§æã䜿çšããŸãïŒïŒ
resp := doThing(a).
MapErr(func(err) { myerror.Wrap(err) })!
Map
ã¯åãããšãè¡ãããšã©ãŒã§ã¯ãªãæåå€ãå€æããã ãã§ãã
ããã§ç€ºãããã®ãããå€ãã®ã³ã³ãããŒã¿ããããŸãããããããæãèå³æ·±ããšæããŸãã ãã«æ©èœã®çµæã¿ã€ããã©ã®ããã«èŠãããã«ã€ããŠã®ããè¯ãã¢ã€ãã¢ã«ã€ããŠã¯ãRustã®ããã§ãã¯ããããšããå§ãããŸãïŒ
Go 1.xèšèªã¯åçµãããŠãããããèšèªå€æŽã®ææ¡ã¯çŸåšãææ¡ã®ã¬ãã¥ãŒããã»ã¹ã§ã¯æ€èšãããŠããŸããïŒãææã®ãšãããããã¯Go2ã§ãïŒã ããã«ããã«é¢ãã決å®ãæåŸ ããªãããšãããªãã«ç¥ãããŠãã ããã
final_value := doThing(a).
Then(func(resp) { doAnotherThing(b, resp.foo()) }).
Then(func(resp) { FinishUp(c, resp.bar()) })!
ããã¯Goã«ãšã£ãŠæ£ããæ¹åã§ã¯ãªããšæããŸãã ()) })!
ãçå£ã«ïŒ Goã®äž»ãªç®æšã¯ãåŠç¿ã®ãããããèªã¿ãããã䜿ããããã§ãã ããã¯åœ¹ã«ç«ã¡ãŸããã
誰ããredditã¹ã¬ããã§èšã£ãããåèšã¿ã€ããšãžã§ããªãã¯ãééããªã奜ãã§ãããã
ããããç§ã¯æçš¿ã§äžæ確ã§ããïŒç§ã¯ç¢ºãã«çµæã¿ã€ããåèšã¿ã€ããšãžã§ããªãã¯ããæ§æãããããšãæã¿ãŸãã
ç§ã¯ãäž¡æ¹ãè¿œå ããŠãïŒå人çã«ã¯éåžžã«ããããããªããšæããŸããïŒãã®æ©èœãè¿œå ããéã®åŠšãã«ãªããªãããã«ããããæå®ããããšããŠããŸããããã®æ©èœã¯ãããã«åãæ¿ããããšãã§ããŸãïŒåŸæ¥ã®äžè¬çãªæ§æã§ã©ã®ããã«èŠãããã®äŸã瀺ããGo sumã¿ã€ãã®åé¡ã«ããªã³ã¯ããŠããŸãïŒã
çµæã®çš®é¡ãšç®æšã®é¢ä¿ãããããŸããã ãšã©ãŒäŒæãšã³ã³ãããŒã¿ã«é¢ããããªãã®ã¢ã€ãã¢ã¯ãè€æ°ã®çµæãã©ã¡ãŒã¿ã®çŸåšã®ãµããŒããšåæ§ã«æ©èœããããã«èŠããŸãã
@ianlancetaylorã¯ãçŸåšã®çµæã¿ãã«ã§äžè¬çã«æ©èœããã³ã³ãããŒã¿ãå®çŸ©ããæ¹æ³ã®äŸã瀺ããŸããïŒ å¯èœã§ããã°ãããèŠãããšæããŸãããããã§ã¯ãªããšæããŸãïŒãã®æçš¿ã«ãããšïŒ
@tarcieriãã®æçš¿ã¯å€§ããç°ãªãã error
ã¯Result<A>
æšå¥šããã䜿çšæ³ã«ã¯è¡šç€ºãããŸããã ãã®åé¡ã¯ãæçš¿ãšã¯ç°ãªãã result<int, error>
瀺åããŠããããã§ããããã¯ãææ¡ãããã³ã³ãããŒã¿ãerror
ç¹å¥ã«èªèããŠããããšãæå³ããŸãã 誀解ããŠããŸã£ãããè©«ã³ããŸãã
ç®çã¯ã result
ãerror
ã«çµåããããšã§ã¯ãªããRustã®Result
ã¿ã€ããŸãã¯Either
ãšåæ§ã«ã Result
result
ã2ã€ã®å€ãéã¶ããšã§ãã Haskellã®Either
ã ã©ã¡ãã®èšèªã§ããæ
£äŸã«ããã2çªç®ã®å€ã¯éåžžerror
ã¿ã€ãã§ãïŒãã ããããã§ããå¿
èŠã¯ãããŸããïŒã
ãã®åé¡ã¯ãæçš¿ãšã¯ç°ãªããçµæã瀺åããŠããããã§ã
æçš¿ã¯æ¬¡ã®ããšã瀺åããŠããŸãã
type Result<A> struct {
// fields
}
func (r Result<A>) Value() A {âŠ}
func (r Result<A>) Error() error {âŠ}
...ããã©ãããããã®æçš¿ã¯error
ååŸã«ç¹åããŠããŸããããã®ææ¡ã¯2çªç®ã®å€ã«ãŠãŒã¶ãŒæå®ã®ã¿ã€ããåãå
¥ããŸãã
確ãã«ã result.Err()
ãresult.MapErr()
ãããªãã®ã¯ããã®å€ãåžžã«error
ã§ãã
@tarcieriæ§é äœã®äœãåé¡ã«ãªã£ãŠããŸããïŒ https://play.golang.org/p/mTqtaMbgIF
@griesemerã¯ãGoã®æçš¿ã§ã®
@tarcieriããããŸããã ããããããïŒéäžè¬æ§ããŸãã¯ããããåèšã¿ã€ãããªãïŒãããã§åé¡ã§ããå Žåã¯ã代ããã«ãããã®åé¡ã«å¯ŸåŠããå¿ èŠããããŸãã çµæã¿ã€ãã®ã¿ãåŠçããããšã¯ãç¹å¥ãªã±ãŒã¹ãè¿œå ããããšã ãã§ãã
Goã«ãžã§ããªãã¯ã¹ããããã©ããã¯ããã¡ãŒã¹ãã¯ã©ã¹ã®çµæã¿ã€ãã圹ç«ã€ãã©ãããšçŽäº€ããŸãã å®è£ ãèªåã§å®è£ ãããã®ã«è¿ã¥ããããšãã§ããŸãããææ¡ã§ã«ããŒãããŠããããã«ãã³ã³ãã€ã©ããã¡ãŒã¹ãã¯ã©ã¹ã®æ¹æ³ã§ããã«ã€ããŠæšè«ã§ããããã«ããããšã§ãããšãã°ãæ¶è²»ãããŠããªãçµæã«ã€ããŠèŠåããããšãã§ããŸãã åäžã®çµæã¿ã€ããæã€ããšããææ¡ã®ã³ã³ãããŒã¿ãæ§æå¯èœã«ãããã®ã§ãã
@tarcieriæ§æã¯ãåäžã®çµææ§é äœã¿ã€ãã§ãå¯èœã§ãã
åã蟌ã¿ãŸãã¯å®çŸ©ãããæ§é äœåã䜿çšããªãçç±ãããããŸããã ãšã©ãŒããã§ãã¯ããããã®ç¹æ®ãªã¡ãœãããšæ§æãããã®ã¯ãªãã§ããïŒ Goã«ã¯ãããããã¹ãŠãå®è¡ããæ段ããã§ã«ãããŸãã ããã¯ãGoèšèªãå®çŸ©ãããRustãå®çŸ©ããæ©èœãè¿œå ããŠããã ãã®ããã§ãã ãã®ãããªå€æŽãå®è£ ããã®ã¯ééãã§ãã
åã蟌ã¿ãŸãã¯å®çŸ©ãããæ§é äœåã䜿çšããªãçç±ãããããŸããã ãšã©ãŒããã§ãã¯ããããã®ç¹æ®ãªã¡ãœãããšæ§æãããã®ã¯ãªãã§ããïŒ
ããäžåºŠç¹°ãè¿ããŸãããžã§ããªãã¯ã®çµæã¿ã€ãã䜿çšããã«ã¯...ãžã§ããªãã¯ãå¿ èŠã§ãã Goã«ã¯ãžã§ããªãã¯ã¯ãããŸããã Goããžã§ããªãã¯ã¹ãååŸããããšãé€ããŠãèšèªããã®ç¹å¥ãªå Žåã®ãµããŒããå¿ èŠã§ãã
ããããããªãã¯ãã®ãããªããšãææ¡ããŠããŸããïŒ
type Result struct {
value interface{}
err error
}
ã¯ããããã¯ãæ©èœãããŸã...åå®å
šæ§ãç ç²ã«ããŠã ããã§ãçµæãæ¶è²»ããã«ã¯ãåã¢ãµãŒã·ã§ã³ãå®è¡ããŠã interface{}
åã®å€ãæåŸ
ã©ããã§ããããšã確èªããå¿
èŠããããŸãã ããã§ãªãå Žåã¯ãå®è¡æãšã©ãŒã«ãªããŸãïŒçŸåšã®ã³ã³ãã€ã«æãšã©ãŒãšã¯å¯Ÿç
§çã§ãïŒã
ããã¯ãGoãçŸåšæã£ãŠãããã®ã«å¯Ÿãã倧ããªååž°ã«ãªããŸãã
ãã®æ©èœãå®éã«åœ¹ç«ã€ããã«ã¯ãã¿ã€ãã»ãŒãã§ããå¿ èŠããããŸãã Goã®åã·ã¹ãã ã¯ãç¹æ®ãªã±ãŒã¹ã®èšèªãµããŒããªãã§åå®å šãªæ¹æ³ã§å®è£ ããã®ã«ååãªè¡šçŸåããããŸããã å°ãªããšããžã§ããªãã¯ãå¿ èŠã§ãããçæ³çã«ã¯ã¿ã€ããåèšããå¿ èŠããããŸãã
ããã¯ãGoèšèªãå®çŸ©ããªãæ©èœãè¿œå ããŠããã ãã®ããã§ã[...]ã ãã®ãããªå€æŽãå®è£ ããã®ã¯ééãã§ãã
ç§ã¯å ã®ææ¡ã§åããããã«ããŒããŸããïŒ
ããã®ã¢ãããŒãã«ã¯å°ãåŠç¿æ²ç·ã䌎ãããšãèªããŸãããã®ãããã³ã³ãããŒã¿ã®ã€ãã£ãªã ã«æ £ããŠããªã人ã«ãšã£ãŠã¯ãããã°ã©ã ã®æ確ãã«æªåœ±é¿ãäžããå¯èœæ§ããããŸããå人çã«ã¯ããšã©ãŒåŠçã®ããã®ã³ã³ãããŒã¿ã倧奜ãã§ãããæåçã«ã©ã®ããã«ç解ã§ãããã¯ééããããŸããã Goã«ã¯äžåããããããŸãããã
ç§ã¯èªåã®çæã確èªããããã«æããŸãããŸãããã®ãããªæ©èœã¯Goéçºè ã«ã¯ç°¡åã«ç解ã§ãããèšèªã®åçŽããéèŠããæ§è³ªã«åããŠããããã«æããŸãã ããã¯ããã°ã©ãã³ã°ãã©ãã€ã ã掻çšããŠãããæããã«ãGoéçºè ã¯ç解ãæãã§ãããªãããã§ããããã®ãããªå Žåã¯æ©èœãééã£ãŠããããã«èŠããŸãã
圌ãã¯éãå®çŸ©ããŸã
çµæã¿ã€ãã¯Ruståºæã®æ©èœã§ã¯ãããŸããã ãããã¯å€ãã®é¢æ°åèšèªã§èŠãããŸãïŒäŸãã°ãHaskellã®Either
ãšOCamlã®result
ïŒã ããã¯èšã£ãŠããããããGoã«å°å
¥ããããšã¯ãããŸãã«ãé ãæ©ã®ããã«æããŸãã
ã¢ã€ãã¢ãå ±æããŠããã ãããããšãããããŸãããäžèšã®äŸã¯çŽåŸããããªããšæããŸãã ç§ã«ãšã£ãŠãAã¯BãããåªããŠããŸãïŒ
A
`` `respãerrïŒ= doThingïŒaïŒ
errïŒ= nil {ã®å Žå
nilãè¿ãããšã©ãŒ
}
respã®å Žåãerr = doAnotherThingïŒbãresp.fooïŒïŒïŒ; errïŒ= nil {
ãšã©ãŒãè¿ã
}
respã®å Žåãerr = FinishUpïŒcãresp.barïŒïŒïŒ; errïŒ= nil {
ãšã©ãŒãè¿ã
}
çµæïŒ= doThingïŒaïŒã
ThenïŒfuncïŒrespïŒ{doAnotherThingïŒbãresp.fooïŒïŒïŒ}ïŒã
ThenïŒfuncïŒrespïŒ{FinishUpïŒcãresp.barïŒïŒïŒ}ïŒ
result.isErrorïŒïŒ{ã®å Žå
result.ErrorïŒïŒãè¿ããŸã
}
`` `
Aã®æ¹ãèªã¿ããããšã¯æããŸããã å®éãã¢ã¯ã·ã§ã³ã¯ãŸã£ããç®ç«ã¡ãŸããã 代ããã«ãäžç®èŠãã ãã§ãå€æ°ã®ãšã©ãŒãååŸãããŠè¿ãããŠããããšãããããŸãã
ã¯ããŒãžã£ãŒæ¬äœãæ°ããè¡ã«é 眮ãããããã«Bããã©ãŒãããããå Žåããããæãèªã¿ããããã©ãŒãããã«ãªããŸãã
ãŸããæåŸã®ãã€ã³ãã¯å°ãã°ãããŠããããã§ãã é¢æ°åŒã³åºãã®ããã©ãŒãã³ã¹ãéåžžã«éèŠãªå Žåã¯ãå¿ ããããåŸæ¥ã®æ§æã䜿çšããŠãã ããã
A
@asãããéåžžã®ãããŒã¯ã€ã³ãã³ããããã¹ãã§ã¯ãªããšæããŸãã
if err != nil {
return err
}
resp, err = doAnotherThing(b, resp.foo());
if err != nil {
return err
}
resp, err = FinishUp(c, resp.bar());
if err != nil {
return err
}
ãã®ã¹ã¬ããããã®èå³æ·±ã芳å¯ã®1ã€ïŒã³ããŒãšè²Œãä»ããç¶ããå
ã®äŸã«ã¯ããã€ãã®ãšã©ãŒãå«ãŸããŠããŸããïŒæåã®if
ã¯ãšã©ãŒæã«nil, err
ãè¿ãã次ã®2ã€ã¯err
ã®ã¿ãè¿ããŸã
ãã®ç¹å®ã®ã¯ã©ã¹ã®ãšã©ãŒã¯ãGoã³ã³ãã€ã©ãŒã«ãã£ãŠæ€åºããããããªãã®ã§ãããæ§æã®å®åæãéåžžã«å€ããšãã³ããŒããŠè²Œãä»ãããšãã«ãã®ãããªãšã©ãŒãç°¡åã«èŠéãããããã«ãªãããšã«æ³šæããŠãã ããã
ããã¯ææ¡ãããè¯ããããã®ã§ã¯ãããŸããã è€æ°ã®å€ãè¿ããªãã®ã¯ãæ瀺çãªãšã©ãŒåŠçã®çµæã§ãããšæ³å®ãããŠããŸãã é¢æ°å ã§åããšã©ãŒãçºçããå¯èœæ§ããããŸãããäžèŠãªã«ãã»ã«åã®ããã«ãããã¯è¡šç€ºãããŸããã§ããã
ç§ã¯åæããŸãããããããã®çš®ã®ææ¡ã®é·æã ãšæããŸãã ããã°ã©ã ãè¡ã£ãŠããã®ããšã©ãŒãè¿ãããããåŠçããªãããšã ãã§ããå Žåãããã¯èªç¥çãªãŒããŒããããšã³ãŒãã浪費ããç©äºãèªã¿ã«ããããŸãã ãã®ãããªæ©èœãè¿œå ãããšããããšã¯ãïŒããã䜿çšããããšãéžæãããããžã§ã¯ãã§ã¯ïŒãšã©ãŒãåŠçããã³ãŒããå®éã«ç解ãã䟡å€ã®ããããšãããŠããããšãæå³ããŸãã
åæããªãããšã«åæããå¿ èŠããããŸãã ææ¡ã®éæ³ã®ããŒã¯ã³ã¯æžãã®ã¯ç°¡åã§ãããç解ããã®ã¯é£ããã§ãã çããããããšãã£ãŠãåçŽã«ããããã§ã¯ãããŸããã
èªã¿ã«ããããããšã¯äž»èŠ³çãªããšãªã®ã§ãããã«ç§ã®æèŠããããŸãã ãã®ææ¡ã§ç§ãç®ã«ããã®ã¯ãéæ³ã®é¢æ°ãšèšå·ïŒéåžžã«èŠéããããïŒãåãããããè€éã§ãããã«ããã³ãŒãã ãã§ãã ãããŠãã±ãŒã¹Aã®å Žåãéåžžã«åçŽã§ç解ããããã³ãŒããé衚瀺ã«ããã ãã§ããç§ã«ãšã£ãŠã¯ãå€ãè¿œå ããããéèŠãªå Žæã§ã³ãŒããççž®ããããç©äºãåçŽåãããããããšã¯ãããŸããã èšèªã¬ãã«ã§ããããæ±ãããšã«äŸ¡å€ã¯ãããŸããã
ææ¡ã解決ããå¯äžã®åé¡ã¯ãã¯ã£ãããšããããŸããããšã©ãŒåŠçã®å®åæã§ãã ãããå¯äžã®çç±ã§ãããªããããã¯ç§ã«ãšã£ãŠããã ãã®äŸ¡å€ã¯ãããŸããã æ§æãã€ã©ãŒãã¬ãŒãã«é¢ããè°è«ã¯ãå®éã«ã¯ææ¡ã«å察ããŠããŸãã ãã®ç¹ã§ã¯ãã¯ããã«è€éã§ããèŠéããã¡ãªãã¹ãŠã®éæ³ã®èšå·ãšè§ãã£ãã§ãã äŸAã«ã¯å®åæããããŸãããè«çãšã©ãŒã¯çºçããŸããã ãã®æèã§ã¯ããã®ææ¡ããåŸããããã®ã¯äœããããŸãããç¹°ãè¿ãã«ãªããŸãããããã¯ããŸãæçšã§ã¯ãããŸããã
Rustã®æ©èœã¯Rustã«ä»»ããŸãããã
æ確ã«ããããã«ãç§ã¯ã·ã§ãŒãã«ãããšããŠ!
æ¥å°ŸèŸãè¿œå ããããšã«å€¢äžã§ã¯ãããŸããããåçŽåããåçŽãªæ§æãèãåºããšããã¢ã€ãã¢ã¯å¥œãã§ãã
err = foo()
if err != nil {
return err
}
ãã®æ§æãç¹å¥ãªèšå·ã§ã¯ãªãããŒã¯ãŒãã§ãã£ãŠãã ããã¯èšèªã«ã€ããŠã®ç§ã®æ倧ã®äžæºã§ããïŒå人çã«ã¯ãžã§ããªãã¯ã¹ãããããã«å€§ããïŒãã³ãŒãå šäœã«ãã®ãã¿ãŒã³ãæ£ãã°ã£ãŠãããšãèªã¿ã«ãããéšã ãããšæããŸãã
ãŸããã³ãŒãã§èªã¿ããããªãã®ã§ã @ tarcieriããããããããªé£éãå¯èœã«ããäœããèŠãããšæããŸãã @crekerãã»ã®ããããŠããè€éãã¯ãã³ãŒãã®ä¿¡å·å¯Ÿéé³æ¯ã®åäžã«ãã£ãŠãã©ã³ã¹ãåããŠãããšæããŸãã
ç§ã¯ããã®ææ¡ããã®å®ããããç®æšãã©ã®ããã«éæããããå®å šã«ã¯ç解ããŠããŸããã
ãšã©ãŒåŠçã®å®åæãæžããïŒææ¡ã«ã¯ããã€ãã®æ¶ç©ºã®Goã³ãŒãããããŸãïŒ
result := doThing(a).
Then(func(resp) { doAnotherThing(b, resp.foo()) }).
Then(func(resp) { FinishUp(c, resp.bar()) })
if result.isError() {
return result.Error()
}
é¢æ°ãªãã©ã«ã®åäœæ¹æ³ãããã«å€§å¹
ã«å€æŽããªãéãã func(resp) { expr }
ãã©ã®ããã«åäœããã®ãããããããŸããã çµæã®ã³ãŒãã¯ã次ã®ããã«ãªããŸãã
result := doThing(a).
Then(func(resp T) result(T, error) { return doAnotherThing(b, resp.foo()) }).
Then(func(resp T) result(T, error) { return FinishUp(c, resp.bar()) })
if result.isError() {
return result.Error()
}
çŸå®çãªGoã³ãŒãã§ã¯ãäžéåŒãããããé·ããç¬èªã®è¡ã«é 眮ããå¿ èŠãããããšããããããŸãã ããã¯ãä»æ¥ã®å®éã®Goã³ãŒãã§èªç¶ã«çºç
result := doThing(a).
Then(func(resp T) result(T, error) {
return doAnotherThing(b, resp.foo())
}).
Then(func(resp T) result(T, error) {
return FinishUp(c, resp.bar())
})
if result.isError() {
return result.Error()
}
ãããã«ãããããã¯ç§ã«å€§äžå€«ã ãšæããŸãããææ¡ã®ãã®äžã®å®éã®Goã³ãŒãã®ããã«ãçŽ æŽããããšã¯èšããŸããã ãã®ãThenãã³ã³ãããŒã¿ã¯æ¬è³ªçã«ãreturnãã®å察ã§ãã ïŒã¢ããã«ç²ŸéããŠããå Žåãããã¯é©ãããšã§ã¯ãããŸãããïŒããã«ããããifãã¹ããŒãã¡ã³ããèšè¿°ããå¿ èŠããªããªããŸãããé¢æ°ãèšè¿°ããå¿ èŠãçããŸãã å šäœãšããŠãããã¯å®è³ªçã«è¯ããæªãããããŸããã ããã¯ãæ°ããã¹ãã«ã®åãå®åããžãã¯ã§ãã
ã³ã³ãã€ã©ãŒãçµæã«ã€ããŠæšè«ã§ããããã«ããŸãããã®æ©èœãæãŸããå ŽåïŒããã§ã¯ããã«ã€ããŠæèŠãè¡šæããŠããŸããïŒããã®ææ¡ãã©ã®ããã«å®è³ªçã«å®çŸå¯èœã«ãªããããããŸããã 圌ãã¯ç§ãçŽäº€ããŠãããšæããŸãã
æãããæžãããGoã§ã¯ããã®çš®ã®ãšã©ãŒåŠçãã€ã©ãŒãã¬ãŒãã¯ã³ãŒãã®ããäžéšãæ§æããŸãã ããŸãæžãããŠãããšç§ãèããããã€ãã®Goã³ãŒãããŒã¹ãç°¡åã«èŠãŠã¿ããšãããã¯1æ¡ã®è¡ã®ããŒã»ã³ããŒãžã§ããã ã¯ãããããé©åãªå ŽåããããŸãããå€ãã®å Žåãåèšèšãå¿ èŠã§ãããšããå åã§ãã ç¹ã«ãã³ã³ããã¹ããè¿œå ããã«ãšã©ãŒãè¿ãã ãã§ãçŸåšãããé »ç¹ã«çºçããŸãã ããã¯ãåã€ãã£ãªã ããšåŒã°ãããããããŸããã èšèªèšèšãå³æžé€šãããŒã«ãçŽç²ã«ç€ŸäŒçããŸãã¯ãããã®çµã¿åããã®ããããã§ãGoããã®åã€ãã£ãªã ãæããšã©ãŸãããããã«äœããã¹ããããŸãã¯ã§ãããã«ã€ããŠè°è«ããå¿ èŠããããŸãã ã ãã®ææ¡ãæ¡æããããã©ããã«ã€ããŠãåæ§ã«è°è«ããããšæããŸãã å®éããã®ææ¡ã®ç®çã§ãããšç§ãä¿¡ããŠããããã«ããã®åã€ãã£ãªã ãè¡šçŸããããããããšã¯ãééã£ãã€ã³ã»ã³ãã£ããèšå®ããå¯èœæ§ããããŸãã
çŸåšããã®ææ¡ã¯äž»ã«å¥œã¿ã®åé¡ãšããŠæ±ãããŠããŸãã ç§ã®æèŠã§ããããã説åŸåã®ãããã®ã«ããã®ã¯ããã®æ¡çšããã°ã®ç·æ°ãæžããããšã瀺ã蚌æ ã§ãããã è¯ãæåã®ã¹ãããã¯ã Goã³ãŒãã¹ã®ä»£è¡šçãªãã£ã³ã¯ãå€æããŠãããçš®ã®ãã°ãæ°ããã¹ã¿ã€ã«ã§è¡šçŸã§ããªãããè¡šçŸãããå¯èœæ§ãäœãããšã瀺ãããšã§ããå®éã®Goã³ãŒãã®1è¡ãããxåã®ãã°ã¯æ¬¡ã®ããã«ä¿®æ£ãããŸããæ°ããã¹ã¿ã€ã«ã ïŒæ°ããã¹ã¿ã€ã«ãä»ã®çš®é¡ã®ãã°ã®å¯èœæ§ãé«ããããšã«ãã£ãŠæ¹åãçžæ®ºããªãããšã瀺ãã®ã¯ã¯ããã«é£ããããã§ããããã§ã¯ãGoã®åã®å€ãè¯ãæ代ã®ããã«ãèªã¿ããããšè€éãã«ã€ããŠã®æœè±¡çãªè°è«ãããªããã°ãªããªããããããŸãããã³ãŒãã¹ãç®ç«ã€ããã«ãªããŸãããïŒ
ãã®ãããªè£ä»ããšãªã蚌æ ãæå ã«ããã°ããã匷åãªäž»åŒµãããããšãã§ããŸãã
ã³ã³ããã¹ããè¿œå ããã«ãšã©ãŒãè¿ãã ãã§ãçŸåšãããé »ç¹ã«çºçããŸãã ããã¯ãåã€ãã£ãªã ããšåŒã°ãããããããŸããã
ãã®ææ ãåæ ãããããšæããŸãã ãã®
if err := foo(x); err != nil {
return err
}
åçŽåããã¹ãã§ã¯ãªããèœèãããã¹ãã§ãã
if err := foo(x); err != nil {
return errors.Wrapf(err, "fooing %s", x)
}
@peterbourgon
ããã«é¢ããç§ã®æ倧ã®åé¡ã¯ããšã©ãŒãç²ç®çã«è¿ãããããšã§ã¯ãããŸããã ã¢ã¯ã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã foo(x)
; ã¯ããã»ã©ç®ã«èŠããŸãããimhoã¯ãã¢ã¯ã·ã§ã³èªäœãæ°ããè¡ãžã®åçŽãªæ»ãã§ãã代æ¿ã®ãæ©èœçãªããœãªã¥ãŒã·ã§ã³ãããå
šäœãããªãèªã¿ã«ããããŸãã
å²ãåœãŠãšã¢ã¯ã·ã§ã³ãifã¹ããŒãã¡ã³ãèªäœããåé¢ãããŠããå Žåã§ããçµæã®ã¹ããŒãã¡ã³ãã¯ãã¢ã¯ã·ã§ã³ã§ã¯ãªãçµæã«ã¢ã¯ã»ã³ããä»ããŸãã ç¹ã«çµæãéèŠãªéšåã§ããå Žåãããã¯å®å šã«æå¹ã§ãã ãã ããåã¹ããŒãã¡ã³ããïŒçµæããšã©ãŒïŒã¿ãã«ãååŸãããšã©ãŒ/ãªã¿ãŒã³ããã§ãã¯ããŠãããæ°ããã¿ãã«ãååŸããªããå¥ã®ã¢ã¯ã·ã§ã³ãå®è¡ããã¹ããŒãã¡ã³ããå€æ°ããå Žåãçµæèªäœã¯æããã«ã¡ã€ã³ãã£ã©ã¯ã¿ãŒã§ã¯ãããŸãããããããã
@urandomçµæã¯ïŒvalãerrorïŒã®ãã¢ã ãšæãã®ã§ããšã©ãŒ/ãªã¿ãŒã³ã®ãã§ãã¯ãããããã®äž»ãªæåã ãšæããŸãã
ãã¹ãŠã®if err != nil { return err }
ãé¿ããããã«ãäºçŽèªïŒ reterr
ãããªãã®ïŒ if err != nil { return err }
ã©ãã§ããïŒ
ãããã£ãŠããã®
resp, err := doThing(a)
if err != nil {
return nil, err
}
resp, err = doAnotherThing(b, resp.foo())
if err != nil {
return nil, err
}
resp, err = FinishUp(c, resp.bar())
if err != nil {
return nil, err
}
ã«ãªããŸãïŒ
resp, _ := reterr doThing(a)
resp, _ = reterr doAnotherThing(b, resp.foo())
resp, _ = reterr FinishUp(c, resp.bar())
reterrã¯åºæ¬çã«ãåŒã³åºãããé¢æ°ã®æ»ãå€ããã§ãã¯ãããããã®ããããããšã©ãŒã§nilã§ãªãå Žåã¯æ»ããŸãïŒãšã©ãŒä»¥å€ã®æ»ãå€ã§ã¯nilãè¿ããŸãïŒã
ïŒ18721ãšããŠãŸããŸãèããã
@tarcieri reflect
ããã±ãŒãžã®äžéšã䜿çšããŠãã ããã ç§ã¯ããªãã®ææ¡ã®ãããªãã®ãã·ãã¥ã¬ãŒãããããšãã§ããŸãã
ããããç§ã¯ããããã䟡å€ã¯ãªããšæããŸãã
https://play.golang.org/p/CC5txvAc0e
func main() {
result := Do(func() (int, error) {
return doThing(1000)
}).Then(func(resp int) (int, error) {
return doAnotherThing(200000, resp)
}).Then(func(resp int) (int, error) {
return finishUp(1000000, resp)
})
if result.err != nil {
log.Fatal(result.err)
}
val := result.val.(int)
fmt.Println(val)
}
@iporsutåå°ã«ã¯2ã€ã®åé¡ããããè¡šé¢äžã¯åé¡ãã解決ãããŠããããã«èŠãããããããŸãããããã®ç¹å®ã®åé¡ã«å¯Ÿããäžé©åãªè§£æ±ºçã«ãªããŸãã
ç§ã«ãšã£ãŠããããã®åé¡ã®ããããã¯ãGoããã§ã«æã£ãŠãããã®ãã倧ããåŸéããŠãããåæã«ãå®å šã«éã¹ã¿ãŒã¿ãŒã§ãã
ç§ã¯Goãšããããšã©ãŒãåŠçããæ¹æ³ã奜ãã§ãã ãã ãããã£ãšç°¡åãããããŸããã Goã§ã®ãšã©ãŒåŠçã«é¢ããç§ã®èãã®ããã€ãã次ã«ç€ºããŸãã
çŸåšã®æ¹æ³ïŒ
resp, err := doThing(a)
if err != nil {
return nil, err
}
resp, err = doAnotherThing(b, resp.foo())
if err != nil {
return nil, err
}
resp, err = FinishUp(c, resp.bar())
if err != nil {
return nil, err
}
AïŒ
resp, _ := doThing(a)
resp, _ = doAnotherThing(b, resp.foo())
resp, _ = FinishUp(c, resp.bar())
// return if error is omited, otherwise deal with it as usual (if err != nil { return err })
//However, this breaks semantics of Go and may mislead due to the usa of _ (__ or !_ could be used to avoid such misleading)
BïŒ
resp, err := doThing(a)?
resp, err = doAnotherThing(b, resp.foo())?
resp, err = FinishUp(c, resp.bar())?
// ? indicates that it will return in case of error (more explicit)
// or any other indication could be used
// this approach is preferred for its explicitness
CïŒ
resp, err := doThing(a)
return if err
resp, err = doAnotherThing(b, resp.foo())
return if err
resp, err = FinishUp(c, resp.bar())
return if err
// if err return err
// or if err return (similar to javascript return)
// this one is my favorite, almost no changes to the language, very readable and less SLOC
DïŒ
resp, _ := return doThing(a)
resp, _ = return doAnotherThing(b, resp.foo())
resp, _ = return FinishUp(c, resp.bar())
// or
resp = throw FinishUp(c, resp.bar())
// this one is also very readable (although maybe a litle less than option **C**) and even less SLOC than **C**
// at this point I'm not sure whether C or D is my favorite ))
//This applies to all approaches above
// if the function that contains any of these options has no value to return, exit the function. E.g.:
func test() {
resp, _ := return doThing(a) // or any of other approaches
// exit function
}
func test() ([]byte, error) {
resp, _ := return doThing(a) // or any of other approaches
// return whatever is returned by doThing(a) (this function of course must return ([]byte, error))
}
è±èªã倱瀌ããŸãããã®ãããªå€æŽãå¯èœãã©ããããŸãããã©ãŒãã³ã¹ã®ãªãŒããŒããããçºçãããã©ããã¯ããããŸããã
ãããã®ã¢ãããŒãã®ãããããæ°ã«å ¥ã£ãå Žåã¯ã次ã®ã«ãŒã«ã«åŸã£ãŠæ°ã«å ¥ã£ãŠãã ããã
A =ð
B =ð
C =â€ïž
D =ð
ãããŠðããªããã¢ã€ãã¢å šäœãå«ããªãïŒïŒ
ãã®ããã«ããŠãããã€ãã®çµ±èšãååŸããã+ 1ãã®ãããªäžèŠãªã³ã¡ã³ããåé¿ã§ããŸãã
ç§ã®ãææ¡ãã«ã€ããŠè©³ãã説æããŸã...
// no need to explicitely define error in return statement, much like throw, try {} catch in java
func test() int {
resp := throw doThing() // "returns" error if doThing returns (throws) an error
return resp // yep, resp is int
}
func main() {
resp, err := test() // the last variable is always error type
if err != nil {
os.Exit(0)
}
}
ç¹°ãè¿ããŸããããã®ãããªããšãå¯èœãã©ããã¯ããããŸããïŒïŒ
ãã1ã€ã®ã¯ã¬ã€ãžãŒãªãªãã·ã§ã³ã¯ã error
ãšããåèªãããå°ãéæ³ã®ããã«ããããšã§ãã 代å
¥ïŒãŸãã¯çã宣èšïŒã®å·ŠåŽã§äœ¿çšã§ããããã«ãªããéæ³ã®é¢æ°ã®ããã«æ©èœããŸãã
res, error() := doThing()
// Shorthand for
res, err := doThing()
if err != nil {
return 0, ..., 0, err
}
å
·äœçã«ã¯ã error()
ã¯æ¬¡ã®ãšããã§ãã
error
ããã«æ±ãããŸããnil
ãå²ãåœãŠãããŠããå Žåãäœãèµ·ãããŸãããnil
å€ãå²ãåœãŠãããŠããå Žåãå²ãã§ããé¢æ°ã¯ããã«æ»ããŸãã error
åã§ããå¿
èŠãããã error()
å²ãåœãŠãããå€ãå²ãåœãŠãããŠããæåŸã®å€ãé€ããŠããã¹ãŠã®æ»ãå€ã¯0ã«èšå®ãããŸãããšã©ãŒã«äœããã®å€æŽãé©çšããå Žåã¯ã次ã®æäœãå®è¡ã§ããŸãã
res, error(func (e error) error { return fmt.Errorf("foo: %s", error)})
:= doThing()
ãã®å Žåãé¢æ°ãæ»ãåã«å²ãåœãŠãããå€ã«ã¯ããŒãžã£ãé©çšãããŸãã
ããã¯å°ãéãã§ãããããã¯äž»ã«ãã¯ããŒãžã£ã«å¯ŸåŠããªããã°ãªããªããšããæ§æäžã®è¥å€§åã«ãããã®ã§ãã æšæºã©ã€ãã©ãªã¯ãããããŸãä¿®æ£ã§ããŸããããšãã°ã error(errors.Wrapper("foo"))
ã䜿çšãããšãæ£ããã©ãããŒã¯ããŒãžã£ãçæãããŸãã
å¥ã®æ¹æ³ãšããŠãnullary error()
æ§æãèŠèœãšãããå¯èœæ§ãé«ãå Žåã¯ã代ããã«error(return)
ããå§ãããŸãã ããŒã¯ãŒãã䜿çšãããšã誀解ã®ãªã¹ã¯ã軜æžãããŸãã ãã ããã¯ããŒãžã£ãŒã±ãŒã¹ã«ã¯ããŸãæ¡åŒµã§ããŸããã
Goãæžãã人ã¯èª°ã§ããã³ãŒãã®äž»èŠãªç®çãã泚æãããããšã©ãŒåŠçãã€ã©ãŒãã¬ãŒãã®äžå¹žãªæ¥å¢ã«ééããŸããã ãã®ããã2015幎ã«RobPikeããã®åé¡ã«åãçµã¿ãŸããã MartinKÃŒhlãææããŠããããã«ããšã©ãŒåŠçãç°¡çŽ åããããã®Robã®ææ¡ã¯æ¬¡ã®ãšããã§ãã
ãšã©ãŒãåŠçããããã¹ãŠã®ã€ã³ã¿ãŒãã§ãŒã¹ã«è·äººæã®1åéãã®ã¢ãããå®è£ ããå¿ èŠããããŸãããããã§ãåé·ã§å埩çã ãšæããŸã
ãã®ãããä»æ¥ã§ããã®ãããã¯ã«å€ãã®é¢äžããããŸãã
çæ³çã«ã¯ã次ã®ãããªè§£æ±ºçãèŠã€ããããšãã§ããŸãã
次ã®ããã«æ©èœããæ°ããããŒã¯ãŒãcatch:
ã®å°å
¥ãææ¡ããŸãã
çŸåšã®ãã©ãŒã ã®ä»£ããã«ïŒ
res, err := doThing()
if err != nil {
return 0, ..., 0, err
}
ç§ãã¡ã¯æžãã§ãããïŒ
res, err := doThing() catch: 0, ..., 0, err
ããã¯ãäžèšã®çŸåšã®ãã©ãŒã ã³ãŒããšãŸã£ããåãããã«åäœããŸãã å
·äœçã«ã¯ã catch:
ã®å·ŠåŽã«ããé¢æ°ãšå²ãåœãŠãæåã«å®è¡ãããŸãã 次ã«ãæ»ãåŒæ°ã®1ã€ãerror
åã§ããããã®å€ãnil以å€ã®å Žåã«ã®ã¿ã catch:
ã¯return
ã¹ããŒãã¡ã³ããšããŠæ©èœããŸããæš©å©ã doThing()
ããè¿ãããerror
ã¿ã€ãã0åãŸãã¯è€æ°ããå Žåã catch:
ã䜿çšãããšæ§æãšã©ãŒã«ãªããŸãã doThing()
ããè¿ããããšã©ãŒå€ãnil
å Žåã catch:
ããã¹ããŒãã¡ã³ãã®çµãããŸã§ã®ãã¹ãŠãç¡èŠãããè©äŸ¡ãããŸããã
Nemanja Mijailovicã®æè¿ã®ããã°æçš¿ã Goã§ã®
func parse(r io.Reader) (*point, error) {
var p point
if err := binary.Read(r, binary.BigEndian, &p.Longitude); err != nil {
return nil, err
}
if err := binary.Read(r, binary.BigEndian, &p.Latitude); err != nil {
return nil, err
}
if err := binary.Read(r, binary.BigEndian, &p.Distance); err != nil {
return nil, err
}
if err := binary.Read(r, binary.BigEndian, &p.ElevationGain); err != nil {
return nil, err
}
if err := binary.Read(r, binary.BigEndian, &p.ElevationLoss); err != nil {
return nil, err
}
return &p, nil
}
ããã¯ä»£ããã«ãªããŸãïŒ
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
}
å©ç¹ïŒ
çæïŒ
catch:
ã«ãã£ãŠè¿ããããšã©ãŒã¯ãæ°ãããšã©ãŒãŸãã¯ã©ããããããšã©ãŒã®ããããã§ããå¿
èŠããããŸããã catch:
å·ŠåŽã®é¢æ°ã«ãã£ãŠè¿ããããšã©ãŒãšåãã§ã¯ãããŸããã catch:
ã䜿çšããã®ã¯é©åã§ããïŒ äºçŽèªã¯å¿
ãããcatch:
ããå¿
èŠã¯ãããŸããã ä»ã®äººã¯ããè¯ãã¢ã€ãã¢ãæã£ãŠãããããããŸããã äºçŽèªã®ä»£ããã«æŒç®åã«ããããšãã§ããŸããGoãæžãã人ã¯èª°ã§ããã³ãŒãã®äž»èŠãªç®çãã泚æãããããšã©ãŒåŠçãã€ã©ãŒãã¬ãŒãã®äžå¹žãªæ¥å¢ã«ééããŸããã
ããã¯çå®ã§ã¯ãããŸããã ç§ã¯Goã§ããã°ã©ã ãããªãè¡ã£ãŠããŸããããã€ã©ãŒãã¬ãŒãã®ãšã©ãŒåŠçã«åé¡ã¯ãããŸããã ãšã©ãŒåŠçã³ãŒããæžãããšã¯ãç§ãã»ãšãã©æ°ä»ããªãã»ã©ãããžã§ã¯ããéçºããã®ã«éåžžã«ããããªæéãæ¶è²»ããŸãããããŠããã¯èšèªãžã®å€æŽãæ£åœåããªãç§èŠã§ãã
Goãæžãã人ã¯èª°ã§ããã³ãŒãã®äž»èŠãªç®çãã泚æãããããšã©ãŒåŠçãã€ã©ãŒãã¬ãŒãã®äžå¹žãªæ¥å¢ã«ééããŸããã
ããã¯çå®ã§ã¯ãããŸããã ç§ã¯Goã§ããã°ã©ã ãããªãè¡ã£ãŠããŸããããã€ã©ãŒãã¬ãŒãã®ãšã©ãŒåŠçã«åé¡ã¯ãããŸããã ãšã©ãŒåŠçã³ãŒããæžãããšã¯ãç§ãã»ãšãã©æ°ä»ããªãã»ã©ãããžã§ã¯ããéçºããã®ã«éåžžã«ããããªæéãæ¶è²»ããŸãããããŠããã¯èšèªãžã®å€æŽãæ£åœåããªãç§èŠã§ãã
ãšã©ãŒåŠçã³ãŒãã®èšè¿°ã«ãããæéã«ã€ããŠã¯äœãèšããŸããã§ããã ç§ã¯ãããã³ãŒãã®äžå¿çãªç®çããæ°ãããããšèšã£ãã ãã§ãã ãã¶ãç§ã¯ãGoãèªãã 人ã¯çãäžå¹žãªããšã«ãšã©ãŒåŠçã®æ¥å¢ã«ééãã...ããšèšã£ãã¯ãã§ãã
ã ããã @ cznic ãããªãã«ãšã£ãŠã®è³ªåã¯ããã€ã©ãŒãã¬ãŒãã®åŠçã«é床ã®ãšã©ãŒããããšæããGoã³ãŒããèªãã ããšãããã®ãââããããšãç解ããããšããŠããã³ãŒãã®éªéã«ãªã£ãã®ããšããããšã ãšæããŸãã
誰ãç§ã®ææ¡ã奜ãã§ã¯ãããŸããð
ãšã«ãããããã€ãã®æ§æããããæè¯ã®ãã®ïŒããã€ãã®æ祚ã·ã¹ãã ïŒã«æ祚ãããããŸãã¯readmeã«ãªã³ã¯ãå«ããå¿
èŠããããŸã
ãã¶ãç§ã¯ãGoãèªãã 人ã¯çãäžå¹žãªããšã«ãšã©ãŒåŠçã®æ¥å¢ã«ééãã...ããšèšã£ãã¯ãã§ãã
ããã¯çå®ã§ã¯ãªãã ç§ã¯ãçŸåšã®æå 端ã®ãšã©ãŒåŠçã®æ瀺æ§ãšé©åãªå±ææ§ã奜ã¿ãŸãã ãã®ææ¡ã¯ãç§ãä»ãŸã§èŠãä»ã®ã©ã®ææ¡ãšåæ§ã«ãã³ãŒãIMHOãèªã¿ã«ããããç¶æããã®ãæªåãããŸãã
ã ããã @ cznic ãããªãã«ãšã£ãŠã®è³ªåã¯ããã€ã©ãŒãã¬ãŒãã®åŠçã«é床ã®ãšã©ãŒããããšæããGoã³ãŒããèªãã ããšãããã®ãââããããšãç解ããããšããŠããã³ãŒãã®éªéã«ãªã£ãã®ããšããããšã ãšæããŸãã
ããããç§ã®çµéšã§ã¯ãGoã¯éåžžã«èªã¿ãããããã°ã©ãã³ã°èšèªã§ãã ãã¡ããããã®ã¯ã¬ãžããã®ååã¯gofmtã«éãããŸãã
ç§èªèº«ã®çµéšã§ã¯ãäŸåããã¹ããŒãã¡ã³ãããããããããšãå®éã«ãã©ãã°ãå§ãŸããŸããåã¹ããŒãã¡ã³ãã¯ãšã©ãŒãã¹ããŒããå¯èœæ§ãããããšã©ãŒåŠçã¯åèšãããŠããã«å€ããªããŸãã 5è¡ã®ã³ãŒãã¯20ã«ãªããŸãã
@cznic
ç§ã®çµéšã§ã¯ããã€ã©ãŒãã¬ãŒãã®åŠçã§ãšã©ãŒãçºçãããšãã³ãŒããèªã¿ã«ãããªããŸãã ãšã©ãŒåŠçèªäœã¯ã»ãšãã©åãã§ããããïŒçºçããå¯èœæ§ã®ãããšã©ãŒã©ããã³ã°ã¯ãããŸããïŒãäžçš®ã®ãã§ã³ã¹å¹æãçºçããŸããã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å Žåã倧éã®ãšã©ãŒåŠçã衚瀺ãããŸãã ãããã£ãŠãæ倧ã®åé¡ã§ãããããã°ã©ã ã®æãéèŠãªéšåã§ããå®éã®ã³ãŒãã¯ããã®ç®ã®é¯èŠã®èåŸã«é ãããŠãããã³ãŒãã®äžéšãäœã§ããããå®éã«ç¢ºèªããããšã¯éåžžã«å°é£ã§ãã
ãšã©ãŒåŠçã¯ãã³ãŒãã®äž»èŠéšåã§ãã£ãŠã¯ãªããŸããã æ®å¿µãªãããããã¯ãŸãã«ããã§çµããããšããããããŸãã
ä»ã®èšèªã§ã®ã¹ããŒãã¡ã³ãæ§æãéåžžã«äººæ°ãããã®ã«ã¯çç±ããããŸãã
ãšã©ãŒåŠçèªäœã¯ã»ãšãã©åãã§ããããïŒãšã©ãŒã¯ãããŸããïŒ
çºçããå¯èœæ§ã®ããã©ããã³ã°ïŒãããã¯äžçš®ã®ãã§ã³ã¹å¹æãçæããŸãã
ã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å Žåã倧éã®ã³ãŒãã衚瀺ãããŸãã
ãšã©ãŒåŠçã®ã
ããã¯éåžžã«äž»èŠ³çãªç«å Žã§ãã ããã¯ãifã¹ããŒãã¡ã³ãã
ã³ãŒããå€èªäžèœã«ããããKïŒRã¹ã¿ã€ã«ã®äžæ¬åŒ§ã§å€èªäžèœã«ããŸãã
ç§ã®èŠè§£ã§ã¯ãgoã®ãšã©ãŒåŠçã®æ瀺æ§ã¯ããã«èããŠãããŸã
ãã¿ãŒã³ãå£ããŠããããšã«æ°ä»ããŸã§ã芪ãã¿ãããã®èæ¯ã«ã
人éã®ç®ãéåžžã«åŸæãªããšã æ¬ èœããŠãããšã©ãŒåŠçã
ãšã©ãŒå€æ°ã¯_ãªã©ã«å²ãåœãŠãããŸãã
å
¥åããã®ã¯è² æ
ã§ããééãã¯ãããŸããã ããããGoã¯æé©åãããŠããŸãã
ã³ãŒãäœæè
ãããã¯ãªãŒããŒã®ããã«æ瀺çã«æé©åããŸãã
2017幎5æ16æ¥ç«ææ¥ååŸ5æ45åãViktor Kojouharov < [email protected]
æžããŸããïŒ
@cznic https://github.com/cznic
ç§ã®çµéšã§ã¯ããã€ã©ãŒãã¬ãŒãã®åŠçã§ãšã©ãŒãçºçãããšãã³ãŒããäœæãããŸã
ã¯ããã«èªã¿ã«ããã ãšã©ãŒåŠçèªäœã¯ã»ãšãã©åãã§ãããã
ïŒçºçããå¯èœæ§ã®ãããšã©ãŒã©ããã³ã°ã¯ãããŸããïŒãäžçš®ã®ãã§ã³ã¹ãçæããŸã
å¹æãã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å ŽåçµäºããŸã
倧éã®ãšã©ãŒåŠçã衚瀺ãããŸãã ãããã£ãŠãæ倧ã®åé¡ã¯ãå®éã®
ããã°ã©ã ã®æãéèŠãªéšåã§ããã³ãŒãã¯ããã®ãªããã£ã«ã«ã®èåŸã«é ãããŠããŸã
å¹»æ³ãå®éã«äœã®éšåãèŠãã®ãéåžžã«é£ãã
ã³ãŒãã¯çŽã§ãããšã©ãŒåŠçã¯ãã³ãŒãã®äž»èŠéšåã§ãã£ãŠã¯ãªããŸããã æ®å¿µãªãããããªã
å€ãã®å Žåãããã¯ãŸãã«ããã§ããããšã«ãªããŸããâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/19991#issuecomment-301702623 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAAcA4ydpBFiapYBOBUyUjg6du5Dnjs5ks5r6VQjgaJpZM4M-dud
ã
ã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å Žåã倧éã®ã³ãŒãã衚瀺ãããŸãã
ãšã©ãŒåŠçã®ã
ããã¯éåžžã«äž»èŠ³çãªç«å Žã§ãã
éåžžã«äž»èŠ³çã§ãããªããåºãå ±æãããŠããŸãã
ããèªèº«ãèšã£ãããã«ã
Goããã°ã©ããŒãç¹ã«ãã®èšèªã«äžæ £ããªããã°ã©ããŒã®éã§ããããè°è«ã®ãã€ã³ãã¯ããšã©ãŒã®åŠçæ¹æ³ã§ãã äŒè©±ã¯ãã·ãŒã±ã³ã¹ã®åæ°ã§ãã°ãã°åãã«å€ãããŸã
if err != nil {
return err
}
çŸããŸãã
å ¬å¹³ãæãããã«ãRobã¯ãGoãšã©ãŒåŠçã«é¢ãããã®èªèã¯ãäžå¹žã§ã誀解ãæãããããç°¡åã«ä¿®æ£ã§ããããšç¶ããŸããã ãããã圌ã¯ãã®èšäºã®ã»ãšãã©ããç¥èŠãä¿®æ£ããããã®åœŒã®æšå¥šããæ¹æ³ã説æãã説æããŠããããã«ãããã®åŠæ¹èªäœã«ã¯åé¡ããããŸãã ããŒãã£ã³ã®æ¹å€ã«å ããŠãããã®ææ¡ã¯ã @ cznicãGoãšã©ãŒåŠçã§
ãã¶ãåé¡ã¯ãç§ãã¡ã眮ãæããèœåãæã£ãŠãããã©ããã§ã
res, err := doThing()
if err != nil {
return nil, err
}
次ã®ãããªãã®ã§ïŒ
res, err := doThing() catch: nil, err
ããã䜿çšããŸããããããšã4è¡ããŒãžã§ã³ã䜿ãç¶ããŸããïŒ ããªãã®å人çãªå¥œã¿ã«é¢ä¿ãªãããã®ãããªä»£æ¿æ¡ã¯Goã³ãã¥ããã£ã§åºãæ¡çšãããæ £çšçã«ãªããšæããŸããïŒ çãããŒãžã§ã³ãèªã¿ãããã«æªåœ±é¿ãäžãããšããè°è«ã®äž»èŠ³æ§ãèãããšãããã°ã©ããŒãšã®ç§ã®çµéšã§ã¯ã圌ãã¯åäžè¡ããŒãžã§ã³ã«åŒ·ãåŒãå¯ããããã ãããšèšã£ãŠããŸãã
å®éã®è©±ïŒgo 1ã¯åºå®ãããŠãããç¹ã«ãã®åºæ¬çãªæ¹æ³ã§ã¯å€æŽãããŸããã
Go 2ãããã€ãã®ãã³ãã¬ãŒãã¿ã€ããå®è£ ãããŸã§ãããçš®ã®ãªãã·ã§ã³ã¿ã€ããææ¡ããããšã¯ç¡æå³ã§ãã ãã®æç¹ã§ããã¹ãŠãå€ãããŸãã
2017幎5æ16æ¥ã«ã¯ãååŸ11æ46åã§ãããªãŒHinners [email protected]æžããŸããïŒ
ã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å Žåã倧éã®ã³ãŒãã衚瀺ãããŸãã
ãšã©ãŒåŠçã®ãããã¯éåžžã«äž»èŠ³çãªç«å Žã§ãã
éåžžã«äž»èŠ³çã§ãããªããåºãå ±æãããŠããŸãã
ããèªèº«ãèšã£ãããã«ã
Goããã°ã©ããŒãç¹ã«ãã®èšèªã«äžæ £ããªããã°ã©ããŒã®éã§ããããè°è«ã®ãã€ã³ãã¯ããšã©ãŒã®åŠçæ¹æ³ã§ãã äŒè©±ã¯ãã·ãŒã±ã³ã¹ã®åæ°ã§ãã°ãã°åãã«å€ãããŸã
errïŒ= nil {ã®å Žå
ãšã©ãŒãè¿ã
}
çŸããŸããå ¬å¹³ãæãããã«ãRobã¯ãGoãšã©ãŒåŠçã«é¢ãããã®èªèã¯ãäžå¹žã§ã誀解ãæãããããç°¡åã«ä¿®æ£ã§ããããšç¶ããŸããã ãããã圌ã¯ãã®èšäºã®ã»ãšãã©ããç¥èŠãä¿®æ£ããããã®åœŒã®æšå¥šããæ¹æ³ã説æããããšã«è²»ãããŠããŸãã æ®å¿µãªãããããŒãã£ã³ã»ã¯ãŒã«ããã説æããŠããããã«ãããã®åŠæ¹èªäœã«ã¯åé¡ããããŸãã ããŒãã£ã³ã®æ¹å€ã«å ããŠãããã®ææ¡ã¯ã @ cznicãGoãšã©ãŒåŠçã§
ãã¶ãåé¡ã¯ãç§ãã¡ã眮ãæããèœåãæã£ãŠãããã©ããã§ã
resãerrïŒ= doThingïŒïŒ
errïŒ= nil {ã®å Žå
nilãè¿ãããšã©ãŒ
}
次ã®ãããªãã®ã§ïŒresãerrïŒ= doThingïŒïŒcatchïŒnilãerr
ããã䜿çšããŸããããããšã4è¡ããŒãžã§ã³ã䜿ãç¶ããŸããïŒ ããªãã®å人çãªå¥œã¿ã«é¢ä¿ãªãããã®ãããªä»£æ¿æ¡ã¯Goã³ãã¥ããã£ã§åºãæ¡çšãããæ £çšçã«ãªããšæããŸããïŒ çãããŒãžã§ã³ãèªã¿ãããã«æªåœ±é¿ãäžãããšããè°è«ã®äž»èŠ³æ§ãèãããšãããã°ã©ããŒãšã®ç§ã®çµéšã§ã¯ã圌ãã¯åäžè¡ããŒãžã§ã³ã«åŒ·ãåŒãå¯ããããã ãããšèšã£ãŠããŸãã
â
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŠãã ããã
Go 2ãããã€ãã®ãã³ãã¬ãŒãã¿ã€ããå®è£ ãããŸã§ãããçš®ã®ãªãã·ã§ã³ã¿ã€ããææ¡ããããšã¯ç¡æå³ã§ãã ãã®æç¹ã§ããã¹ãŠãå€ãããŸãã
ãã®ã¹ã¬ããã®ã¿ã€ãã«ã瀺ãããã«ãGo 2ã«ã€ããŠè©±ããŠãããšæããŸããããŸãããGo 2ãã¯ãã決ããŠãã®å©æ²è¡šçŸã§ã¯ãªããšå®å šã«ä¿¡ããŠããŸãã å®éãGo 1ãä¿®æ£ãããŠããããšãèãããšãGoã®è°è«ã®å€§éšåãGo2ã«è²»ããå¿ èŠããããŸãã
ããã¯èšã£ãŠããGoã®åé·æ§ã«ã€ããŠäžæºãèšã人ã¯èª°ã§ã
ãšã©ãŒåŠçã«ã¯ããšã©ãŒã®ç®çãšããåºæ¬çãªãã€ã³ããæ¬ ããŠããŸã
Goã§ã®åŠçã¯ããšã©ãŒã§ã¯ãªãã±ãŒã¹ãç°¡æœã§ç®ç«ããªããã®ã«ããããã«_not_ã§ã
ã§ããã ãã ããããGoã®ãšã©ãŒåŠçæŠç¥ã®ç®æšã¯ã匷å¶ããããšã§ã
åžžã«ã次ã®å Žåã«äœãèµ·ããããèæ
®ããã³ãŒãã®äœæè
æ©èœã倱æãããããŠæãéèŠãªã®ã¯ãã¯ãªãŒã³ã¢ãããå
ã«æ»ããããã³å埩ããæ¹æ³
çºä¿¡è
ã«æ»ãåã«ã
ãšã©ãŒåŠçãã€ã©ãŒãã¬ãŒããé ãããã®ãã¹ãŠã®æŠç¥ã¯ãç§ã«ã¯
ãããç¡èŠããŸãã
2017幎5æ16æ¥ç«ææ¥ã23ïŒ51 Dave
æ¬åœã®è©±ïŒgo 1ã¯ä¿®æ£ãããŠãããç¹ã«ããã§ã¯å€æŽãããŸãã
åºæ¬çãªæ¹æ³ãGo 2ãå®è£ ãããŸã§ãããçš®ã®ãªãã·ã§ã³ã¿ã€ããææ¡ããã®ã¯ç¡æå³ã§ã
ãã³ãã¬ãŒãã¿ã€ãã®äžéšã ãã®æç¹ã§ããã¹ãŠãå€ãããŸãã2017幎5æ16æ¥ã«ã¯ãååŸ11æ46åã§ãããªãŒHinners [email protected]æžããŸããïŒ
ã³ãŒãã®äžéšããã°ããã¹ãã£ã³ãããšãã»ãšãã©ã®å Žåã
質é
ãšã©ãŒåŠçã®ãããã¯éåžžã«äž»èŠ³çãªç«å Žã§ãã
éåžžã«äž»èŠ³çã§ãããªããåºãå ±æãããŠããŸãã
ããèªèº«ãèšã£ãããã«ã
Goããã°ã©ããŒãç¹ã«åå¿è ã®ããã°ã©ããŒã®éã§ã®å ±éã®è«ç¹
èšèªã¯ããšã©ãŒãåŠçããæ¹æ³ã§ãã äŒè©±ã¯ãã°ãã°
ã·ãŒã±ã³ã¹ã®åæ°ã§åãerrïŒ= nil {ã®å Žå
ãšã©ãŒãè¿ã
}çŸããŸãã
å ¬å¹³ãæãããã«ãRobã¯ãGoãšã©ãŒåŠçã«é¢ãããã®èªèã¯æ¬¡ã®ããã«è¿°ã¹ãŠããŸãã
ãæ®å¿µãªããã誀解ãæãããããç°¡åã«ä¿®æ£ã§ããŸããã ãããã圌ã¯ãã®ã»ãšãã©ãè²»ãããŠããŸã
圌ã説æããèšäºhttps://blog.golang.org/errors-are-values
ç¥èŠãä¿®æ£ããããã®æšå¥šãããæ¹æ³ã æ®å¿µãªãããããã®
説æãããŠããããã«ãåŠæ¹èªäœã¯åé¡ããããŸã
https://www.innoq.com/en/blog/golang-errors-monads/ããŒãã£ã³ã«ãã£ãŠãšãŠããã
ãã¥ãŒã«ã ããŒãã£ã³ã®æ¹è©ã«å ããŠãããã®ææ¡ã¯ãŸãã
@cznichttps ïŒ//github.com/cznicãGoã§è©äŸ¡ããŠãããšèšã£ãŠããå°å
ãšã©ãŒåŠçããã¶ãåé¡ã¯ãç§ãã¡ã眮ãæããèœåãæã£ãŠãããã©ããã§ã
resãerrïŒ= doThingïŒïŒ
errïŒ= nil {ã®å Žå
nilãè¿ãããšã©ãŒ
}次ã®ãããªãã®ã§ïŒ
resãerrïŒ= doThingïŒïŒcatchïŒnilãerr
ããã䜿çšããŸããããããšã4è¡ããŒãžã§ã³ã䜿ãç¶ããŸããïŒ
ããªãã®å人çãªå¥œã¿ã«é¢ä¿ãªããããªãã¯æ¬¡ã®ãããªä»£æ¿æ¡ãèããŸãã
ããã¯Goã³ãã¥ããã£ã§åºãæ¡çšãããæ £çšçã«ãªããŸããïŒ
çãããŒãžã§ã³ãéã«ãšããè°è«ã®äž»èŠ³æ§ãèãããš
èªã¿ãããã«åœ±é¿ããŸããããã°ã©ããŒãšã®ç§ã®çµéšã¯åœŒããããããã ãããšèšããŸã
åç·ããŒãžã§ã³ã«åŒ·ãåŒãå¯ããããŸããâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/19991#issuecomment-301787215 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAAcAwATgoJwL5WV-0nffLjLB9L86GYOks5r6ai3gaJpZM4M-dud
ã
ããããGoã®ãšã©ãŒåŠçæŠç¥ã®ç®æšã¯ã匷å¶ããããšã§ã
åžžã«ã次ã®å Žåã«äœãèµ·ããããèæ ®ããã³ãŒãã®äœæè
æ©èœã倱æãããããŠæãéèŠãªã®ã¯ãã¯ãªãŒã³ã¢ãããå ã«æ»ããããã³å埩ããæ¹æ³
çºä¿¡è ã«æ»ãåã«ã
ããŠãGoã¯ãã®ç®æšãéæããŸããã§ããã ããã©ã«ãã§ã¯ãGoã䜿çšãããšãè¿ããããšã©ãŒãç¡èŠã§ããŸããå€ãã®å Žåãã©ããã§æ£åžžã«æ©èœããªããªããŸã§ããã®ããšãç¥ãããšããã§ããŸããã ããã©ããããGoã³ãã¥ããã£ã®äŸå€ïŒããã¯èŠç¹ã蚌æããããã®åãªãäŸã§ãïŒã§å€§ãã«å«ãããŠããã®ã§ãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãããããããããèæ ®ããå¿ èŠããããŸãã ããã¯ãã°ãã°ç§ãã¡ã«ãã¹ãŠãæãŸããŠç¡èŠãããšããåé¡ã«ã€ãªãããŸãããããã¯ããã°ã©ããŒã®ããã§ãã
åºæ¬çã«ãGoã§ã®ãšã©ãŒåŠçã¯ãªããã€ã³ã§ãã ãã¹ãŠã®ãšã©ãŒãåŠçããå¿ èŠããããšããã®ã¯ãå£é ã®æ £ç¿ã«é¢ãããã®ã§ãã ãããå®éã«ããªãã«ãšã©ãŒãåŠçããããšã匷å¶ãããªãã°ãç®æšã¯éæãããã§ãããã ããšãã°ãã³ã³ãã€ã«æã®ãšã©ãŒãèŠåããããŸãã
ããã念é ã«çœ®ããŠããã€ã©ãŒãã¬ãŒããé ããŠã誰ãå·ã€ããŸããã å£é ã§ã®æ £ç¿ã¯ä»ã§ãç¶æãããããã°ã©ããŒã¯ä»ã®ããã«ãšã©ãŒåŠçããªããã€ã³ããŸãã
Goã®ãšã©ãŒåŠçæŠç¥ã®ç®æšã¯ã匷å¶ããããšã§ã
åžžã«ã次ã®å Žåã«äœãèµ·ããããèæ ®ããã³ãŒãã®äœæè
æ©èœã倱æãããããŠæãéèŠãªã®ã¯ãã¯ãªãŒã³ã¢ãããå ã«æ»ããããã³å埩ããæ¹æ³
çºä¿¡è ã«æ»ãåã«ã
ããã¯ééããªãé«è²Žãªç®æšã§ãã ãã ãããã©ã€ããªãããŒã®å¯èªæ§ãšã³ãŒãã®æå³ãšã®ãã©ã³ã¹ããšãå¿ èŠãããã®ãç®æšã§ãã
Goããã°ã©ããŒãšããŠãç§ã¯ããªãã«èšãããšãã§ããŸãã
èªã¿ããããæãªãããã®Goã®ãšã©ãŒåŠçã äœãèŠããªã
ä»ã®äººãæžããã³ãŒããèªãããšã«äžå¿«æãæããªãã®ã§ããã¬ãŒããªããã
ããã°ã©ããŒã«è¡ããªããã
0:10ææ°Žæã2017幎5æ17æ¥ã«ã¯ãããªãŒHinners [email protected]
æžããŸããïŒ
Goã®ãšã©ãŒåŠçæŠç¥ã®ç®æšã¯ã匷å¶ããããšã§ã
åžžã«ã次ã®å Žåã«äœãèµ·ããããèæ ®ããã³ãŒãã®äœæè
æ©èœã倱æãããããŠæãéèŠãªã®ã¯ãã¯ãªãŒã³ã¢ãããå ã«æ»ããããã³å埩ããæ¹æ³
çºä¿¡è ã«æ»ãåã«ãããã¯ééããªãé«è²Žãªç®æšã§ãã ããã¯ç®æšã§ãããããã¯
ãã©ã€ããªãããŒã®å¯èªæ§ãšã³ãŒãã®æå³ã«å¯ŸããŠãã©ã³ã¹ãåããŠããŸããâ
ã³ã¡ã³ãããã®ã§ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/19991#issuecomment-301794653 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAAcAzfcu5hq86xxVj85qfOquVawHh44ks5r6a5zgaJpZM4M-dud
ã
@davecheney ããšã©ãŒåŠçã¯æ瀺çã§ãããåŸã§å»¶æãããã¹ãã§ã¯ãªãããšã«åæããŸããïŒãã¡ããã_ã§å®è¡ã§ããŸãïŒã1ã€ã®é¢æ°ã§ãšã©ãŒãåŠçããããã«ãšã©ãŒãããããªã³ã°ãããæŠç¥ããããŸããè¿œå æ å ±ãè¿œå ãŸãã¯åé€ããŸãïŒã¯ã©ã€ã¢ã³ãã«éä¿¡ããåã«ïŒã ç§ã®å人çãªåé¡ã¯ãåã4è¡ã®ã³ãŒããäœåºŠãæžããªããã°ãªããªãããšã§ãã
äŸãã°ïŒ
getNewTokenïŒid int64ïŒïŒããŒã¯ã³ããšã©ãŒïŒ{
user := &User{ID:id}
u, err := user.Get();
if err != nil {
return Token{}, err
}
token, err := token.New(u);
if err != nil {
return Token{}, err
}
return token, nil
}
ç§ã¯ããã§ãšã©ãŒãåŠçããŠããŸãããç§ã¯ãããè¿ãã ãã§ãã ãã®çš®ã®ã³ãŒããèªããšãã¯ããšã©ãŒã®ãåŠçããã¹ãããããå¿
èŠããããã³ãŒãã®äž»ãªç®çãèŠã€ããã®ãå°é£ã§ãã
äžèšã®ã³ãŒãã¯ã次ã®ãããªãã®ã«ç°¡åã«çœ®ãæããããšãã§ããŸãã
getNewTokenïŒid int64ïŒïŒããŒã¯ã³ããšã©ãŒïŒ{
user := &User{ID:id}
u, err := throw user.Get(); //throw should also wrap the error
token, err := throw token.New(u);
return token, nil
}
ãã®ãããªã³ãŒãã¯ãããèªã¿ããããäžèŠæ§ã®å°ãªãïŒIMHOïŒã³ãŒãã§ãã ãŸãããšã©ãŒã¯ããã®é¢æ°ã䜿çšãããŠããé¢æ°ã§åŠçãããå¯èœæ§ããããåŠçããå¿
èŠããããŸãã
Goããã°ã©ããŒãšããŠãç§ã¯Goã®ãšã©ãŒåŠçã®åé·æ§ãèªã¿ããããæãªãããšã¯ãªããšããªãã«èšãããšãã§ããŸãã
åæããŸãã
ç¡é¢ä¿ãªã¡ã¢ã«ã€ããŠïŒ
ãŸãããçµæãã¿ã€ãã¯ææ¡ã«å¯ŸããŠå°ãå ·äœçãããããã«æãããŸãã ãã¶ããåã¯å®éã«ã¯2ã€ã®ããªã¢ã³ãã®åæåã§ãã åæåã®æŠå¿µãããå Žåã¯ãçµæãŸãã¯ãªãã·ã§ã³ããã±ãŒãžãããªãŒããäœæãããããèšèªã«è¿œå ããåã«å®éšããŠãå®éã«ã¯åå©çšã§ãããåªããŠããã ãã®äœåãªæ§æãã¡ãœãããããããè¿œå ããå¿ èŠã¯ãããŸãããçµæã¿ã€ãã®å Žåã åæåãGoã§åœ¹ç«ã€ãã©ããã¯ããããŸããããããäžè¬çãªã±ãŒã¹ã«ã€ããŠè°è«ã§ããã°ãããå ·äœçãªçµæã¿ã€ãã®å Žåããããããã匷åã«ãªããŸãïŒããããç§ã¯ééã£ãŠããŸãïŒã
func getNewTokenïŒid int64ïŒïŒããŒã¯ã³ããšã©ãŒïŒ{
userïŒ=ïŒUser {IDïŒid}
u, err := user.Get()
if err != nil {
return Token{}, err
}
return token.New(u)
}
åçã®ããã§ãã
0:34ææ°Žæã2017幎5æ17æ¥ã«ã¯ãKiura [email protected]ã¯æžããŸããïŒ
@davecheney https://github.com/davecheney ãç§ã¯ããªãã«åæããŸãã
ãã®ãšã©ãŒåŠçã¯æ瀺çã§ãããåŸã§å»¶æãããã¹ãã§ã¯ãããŸããïŒ
ãã¡ãããããªãã¯_ïŒã§è¡ãããšãã§ããŸããããããªã³ã°ãããæŠç¥ããããŸã
1ã€ã®æ©èœã§ããããåŠçããããã®ãšã©ãŒãè¿œå æ å ±ãè¿œå ããããã®ãšã©ãŒããŸãã¯
åé€ããŸãïŒã¯ã©ã€ã¢ã³ãã«éä¿¡ããåã«ïŒã ç§ã®å人çãªåé¡ã¯ç§ãæã£ãŠããããšã§ã
åã4è¡ã®ã³ãŒããäœåºŠãæžãäŸãã°ïŒ
getNewTokenïŒid int64ïŒïŒããŒã¯ã³ããšã©ãŒïŒ{
userïŒ=ïŒUser {IDïŒid}
uãerrïŒ= user.GetïŒïŒ;
errïŒ= nil {ã®å Žå
ããŒã¯ã³{}ãè¿ãããšã©ãŒ
}ããŒã¯ã³ããšã©ãŒïŒ= token.NewïŒuïŒ;
errïŒ= nil {ã®å Žå
ããŒã¯ã³{}ãè¿ãããšã©ãŒ
}
ããŒã¯ã³ãè¿ããnil}
ç§ã¯ããã§ãšã©ãŒãåŠçããŠããŸãããç§ã¯ãããè¿ãã ãã§ãã ãããŠç§ãèªãã ãšã
ãã®çš®ã®ã³ãŒãã§ã¯ããšã©ãŒã®ãåŠçããã¹ãããããå¿ èŠããããèŠã€ããã®ãå°é£ã§ã
ã³ãŒãã®äž»ãªç®çäžèšã®ã³ãŒãã¯ã次ã®ãããªãã®ã«ç°¡åã«çœ®ãæããããšãã§ããŸãã
getNewTokenïŒid int64ïŒïŒããŒã¯ã³ããšã©ãŒïŒ{
userïŒ=ïŒUser {IDïŒid}
uãerrïŒ= throw user.GetïŒïŒ; // throwããšã©ãŒãã©ããããå¿ èŠããããŸã
ããŒã¯ã³ããšã©ãŒïŒ= throw token.NewïŒuïŒ;
ããŒã¯ã³ãè¿ããnil
}
ãã®ãããªã³ãŒãã¯ãããèªã¿ããããäžèŠæ§ã®å°ãªãïŒIMHOïŒã³ãŒãã§ãã ãããŠãã®
ãšã©ãŒã¯ããã®é¢æ°ãååšããé¢æ°ã§åŠçãããå¯èœæ§ããããåŠçããå¿ èŠããããŸã
䜿çšæžã¿ãâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/19991#issuecomment-301802010 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAAcA9sIRXX7RSdDcUOidpe-qLTR7unNks5r6bP3gaJpZM4M-dud
ã
ãŸãããçµæãã¿ã€ãã¯ææ¡ã«å¯ŸããŠå°ãå ·äœçãããããã«æãããŸãã ãã¶ããåã¯å®éã«ã¯2ã€ã®ããªã¢ã³ãã®åæåã§ãã åæåã®æŠå¿µãããå Žåã¯ãçµæãŸãã¯ãªãã·ã§ã³ããã±ãŒãžãããªãŒããäœæãããããèšèªã«è¿œå ããåã«å®éšããŠãå®éã«ã¯åå©çšã§ãããåªããŠããã ãã®äœåãªæ§æãã¡ãœãããããããè¿œå ããå¿ èŠã¯ãããŸãããçµæã¿ã€ãã®å Žåã åæåãGoã§åœ¹ç«ã€ãã©ããã¯ããããŸããããããäžè¬çãªã±ãŒã¹ã«ã€ããŠè°è«ã§ããã°ãããå ·äœçãªçµæã¿ã€ãã®å Žåããããããã匷åã«ãªããŸãïŒããããç§ã¯ééã£ãŠããŸãïŒã
å ã®ææ¡ã§è¿°ã¹ãããŠããããã«ãçµæã¿ã€ãã¯çæ³çã«ã¯åèšã¿ã€ããšããŠå®è£ ããïŒããšãã°ãåæåala Rustã®ïŒãèšèªã«ããããè¿œå ããããã®ãªãŒãã³ãªææ¡ããããŸãã
ãã ããè¿œå ã®èšèªãµããŒããªãã§åå©çšå¯èœãªçµæã¿ã€ãã©ã€ãã©ãªãå®è£ ããã«ã¯ãåèšã¿ã€ãã ãã§ã¯äžååã§ãã ãŸãããžã§ããªãã¯ãå¿ èŠã§ãã
ãã®ææ¡ã¯ããžã§ããªãã¯ã¹ã«äŸåããã代ããã«ã³ã³ãã€ã©ãŒããã®ç¹æ®ãªã±ãŒã¹ã®ãã«ãã«äŸåããçµæã¿ã€ããå®è£ ãããšããã¢ã€ãã¢ã暡玢ããŠããŸããã
ãããæçš¿ããã®ã§ããããè¿œæ±ããããã®æè¯ã®æ¹æ³ã¯ãèšèªã¬ãã«ã®ãžã§ããªãã¯ã¹ã®ãµããŒãã䜿çšããããšã§ããããšã«åæããŸãã
@davecheney ã確ãã«ããã®å Žåã¯ã»ãšãã©éãã¯ãããŸãããããšã©ãŒãè¿ãé¢æ°ã§3ã4åã®åŒã³åºããããå Žåã¯ã©ããªããŸããïŒ
PSç§ã¯ãšã©ãŒãåŠçããGo1æ§é ã«å察ããŠããŸãããç§ã¯ãããããè¯ããããããªããšæããŸãã
å ã®ææ¡ã§è¿°ã¹ãããŠããããã«ãçµæã¿ã€ãã¯çæ³çã«ã¯åèšã¿ã€ããšããŠå®è£ ããïŒããšãã°ãåæåala Rustã®ïŒãèšèªã«ããããè¿œå ããããã®ãªãŒãã³ãªææ¡ããããŸãã
ç³ãèš³ãããŸããããç§ã¯ãã£ãšæ確ã«ãã¹ãã§ããïŒç§ã¯ãã®å£°æã䞻匵ããŠããŸããïŒ
Goã®çµæã¿ã€ããå¿ èŠã§ã¯ãªããç¹æ®ãªã±ãŒã¹ã®ã³ã³ãã€ã©ãŒã®éæ³ãå©çšããã ãã§ãããšæããŸãã
ç§ã«ã¯æªãèãã®ããã«æããŸãã
ãã ããè¿œå ã®èšèªãµããŒããªãã§åå©çšå¯èœãªçµæã¿ã€ãã©ã€ãã©ãªãå®è£ ããã«ã¯ãåèšã¿ã€ãã ãã§ã¯äžååã§ãã ãŸãããžã§ããªãã¯ãå¿ èŠã§ãã
ãã®ææ¡ã¯ããžã§ããªãã¯ã¹ã«äŸåããã代ããã«ã³ã³ãã€ã©ãŒããã®ç¹æ®ãªã±ãŒã¹ã®ãã«ãã«äŸåããçµæã¿ã€ããå®è£ ãããšããã¢ã€ãã¢ã暡玢ããŠããŸããã
ãããæçš¿ããã®ã§ããããè¿œæ±ããããã®æè¯ã®æ¹æ³ã¯ãèšèªã¬ãã«ã®ãžã§ããªãã¯ã¹ã®ãµããŒãã䜿çšããããšã§ããããšã«åæããŸãã
ã¯ããååã«å ¬å¹³ã§ãã ç§ã¯ããªãã®æåŸã®å£°æã«åæããŸãã ãšã«ããGo2ãåŸ ããªããã°ãªããªãå Žåã¯ãæåã«ãã£ãšäžè¬çãªåé¡ã解決ããã»ããããã§ãããïŒå®éã«åé¡ã§ãããšä»®å®ããŠïŒ:)
ãŸããRob Pikeã¯ãäžèšã®ããã«ãšã©ãŒåŠçã«é¢ããèšäºãæžããŸããã ãã®ã¢ãããŒãã¯åé¡ããä¿®æ£ãããŠããããã«èŠããŸãããå¥ã®åé¡ãçºçããŸããããã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã«ããã³ãŒãã®èšåŒµã§ãã
ãæ瀺çãªãšã©ãŒåŠçããšã詳现ãªãšã©ãŒåŠçããæ··åããªãããšãéèŠã ãšæããŸãã Goã¯ããŠãŒã¶ãŒã«ãšã©ãŒåŠçãå§ä»»ããã®ã§ã¯ãªãããã¹ãŠã®ã¹ãããã§ãšã©ãŒåŠçãæ€èšããããã«åŒ·å¶ããããšèããŠããŸãã ãšã©ãŒãã¹ããŒããå¯èœæ§ã®ããåŒã³åºãé¢æ°ããšã«ããšã©ãŒãåŠçãããã©ãããããã³ãã®æ¹æ³ã決å®ããå¿ èŠããããŸãã ãšã©ãŒãç¡èŠããããšãæå³ããå Žåãããã°ãåè©Šè¡ããããšãæå³ããå ŽåããããŸããå€ãã®å Žåããšã©ãŒãåŒã³åºãå ã«æž¡ããŠåŠçããããšãæå³ããŸãã
Robã®èšäºã¯çŽ æŽããããEffective Go 2ã®äžéšã§ããå¿ èŠããããŸãããããã¯ãããŸã§ã®ãšããããç解ã§ããªãæŠç¥ã§ãã ç¹ã«ç°çš®ã®åŒã³åºãå ãåŠçããå Žåã管çãããšã©ãŒåŠçããããããããŸã
ãšã©ãŒåŠçã«åœ¹ç«ã€ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒããã®ä»ã®æ©èœãæ€èšããã®ã¯äžåçã§ã¯ãªããšæããŸãã Goãšã©ãŒåŠçã®åºæ¬ãæãªããªãããšãéèŠã ãšæããŸãã ããšãã°ãçºçãããã¹ãŠã®ãšã©ãŒãåŠçããé¢æ°ã¬ãã«ã®ãšã©ãŒãã³ãã©ãŒã確ç«ããã®ã¯æªãããšã§ãã ããã¯ãäŸå€åŠçãéåžžè¡ãããšãããã°ã©ããŒãå®è¡ã§ããããã«ããããšãæå³ããŸããã€ãŸãããšã©ãŒã®èæ ®ãã¹ããŒãã¡ã³ãã¬ãã«ã®åé¡ãããããã¯ã¬ãã«ãŸãã¯é¢æ°ã¬ãã«ã®åé¡ã«ç§»ããŸãã ããã¯ééããªãå²åŠã«åããŠããŸãã
@billyh ãGoã§ã®ãšã©ãŒåŠçãã¿ãŒã³ãã®èšäºã«é¢ããŠã¯ãä»ã®è§£æ±ºçããããŸãã
@egonelbre
ãããã®ãœãªã¥ãŒã·ã§ã³ã¯ãåãã¿ã€ãã®æäœãç¹°ãè¿ãå®è¡ããŠããå Žåã«ã®ã¿é©ããŠããŸãã éåžžã¯ããã§ã¯ãããŸããã ãããã£ãŠããããå®éã«é©çšããããšã¯ã»ãšãã©ã§ããŸããã
@urandomã§ã¯ãçŸå®çãªäŸã瀺ããŠãã ããã
確ãã«ç§ã¯ãã£ãšè€éãªäŸãåãããšãã§ããŸãïŒ
func (conversion *PageConversion) Convert() (page *kb.Page, errs []error, fatal error)
ãããã¯ã©ãã«ã§ãåœãŠã¯ãŸãããã§ã¯ãªãããšã¯ç解ããŠããŸãããæ¹åãããäŸã®é©åãªãªã¹ãããªããã°ããŸãšããªè°è«ãããæ¹æ³ã¯ãããŸããã
@egonelbre
å 責äºé ïŒç§ã¯jujuã䜿çšããããšããã³ãŒããèªãã ããšããããŸããã ããã¯ç§ãé ã®ãŠã£ãºãã«ç¥ã£ãŠããåãªããçç£ã補åã§ãã ãã®ãããªã¿ã€ãã®ãšã©ãŒåŠçïŒç¬ç«ããæäœã®éã«ãšã©ãŒããã§ãã¯ã€ã³ãããïŒãgoã®äžçã§æ®åããŠããããšã¯åççã«ç¢ºä¿¡ããŠãããããã«ééããŠããªã人ã¯ããªããšæããŸãã
@urandomåæããŸãã å®éã®ã³ãŒããªãã§è°è«ããéã®äž»ãªåé¡ã¯ã人ã ãå®éã®åé¡ã§ã¯ãªããåé¡ã®ãèŠç¹ããèŠããŠããããšã§ããããã¯ãåé¡ã®èšè¿°ãé床ã«åçŽåããããšã«ã€ãªããããšããããããŸãã _PSïŒ goã§1ã€ã®ãŸããã_
ããšãã°ããããã®å®éã®äŸãããèæ ®ããå¿ èŠã®ããä»ã®ããã€ãã®ããšãããããŸãã
ã幞ãããšã倱æãã®éã ãã§ã¯ãããŸããã ç§ã¯ãããã解決ã§ããªããšèšã£ãŠããã®ã§ã¯ãªãããã ããããèšç»ããŠè°è«ããå¿ èŠããããšããããšã§ãã
@egonelbreã¯ãä»é±ã®Golang Weeklyã®å¥ã®äŸã§ãMarioZupanã«ãããGoã§éçããã°ãžã§ãã¬ãŒã¿ãŒãäœæããããšããã¿ã€ãã«ã®èšäºã«ãããŸãã
func (ds *GitDataSource) Fetch(from, to string) ([]string, error) {
fmt.Printf("Fetching data from %s into %s...\n", from, to)
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
}
fmt.Print("Fetching complete.\n")
return dirs, nil
}
泚ïŒããªãªã®ã³ãŒãã«å¯Ÿããæ¹å€ãæ瀺ããŠããããã§ã¯ãããŸããã å®éãç§ã¯åœŒã®èšäºããšãŠã楜ããã ã
æ®å¿µãªããããã®ãããªäŸã¯ãã¹ãŠGoãœãŒã¹ã§ã¯äžè¬çãããŸãã Goã³ãŒãã¯ãé¢å¿ã®ãã1è¡ã®ãã®ç·è·¯ãã¿ãŒã³ã«åŒãå¯ãããããã®åŸã«3è¡ã®åäžãŸãã¯ã»ãŒåäžã®ãã€ã©ãŒãã¬ãŒããäœåºŠãç¹°ãè¿ãããŸãã ããªãªã®ããã«ãå¯èœãªå Žåã¯å²ãåœãŠãšæ¡ä»¶ä»ããçµã¿åããããšãå°ã圹ç«ã¡ãŸãã
ã³ãŒãã®è¡ãæå°éã«æããããšãäž»ãªç®çãšããŠããã°ã©ãã³ã°èšèªãèšèšãããŠãããã©ããã¯ããããŸããããaïŒæå³ã®ããã³ãŒããšå®åæã®æ¯çã¯ãããã°ã©ãã³ã°èšèªã®å質ã®ïŒå€ãã®ïŒæå¹ãªå°ºåºŠã®1ã€ã§ããå¯èœæ§ããããŸããbïŒããã°ã©ãã³ã°ã®å€ãã¯ãšã©ãŒåŠçã䌎ãããããã®ãã¿ãŒã³ã¯Goã³ãŒãã«æµžéãããããã£ãŠãéå°ãªãã€ã©ãŒãã¬ãŒãã®ãã®ç¹å®ã®ã±ãŒã¹ãåçåããã¡ãªããããããŸãã
è¯ã代æ¿æ¡ãç¹å®ã§ããã°ãããã¯æ¥éã«æ¡çšãããGoã®èªã¿åããæžã蟌ã¿ãä¿å®ãããã«æ¥œãããªããšæããŸãã
Rebecca SkinnerïŒ@cercerillaïŒã¯ãGoã®ãšã©ãŒåŠçã®æ¬ ç¹ã«é¢ããåªããèšäºãšãã¹ã©ã€ããããã®Monadic Error Handling inGoã®ãœãªã¥ãŒã·ã§ã³ãšããŠã¢ããã䜿çšããåæãå ±æããŸããã ç§ã¯æåŸã«åœŒå¥³ã®çµè«ãç¹ã«å¥œãã§ããã
圌ã®èšäºã§ã¬ããã«ã®ããããåç §ããããã®@davecheneyã®ãããã§ã·ã³ãã«åµåReduxã®ãããèŠã€ããããã«ç§ãå¯èœã«ããŸããã ïŒGo 2ã«å¯Ÿããç§ã®ãã©è²ã®æ¥œèŠ³äž»çŸ©ãããå³ããçŸå®ã«åºã¥ããŠè¡ã£ãŠãããDaveã«ãæè¬ããŸããïŒ
Goã³ãŒãã¯ãé¢å¿ã®ãã1è¡ã®ãã®ç·è·¯ãã¿ãŒã³ã«åŒãå¯ãããããã®åŸã«3è¡ã®åäžãŸãã¯ã»ãŒåäžã®ãã€ã©ãŒãã¬ãŒããäœåºŠãç¹°ãè¿ãããŸãã
ãã¹ãŠã®å¶åŸ¡ãããŒå¶åŸ¡ã¹ããŒãã¡ã³ãã¯éèŠã§ãã ãšã©ãŒåŠçã©ã€ã³ã¯ãæ£ç¢ºæ§ã®èŠ³ç¹ããéåžžã«éèŠã§ãã
ãã€ã©ãŒãã¬ãŒãã«å¯Ÿããæå³ã®ããã³ãŒãã®æ¯çã¯ãããã°ã©ãã³ã°èšèªã®å質ã®ïŒå€ãã®ïŒæå¹ãªå°ºåºŠã®1ã€ã§ããå¯èœæ§ããããŸã
ãšã©ãŒåŠçã¹ããŒãã¡ã³ããæå³ããªããªããšèª°ããèããå Žåã¯ãã³ãŒãã£ã³ã°ãé 匵ã£ãŠãã ãããçµæã«è¿ã¥ããªãããã«ããããšæããŸãã
@davecheneyã®SimplicityDebt Reduxã§ã«ããŒãããŠãããã€ã³ãã®1ã€ã«å¯ŸåŠããã«ã¯ïŒããã«ã€ããŠã¯ã«ããŒããŸããããç¹°ãè¿ãå¿ èŠããããšæããŸãïŒã
次ã®è³ªåã¯ããã®ã¢ããã£ãã¯åœ¢åŒããšã©ãŒãåŠçããåäžã®æ¹æ³ã«ãªããã©ããã§ãã
ãã®ãããªãã®ããšã©ãŒãåŠçãããåäžã®ãæ¹æ³ã«ãªãããã«ã¯ãæšæºã©ã€ãã©ãªå šäœãšãã¹ãŠã®ãGo2ãäºæãããžã§ã¯ãã§è¡ãããé倧ãªå€æŽã§ããå¿ èŠããããŸãã ããã¯è³¢æã§ã¯ãªããšæããŸããPython2/ 3ã®å€§å€±æã¯ããã®ãããªåè£ãèšèªãšã³ã·ã¹ãã ã«ã©ã®ããã«æ害ãäžããå¯èœæ§ããããã瀺ããŠããŸãã
ãã®ææ¡ã§è¿°ã¹ãããã«ãçµæã¿ã€ããèªåçã«åçã®ã¿ãã«ãã©ãŒã ã«åŒ·å¶å€æã§ããå Žåã¯ãæ¢åã®ã³ãŒããšã®äžäœäºææ§ãç¶æããªããããã®ã¢ãããŒããå šé¢çã«æ¡çšããæ¶ç©ºã®Go2æšæºã©ã€ãã©ãªã®èŠ³ç¹ããã±ãŒããæã£ãŠé£ã¹ãããšãã§ããŸãã ããã«ãããèå³ã®ãã人ã¯ãããå©çšã§ããŸãããããã§ãGo1ã§äœæ¥ãããã©ã€ãã©ãªã¯ããã®ãŸãŸäœ¿çšã§ããŸãã ã©ã€ãã©ãªã®äœæè ã¯ãå€ãã¹ã¿ã€ã«ã䜿çšããŠGo1ãšGo2ã®äž¡æ¹ã§åäœããã©ã€ãã©ãªãäœæããããMonadicã¹ã¿ã€ã«ã䜿çšããŠGo2ã®ã¿ã§åäœããã©ã€ãã©ãªãäœæããããéžæã§ããŸãã
ãšã©ãŒåŠçã®ãå€ãæ¹æ³ããšãæ°ããæ¹æ³ãã¯ãèšèªã®ãŠãŒã¶ãŒãããã«ã€ããŠèããå¿ èŠããªããå¿ èŠã«å¿ããŠãå€ãæ¹æ³ãã§äœæ¥ãç¶ããããšãã§ãããšããç¹ã§äºææ§ããããŸãã ããã«ã¯ç¹å®ã®æŠå¿µçãªçŽç²ããæ¬ ããŠããŸãããæ¢åã®ã³ãŒããå€æŽããã«åäœããç¶ããææ°ã ãã§ãªããã¹ãŠã®ããŒãžã§ã³ã®èšèªã§åäœããã©ã€ãã©ãªãéçºã§ããããã«ãããããã¯ããã«éèŠã§ã¯ãªããšæããŸãã
ãšã©ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¢ãã«ãšæ°ããã¢ããã£ãã¯åã®äž¡æ¹ãåŒãç¶ããµããŒãããããšã¯ãçŽããããããã§ãããGo2.0ã®åå¿è ã«äžæ確ãªã¬ã€ãã³ã¹ãæäŸããŸãã
ãããã¯ãã¬ãŒãã§ããèšèªããã®ãŸãŸåçµããããèšèªãé²åãããŠãå¶çºçãªè€éããè¿œå ãã以åã®ããæ¹ãã¬ã¬ã·ãŒããŒã«å§ããŸãã å€ãæ©èœãå»æ¢ããããäºææ§ããããããŸãã¯é倧ãªå€æŽã®åœ¢ã§æžå€ã«ãããã«ããããããå€ãæ©èœã眮ãæããæ°ããæ©èœãè¿œå ããããšã¯ããã®èšèªã®ãŠãŒã¶ãŒãèãããã®ã§ããããããããã¯æ¬åœã«2ã€ã®ãªãã·ã§ã³ã ãã ãšæããŸãé¢ä¿ãªãåŠã¶å¿ èŠããããŸãã
èšèªãå€ããããšã¯ã§ããªããšæããŸãããããšãGo2ããããå®å šã«æ¡çšãããšããŠããæ°åè ã«ãå€ãæ¹æ³ããšãæ°ããæ¹æ³ãã®äž¡æ¹ãåŠã¶ããšãé¿ããŠããããŸãã ããªãã¯ãŸã Go1ãšGo2ã®åè£ãæ®ãããŠããã§ãããããããŠæ°åè ã¯éããäœã§ãããçåã«æãã§ãããããããŠãšã«ãããGo1ããåŠã°ãªããã°ãªããªãããšã«ãªãã§ãããã
äžäœäºææ§ã¯ãèšèªãšã³ãŒãã®äºææ§ãæããã®ã«åœ¹ç«ã€ãšæããŸããæ§æãå€ããªã£ãŠããŠããGoãæããæ¢åã®è³æã¯ãã¹ãŠåŒãç¶ãæå¹ã§ãã Goã®ææããã¹ãŠèª¿ã¹ãŠãå€ãæ§æãç¡å¹ã«ããå¿ èŠã¯ãããŸãããææã¯ãæãªãšãã«ãæ°ããæ§æããããšããéç¥ãè¿œå ããããšãã§ããŸãã
ããããè¡ãã«ã¯è€æ°ã®æ¹æ³ãããããšããã®ã¯ãäžè¬çã«åçŽæ§ãšããããªãºã ãšããGoã®å²åŠã«åããããšãç解ããŠããŸãããæ°ããèšèªæ©èœãè¿œå ããããã«æ¯æããªããã°ãªããªã代åã§ãã æ°ããèšèªæ©èœã¯ããã®æ§è³ªäžãå€ãã¢ãããŒããå»æ¢ããŸãã
ç§ã¯ç¢ºãã«ãGopherã«ãšã£ãŠããèªç¶ãªæ¹æ³ã§åãã³ã¢åé¡ã解決ããæ¹æ³ããããããããªãããšãèªããããšæããŸãããæ¢åã®ã¢ãããŒãããã®ãã®ãããªäžå¿«ãªå€æŽã§ã¯ãããŸããã
èæ ®ãã¹ããã1ã€ã®ããšïŒGoã¯èšèªãç¿åŸãããããããšããæš¡ç¯çãªä»äºãããŠããŸããããããã ãã人ã ãèšèªã«åå ãããããšã«äŒŽãé害ã§ã¯ãããŸããã Goã®ãšã©ãŒåŠçã®åé·æ§ãèŠãŠãããã«ãã£ãŠå»¶æãããŠãã人ããããããããšèšã£ãŠãéèšã§ã¯ãããŸããããã®äžã«ã¯ãèšèªã®æ¡çšãæåŠãã人ãããŸãã
èšèªã®æ¹åãçŸåšããã«ãã£ãŠå»¶æãããŠãã人ã ãåŒãä»ããããšãã§ãããã©ããããããŠãããèšèªãåŠã³ã«ããããããšãšã©ã®ããã«ãã©ã³ã¹ããšãããå°ãã䟡å€ããããšæããŸãã
ãã ããã¢ããã£ãã¯ãšã©ãŒåŠçã®ãããªããšãè¡ããšããšã©ãŒã«ã€ããŠèãããããšããGoã®å²åŠã«åããŸãã ã¢ããã£ãã¯ãšã©ãŒåŠçãšJavaã¹ã¿ã€ã«ã®äŸå€åŠçã¯ãã»ãã³ãã£ã¯ã¹ãéåžžã«äŒŒãŠããŸãïŒãã ããæ§æã¯ç°ãªããŸãïŒã Goã¯ãèãããšãã«ãšã©ãŒåŠçã³ãŒããè¿œå ããã ãã§ãªããããã°ã©ããŒãåãšã©ãŒãæ瀺çã«åŠçããããšãæåŸ
ãããšãããæå³çã«ç°ãªãå²åŠãæ¡çšããŸããã å®éã return nil, err
ã€ãã£ãªã ã¯å³å¯ã«èšãã°æé©ã§ã¯ãããŸãããããã¯ãããããè¿œå ã®æçšãªã³ã³ããã¹ããè¿œå ã§ããããã§ãã
Goã®ãšã©ãŒåŠçã«å¯ŸåŠããè©Šã¿ã¯ãããã念é ã«çœ®ããŠããå¿ èŠãããããšã©ãŒã«ã€ããŠèããã®ãç°¡åã«é¿ããããªãããã«ããå¿ èŠããããšæããŸãã
@alercahç§ã¯ããªããä»èšã£ããã¹ãŠã®ãã®ãšã¯éãããšãæé¡ããå¿ èŠããããŸã...
ã¢ããã£ãã¯ãšã©ãŒåŠçã®ãããªããšãããããšã¯ããšã©ãŒã«ã€ããŠèãããããšããGoã®å²åŠã«åããŸãã
Rustããæ¥ãŠããã®ã§ãRustïŒãŸãã¯Rustã³ã³ãã€ã©ïŒã¯å®éã«ã¯Goããããšã©ãŒã«ã€ããŠèãããããããšæããŸãã Rustã®Result
ã¿ã€ãã«ã¯ïŒ[must_use]å±æ§ããããŸããããã¯ãæªäœ¿çšã®çµæãã³ã³ãã€ã©èŠåãçæããããšãæå³ããŸãã ããã¯Goã§ã¯ããã§ã¯ãããŸããïŒRebecca Skinnerã¯åœŒå¥³ã®è¬æŒã§ããã«åãçµãã§ããŸãïŒïŒGoã³ã³ãã€ã©ã¯ãããšãã°æªåŠçã®error
å€ã«ã€ããŠèŠåããŸããã
Ruståã·ã¹ãã ã¯ãã³ãŒãã§å¯ŸåŠããããã¹ãŠã®ãšã©ãŒã±ãŒã¹ã匷å¶ããŸããããã§ãªãå Žåãããã¯åãšã©ãŒããŸãã¯ããããèŠåã§ãã
ã¢ããã£ãã¯ãšã©ãŒåŠçãšJavaã¹ã¿ã€ã«ã®äŸå€åŠçã¯ãã»ãã³ãã£ã¯ã¹ãéåžžã«äŒŒãŠããŸãïŒãã ããæ§æã¯ç°ãªããŸãïŒã
ãããçå®ã§ã¯ãªãçç±ãåæããŸãããã
(success, error)
ã¿ãã«Result
åèšã¿ã€ãïŒäŸïŒ Result<Success, Error>
å šäœãšããŠããšã©ãŒåŠçã«é¢ããŠã¯ãGoã¯JavaãããRustã«ã¯ããã«è¿ããšæããŠããŸããGoãšRustã®ãšã©ãŒã¯åãªãå€ã§ãããäŸå€ã§ã¯ãããŸããã äŒæãæ瀺çã«ãªããã€ã³ããå¿ èŠããããŸãã ç°ãªãã¿ã€ãã®ãšã©ãŒããããšãã°ã©ããã³ã°ã«ãã£ãŠãç¹å®ã®é¢æ°ãè¿ããšã©ãŒã«å€æããå¿ èŠããããŸãã ãããã¯äž¡æ¹ãšããç°ãªãã¿ã€ãã®ã·ã¹ãã æ©èœïŒã¿ãã«ãšäžè¬çãªåèšã¿ã€ãïŒã䜿çšããã ãã§ãæçµçã«æåå€ãšãšã©ãŒã®ãã¢ãè¡šããŸãã
Rustããã¯ã¬ãŒãããšã«éžæçã«äœ¿çšããŠæé»çãªãšã©ãŒåŠçãè¡ãããšãã§ããããã€ãã®æœè±¡åãæäŸããããã€ãã®äŸå€ããããŸãïŒã€ãŸããæ瀺çãªãšã©ãŒå€æã§ã¯ãæåã§ãšã©ãŒãäŒæããå¿
èŠããããŸãïŒã ããšãã°ã From
ãã¬ã€ãã䜿çšããŠããšã©ãŒãããã¿ã€ãããå¥ã®ã¿ã€ãã«èªåçã«å€æã§ããŸãã å人çã«ã¯ããšã©ãŒãããæ瀺çãªã¿ã€ãããå¥ã®æ瀺çãªã¿ã€ãã«èªåçã«å€æã§ããç¹å®ã®ããã±ãŒãžã«å®å
šã«ã¹ã³ãŒããããããªã·ãŒãå®çŸ©ã§ããããšã¯ãæ¬ ç¹ã§ã¯ãªãå©ç¹ã ãšæããŸãã Rustã®ç¹æ§ã·ã¹ãã ã§ã¯ãèªåã®ã¯ã¬ãŒãå
ã®ã¿ã€ãã«å¯ŸããŠFrom
ã®ã¿ãå®çŸ©ã§ãããããè·é¢ã眮ããäžæ°å³ãªã¢ã¯ã·ã§ã³ãé²ãããšãã§ããŸãã
ãã ããããã¯ãã®ææ¡ã®ç¯å²å€ã§ãããGoãé£æºããŠæ©èœããªãããã€ãã®èšèªæ©èœãå«ãŸããŠãããããGoããããã®ã¿ã€ãã®æé»çãªå€æããµããŒãããããªã¹ã¯ãããããããªæ»ããããåéã¯ãªããšæããŸãã ãå°ãªããšãGoããžã§ããªãã¯ã¹ãšç¹æ§/åã¯ã©ã¹ãè¿œå ãããŸã§ã¯ã
ãã®åé¡ã«ã€ããŠç§ã®2ã»ã³ããæããã ãã®çš®ã®æ©èœã¯ãåäžã®ã¢ããªã±ãŒã·ã§ã³ãå€æ°ã®è£å©ããŒã¿ãœãŒã¹ãšéä¿¡ããç°¡åãªæ¹æ³ã§çµæãäœæããäŒæ¥ïŒç§èªèº«ã®éçšäž»ãªã©ïŒã«ãšã£ãŠéåžžã«åœ¹ç«ã€ãšæããŸãã
ãããç§ãã¡ãæã£ãŠããã§ãããããã€ãã®ã³ãŒããããŒã®ä»£è¡šçãªããŒã¿ãµã³ãã«ã§ã
func generateUser(userID : string) (User, error) {
siteProperties, err := clients.GetSiteProperties()
if err != nil {
return nil, err
}
chatProperties, err := clients.GetChatProperties()
if err != nil {
return nil, err
}
followersProperties, err := clients.GetFollowersProperties()
if err != nil {
return nil, err
}
// ... (repeat X5)
return createUser(siteProperties, ChatProperties, followersProperties, ... /*other properties here */), nil
}
Goã¯ããŠãŒã¶ãŒã«åãã€ã³ãã§ãšã©ãŒã«ã€ããŠèããããããã«èšèšãããŠãããšããå€ãã®ããã·ã¥ããã¯ãç解ããŠããŸãããé¢æ°ã®å€§éšåãT, err
è¿ãã³ãŒãããŒã¹ã§ã¯ãããã¯å®è³ªçãªå®éã®ã³ãŒãã®èšåŒµã«ã€ãªãããŸã誰ããè¿œå ã®é¢æ°åŒã³åºããè¡ã£ãåŸã«ãšã©ãŒåŠçã³ãŒããè¿œå ããã®ãå¿ãããšã©ãŒãé»ã£ãŠãã§ãã¯ãããªããããå®éã«ã¯æ¬çªç°å¢ã®å€±æã«ã€ãªãããŸããã ããã«ãå®éãç§ãã¡ã®æããããã¹ããªãµãŒãã¹ã®ããã€ããæ倧20ïŒ
以äžã®ãšã©ãŒåŠçã§ããã®ã¯çããããšã§ã¯ãªããèå³æ·±ããã®ã¯ã»ãšãã©ãããŸããã
ããã«ããã®ãšã©ãŒåŠçããžãã¯ã®å€§éšåã¯åäžã§ãããé説çã«ãã³ãŒãããŒã¹ã§ã®æ瀺çãªãšã©ãŒåŠçã®éãå€ããããå¹²ãèã®å±±ã«å°ãéããããããäŸå€çãªã±ãŒã¹ãå®éã«èå³æ·±ãã³ãŒããèŠã€ããã®ã¯å°é£ã§ãã 'æŒåã®çŸè±¡ã
ç¹ã«ãã®ææ¡ã解決çã§ã¯ãªãçç±ã¯ç¢ºãã«ããããŸããããã®å®åæãåæžããããã®ãäœããã®ãæ¹æ³ãå¿ èŠã§ãããšç§ã¯ä¿¡ããŠããŸãã
ããå°ãæ æ°ãªèãïŒ
Rustã®æ«å°Ÿã®?
ã¯ãåªããæ§æã§ãã ãã ããGoã®å Žåããšã©ãŒã³ã³ããã¹ãã®éèŠæ§ãèãããšã次ã®ããªãšãŒã·ã§ã³ãææ¡ããå¯èœæ§ããããŸãã
?
ãGoçšã«å€æŽãããRustã®ããã«æ©èœããŸãã å
·äœçã«ã¯ãæåŸã®æ»ãå€ãã¿ã€ãerror
é¢æ°ã§ã®ã¿äœ¿çšã§ããæåŸã®æ»ãå€ãã¿ã€ãerror
é¢æ°åŒã³åºãã®çŽåŸã«è¡šç€ºãããå¿
èŠããããŸãïŒæ³šïŒ error
ãå®è£
ãããã¹ãŠã®åãèš±å¯ããŸããã error
ãèŠæ±ãããšãnilã€ã³ã¿ãŒãã§ã€ã¹ã®åé¡ãçºçããã®ãé²ãããšãã§ããŸããããã¯çŽ æŽãããããŒãã¹ã§ãïŒã ãã®çµæããšã©ãŒå€ãnil以å€ã®å Žåã ?
ã衚瀺ãããé¢æ°ãé¢æ°ããè¿ãããæåŸã®ãã©ã¡ãŒã¿ãŒããšã©ãŒå€ã«èšå®ãããŸãã ååä»ãã®æ»ãå€ã䜿çšããé¢æ°ã®å Žåãä»ã®å€ã«å¯ŸããŠãŒããè¿ãããçŸåšæ ŒçŽãããŠããå€ãè¿ãããšãã§ããŸãã ããã§ãªãé¢æ°ã®å Žåãä»ã®æ»ãå€ã¯åžžã«ãŒãã§ãã.?("opening %s", file)
ã¯äžèšã®ããã«æ©èœããŸããããšã©ãŒãå€æŽããã«è¿ãã®ã§ã¯ãªãããšã©ãŒãæ§æããé¢æ°ãä»ããŠæž¡ãããç¹ãç°ãªããŸãã 倧ãŸãã«èšãã°ã .?(str, vals...)
ã¯fmt.Errorf(str + ": %s", vals..., err)
ããã«äŸµé£ãå€åãããŸã.?
æ§æã®ããªã¢ã³ããŸãã¯å¥ã®ããŒãžã§ã³ã®ãããããååšããå¿
èŠããããŸããïŒ19412ïŒåèšã¿ã€ãïŒããã³ïŒ21161ïŒãšã©ãŒåŠçïŒããã³ïŒ15292ïŒãžã§ããªãã¯ïŒã«é¢é£ããŸãã
é¢é£ããŠããïŒ
æ°ãããšã©ãŒåŠçæ©èœã®ããã©ãããã¶ã€ã³ãïŒ
https://go.googlesource.com/proposal/+/master/design/go2draft.md
ãšã©ãŒèšèšã«é¢ãããã£ãŒãããã¯ïŒ
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback
åå¥ã®ãªã¿ãŒã³ã¿ã€ããäœæãã代ããã«ã @ LegoRemixã話ããŠããgo-langã®ãã®1ã€ã®åä»ãªæ©èœã解決ããããã®ã @ alercahã®ææ¡ã奜ã
ãŒãå€ãæšæž¬ããªãããã«Rustã®RFCã«ããã«åŸãã catch
åŒãå°å
¥ããŠãæ¬äœããšã©ãŒãè¿ããå Žåã«è¿ããããã®ãæ瀺çã«æå®ã§ããããã«ããããšããå§ãããŸãã
ãããã£ãŠããã®ïŒ
func generateUser(userID string) (*User, error) {
siteProperties, err := clients.GetSiteProperties()
if err != nil {
return nil, errors.Wrapf(err, "error generating user: %s", userID)
}
chatProperties, err := clients.GetChatProperties()
if err != nil {
return nil, errors.Wrapf(err, "error generating user: %s", userID)
}
followersProperties, err := clients.GetFollowersProperties()
if err != nil {
return nil, errors.Wrapf(err, "error generating user: %s", userID)
}
return createUser(siteProperties, ChatProperties, followersProperties), nil
}
ãã®DRYã³ãŒãã«ãªããŸãïŒ
func generateUser(userID string) (*User, error) {
siteProperties := clients.GetSiteProperties()?
chatProperties := clients.GetChatProperties()?
followersProperties := clients.GetFollowersProperties()?
return createUser(siteProperties, ChatProperties, followersProperties), nil
} catch (err error) {
return nil, errors.Wrapf(err, "error generating user: %s", userID)
}
ãããŠã䜿çšããŠããæ©èœããããšãèŠæ±?
ãªãã¬ãŒã¿ãå®çŸ©ããå¿
èŠããããŸãcatch
@bradfitz @peterbourgon @SamWhitedå€åããã«ã¯å¥ã®åé¡ãããã¯ãã§ããïŒ
@sheerun ?
æŒç®åãšcatch
handle
ã¹ããŒãã¡ã³ãã¯ãæ°ãããšã©ãŒåŠçãã©ãããã¶ã€ã³ã®check
æŒç®åãšhandle
ã¹ããŒãã¡ã³ããšéåžžã«ãã䌌ãŠããŸãïŒhttpsïŒ //go.googlesource.com/proposal/+/master/design/go2draft.mdïŒã
奜å¥å¿æºçãªäººã«ãšã£ãŠã¯ããããcheck
ãšhandle
ã³ãŒãã®ããã«ãªããŸãã
func generateUser(userID string) (*User, error) {
handle err { return nil, errors.Wrapf(err, "error generating user: %s", userID) }
siteProperties := check clients.GetSiteProperties()
chatProperties := check clients.GetChatProperties()
followersProperties := check clients.GetFollowersProperties()
return createUser(siteProperties, chatProperties, followersProperties), nil
}
ç§ãå€æŽããå¯äžã®ããšã¯ãæé»ã®handle
ãåãé€ãããã§ãã¯ã䜿çšãããŠããå Žåã¯ãããå®çŸ©ããå¿
èŠãããããšã§ãã ããã«ãããéçºè
ããã§ãã¯ãæ æ°ã«äœ¿çšãããããšã©ãŒã®åŠçæ¹æ³ãã©ããæ¹æ³ãèãããããã®ãé²ãããšãã§ããŸãã æé»ã®ãªã¿ãŒã³ã¯å¥åã®æ©èœã§ããå¿
èŠãããã以åã«ææ¡ãããããã«äœ¿çšã§ããŸãã
func generateUser(userID string) (*User, error) {
handle err { return _, errors.Wrapf(err, "error generating user: %s", userID) }
siteProperties := check clients.GetSiteProperties()
chatProperties := check clients.GetChatProperties()
followersProperties := check clients.GetFollowersProperties()
return createUser(siteProperties, chatProperties, followersProperties), nil
}
ãã®ææ¡ã®äœæè
ãšããŠããã®ææ¡ã¯ïŒ15292ã«ãã£ãŠäºå®äžç¡å¹ã«ããã httpsïŒ //go.googlesource.com/proposal/+/master/design/go2draft-contracts.mdã®ããã«æ©èœããããšã«æ³šæããŠresult()
ã®ç¹æ®ãªã±ãŒã¹ã§åããªã¢ãŒãã£ãºã ãå¯èœã«ããæ°ããæ§æãææ¡ããŸããããšãã°ãã³ã³ãã©ã¯ãã䜿çšããŠãããåé¿ã§ããå Žåããã®ææ¡ã¯ãã¯ãæå³ããªããšæããŸãã
ãã®ãã¡ã®å°ãªããšã1ã€ãGo2ã§çµäºããå¯èœæ§ãé«ãããã«æãããã®ã§ããã®ç¹å®ã®ææ¡ãéããå¿
èŠããããã©ããããããŠäººã
ãhandle
代ããã«çµæã¿ã€ãã«ãŸã èå³ãæã£ãŠãããã©ããçåã«æããŸããäŸãã°å¥çŽãå©çšå¯èœã§ãããšä»®å®ããŠæžãçŽãããããšã
ïŒç§ã¯ãããããã®ä»äºãããæéããªãããšã«æ³šæããŠãã ããããããä»ã®èª°ãããã®ã¢ã€ãã¢ãååãã«èŠãããšã«èå³ããããªãããããè¡ã£ãŠãã ããïŒ
@sheerun Go 2ãšã©ãŒåŠçã«é¢ãããã£ãŒãããã¯ãšã¢ã€ãã¢ã
https://github.com/golang/go/wiki/Go2ErrorHandlingFeedback
ããã³/ãŸãã¯ãã®å
æ¬çãªãªã¹ã_Go2ãšã©ãŒåŠçã§èæ
®ãã¹ãèŠä»¶ïŒ_
https://gist.github.com/networkimprov/961c9caa2631ad3b95413f7d44a2c98a
æãåèã«ãªãã³ã¡ã³ã
ããã¯Goã«ãšã£ãŠæ£ããæ¹åã§ã¯ãªããšæããŸãã
()) })!
ãçå£ã«ïŒ Goã®äž»ãªç®æšã¯ãåŠç¿ã®ãããããèªã¿ãããã䜿ããããã§ãã ããã¯åœ¹ã«ç«ã¡ãŸããã