ã¯ããã«
ããã°ã©ãã³ã°æè¡ã®æ´å²ã¯ãããã¨ããããæ´å²ãããã§ããããã«ãããããªãå²è¦³ãã§çºãããã¨ãã§ãã¾ãããªãã°ãããã°ã©ãã³ã°æè¡ã®æ´å²ãããã¨ã©ã¼ãã³ããªã³ã°ã¨ã®æ¦ããã¨ããè¦ç¹ããè¦ããã¨ãã§ããã®ã§ã¯ãªãã§ãããããæ¬æ¥ã¯ãã¨ã©ã¼ãã³ããªã³ã°ã¨ã®æ¦ãã®æ´å²ã俯ç°ãããã¨ã§ãã¨ã©ã¼ãã³ããªã³ã°ã®åæã«ã¤ãã¦èãã¦ãããã¨æãã¾ãã
ãªãããã®ã¨ã³ããªã¯NDSã¨ããåå¼·ä¼ã®ç¬¬41åã§çºè¡¨ããå 容ã¨åä¸ã§ãã
Cã®æ代
Cã®æ代ã®ã¨ã©ã¼ãã³ããªã³ã°ã§ã¯ãé¢æ°ã®è¿ãå¤ã¨ãã°ãã¼ãã«å¤æ°errnoãè¦ããã¨ã§å¦çãæåããã失æããããè¦ãã®ãä¸è¬çã§ããã
ä¾ã¨ãã¦ãæååãlongã«å¤æããstrtolé¢æ°ãmanã§å¼ãã¦ã¿ã¾ããããããã¨ãã ããã以ä¸ã®ãããªãã¨ãæ¸ããã¦ãã¾ãã
- å¤æã«å¤±æããã¨ã0ãè¿ã
- å¤æã«å¤±æããå ´åãã°ãã¼ãã«ãªå¤æ°ã§ããerrnoã«ä»¥ä¸ã®å®æ°ãæ ¼ç´ãã
- invalidãªæååã渡ãããï¼EINVAL
- longãoverflowãããunderflowããæ°ã渡ãããï¼ERANGE
ãã¦ãä¸è¦ãã¦ã¨ã¦ãã·ã³ãã«ãªä»æ§ã§ãããç¾ä»£çãªè¦ç¹ããã¿ã¦ã¿ãã¨ãããã¤ãæ°ã«ãªããã¨ãããããã§ãããã£ã¨æãã¦ã¿ãã¨â¦â¦
- é¢æ°ãå¼ã³åºãããã¨ãã¨ã©ã¼ã§ãããã©ãããæåã§ãã§ãã¯ããå¿ è¦ãããããä»®ã«ãã§ãã¯ããªãã£ãã¨ãã¦ãã³ã³ãã¤ã©ãæã£ã¦ãããããã§ã¯ãªã
int main(int argc, char *argv[]){ long l = strtol("string"); // ãªãããããã¡ããã¡ãã¨ãããããã some_function(l); // ããã§ããããªãã¨ã«ãªã return 0; }
ããã¯çµæ§æãã§ããããã¨ãã°"String"ã¿ãããªæååãstrtolã«æ¸¡ãã¦ãã¨ã©ã¼ãã§ãã¯ãããªãã£ãå ´åã0ã¨ããæ°ã ã¨è§£éãããã¾ã¾ãããã°ã©ã ã¯åãç¶ãã¾ããããã¦ãã©ãããã®strtolãå¼ã³åºããã¨ããããé ãé¢ããã¨ããã§ããããªãããã°ã©ã ãã¯ã©ãã·ã¥ãã¾ãããã°ãå ¥ãè¾¼ãã§ãã¾ã£ãã¨ããã¨ããã°ãçºè¦ãããã¨ãããé ãé¢ãã¦ããã¨ãããããã°ã¯å°é£ã極ãã¾ãããã¼ãããããããã
ã§ã¯ãå¿ ãã¨ã©ã¼ãæåã§ãã§ãã¯ããã°ããã§åé¡ã¯è§£æ±ºã§ããããããããªãã¨ã¯ããã¾ããããã¨ãã°ããªããæååã¨æååãåãåãããããlongã¨ãã¦è§£éãã¦è¶³ãé¢æ°ãå«ãã©ã¤ãã©ãªä½æãã¦ããã¨ãã¾ãããããã®ã¨ããããstrtolã«invalidãªæååã渡ãã¦EINTVALã帰ã£ã¦ãã¦ããèªåã§ã¯ãã®ã¨ã©ã¼ãã©ããã³ããªã³ã°ãã¹ãããã¨ãããã¨ã¯ãããã¾ããããªããã¨ããã¨ããå¤ãªå¤å ¥ããããæã«ãããã©ãæ±ãã¹ãããã¨ããã®ã¯ãã©ã¤ãã©ãªã決ããã¹ããã¨ã§ã¯ãªãã¦ãã¢ããªã±ã¼ã·ã§ã³ã®è¦ä»¶ã«ãã£ã¦æ±ºã¾ããã¨ã ããã§ãã
ãªã®ã§ãããªãã¯ããªããä½æãã¦ããé¢æ°ã®å©ç¨è ã«å¯¾ãã¦ãinvalidãªæååã渡ãããããã¨ããã¨ã©ã¼ãéç¥ããå¿ è¦ãããããã§ããã¤ã¾ããã¨ã©ã¼ãä¸æµã«ä¼æãããå¿ è¦ãããããã§ããããã¦ããã®ãããªã·ãã¥ã¨ã¼ã·ã§ã³ã¯æ±ºãã¦çãããã®ã§ã¯ããã¾ããããã®ãã³ã«ããªãã¯èµ·ããããã¨ã©ã¼ã«å¯¾ãã¦ãã¹ã¦ã¨ã©ã¼ã³ã¼ããå®ç¾©ãã¦ãã¨ã©ã¼ã®å ´åã®è¿ãå¤ã決ãã¦ãã¨ããä½æ¥ãããªããã°ããã¾ãããããã¦ãããªãã®æ¸ãã³ã¼ãã¯æ¬è³ªçãªå¦çãããã¨ã©ã¼ãã³ããªã³ã°ã®ããã®ã³ã¼ãã«ãã£ã¦ã©ãã©ã太ã£ã¦ããã¾ãã
ã¤ã¾ãããã®ããæ¹ã§ã¯ã
- ã¨ã©ã¼ãç¡è¦ãããã
- ã¨ã©ã¼ãä¸æµã«ä¼æãããã®ãã ãããããããã
ã¨ããåé¡ãããããã§ãã
ããã¦ãããã ãã§ã¯ããã¾ãããã¾ã æ°ã«ãªãç¹ã¯ããã¾ããããã¯ã
- ã¨ã©ã¼ã®è©³ç´°ãã°ãã¼ãã«å¤æ°ã«æ ¼ç´ããã¦ãã
ã¨ããç¹ã§ããã°ãã¼ãã«å¤æ°ã¯ããã¤æ¸ããããããããã¾ããããªã®ã§ãerrnoããã¨ããåç §ãããå ´åã¯ããç¨ã®å¤æ°ãä½ã£ã¦ã³ãã¼ãã¦ãããã¨ããåé¿çãä¸è¬ã«åããã¦ãã¾ãã
int main(int argc, char *argv[]){ long l = strtol("string"); int strtol_err = errno; // ã³ãã¼ãã¨ããªãã¨ãããªã // ã¡ãã£ã¨ãªããããéã«errnoãæ¸ããããå¯è½æ§â¥â¥ if (strtol_err== EINVAL) { // ã¨ã©ã¼å¦ç } else if (strtol_err == ERANGE) { // ã¨ã©ã¼å¦ç } return 0; }
ã·ã³ã°ã«ã¹ã¬ããã§åãã¦ãããªãã°ãã次ã®è¡ã§å¿ ããã§ãã¯ããããã¯ã³ãã¼ãããã¨ãããã¨ãå¾¹åºããã°ï¼ããã ã£ã¦çµå±äººéããããªããã°ãªããªãã®ã§ãããã©ï¼åé¡ã«ã¯ãªããªãã§ãããããããããããããããã«ãã¹ã¬ããã§åãã¦ãããï¼errnoã¯æ¬å½ã«ãã©ã®ã¿ã¤ãã³ã°ã§æ¸ãããããããããªãããã®ã«ãªãã¾ãã
ããã«ããã²ã¨ã¤åé¡ãããã¾ããããã¯ãã¨ã©ã¼æã«ãªã½ã¼ã¹ã®è§£æ¾ãããã®ãç ©éãã¨ããç¹ã§ãã
ã¨ã©ã¼ã«ãªã£ã¦ãã¾ã£ãã¨ããmallocã§ç¢ºä¿ãã¦ãããã®ãfreeããã«æ©æreturnãªã©ãããã¨ãæ£å¸¸ç³»ã§ã¯è§£æ¾ããããªã½ã¼ã¹ã解æ¾ãããªãã£ãããã¾ãããããé²ãããã«ãããããã¿ã¼ã³ã¯ãé¢æ°ã®å¾ãã®ã»ãã«ãªã½ã¼ã¹è§£æ¾ã®å¦çãæ¸ãã¦ãããè¿ãå¤ã¯å¤æ°ã«å ¥ãã¦ãããgotoã§ãªã½ã¼ã¹è§£æ¾ã®ã¨ããã«ãã£é£ã¶ãã¿ã¼ã³ã§ãã
int nyan(){ int *p1 = (int *)malloc(sizeof(int)) int *p2 = (int *)malloc(sizeof(int)) int *p3 = (int *)malloc(sizeof(int)) int retval = 0; // ãã¡ããã¡ããªãããã //ï¼ã¨ã©ã¼ãèµ·ãã£ãï¼ if (err) { retval = -1; // ã¨ã©ã¼ã³ã¼ããå ¥ã㦠goto cleanup; //cleanupã«ãã£é£ã¶ } //æ£å¸¸ç³»ã¯ç¶ã retval = 1; //æ£å¸¸ç³»ã®å ´åã®è¿ãå¤ãå ¥ã㦠cleanup: free(p1); free(p2); free(p3); return retval; }
ã¨ã©ã¼å¦çå¨ãã®ã³ã¼ãã ãã§ããããªã«å¤§ããªé¢æ°ã«ãªã£ã¦ãã¾ãã¾ããããã°ãå ¥ãè¾¼ã¿ããã§æãã§ããï¼ä¸ææ話é¡ã«ãªã£ãAppleå²ä¸æ大ã®ã»ãã¥ãªãã£ãã°ãgoto fail; ãªããã¯ãã®ãã¿ã¼ã³ãã¤ãã£ã¦ããã¤ã§ãã
Cã¹ã¿ã¤ã«ã®ã¨ã©ã¼ãã³ããªã³ã°ã®åé¡ç¹ã«ã¤ãã¦ã¯ãããã¾ãã«ãããªã¨ããã§ããããã
ä¸åº¦ã¾ã¨ãã¦ããã¨ã
- ã¨ã©ã¼ãç¡è¦ãããã
- ã¨ã©ã¼ãä¸æµã«ä¼æãããã®ãã ãããããããã
- ã¨ã©ã¼ã®å 容ãã°ãã¼ãã«å¤æ°ã«æ ¼ç´ããã¦ãã
- ãªã½ã¼ã¹ç®¡çã絡ãã¨ç ©éã«ãªã
ã§ããã
ä¾å¤ã®æ代
ãã¦ãCã®æ代ã®ãããªåé¡ã«å¯¾æããããã«ã人éã¯ä¾å¤ã¨ããæ°ããæ¦å¨ãä½ãåºãã¾ãããä¾ããããªãããä¸è¿°ã®åé¡ç¹ãããã«è§£æ±ºããã¦ããã®ããè¦ã¦ã¿ã¾ãããã
- ã¨ã©ã¼ãç¡è¦ãããã
ä¾å¤ãrescue(ãã£ãã)ãããããã¨ãããã¨ã¯ããå¾ã¾ããããã®å ´åãããã°ã©ã ã¯ãããã¾ã¯ã©ãã·ã¥ãã¦ãããã®ã§ãã¨ã©ã¼ãç¡è¦ãã¦ãã¾ã£ã¦ãããééããå é¨ç¶æ ã®ã¾ã¾ããã°ã©ã ãé²ãã§ãã¾ã£ã¦ããã°ãå ¥ãè¾¼ãã ã¨ããã¨é ãé¢ããã¨ããã§ãããªãã¯ã©ãã·ã¥ãããã¨ãããããªãã¨ã¯é²ããããã«ãªãã¾ããã
class WanError < StandardError; end def wan raise WanError, "ã¨ã©ã¼ã ãï¼ï¼ï¼" end wan # rescueãã¦ããªãã®ã§ããã§ããã°ã©ã ã¯æ¢ã¾ã£ã¦ãã¾ã
- ã¨ã©ã¼ãä¸æµã«ä¼æãããã®ãã ãããããããã
ä¾å¤ãraiseãã¦ãããrescueããªãã£ãå ´åãä¾å¤ã¯ã³ã¼ã«ã¹ã¿ãã¯ãä¸æµã«åãã£ã¦ã©ãã©ãçªãé²ãã§ããã¾ãããªã®ã§ãä½ãæ¸ããªãã¦ã nyan ã®ä¸ã§ããã wan ã®ã¨ã©ã¼ã main ã§æã¾ãããã¨ãã§ãã¾ãã
class WanError < StandardError; end def nyan wan end def wan raise WanError, "ã¨ã©ã¼ã ãï¼ï¼ï¼" end begin nyan rescue WanError => e # wanã®ä¸ã§çºçããã¨ã©ã¼ãããã§æãããã p e end
- ã°ãã¼ãã«å¤æ°errnoã®åå¨
ä¾å¤ãèµ·ãããã³ã«ä¾å¤ãªãã¸ã§ã¯ããçºçãããã®ã§ãã°ãã¼ãã«å¤æ°ã«ã¨ã©ã¼ãå ¥ãã¦ããå¿ è¦ãããã¾ããã
- ãªã½ã¼ã¹ãçä»ãåé¡
ensureãfinalyï¼ä¾å¤ãèµ·ãã£ã¦ãèµ·ãããªãã¦ãããªããå®è¡ãããé¨åï¼ãããã®ã§ãããã§ãçä»ãããã°ã·ã³ãã«ã§ãã
r = Resource.new begin # do something rescue => e # do something ensure r.close end
ãã¦ããããã¨ã¥ããã§ãããããªæ°ãããä¾å¤æ©æ§ã§ãããè¿å¹´ããã®ä¾å¤æ©æ§ããã£ã¦ãã¦ã解決ã§ããªãåé¡ã人é¡ã襲ãã¾ããã
- ãã£ãããå¿ãåé¡
ä¾å¤ããã£ãããããããã¨ãã¢ããªã¯æ»ã«ã¾ããããã¯ããè¦äºã«ç°¡åã«æ»ã«ã¾ããJavaã®æ¤æ»ä¾å¤ã¯ä¾å¤ã®ãã£ãããå¿ããã³ã³ãã¤ã«æã«è¦ã¤ãã¦ãããä»çµã¿ã§ãããæ¹å¤ãå¤ãæ©è½ã§ãããä»åã¯ã¡ãã£ã¨åéçã«ç¡çãªã®ã§æ¤æ»ä¾å¤ã®è©±ã«ã¯ç«ã¡å ¥ãã¾ããã
- éåæå¦çã¨ã®ç¸æ§ã®æªã
ä¸è¬ã«ãéåæå¦çã絡ãã¨ãä¾å¤ã®æ±ãã¯ããªãé£ãããªã£ã¦ãã¾ããã¨ããã®ãã(ãã¨ãã°)ã¹ã¬ããAã§èµ·ãã£ãä¾å¤ã¯ããã®ã¾ã¾ã¹ã¬ããBã§ãã£ãããããã¨ã¯ã§ãã¾ãããããã¯ãã¹ã¬ããAã¨ã¹ã¬ããBãå¥ã®ã³ã¼ã«ã¹ã¿ãã¯ãæã£ã¦ãããã¨ãèããã°å½ç¶ã®ãã¨ã§ãããã®ãããã¹ã¬ãããã¾ããã ä¾å¤ã®åãæ±ãã¨ããã®ã¯é常ã«ããããããã®ã¨ãªãã¾ããJavaã¯ããã«å¯¾ã㦠Callable 㨠Future ã¨ããåçãåºããããã¯ä¸å®ã®ææãä¸ãã¦ããã¨è¨ãããã§ãï¼ãã®ãããã詳ããå ¥ãè¾¼ãä½è£ããªãã®ã§å ¥ãè¾¼ã¿ã¾ããï¼ããããããã¨ãã° goroutine ã®ããã«ãéåæãªã¿ã¹ã¯ããé£ç¶çã«å¤ãåãåãããã¨ããªã©ã¯ã©ãããã°ããã§ããããï¼ Runnable ã§ã¯ä¾ç¶ã¨ãã¦å¥ã¹ã¬ããã®ä¾å¤ãè£è¶³ããæ¹æ³ã¯ãªããéåæå¦çã¨ä¾å¤æ©æ§ã¨ããã®ã¯ããã¯ãçµæ§ç¸æ§ãæªããã®ã®ããã§ãã
Eitherã®æ代
ãã¦ãCã¹ã¿ã¤ã«ã®ã¨ã©ã¼ãã³ããªã³ã°ã«å¯¾ãã¦ãä¾å¤ã¨ã¯å¥ã®æ¹åããåçãåºããã®ããé¢æ°åçéã§ãã使ããã¦ããEitherã¨ãããã¼ã¿åã§ãã
Scalaã®ä¾ã§èª¬æãã¾ããããScalaã«ããã Either ã¨ããã®ã¯ãLeftãRightã©ã¡ããã®å¤ãæã¤ãã¼ã¿åã§ããLeftã¨Rightã¯ã³ã³ããã«ãªã£ã¦ãã¦ãã©ããªå¤ã§ããã®ä¸ã«å ¥ãããã¨ãã§ãã¾ãã
Eitherã®ä½¿ãæ¹ã¨ãã¦ã¯ãæ£å¸¸ã«å¦çãæåããå ´åã¯Rightï¼æ£ãããã¨ããæå³ã®Rightã¨æãã¦ããï¼ã«å¤ãçªã£è¾¼ãã§ã失æããå ´åã¯å¤±æã®çç±ãªã©ã表ããªãã¸ã§ã¯ããLeftã«çªã£è¾¼ãã§è¿ãã¾ãããããªæãã
def divide(x:Int, y:Int): Either[String, Int] = { if (y == 0) { Left("can't divide by zero") } else { Right(x / y) } } divide(2, 2) // => Right(1) divide(0, 0) // => Left("can't divide by zero")
Cã¹ã¿ã¤ã«ã¨åãããå¤ã¨ãã¦ã¨ã©ã¼ãã©ãããè¿ãã¹ã¿ã¤ã«ã§ããããEitherã®å ´åã©ã®ããã«Cã¹ã¿ã¤ã«ã®åé¡ã解決ããã¦ããã®ãè¦ã¦ã¿ã¾ããããã¾ãã
- ã¨ã©ã¼ãç¡è¦ãããã
ã¨ããç¹ã¯è§£æ±ºããã¦ãã¾ããã¨ããã®ããEitherã®ä¸èº«ã¯ãã®ã¾ã¾ã§ã¯ä½¿ãã¾ããããªãããã®æ¹æ³ã§åãåºãå¿ è¦ãããã¾ãã
ãã¨ãã°ãEitherã®ä¸èº«ã¯ããã¿ã¼ã³ãããã§åãåºããã¨ãã§ãã¾ãã
val either = divide(2, 2) either match { case Right(x) => println(x) case Left(message) => println(message) }
ãã®ã¨ããRightã ãã§ãã¿ã¼ã³ããããããLeftã ãã§ãã¿ã¼ã³ããããããã¨ããã¨ãã³ã³ãã¤ã©ããcaseãç¶²ç¾ çãããªãããã¨æã£ã¦ããã¾ããçµå§ãããªæãã§ãLeftãç¡è¦ãã¦Rightã®ä¸èº«ã ããæ±ããã¨ããã¨ã³ã³ãã¤ã©ã«æãããä»çµã¿ãæã£ã¦ãã¾ãã
次ã«
- ã¨ã©ã¼ãä¸æµã«ä¼æãããã®ãã ãããããããã
ã¨ããåé¡ã«ã¤ãã¦è¦ã¦ã¿ã¾ããããEitherã«ã¯rightã¨ããã¡ã½ããããã£ã¦ããããå¼ã¶ã¨RightProjectionã¨ãããã®ãåå¾ã§ãã¾ããããã¯ãEitherã®rightå´ãæ£å½ãªãã®ã¨ãã¦æ±ãããã¨æ±ºãããã®ãã®ãããªãã®ã§ãããã®RightProjectionã«ã¯mapã¡ã½ãããçãã¦ãã¦ããã®mapã¡ã½ããã¯ãLeftã®å ´åã¯ãã®ã¾ã¾Leftãè¿ãã¦ãRightã®å ´åã¯å¼æ°ã«æå®ããè¨ç®ãè¡ããã¨ããæåããã¾ãã
def divideAndDouble(x: Int, y:Int): Either[String, Int] = divide(x, y).right.map(_ * 2) divideAndDouble(2, 2) // => Right(2) divideAndDouble(0, 0) // => Left("can't divide by zero")
ãã®ããã«ãmapï¼ãflatMapï¼ãå©ç¨ãããã¨ã§ç°¡åã«ã¨ã©ã¼ãä¼æããããã¨ãã§ãã¾ãï¼forå¼ãã¢ããã«ã¤ãã¦ã¯è§¦ãã¾ãããèå³ãããã°èª¿ã¹ã¦ãã ããï¼ã
- ã¨ã©ã¼ã®è©³ç´°ãã°ãã¼ãã«å¤æ°ã«æ ¼ç´ããã¦ãã
æ¯åEitherãä½ãã®ã§ã°ãã¼ãã«å¤æ°ã¯é§éã§ãã¾ãã
- ãªã½ã¼ã¹ã®è§£æ¾åé¡
ããã¯Eitherã«ãã£ã¦è§£æ±ºããããã®ã§ã¯ãªãã§ãããé¢æ°åã¹ã¿ã¤ã«ã§ã¯ãªã½ã¼ã¹ã®ç¢ºä¿ã解æ¾ã¯å¯ä½ç¨ã¨ã¿ãªãã¾ããé¢æ°åã¹ã¿ã¤ã«ã§ã¯ãå¯ä½ç¨ããªãã¹ãå±æçã«ã¾ã¨ãã¦ããã¸ãã¯ããåé¢ããã¨ããå¥ã®æ¹æ³ã§è§£æ±ºãã¦ãã¾ãï¼éãªèª¬æã§ããããã«å ¥ãè¾¼ãã¨ã¾ãæéããããã®ã§ããã詳ããæ°ã«ãªãã²ã¨ã¯èª¿ã¹ã¦ãã ããï¼ã
ã¨ããããã§ãCã¹ã¿ã¤ã«ã®åé¡ç¹ã¯ã©ãããEitherã§ã ãã¶è§£æ±ºã§ãããã§ãã
ããããããã«ãä¾å¤ãæã¡è¾¼ãã§ãã¾ã£ãåé¡ç¹ãEitherãã©ã®ããã«è§£æ±ºãã¦ããããè¦ã¦ã¿ã¾ãããã
- ãã£ããããããåé¡
ä¸è¿°ã®éããã¨ã©ã¼ãç¡è¦ãããã¨ããã¨ãã³ã³ãã¤ã©ãæã£ã¦ããã¾ãããæ¤æ»ä¾å¤ã»ã©ç ©éã§ãããã¾ããã
- éåæå¦çã¨ã®ç¸æ§åé¡
ä¾å¤æ©æ§ã¯å¶å¾¡æ§æã§ãããEitherã¯åãªããã¼ã¿åã§ããã¹ã¿ãã¯ãé£ã³è¶ãããããªããããæ®éã®å¤ãã¨ãã¦æ±ãã¾ãããªã®ã§ãä¾å¤æ©æ§ãããç´ ç´ã«éåæå¦çã«ããã¦ã¨ã©ã¼ãæ±ããã¨ãã§ãã¾ããä½åº¦ãè¨ãã¾ãããåãªãå¤ã§ãããã
ãã¾ãã»ç¾ä»£ããã°ã©ãã³ã°è¨èªã®ç°ç«¯å ãgolangã«ã¤ãã¦
golangããä¾å¤æ©æ§ä»¥å¤ã®æ¹æ³ã§ã¨ã©ã¼ãæ±ãè¨èªã§ããããã¯ãgoroutineã®åå¨ã大ããã®ã§ã¯ãªãã§ãããããgoroutineã¯Javaã®Futureã¨ãã¨ç°ãªããgoroutineå士ã§ãã¼ã¿ãããã¨ãããããã« channel ã使ãã¾ãããã®ã¨ããç´ ç´ãªä¾å¤æ©æ§ã¯ã¾ã£ããå½¹ã«ç«ã¡ã¾ããããã
ããã§golangã¯ãè¿ãå¤ãè¤æ°æã¦ããã¨ãå©ç¨ãã¦ãæåã®è¿ãå¤ã«æ£å¸¸ç³»ã®è¿ãå¤ã2ã¤ãã®è¿ãå¤ã«ç°å¸¸ç³»ã®æã®ã¨ã©ã¼å¤ãè¿ããã¨ãããæ £ç¿ããã¤ãããã¨ã«ãã¦ãã¾ããï¼ï¼ï¼ï¼
file, err := os.Open(filename)
ããã¯ããªã大èãªèãããã§ãããå®ã¯çµæ§ãã©ã³ã¹ã®ã¨ãã解ã ã¨æãã¾ãã
ã¾ãããã£ããerrãåãåãå¿ããã¨ãã³ã³ãã¤ã«æã«æããã¾ã
f := os.Open(filename) //multiple-value os.Open() in single-value context
ããã«ãerrãåãåã£ãã¨ãã¦ããããç¡è¦ãã¦ãã³ã³ãã¤ã«æã«æããã¾ã
f, err := os.Open(filename)
// ãã®ãã¨ãªã«ãããªãã¨ãerr declared and not usedã¨æããã
ããã«ããªã½ã¼ã¹ãçä»ãåé¡ã«é¢ãã¦ããdefer ãå°å ¥ãããã¨ã§è§£æ±ºãã¦ãã¾ãã
func openAndClose(filename string) { f, err := os.Open(filename) // snip defer f.Close() // openAndCloseãæããã¨ãã«å¿ ãå¼ã°ãã // snip }
ç¾ä»£çãªè¨èªãªã®ã«ããããä¾å¤ããªãã®ï¼ï¼ï¼ï¼ã£ã¦æåã¯ã³ã£ãããã¾ãããgoroutineã¨ã®çµ¡ã¿ãèããã¨é常ã«ãã©ã³ã¹ã®ã¨ããè¨è¨ã ã¨è¨ããããªæ°ããã¾ãããããæå³ãããã¾ãå è¦ãããªããã¢ãããããªãEitherãã¿ãããªç«ã¡ä½ç½®ã§ãããªãé¢ç½ãã§ããï¼
ã¾ã¨ã
ã¨ã©ã¼ãã³ããªã³ã°ã®ãã©ãã¤ã ãããããè¦ã¦ã¿ã¾ããããã©ããæé«ã®æ£è§£ãã£ã¦ãã¨ã¯ãªãããã©ãããããã®ãã©ãããã©ã¼ã ããã©ãã¤ã ãã©ãåé¡ã解決ãããã¨ãã¦ããã®ããç¥ããã¨ã§ãããå®å ¨ãªã¢ããªã±ã¼ã·ã§ã³ãæ¸ãå©ãã«ã¯ãªãã®ã§ã¯ãªãã§ããããã