å ã®ã¿ã€ãã«ïŒææ¡ïŒããã±ãŒãžéã§ã¿ã€ãã移åããªããã段éçãªã³ãŒã修埩ããµããŒããã
Goã¯ãã³ãŒãããŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°äžã«æ®µéçãªã³ãŒã修埩ãå¯èœã«ããããã«ãåã®ä»£æ¿ã®åçã®ååãäœæããæ©èœãè¿œå ããå¿ èŠããããŸãã ããã¯ãïŒ16339ã§ææ¡ãããGo 1.8ãšã€ãªã¢ã¹æ©èœã®ã¿ãŒã²ããã§ããããGo1.8ããã¯å·®ãæ§ããããŸããã Go 1.8ã§ã¯åé¡ã解決ã§ããªãã£ããããåé¡ãæ®ã£ãŠããŸããGo1.9ã§åé¡ã解決ã§ããããšãé¡ã£ãŠããŸãã
ãšã€ãªã¢ã¹ã®ææ¡ã®è°è«ã§ã¯ãç¹ã«åã®ä»£æ¿åãäœæãããã®æ©èœãéèŠã§ããçç±ã«ã€ããŠå€ãã®è³ªåããããŸããã ãããã®è³ªåã«çããæ°ããªè©Šã¿ãšããŠããã³ãŒãããŒã¹ãªãã¡ã¯ã¿ãªã³ã°ïŒGoã®å©ããåããŠïŒ ããšããèšäºãæžããæçš¿ããŸããã åæ©ã«ã€ããŠè³ªåãããå Žåã¯ããã®èšäºããèªã¿ãã ããã ïŒå¥ã®çããã¬ãŒã³ããŒã·ã§ã³ã«ã€ããŠã¯ãRobertã®Gopherconã©ã€ããã³ã°ããŒã¯ãåç §ããŠãã ãããæ®å¿µãªããããã®ãããªã¯10æ9æ¥ãŸã§ãªã³ã©ã€ã³ã§å©çšã§ããŸããã§ãããæŽæ°ã12æ16æ¥ïŒãããç§ã®GothamGoããŒã¯ã§ããããã¯æ¬è³ªçã«èšäºã®æåã®ãã©ããã§ãããïŒ
ãã®åé¡ã¯ãç¹å®ã®è§£æ±ºçãææ¡ãããã®ã§ã¯ãããŸããã 代ããã«ãå¯èœãªè§£æ±ºçã®ã¹ããŒã¹ã«ã€ããŠGoã³ãã¥ããã£ãããã£ãŒãããã¯ãåéããããšæããŸãã èããããæ¹æ³ã®1ã€ã¯ãèšäºã®æåŸã§èª¬æããããã«ããšã€ãªã¢ã¹ãã¿ã€ãã«å¶éããããšã§ãã ä»ã«ãèæ ®ãã¹ãããšããããããããŸããã
ã¿ã€ããšã€ãªã¢ã¹ããã®ä»ã®è§£æ±ºçã«ã€ããŠã®èããã³ã¡ã³ããšããŠããã«æçš¿ããŠãã ããã
ããããšãããããŸããã
æŽæ°ã12æ16æ¥ïŒã¿ã€ããšã€ãªã¢ã¹ã®èšèšããã¥ã¡ã³ããæçš¿ãããŸããã
æŽæ°ã1æ9æ¥ïŒææ¡ãåãå
¥ããããdev.typealiasãªããžããªãäœæãããå®éšã®ããã«Go1.9ãµã€ã¯ã«ã®éå§æã«å®è£
ãäºå®ãããŠããŸãã
ã¿ã€ããšã€ãªã¢ã¹ã100ïŒ å¿ èŠãªå Žåãvarãšã€ãªã¢ã¹ã¯ãããã10ïŒ å¿ èŠã§ãããfuncãšã€ãªã¢ã¹ã¯1ïŒ å¿ èŠã§ãããconstãšã€ãªã¢ã¹ã¯0ïŒ å¿ èŠã§ãã constã«ã¯ãã§ã«=ããããfuncããããã=ã䜿çšã§ãããããéèŠãªåé¡ã¯ãvarãšã€ãªã¢ã¹ãèšç»ãŸãã¯å®è£ ããã®ã«ååéèŠã§ãããã©ããã§ãã
@rogpeppe ïŒhttps://github.com/golang/go/issues/16339#issuecomment-258771806ïŒãš@ianlancetaylor ïŒhttps://github.com/golang/go/issues/16339#issuecomment-233644777ïŒã䞻匵ããŠããããã«å ã®ãšã€ãªã¢ã¹ã®ææ¡ã§ã¯ãèšäºã§è¿°ã¹ãããã«ãã°ããŒãã«å€æ°ã®å€æŽã¯éåžžééãã§ãã éåžžã¯ãã°ã§ããããšã«å¯Ÿå¿ããããã«ãœãªã¥ãŒã·ã§ã³ãè€éã«ããããšã¯ãããããæå³ããããŸããã ïŒå®éããã®æ¹æ³ãç解ã§ããã°ãé·æçã«Goãã°ããŒãã«å€æ°ãäžå€ã«ããå¿ èŠãããããšã«ç§»è¡ããŠãé©ããªãã§ããããïŒ
ããè±å¯ãªvarãšã€ãªã¢ã¹ã¯èšç»ãç«ãŠãã®ã«ååéèŠã§ã¯ãªãå¯èœæ§ãé«ããããããã§ã®æ£ããéžæã¯åãšã€ãªã¢ã¹ã®ã¿ã«çŠç¹ãåœãŠãããšã§ããããã«æãããŸãã ããã§ã®ã³ã¡ã³ãã®ã»ãšãã©ã¯åæããŠããããã§ãã å šå¡ããªã¹ãããããã§ã¯ãããŸããã
æ°ããæ§æã®æã匷åãªè°è«ã¯ãçŸåšãŸãã¯å°æ¥ã®ããããã§varãšã€ãªã¢ã¹ããµããŒãããå¿ èŠãããããšã§ãïŒhttps://github.com/golang/go/issues/18130#issuecomment-264232763 by @MeroviusïŒã varãšã€ãªã¢ã¹ãæããªãããã«èšç»ããŠãåé¡ãªãããã§ãïŒåã®ã»ã¯ã·ã§ã³ãåç §ïŒã
varãšã€ãªã¢ã¹ããªãå Žåã=ã®åå©çšã¯ãæ°ããæ§æãå°å ¥ãããããç°¡åã§ãã=>ãšã€ãªã¢ã¹ã®ææ¡ã®ããã«ããïŒhttps://github.com/golang/go/issues/18130#issuecomment-264185142 by @joegrasseïŒããŸãã¯ãšã¯ã¹ããŒãïŒhttps://github.com/golang/go/issues/18130#issuecomment-264152427 by @cznicïŒã
= inã䜿çšãããšãPascalããã³Rustã®åãšã€ãªã¢ã¹ã®æ§æãšãå®å šã«äžèŽããŸãã ä»ã®èšèªãåãæŠå¿µãæã£ãŠããéããåãæ§æã䜿çšããã®ã¯è¯ãããšã§ãã
å°æ¥çã«ã¯ãfuncãšã€ãªã¢ã¹ãååšããå°æ¥ã®Goãååšããå¯èœæ§ãããïŒ@nigeltaoã«ããhttps://github.com/golang/go/issues/18130#issuecomment-264324306ãåç §ïŒããã¹ãŠã®å®£èšã§åã圢åŒãèš±å¯ãããŸãïŒ
const C2 = C1
func F2 = F1
type T2 = T1
var V2 = V1
çã®ãšã€ãªã¢ã¹ã確ç«ããªãã®ã¯ãvar宣èšã ãã§ããããã¯ãããã°ã©ã ã®å®è¡æã«V2ãšV1ãåå¥ã«åå®çŸ©ã§ããããã§ãïŒäžå€ã®constãfuncãtype宣èšãšã¯ç°ãªããŸãïŒã å€æ°ã®äž»ãªçç±ã®1ã€ã¯å€æ°ãå€åãããããšã§ããããããã®äŸå€ã¯å°ãªããšãç°¡åã«èª¬æã§ããŸãã Goãäžå€ã®ã°ããŒãã«å€æ°ã«ç§»è¡ãããšããã®äŸå€ããªããªããŸãã
æ確ã«ããããã«ãç§ã¯ããã§funcãšã€ãªã¢ã¹ãäžå€ã®ã°ããŒãã«å€æ°ãææ¡ããŠããã®ã§ã¯ãªãããã®ãããªå°æ¥ã®è¿œå ã®åœ±é¿ã調ã¹ãŠããã ãã§ãã
@jimmyfrascheã¯ãconstsãé€ããã¹ãŠã®ãšã€ãªã¢ã¹ãææ¡ããŸããïŒhttps://github.com/golang/go/issues/18130#issuecomment-264278398ïŒããã®ãããvarã§ã¯ãªãconstãäŸå€ã«ãªããŸãã
const C2 = C1 // no => form
func F2 => F1
type T2 => T1
var V2 => V1
var V2 = V1 // different from => form
constãšvarã®äž¡æ¹ã«äžæŽåãããããšã¯ãvarã«äžæŽåãããããšããã説æãé£ããããã§ãã
ã³ã³ãã€ã©ã«æäŸãããå¯æ¬¡çãªæ å ±ïŒããšãã°ã@ btraceyã«ããhttps://github.com/golang/go/issues/18130#issuecomment-264205929ïŒã ãã§ã段éçãªã³ãŒã修埩ãæå¹ã«ã§ãããã©ããã確èªãã䟡å€ã¯ç¢ºãã«ãããŸãã
ãŸãã¯ãã³ã³ãã€ã©ãã³ã³ãã€ã«åã«å ¥åãã¡ã€ã«ãå€æããããã«äœããã®ã«ãŒã«ããŒã¹ã®ååŠçãé©çšã§ããå ŽåïŒããšãã°ã@ tux21bã«ããhttps://github.com/golang/go/issues/18130#issuecomment-264329924ïŒã
æ®å¿µãªãããããããå€æŽããã®ããã«å¶éããããšã¯ã§ããŸããã 調æŽãå¿ èŠãªã³ã³ãã€ã©ã¯å°ãªããšã2ã€ïŒgcãšgccgoïŒãããŸãããgo vetãguruãgoimportsãgocodeïŒã³ãŒãè£å®ïŒãªã©ãããã°ã©ã ãåæããä»ã®ããŒã«ãåæ§ã§ãã
@bcmillsãèšã£ãããã«ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264275574ïŒãããã¹ãŠã®å®è£ ã§ãµããŒããããªããã°ãªããªããéèšèªå€æŽãã¡ã«ããºã ã¯äºå®äžã®èšèªå€æŽã§ãâããã¥ã¡ã³ãã貧匱ãªã ãã§ããã
ç§ãã¡ã¯æ¬¡ã®ããšãç¥ã£ãŠããŸãã ç¹ã«ã¿ã€ããšã€ãªã¢ã¹ãPascalãšRustã«å«ããã®ã«ååéèŠã§ãããšèŠãªãããããšãèãããšãä»ã®ãšã€ãªã¢ã¹ãååšããå¯èœæ§ããããŸãã
ãšã€ãªã¢ã¹ïŒãŸãã¯åã«ãšã€ãªã¢ã¹ãå ¥åïŒã䜿çšãããšãä»ã®ããã±ãŒãžãæ¡åŒµããããããã€ã³çœ®æãäœæã§ããŸãã ããšãã°ã httpsïŒ//go-review.googlesource.com/#/c/32145/ ãç¹ã«ã³ãããã¡ãã»ãŒãžã®èª¬æãåç §ããŠ
ãšã€ãªã¢ã¹ïŒãŸãã¯åã«ã¿ã€ããšã€ãªã¢ã¹ïŒã䜿çšãããšãAPIãµãŒãã§ã¹ã¯å°ããããå éšæ§é ãæ¹åããããã®ããã±ãŒãžã®ã³ã¬ã¯ã·ã§ã³ãšããŠã®å®è£ ã¯å€§ãããªããŸãããã¯ã©ã€ã¢ã³ããã€ã³ããŒãããŠäœ¿çšããããã±ãŒãžã¯1ã€ã ãã§ãã https://github.com/golang/go/issues/16339#issuecomment-232813695ã«èª¬æãããŠããããæœè±¡çãªäŸããã
ãããã³ã«ãããã¡ã«ã¯ããããªãã¯ã®ã€ã³ããŒããæ©èœãããããã®ã»ãã³ãã£ã¯ã¹ã¯çæãããC ++ã³ãŒãã«å®è£ ããã®ã¯ç°¡åã§ãããçæãããGoã³ãŒãã«å®è£ ããããšã¯äžå¯èœã§ãã ããã¯ãC ++ã¯ã©ã€ã¢ã³ããšGoã¯ã©ã€ã¢ã³ãéã§å ±æããããããã³ã«ãããã¡å®çŸ©ã®äœæè ã«ãã©ã¹ãã¬ãŒã·ã§ã³ãåŒãèµ·ãããŸãã ã¿ã€ããšã€ãªã¢ã¹ã¯ãGoããã®æ©èœãå®è£ ããæ¹æ³ãæäŸããŸãã å®éã import publicã®å ã ã®ãŠãŒã¹ã±ãŒã¹ã¯ã段éçãªã³ãŒã修埩ã§ããã åæ§ã®åé¡ã¯ãä»ã®çš®é¡ã®ã³ãŒããžã§ãã¬ãŒã¿ãŒã§ãçºçããå¯èœæ§ããããŸãã
é·ãååã®çç¥åœ¢ã ããŒã«ã«ïŒãšã¯ã¹ããŒããããŠããªãããŸãã¯ããã±ãŒãžã¹ã³ãŒãã§ã¯ãªãïŒãšã€ãªã¢ã¹ã¯ããŸã£ããæ°ããåã®ãªãŒããŒããããçºçãããããšãªããé·ãååãççž®ããã®ã«äŸ¿å©ãªå ŽåããããŸãã ããããã¹ãŠã®äœ¿çšæ³ãšåæ§ã«ãæçµçãªã³ãŒãã®æ確ãã¯ããããæšå¥šããã䜿çšæ³ã§ãããã©ããã«å€§ãã圱é¿ããŸãã
åèã®ããã«ãããããªã¹ãããŸãã ããã€ãã¯åŸã§è°è«ããã以äžã®å¥ã ã®ã»ã¯ã·ã§ã³ã«èŠçŽãããŠããŸããããã®ã»ã¯ã·ã§ã³ã§ãããã解決ãŸãã¯è°è«ããããšã¯ããŠããŸããã
godocã§ã®åŠçã ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264323137 by @ nigeltaoããã³https://github.com/golang/go/issues/18130#issuecomment-264326437by @jimmyfrascheïŒ
ãšã€ãªã¢ã¹ã§æå®ãããåã«ã¡ãœãããå®çŸ©ã§ããŸããïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-265077877 by @ulikunitzïŒ
ãšã€ãªã¢ã¹ãããšã€ãªã¢ã¹ãžã®ãšã€ãªã¢ã¹ãèš±å¯ãããŠããå Žåããšã€ãªã¢ã¹ãµã€ã¯ã«ãã©ã®ããã«åŠçããŸããïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwdïŒ
ãšã€ãªã¢ã¹ã¯ãšã¯ã¹ããŒããããŠããªãèå¥åããšã¯ã¹ããŒãã§ããå¿ èŠããããŸããïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwdïŒ
ãšã€ãªã¢ã¹ãåã蟌ããšã©ããªããŸããïŒåã蟌ã¿ãã£ãŒã«ãã«ã©ã®ããã«ã¢ã¯ã»ã¹ããŸããïŒïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwd ããŸãïŒ17746ïŒ
ãã«ããããããã°ã©ã ã§ãšã€ãªã¢ã¹ãã·ã³ãã«ãšããŠäœ¿çšã§ããŸããïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwdïŒ
Ldflagsæååã€ã³ãžã§ã¯ã·ã§ã³ïŒãšã€ãªã¢ã¹ãåç §ãããšã©ããªããŸããïŒ ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264494658 by @thwd;ããã¯varãšã€ãªã¢ã¹ãããå Žåã«ã®ã¿çºçããŸããïŒ
ããã®å ŽåãããããããŒãžã§ã³ç®¡çãçãã§ãããã¿ã€ããšã€ãªã¢ã¹ã§ã¯ãããŸãããã
ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264573088 by @iainmerrickïŒ
èšäºã«
https://github.com/golang/go/issues/18130#issuecomment -265052639ã§ã @ niemeyerã¯ã
@niemeyerã¯ãããã±ãŒãžéã移åããåãç¹æ®ãªã±ãŒã¹ãšããŠä¿®æ£ããã ãã§ãªããã¡ãœããåã®å€æŽãªã©ãåŠçãããããåºç¯ãªãªãã¡ã¯ã¿ãªã³ã°åé¡ã®è§£æ±ºçãèŠã€ããããšãã§ãããšç€ºåãããã¢ããã¿ãŒããäžå¿ã«æ§ç¯ããã解決çãææ¡ããŸãã
ã³ã¡ã³ãã«ã¯ããªãã®éã®è°è«ããããŸãããããã§ã¯ç°¡åã«èŠçŽããããšã¯ã§ããŸããã è°è«ã¯çµãã£ãŠããŸãããããããŸã§ã®ãšããããã¢ããã¿ãŒãããã®èšèªã«é©åã§ããã®ãããããšãå®éã«å®è£ ã§ããã®ãã¯äžæã§ãã ã¢ããã¿ãŒãã¿ã€ããšã€ãªã¢ã¹ãããå°ãªããšã1æ¡è€éã§ããããšã¯æããã§ãã
ã¢ããã¿ãŒã«ã¯ã以äžã«ç€ºããµãã¿ã€ãã³ã°ã®åé¡ã«å¯Ÿããäžè²«ãããœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ãã
確ãã«ããšã€ãªã¢ã¹ã§ã¯éåžžã®ã¡ãœããå®çŸ©ã®å¶éããã€ãã¹ã§ããŸãããããã±ãŒãžãã¿ã€ãT1 = otherpkg.T2ãå®çŸ©ããŠããå Žåãotherpkg.T2ã§ã¡ãœãããçŽæ¥å®çŸ©ã§ããªãã®ãšåæ§ã«ãT1ã§ã¡ãœãããå®çŸ©ã§ããŸããã ã€ãŸããã¿ã€ãT1 = otherpkg.T2ã®å ŽåãfuncïŒT1ïŒMïŒïŒã¯funcïŒotherpkg.T2ïŒMïŒïŒãšåçã§ãããä»æ¥ã¯ç¡å¹ã§ãããç¡å¹ã®ãŸãŸã§ãã ãã ããããã±ãŒãžãã¿ã€ãT1 = T2ïŒäž¡æ¹ãšãåãããã±ãŒãžå ïŒãå®çŸ©ããŠããå Žåãçãã¯ããŸãæ確ã§ã¯ãããŸããã ãã®å ŽåãfuncïŒT1ïŒMïŒïŒã¯funcïŒT2ïŒMïŒïŒãšåçã«ãªããŸãã åŸè ã¯èš±å¯ãããŠããã®ã§ãåè ãèš±å¯ãããšããè°è«ããããŸãã çŸåšã®èšèšããã¥ã¡ã³ãã§ã¯ãïŒå¶éã®äžè¬çãªåé¿ã«åãããŠïŒããã§å¶éã課ããŠããªããããfuncïŒT1ïŒMïŒïŒã¯ãã®ç¶æ³ã§æå¹ã§ãã
https://github.com/golang/go/issues/18130#issuecomment -267694112ã§ã @ jimmyfrascheã¯ã代ããã«ãã¡ãœããå®çŸ©ã§ãšã€ãªã¢ã¹ã䜿çšããªãããå®çŸ©ããããšãæ確ãªã«ãŒã«ã§ãããTãå®çŸ©ãããŠããããšãç¥ãå¿ èŠããªãããšã瀺åããŠããŸãã funcïŒTïŒMïŒïŒãæå¹ãã©ãããç¥ãããã«ã https://github.com/golang/go/issues/18130#issuecomment -267997124ã§ã @ rscã¯ãä»æ¥ã§ãfuncïŒTïŒMïŒïŒãç¡å¹ãªç¹å®ã®TãããããšãææããŠããŸãïŒ httpsïŒ// play .golang.org / p / bci2qnldejã å®éã«ã¯ã人ã ãåççãªã³ãŒããæžãã®ã§ãããã¯èµ·ãããŸããã
ãã®å¯èœæ§ã®ããå¶éã念é ã«çœ®ããŸããããããå¿ èŠã§ãããšãã匷åãªèšŒæ ãåŸããããŸã§åŸ ã£ãŠããå°å ¥ããŠãã ããã
https://github.com/golang/go/issues/18130#issuecomment -267691816ã§ã @ Meroviusã¯ãããã±ãŒãžã®ç§»åäžã«ååãå€æŽããåã蟌ã¿åã¯ããã®æ°ããååãæçµçã«æ¡çšããå¿ èŠãããå Žåã«åé¡ãåŒãèµ·ãããšææããŠããŸãããµã€ãã䜿çšããŸãã ããšãã°ããŠãŒã¶ãŒã¿ã€ãUã«bytes.Bufferã«ç§»åããio.ByteBufferãåã蟌ãŸããŠããå ŽåãUãio.ByteBufferãåã蟌ãã§ããéããã£ãŒã«ãåã¯U.ByteBufferã§ãããUãbytes.Bufferãåç §ããããã«æŽæ°ããããšããã£ãŒã«ãåã¯å¿ ãU.Bufferã«å€æŽããŸãã
https://github.com/golang/go/issues/18130#issuecomment -267710478ã§ã @ neildã¯ã
https://github.com/golang/go/issues/18130#issuecomment -267703067ã§ã @ bcmillsã¯ã段éçãªä¿®åŸ©äžã«ãã£ãŒã«ãã«è€æ°ã®ååãä»ããããšãã§ããããã«ããã£ãŒã«ããšã€ãªã¢ã¹ã®ã¢ã€ãã¢ãææ¡ããŠããŸãã ãã£ãŒã«ããšã€ãªã¢ã¹ã䜿çšãããšãæäžäœã®åãšã€ãªã¢ã¹ãäœæãã代ããã«ã type U struct { bytes.Buffer; ByteBuffer = Buffer }
ãããªãã®ãå®çŸ©ã§ããŸãã
https://github.com/golang/go/issues/18130#issuecomment -268001111ã§ã @ rscã¯ããã«å¥ã®å¯èœæ§ãæèµ·ããŸããããã®ã¿ã€ãããã®ååã§åã蟌ããã®æ§æã«ããããã€ããåã蟌ãããšãã§ããŸãããããã¬ãã«ã®ã¿ã€ãã代æ¿åãå¿ èŠãšããã«ããã£ãŒã«ãåByteBufferãšããŠãããã¡ãªã³ã°ããŸãã ãããååšããå Žåã¯ãå ã®ååãä¿æããªããïŒ2çªç®ã®ååãäžåšçšãªãšã¯ã¹ããŒããããåãå°å ¥ããã«ïŒãååãio.ByteBufferããbytes.Bufferã«æŽæ°ã§ããŸãã
ãã£ãŒã«ãã®ååå€æŽã®åé¡ã«ãã£ãŠå€§èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ããããã¯ããããšãã蚌æ ãå¢ãããããããã¯ãã¹ãŠèª¿æ»ãã䟡å€ãããããã§ãã @rscãæžããããã«ããåãšã€ãªã¢ã¹ãããã£ãŒã«ããšã€ãªã¢ã¹ã®æ¬ åŠã倧èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ã®æ¬¡ã®å€§ããªé害ãšãªããã€ã³ãã«å°éããã®ã«åœ¹ç«ã€ãªããããã¯é²æ©ããã§ãããïŒã
åã蟌ã¿ãã£ãŒã«ãã§ã®ãšã€ãªã¢ã¹ã®äœ¿çšãå¶éããããã¿ãŒã²ããã¿ã€ãã®ååã䜿çšããããã«åã蟌ã¿åãå€æŽãããšããææ¡ããããŸãããããšã€ãªã¢ã¹ã®å°å ¥ã«ããæ¢åã®å®çŸ©ãå£ããã¢ãããã¯ã«ä¿®æ£ããå¿ èŠããããåºæ¬çã«æ®µéçãªä¿®åŸ©ãã§ããªããªããŸãã @rsc ïŒ "ããã«ã€ããŠã¯ãïŒ17746ã§ããçšåºŠè©³ãã説æããŸãããå ã ãåã蟌ã¿io.ByteBufferãšã€ãªã¢ã¹ã®ååãBufferã§ãããšããåŽã«ããŸããããäžèšã®è°è«ã«ãããç§ã¯ééã£ãŠãããšç¢ºä¿¡ããŸãããç¹ã«@jimmyfrascheã¯ããã€ãã®è¯ã
ãªãã¬ã¯ã·ã§ã³ã䜿çšããããã°ã©ã ã¯ããšã€ãªã¢ã¹ãã·ãŒã¹ã«ãŒããŸãã https://github.com/golang/go/issues/18130#issuecomment -267903649ã§ã @ atdiarã¯ãããã°ã©ã ããªãã¬ã¯ã·ã§ã³ã䜿çšããŠããå Žåãããšãã°ãåãå®çŸ©ãããŠããããã±ãŒãžãååãèŠã€ããããšãææããŠããŸããã¿ã€ãã®å Žåã転éãšã€ãªã¢ã¹ãæ®ãããŠããŠããã¿ã€ãã移åããããšãã«å€æŽãç£èŠããŸãã https://github.com/golang/go/issues/18130#issuecomment -268001410ã§ã @ rscã¯ããã確èªãããåã蟌ã¿ã®ç¶æ³ãšåæ§ã«ãå®ç§ã§ã¯ãããŸãããåã蟌ã¿ã®ç¶æ³ãšã¯ç°ãªããç§ã«ã¯äœããããŸãããããããã³ãŒããé€ããŠçãã¯ããããã®è©³çŽ°ã«éåžžã«ææã§ããããã«ãªãã¬ã¯ãã䜿çšããŠæžãããã¹ãã§ã¯ãããŸãããã
ä»æ¥ã®ãã³ããŒããã±ãŒãžã®äœ¿çšã¯ãreflectã«ãã£ãŠèŠãããããã±ãŒãžã®ã€ã³ããŒããã¹ãå€æŽãããã®ãããŸããã«ãã£ãŠåŒãèµ·ããããé倧ãªåé¡ã«ã€ããŠã¯èªèãããŠããŸããã ããã¯ãããã°ã©ã ããšã€ãªã¢ã¹ã®äœ¿çšã«ãã£ãŠå£ããããããªæ¹æ³ã§reflect.Type.PkgPathãäžè¬çã«æ€æ»ããŠããªãããšã瀺åããŠããŸãã ããã§ããåã蟌ã¿ãšåãããã«ãæœåšçãªã®ã£ããã§ãã
https://github.com/golang/go/issues/18130#issuecomment -268524504ã§ã @ atdiarã¯ããªããžã§ã¯ããã¡ã€ã«ãšåå¥ã®ã³ã³ãã€ã«ãžã®åœ±é¿ã®åé¡ãæèµ·ããŸãã https://github.com/golang/go/issues/18130#issuecomment -268560180ã§ã @ rscã¯ãããã§å€æŽãå ããå¿ èŠã¯ãªããšå¿çããŸããXãYãšYã®å€æŽãã€ã³ããŒãããŠåã³ã³ãã€ã«ããå ŽåãXã¯æ¬¡ã®ããšãè¡ãå¿ èŠããããŸããåã³ã³ãã€ã«ããããŸãã ããã¯ä»æ¥ããšã€ãªã¢ã¹ããªããŠãåœãŠã¯ãŸãããšã€ãªã¢ã¹ããã£ãŠãåœãŠã¯ãŸããŸãã åå¥ã®ã³ã³ãã€ã«ãšã¯ãXãšYãå¥ã ã®ã¹ãããã§ã³ã³ãã€ã«ã§ããããšãæå³ãïŒã³ã³ãã€ã©ãŒã¯åãåŒã³åºãã§ããããåŠçããå¿ èŠã¯ãããŸããïŒãXãåã³ã³ãã€ã«ããã«Yãå€æŽã§ããããã§ã¯ãããŸããã
https://github.com/golang/go/issues/18130#issuecomment -264413439ã§ã @ iandã¯ã眮æå¯èœãªåãããé¢æ°ã®åŒæ°ãæ»ãå€ãªã©ã§ååä»ãåã®ä»£ããã«äœ¿çšã§ããåã®ãªã¹ãããææ¡ããŠããŸãã "ã https://github.com/golang/go/issues/18130#issuecomment -268072274ã§ã @ j7bã¯ä»£æ°åã䜿çšããããšãææ¡ããŠããŸããããããã£ãŠãããŒãã¹ãšããŠã³ã³ãã€ã«æã®åãã§ãã¯ãšåçã®ç©ºã®ã€ã³ã¿ãŒãã§ã€ã¹ãååŸããŸããã ãã®æŠå¿µã®ä»ã®ååã¯ãåèšã¿ã€ããšããªã¢ã³ãã¿ã€ãã§ãã
äžè¬ã«ãããã¯ãã³ãŒãã段éçã«ä¿®åŸ©ããŠã¿ã€ãã移åã§ããããã«ããã®ã«ååã§ã¯ãããŸããã ããã«ã€ããŠèããæ¹æ³ã¯2ã€ãããŸãã
https://github.com/golang/go/issues/18130#issuecomment -268075680ã§ã¯ã @ bcmillsãå ·äœçãªæ¹æ³ãæ¡çšããŠããã代æ°åã®è¡šçŸãå ã®åãšã¯ç°ãªããããåèšãåŠçã§ããªãããšãææããŠããŸãããªãªãžãã«ã¯äºææ§ããããŸããåŸè ã«ã¯ã¿ã€ãã¿ã°ããããŸãã
https://github.com/golang/go/issues/18130#issuecomment -268585497ã§ã¯ã @ rscãçè«çãªæ¹æ³ãæ¡çšããŠããã httpsïŒ //github.com/golang/go/issues/18130#issuecomment-265211655ãæ¡åŒµããŠã@griã¯ã段éçãªã³ãŒã修埩ã§ã¯ãT1ãT2ã®ãµãã¿ã€ãã«ããå¿ èŠãããå Žåãããã°ããã®éã®å ŽåãããããšãææããŠããŸãã äž¡æ¹ãäºãã«ãµãã¿ã€ãã«ããå¯äžã®æ¹æ³ã¯ãããããåãã¿ã€ãã«ããããšã§ããããã¯ãã¿ã€ããšã€ãªã¢ã¹ãè¡ãããšãšã¯ç°ãªããŸãã
ãµã€ãã¿ã³ãžã§ã³ããšããŠã段éçãªã³ãŒã修埩ã®åé¡ã解決ããªãããšã«å ããŠã代æ°å/åèšå/å
±çšäœå/ããªã¢ã³ãåã¯ããèªäœã§Goã«è¿œå ããã®ãå°é£ã§ãã èŠã
詳现ã«ã€ããŠã¯ãFAQã®åçãšGo 1.6AMAã®ãã£ã¹ã«ãã·ã§ã³ãåç
§ããŠãã ããã
https://github.com/golang/go/issues/18130#issuecomment -265206780ã§ã @ thwdã¯ãGoã«ã¯å ·äœçãªã¿ã€ããšã€ã³ã¿ãŒãã§ã€ã¹ã®éã«ãµãã¿ã€ãã®é¢ä¿ãããããïŒbytes.Bufferã¯io.Readerã®ãµãã¿ã€ããšèŠãªãããšãã§ããŸãïŒã ïŒããã³ã€ã³ã¿ãŒãã§ã€ã¹éïŒio.ReadWriterã¯åãããã«io.Readerã®ãµãã¿ã€ãã§ãïŒãã€ã³ã¿ãŒãã§ã€ã¹ããã¡ãœããåŒæ°ãŸã§ïŒçŸåšã®åæ£ã«ãŒã«ã«åŸã£ãŠïŒååž°çã«å ±å€ãã«ãããšãå°æ¥ã®ãã¹ãŠã®ããã±ãŒãžã®ã¿ãæäŸãããå Žåã«åé¡ã解決ãããŸããæ§é ã®ãããªå ·äœçãªã¿ã€ãã§ã¯ãªããã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠãã ããïŒãåªããèšèšã奚å±ããŸããïŒã
解決çãšããŠããã«ã¯3ã€ã®åé¡ããããŸãã ãŸããäžèšã®ãµãã¿ã€ãã®åé¡ãããããã段éçãªã³ãŒã修埩ã¯è§£æ±ºãããŸããã 次ã«ã @ thwdããã®ææ¡ã§è¿°ã¹ãããã«ãæ¢åã®ã³ãŒãã«ã¯é©çšãããŸããã 第äžã«ãã©ãã§ãã€ã³ã¿ãŒãã§ãŒã¹ã®äœ¿çšã匷å¶ããããšã¯å®éã«ã¯è¯ãèšèšã§ã¯ãªãããããããããã©ãŒãã³ã¹ã®ãªãŒããŒãããããããããŸãïŒäŸãã°
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãåç §çšã«ææ¡ãããå¶éãåéããŸãããå¶éã«ãã£ãŠè€éããå¢ãããšã«æ³šæããŠãã ããã https://github.com/golang/go/issues/18130#issuecomment -264195616ã«æžããããã«ããå¶éããªããããåçŽãªèšèšãå®éã«çµéšããåŸã§ã®ã¿ããããã®å¶éãå®è£ ããå¿ èŠããããŸããå¶éãååã§ãããã©ãããç解ããã®ã«åœ¹ç«ã¡ãŸãããã®è²»çšãæ¯æãã¡ãªããããããŸããã
èšãæããã°ãå¶éã¯ãæ·±å»ãªèª€çšãæ··ä¹±ãé²ããšãã蚌æ ã«ãã£ãŠæ£åœåãããå¿ èŠããããŸãã ãŸã ãœãªã¥ãŒã·ã§ã³ãå®è£ ããŠããªãããããã®ãããªèšŒæ ã¯ãããŸããã çµéšããã®èšŒæ ãæäŸããå Žåããããã¯æ»ã䟡å€ããããŸãã
ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264165833ããã³https://github.com/golang/go/issues/18130#issuecomment-264171370 by @iandïŒ
æžå¿µäºé ã¯ããã«ã¹ã¿ã åœåèŠåã«åãããã«æšæºã©ã€ãã©ãªã®æŠå¿µã®ååãå€æŽããã³ãŒããããæšæºã©ã€ãã©ãªã«æ»ãè€æ°ã®ããã±ãŒãžã«ããããšã€ãªã¢ã¹ã®é·ãã¹ãã²ããã£ãã§ãŒã³ãããŸãã¯ãã€ã³ã¿ãŒãã§ã€ã¹{}ããšã©ãŒãªã©ã®ãšã€ãªã¢ã¹ãã§ãã ã
åè¿°ã®ããã«ããã®å¶éã«ãããx / image / drawãå«ãäžèšã®ãæ¡åŒµããã±ãŒãžãã®ã±ãŒã¹ã¯èš±å¯ãããŸããã
æšæºã©ã€ãã©ãªãç¹å¥ã§ããçç±ã¯äžæã§ããåé¡ã¯ã©ã®ã³ãŒãã«ãååšããŸãã ãŸããinterface {}ãerrorããæšæºã©ã€ãã©ãªã®ã¿ã€ãã§ã¯ãããŸããã å¶éããäºåå®çŸ©ãããã¿ã€ãã®ãšã€ãªã¢ã·ã³ã°ããšèšãæãããšããšã€ãªã¢ã·ã³ã°ãšã©ãŒã¯èš±å¯ãããŸãããããšã©ãŒããšã€ãªã¢ã·ã³ã°ããå¿ èŠæ§ã¯ããã®èšäºã®åæ©ä»ãã®äŸã®1ã€ã§ããã
ïŒhttps://github.com/golang/go/issues/18130#issuecomment-264188282 by @jbaïŒ
ããã«ãããããã±ãŒãžå ã®ã¿ã€ãã®ååãå€æŽãããšãã«ãšã€ãªã¢ã¹ãäœæã§ããªããªããŸããããã¯ã段éçãªä¿®åŸ©ãå¿ èŠã«ãªãã»ã©åºã䜿çšãããŠããå¯èœæ§ããããŸãïŒhttps://github.com/golang/go/issues/18130#issuecomment-264274714 by @ bcmillsïŒã
ãŸããèšäºã®ããã«ãšã€ãªã¢ã·ã³ã°ãšã©ãŒãèš±å¯ããŸããã
ïŒGo 1.8ã§ã®ãšã€ãªã¢ã¹ãã£ã¹ã«ãã·ã§ã³äžã«ææ¡ãããŸããïŒ
ããã±ãŒãžä¿®é£Ÿèå¥åã«å¶éããåã®ã»ã¯ã·ã§ã³ã®åé¡ã«å ããŠãååãåããŸãŸã«ããããšã匷å¶ãããšãèšäºå ã®io.ByteBufferããbytes.Bufferãžã®å€æãèš±å¯ãããªããªããŸãã
ããCãããunsafeãã®ããã«ãã€ã³ããŒãã®èåŸã«ãšã€ãªã¢ã¹ãé ããŠããã®äœ¿çšãããã«é»æ¢ããã®ã¯ã©ãã§ããïŒåãããã«ããšã€ãªã¢ã¹ã®æ§æãåé·ã«ãããªãã¡ã¯ã¿ãªã³ã°ãé²ããããã®è¶³å ŽãšããŠç®ç«ãããããšæããŸãã ãã --https ïŒ //github.com/golang/go/issues/18130#issuecomment -264289940 by @xiegeo
ããšã€ãªã¢ã¹ã¿ã€ããã¬ã¬ã·ãŒã§ãããæ°ããã¿ã€ãã«çœ®ãæããå¿ èŠãããããšãèªåçã«æšæž¬ããå¿ èŠããããŸããïŒgolintãgodocãããã³åæ§ã®ããŒã«ãé©çšããŠå€ãã¿ã€ããéæšå¥šãšããŠèŠèŠåãããšãã¿ã€ããšã€ãªã¢ã¹ã®ä¹±çšãå€§å¹ ã«å¶éãããŸãããšã€ãªã¢ã·ã³ã°æ©èœãæªçšããããšããæåŸã®æžå¿µã¯è§£æ±ºãããã§ããããã --https ïŒ //github.com/golang/go/issues/18130#issuecomment -265062154 by @rakyll
ããããééã£ãŠäœ¿çšãããããšãããããŸã§ã䜿çšãæããšã©ãŸãããã®ã¯ææå°æ©ã®ããã§ãã äžæçã§ã¯ãªãè¯ã䜿çšæ³ããããããããŸããïŒäžèšãåç §ïŒã
ã³ãŒã修埩ã®å Žåã§ããã€ã³ããŒãã°ã©ãã«ãã£ãŠèª²ããããå¶çŽã«å¿ããŠã移è¡äžã¯å€ãã¿ã€ããŸãã¯æ°ããã¿ã€ãã®ããããããšã€ãªã¢ã¹ã«ãªãå¯èœæ§ããããŸãã ãšã€ãªã¢ã¹ã§ããããšã¯ãååãéæšå¥šã«ãªãããšãæå³ãããã®ã§ã¯ãããŸããã
ç¹å®ã®å®£èšãéæšå¥šãšããŠããŒã¯ããã¡ã«ããºã ã¯ãã§ã«ååšããŸãïŒ@jimmyfrascheã«ããhttps://github.com/golang/go/issues/18130#issuecomment-265294564ãåç §ïŒã
ããšã€ãªã¢ã¹ã¯ååã®ãªãã¿ã€ãã«é©çšãã¹ãã§ã¯ãããŸãããååã®ãªãã¿ã€ãããå¥ã®ã¿ã€ãã«ç§»åããéã®ãã³ãŒã修埩ãã®è©±ã§ã¯ãããŸãããååã®ãªãã¿ã€ãã§ãšã€ãªã¢ã¹ãèš±å¯ãããšãGoãåã«ååã®ä»ããã¿ã€ããšååã®ãªãã¿ã€ããšããŠæããããšãã§ããªããªããŸããã --https ïŒ //github.com/golang/go/issues/18130#issuecomment -276864903 by @davecheney
ããããééã£ãŠäœ¿çšãããããšãããããŸã§ã䜿çšãæããšã©ãŸãããã®ã¯ææå°æ©ã®ããã§ãã ååã®ãªãã¿ãŒã²ããã«ã¯è¯ã䜿çšæ³ããããããããŸããïŒäžèšãåç §ïŒã
èšèšããã¥ã¡ã³ãã«èšèŒãããŠããããã«ãç¶æ³ãæ確ã«ããããã«çšèªãå€æŽããäºå®ã§ãã
ç§ã¯ãããã©ãã»ã©èŠèŠçã«åäžã«èŠãããã奜ãã§ãã
const OldAPI => NewPackage.API
func OldAPI => NewPackage.API
var OldAPI => NewPackage.API
type OldAPI => NewPackage.API
ããããã»ãšãã©ã®èŠçŽ ãã»ãŒåŸã
ã«åããããšãã§ããã®ã§ãããããæãåçŽã§ã
解決çã¯ãåã«=
ãèš±å¯ããã ãã§ãã
const OldAPI = NewPackage.API
func OldAPI() { NewPackage.API() }
var OldAPI = NewPackage.API
type OldAPI = NewPackage.API
ããã§ãæåã«ãç§ã¯ãã®çŽ æŽãããèšäºã«æè¬ããããšæããŸããã æè¯ã®è§£æ±ºçã¯ãä»£å ¥æŒç®åã䜿çšããŠåãšã€ãªã¢ã¹ãå°å ¥ããããšã ãšæããŸãã ããã¯ãæ°ããããŒã¯ãŒã/æŒç®åãå¿ èŠãšããã䜿ãæ £ããæ§æã䜿çšãã倧èŠæš¡ãªã³ãŒãããŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°ã®åé¡ã解決ããã¯ãã§ãã
Russã®èšäºãææããŠããããã«ããšã€ãªã¢ã¹ã®ãããªãœãªã¥ãŒã·ã§ã³ã¯ã httpsïŒ //github.com/golang/go/issues/17746ãšhttps://github.com/golang/go/issues/17784ãé©åã«è§£æ±ºããå¿ èŠããã
ãã®èšäºãæžããŠãããŠããããšãã
ä»£å ¥æŒç®åã䜿çšããåã®ã¿ã®ãšã€ãªã¢ã¹ãæé©ã ãšæããŸãã
type OldAPI = NewPackage.API
ç§ã®çç±ïŒ
äžèšã®ãã¹ãŠïŒçµæã¯ã·ã³ãã«ã§ãçŠç¹ãçµãããä¿å®çã§ãçŸçã§ãããããGoã®äžéšã§ããããšãç°¡åã«æ³åã§ããŸãã
ãœãªã¥ãŒã·ã§ã³ãã¿ã€ãã®ã¿ã«å¶éãããå Žåãæ§æ
type NewFoo = old.Foo
@rscã®èšäºã§èª¬æããããã«ããã§ã«åã«æ€èšããããã«ãç§ã«ã¯éåžžã«è¯ãããã§ãã
å®æ°ãå€æ°ãé¢æ°ã«å¯ŸããŠåãããšãå®è¡ã§ããããã«ãããå Žåãç§ã®å¥œã¿ã®æ§æã¯ïŒä»¥åã«ææ¡ãããããã«ïŒã§ãã
package newfmt
import (
"fmt"
)
// No renaming.
export fmt.Printf // Note: Same as `export Printf fmt.Printf`.
export (
fmt.Sprintf
fmt.Formatter
)
// Renaming.
export Foo fmt.Errorf // Foo must be exported, ie. `export foo fmt.Errorf` would be invalid.
export (
Bar fmt.Fprintf
Qux fmt.State
)
åã«èª¬æããããã«ãæ¬ ç¹ã¯ãæ°ãããããã¬ãã«ã®ã¿ã®ããŒã¯ãŒããå°å ¥ãããããšã§ããããã¯ãæè¡çã«å®çŸå¯èœã§ãããå®å šãªäžäœäºææ§ãããã«ãããããããæããã«åä»ã§ãã ã€ã³ããŒãã®ãã¿ãŒã³ãåæ ããŠããã®ã§ããã®æ§æã奜ãã§ãã èŒžå ¥ãèš±å¯ãããŠããã®ãšåãã»ã¯ã·ã§ã³ã§ã®ã¿èŒžåºãèš±å¯ãããã®ã¯åœç¶ã®ããšã®ããã«æãããŸãã ããã±ãŒãžå¥ãšä»»æã®å€æ°ãåãå®æ°ããŸãã¯é¢æ°TLDã®éã
ååå€æŽèå¥åã¯ããã±ãŒãžã¹ã³ãŒãã§å®£èšãããŸãããæ°ããåå
var v = Printf // undefined: Printf.
var Printf int // Printf redeclared, previous declaration at newfmt.go:8.
ã€ã³ããŒãããã±ãŒãžã§ã¯ãïŒnewftmã®ïŒããã±ãŒãžãããã¯ã®ä»ã®ãšã¯ã¹ããŒããããèå¥åãšåæ§ã«ãååå€æŽèå¥åãéåžžã©ãã衚瀺ãããŸãã
package foo
import "newfmt"
type bar interface {
baz(qux newfmt.Qux) // qux type is identical to fmt.State.
}
çµè«ãšããŠããã®ã¢ãããŒãã¯newfmtã«æ°ããããŒã«ã«åãã€ã³ãã£ã³ã°ãå°å ¥ããŸãããããã«ãããïŒ17746ã§èª¬æããåé¡ã®å°ãªããšãäžéšãåé¿ãããïŒ17784ãå®å šã«è§£æ±ºããããšæããŸãã
ç§ã®æåã®å¥œã¿ã¯ãã¿ã€ãã®ã¿ã®type NewFoo = old.Foo
ã§ãã
ããäžè¬çãªè§£æ±ºçãå¿
èŠãªå Žåã¯ã @ cznicã«åæãexport
ããŒã¯ãŒããæ£ããæå³ãäŒããŠãããšã¯æããŸããã æ§æãã»ãã³ãã£ã¯ã¹ãimport
åæ ããŠããŸããã alias
ã©ãã§ããïŒ
@cznicãæ°ããååã宣èšããããã±ãŒãžã«ã¢ã¯ã»ã¹ã§ããããã«ããããªãçç±ã¯ç解ããŠããŸãããå°ãªããšãç§ã«ã¯ããã®å¶éã¯äºæãã¬äººå·¥çãªãã®ã ãšæããŠããŸãïŒãã ãããã®èåŸã«ããçç±ã¯å®å šã«ç解ããŠããŸãïŒã
[1]ç§ã¯Unixã20幎è¿ã䜿çšããŠããŸãããæåã®è©Šè¡ã§ã¯ãŸã ã·ã³ããªãã¯ãªã³ã¯ãäœæã§ããŸããã ãããŠãç§ã¯éåžžãããã¥ã¢ã«ãèªãã åŸã2åç®ã®è©Šè¡ã§ã倱æããŸãã
è¿œå ã®å¶çŽãææ¡ããããšæããŸããæšæºã©ã€ãã©ãªåã®åãšã€ãªã¢ã¹ã¯ãæšæºã©ã€ãã©ãªã§ã®ã¿å®£èšã§ããŸãã
ç§ã®æšè«ã¯ãã«ã¹ã¿ã ã®åœåèŠåã«åãããã«æšæºã©ã€ãã©ãªã®æŠå¿µã®ååãå€æŽããã³ãŒããæäœããããªããšããããšã§ãã ãŸããæšæºã©ã€ãã©ãªã«æ»ã£ãŠããŸãè€æ°ã®ããã±ãŒãžã«ãŸããããšã€ãªã¢ã¹ã®é·ãã¹ãã²ããã£ãã§ãŒã³ãæ±ããããããŸããã
@iand ïŒãã®å¶çŽã«ããããã®æ©èœã䜿çšããŠäœããæšæºã©ã€ãã©ãªã«ç§»è¡ããããšããããã¯ãããŸãã é©åãªäŸãšããŠãçŸåšã®Context
ã®æšæºã©ã€ãã©ãªãžã®ç§»è¡ã Context
ã®å€ã家ã¯ãæšæºã©ã€ãã©ãªã®Context
ãšã€ãªã¢ã¹ã«ãªãã¯ãã§ãã
@quentinmitããã¯æ®å¿µãªããæ¬åœã§ãã ãŸãããã®CLhttpsïŒ//go-review.googlesource.com/#/c/32145/ã®golang.org/x/image/drawã®ãŠãŒã¹ã±ãŒã¹ãå¶éãããŸãã
ç§ã®æ¬åœã®æžå¿µã¯ã interface{}
ãerror
ãããªãã®ããšã€ãªã¢ã·ã³ã°ãã人ã
ã«ãããŸã
æ°ãããªãã¬ãŒã¿ãŒãå°å
¥ããããšã«ãªã£ãå Žåã¯ã ~
ãææ¡ããããšæããŸãã è±èªã§ã¯ãäžè¬çã«ãé¡äŒŒãããã»ãŒãããçŽãããŸãã¯ãåšèŸºããæå³ãããšç解ãããŠããŸãã äžèšã®@ 4adã§è¿°ã¹ãããã«ã =>
ã¯ãæ¹åæ§ãæ··ä¹±ããé察称æŒç®åã§ãã
äŸãã°ïŒ
const OldAPI ~ NewPackage.API
func OldAPI ~ NewPackage.API
var OldAPI ~ NewPackage.API
type OldAPI ~ NewPackage.API
@iandå³åŽãããã±ãŒãžä¿®é£Ÿèå¥åã«å¶éãããšãç¹å®ã®æžå¿µã解æ¶ãããŸãã
ãŸããçŸåšã®ããã±ãŒãžã®ã©ã®åã«ãããŸãã¯map[string]map[int]interface{}
ãããªé·ãååŒã®ãšã€ãªã¢ã¹ãèšå®ã§ããªãããšãæå³ããŸãã ãããããããã®äœ¿çšã¯ã段éçãªã³ãŒã修埩ã®äž»ãªç®çãšã¯äœã®é¢ä¿ããªãã®ã§ããããã倧ããªæ倱ã§ã¯ãããŸããã
@ cznic ã @ iand ããã®ä»ïŒ _ããšã«æ³šæããŠãã ããã ãããã¯æ©èœã®èª¬æãè€éã«ããæ©èœã®ãã¹ãŠã®ãŠãŒã¶ãŒã«èªç¥çè² è·ãè¿œå ããŸããå¶éãå¿ããå Žåãæ©èœããã¯ãã ãšæã£ããã®ãæ©èœããªãçç±ãããºã«ã§è§£ãå¿ èŠããããŸãã
æ¶ç©ºã®èª€çšã®ã¿ãçç±ãšããŠãæå ã®è©Šè¡ã«å¶éãå®è£
ããããšã¯ãã°ãã°ééãã§ãã ããã¯ãšã€ãªã¢ã¹ææ¡ã®è°è«ã§èµ·ããããã©ã€ã¢ã«ã®ãšã€ãªã¢ã¹ã¯èšäºããã®io.ByteBuffer
=> bytes.Buffer
å€æãåŠçã§ããªããªããŸããã èšäºãæžãç®çã®äžéšã¯ãåŠçã§ããããã«ãããããšãããã£ãŠããããã€ãã®ã±ãŒã¹ãå®çŸ©ããŠãäžæ³šæã«ããããå¶éããªãããã«ããããšã§ãã
å¥ã®äŸãšããŠãéãã€ã³ã¿ãŒåã®ã¬ã·ãŒããŒãçŠæ¢ããããéæ§é äœåã®ã¡ãœãããçŠæ¢ãããããããã«ã誀çšã®åŒæ°ãäœæããã®ã¯ç°¡åã§ãã ãããã®ãããããå®è¡ããå ŽåãStringïŒïŒã¡ãœããã䜿çšããŠåæåãäœæããŠããèªäœãå°å·ããããšã¯ã§ããŸããããŸãã http.Headers
ãã¬ãŒã³ãããã«ããŠãã«ããŒã¡ãœãããæäŸããããšãã§ããŸããã å€ãã®å Žåã誀çšãæ³åããã®ã¯ç°¡åã§ãã 説åŸåã®ããç©æ¥µçãªäœ¿çšã¯ã衚瀺ããããŸã§ã«æéããããå¯èœæ§ããããå®éšçšã®ã¹ããŒã¹ãäœæããããšãéèŠã§ãã
ããã«å¥ã®äŸãšããŠããã€ã³ã¿ãŒãšå€ã®ã¡ãœããã®å ã®èšèšãšå®è£ ã§ã¯ãTãš* Tã®ã¡ãœããã»ãããåºå¥ãããŸããã§ããã* Tãããå Žåã¯ãå€ã¡ãœããïŒã¬ã·ãŒããŒTïŒãåŒã³åºãããšãã§ãã Tã®å Žåããã€ã³ã¿ã¡ãœããïŒã¬ã·ãŒããŒ* TïŒãåŒã³åºãããšãã§ããŸãã ããã¯åçŽã§ã説æããå¶éã¯ãããŸããã§ããã ããããå®éã®çµéšãããå€ã«å¯Ÿãããã€ã³ã¿ãŒã¡ãœããã®åŒã³åºããèš±å¯ãããšãç¹å®ã®ã¯ã©ã¹ã®çŽããããé©ãã¹ããã°ãçºçããããšãããããŸããã ããšãã°ã次ã®ããã«æžãããšãã§ããŸãã
var buf bytes.Buffer
io.Copy(buf, reader)
io.Copyã¯æåããŸãããbufã«ã¯äœãå«ãŸããŸããã ãã®ããã°ã©ã ãæ£ããå®è¡ãããªãã£ãçç±ã説æãããããã®ããã°ã©ã ãã³ã³ãã€ã«ãããªãã£ãçç±ã説æããããéžæããå¿ èŠããããŸããã ãããã«ããã質åããããŸããããç§ãã¡ã¯èª€ã£ãå®è¡ãé¿ããåŽã«èœã¡ãŸããã ããã§ãããã¶ã€ã³ã«ç©ŽãéããŠããçç±ã«ã€ããŠã®FAQãšã³ããªã
ç¹°ãè¿ããŸãããå¶éã«ããè€éããå¢ãããšãå¿ããªãã§ãã ããã ãã¹ãŠã®è€éãã®ããã«ãå¶éã«ã¯éèŠãªæ£åœåãå¿ èŠã§ãã èšèšããã»ã¹ã®ãã®æ®µéã§ã¯ãç¹å®ã®èšèšã«é©ããŠããå¯èœæ§ã®ããå¶éã«ã€ããŠèããã®ã¯è¯ãããšã§ãããå¶éã®ãªãåçŽãªèšèšãå®éã«çµéšããåŸã§ã®ã¿ãå¶éãååãªã¡ãªããããããããã©ãããç解ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãããã®è²»çšãæ¯æãããã«ã
ãŸããGo 1.9ãµã€ã¯ã«ã®éå§æïŒçæ³çã«ã¯ãµã€ã¯ã«ãéå§ããæ¥ïŒã«ãäœãè©Šããã«ã€ããŠæ«å®çãªæ±ºå®ãäžããå®éšã®æºåãã§ããŠããããšãé¡ã£ãŠããŸãã å®éšããæéãå¢ãããšãç¹å®ã®å¶éã説åŸåããããã©ãããåŠã¶æ©äŒãªã©ãå€ãã®å©ç¹ããããŸãã ãšã€ãªã¢ã¹ã®1ã€ã®ééãã¯ãGo1.8ãµã€ã¯ã«ã®çµããè¿ããŸã§å®å šãªå®è£ ãã³ãããããªãã£ãããšã§ãã
å ã®ãšã€ãªã¢ã¹ææ¡ã«ã€ããŠã®1ã€ã®ããšã¯ãæå³ããããŠãŒã¹ã±ãŒã¹ïŒãªãã¡ã¯ã¿ãªã³ã°ãæå¹ã«ããïŒã§ã¯ããšã€ãªã¢ã¹ã¿ã€ãã®å®éã®äœ¿çšã¯äžæçãªãã®ã«ãããªããšããããšã§ãã ããããããã¡ã®äŸã§ã¯ã段éçãªä¿®åŸ©ãå®äºãããšãio.BytesBufferã¹ã¿ããåé€ãããŸããã
ãšã€ãªã¢ã¹ã¡ã«ããºã ãäžæçã«ã®ã¿è¡šç€ºããå¿
èŠãããå Žåãå®éã«ã¯èšèªãå€æŽããå¿
èŠããããŸããïŒ ãããã代ããã«ãããšã€ãªã¢ã¹ãã®ãªã¹ããgc
ã«æäŸããã¡ã«ããºã ãååšããå¯èœæ§ããããŸãã gcã¯äžæçã«çœ®æãè¡ãå¯èœæ§ããããããŠã³ã¹ããªãŒã ã³ãŒãããŒã¹ã®äœæè
ã¯ãä¿®æ£ãããŒãžããããšãã«ãã®ãã¡ã€ã«å
ã®ã¢ã€ãã ãåŸã
ã«åé€ããå¯èœæ§ããããŸãã ãã®ææ¡ãããªãããŒãªçµæãããããããšãç§ã¯ç解ããŠããŸãããå°ãªããšãäžæçãªã¡ã«ããºã ã奚å±ããŠããŸãã
æ§æã«é¢ãããã€ã¯ã·ã§ãã£ã³ã°ã«ã¯åå ããŸããïŒåºæ¬çã«ã¯æ°ã«ããŸããïŒããã ãããšã€ãªã¢ã¹ã®è¿œå ã決å®ãããããããåã«å¶éããããšã決å®ãããå Žåã¯ãå°ãªããšãvar
ãŸã§äžè²«ããŠæ¡åŒµå¯èœãªæ§æã䜿çšããŠãã ããã func
ããã³const
ïŒ type Foo = pkg.Bar
ãé€ããã¹ãŠã®ææ¡ãããæ§ææ§é ã¯ãã¹ãŠãèš±å¯ããŸãïŒã ãã®çç±ã¯ã var
ãšã€ãªã¢ã¹ãéããçãã±ãŒã¹ã¯ãŸããããããªããšç§ã¯åæããŸãããããããååšããªããšã¯æããªãã®ã§ããã€ãè¿œå ããããšã決å®ãããããããªããšä¿¡ããŠããŸãããããã ãã®æç¹ã§ããã¹ãŠã®ãšã€ãªã¢ã¹å®£èšã«äžè²«æ§ãæãããããšæãã§ãããã type Foo = pkg.Bar
ãšvar Foo => pkg.Bar
å Žåã¯æªãã§ãããã
ç§ã¯ãŸãã4ã€ãã¹ãŠãæã£ãŠããããšã«ã€ããŠå°ãè°è«ããããšæããŸãã çç±ã¯
1ïŒ var
ã«ã¯éããvar Debug *log.Logger
å
¬éãããã http.DefaultServeMux
ãªã©ã®ã°ããŒãã«ã·ã³ã°ã«ãã³ãåå²ãåœãŠããŠããã³ãã©ãŒãè¿œå ããããã±ãŒãžã®ç»é²ãã€ã³ã¿ãŒã»ãã/åé€ãããããããšããããããŸãã
2ïŒ func Foo() { pkg.Bar() }
ã¯func Foo => pkg.Bar
ãšåãããšãããŸãããåŸè
ã®æå³ã¯ã¯ããã«æ確ã ãšæããŸãïŒç¹ã«ãšã€ãªã¢ã¹ã«ã€ããŠãã§ã«ç¥ã£ãŠããå ŽåïŒã ãããã¯å®éã«ããã«ããããšãæå³ãããã®ã§ã¯ãªãããšæ確ã«è¿°ã¹ãŠããŸãã ãããã£ãŠãæè¡çã«ã¯åãã§ããããšã€ãªã¢ã¹æ§æã¯ããã¥ã¡ã³ããšããŠåœ¹ç«ã€å ŽåããããŸãã
ããããããã¯ç§ãæ»ã¬äžã§ã¯ãããŸããã åŸã§æ¡åŒµãããªãã·ã§ã³ãããéããä»ã®ãšããã¿ã€ããšã€ãªã¢ã¹ã ãã§åé¡ãããŸããã
ãããä»ã®ããã«æžãããŠããŠãšãŠãå¬ããã§ãã ãã°ããã®éãAPIã®èšèšãšå®å®æ§ã«ã€ããŠç§ãæã£ãŠããããããã®æèŠãèŠçŽããŠãããå°æ¥çã«ã¯ã人ã ããªã³ã¯ããããã®ç°¡åãªãªãã¡ã¬ã³ã¹ãšããŠã圹ç«ã¡ãŸã:)
ãã ããããã¥ã¡ã³ããšã¯ç°ãªããšã€ãªã¢ã¹ã§ã«ããŒãããè¿œå ã®ãŠãŒã¹ã±ãŒã¹ãããå Žåã匷調ããããšæããŸãïŒAIUIã¯ããã®åé¡ã®ããäžè¬çãªæå³ã§ããã段éçãªä¿®åŸ©ã解決ããããã®è§£æ±ºçãèŠã€ããããšã§ãïŒã 段éçãªä¿®åŸ©ãå¯èœã«ãããšããã³ã³ã»ããã«ã³ãã¥ããã£ãåæã§ããã°ãšãŠãå¬ããã§ããããšã€ãªã¢ã¹ãšã¯ç°ãªã決å®ãäžãããå Žåã¯ããµããŒããããã©ãããã©ã®ããã«ãµããŒããããã«ã€ããŠãåæã«è©±ãåãå¿
èŠããããšæããŸãã protobufã®ãããªãã¯ã€ã³ããŒãããå¥ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšããããããã€ã³çœ®æããã±ãŒãžã®x/image/draw
ãŠãŒã¹ã±ãŒã¹ïŒã©ã¡ããç§ã®å¿ã«ããè¿ãïŒãªã©ã§ãã @btraceyã«ãããšã€ãªã¢ã¹ã®go-tool / gcãã©ã°ã®ææ¡ã¯ã段éçãªä¿®åŸ©ãæ¯èŒçããŸãã«ããŒããŠãããã®ã®ãä»ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯å®éã«ã¯åãå
¥ããããªããšç§ãä¿¡ããŠããäŸã§ãã ããªãã¯æ¬åœã«äœ¿çšããŠäœããã³ã³ãã€ã«ããããšèª°ããæåŸ
ããããšã¯ã§ããŸããx/image/draw
ãããã®ãã©ã°ãæž¡ãããã«ã¯ã圌ãã¯ãã ã«ã§ããã¯ãã§ãgo get
ã
@jba
@iandå³åŽãããã±ãŒãžä¿®é£Ÿèå¥åã«å¶éãããšãç¹å®ã®æžå¿µã解æ¶ãããŸãã
ãŸããçŸåšã®ããã±ãŒãžã®ã©ã®ã¿ã€ãã«ããšã€ãªã¢ã¹ãèšå®ã§ããªãããšãæå³ããŸã[âŠ]ã ãããããããã®äœ¿çšã¯ã段éçãªã³ãŒã修埩ã®äž»ãªç®çãšã¯äœã®é¢ä¿ããªãã®ã§ããããã倧ããªæ倱ã§ã¯ãããŸããã
ããã±ãŒãžå ã§ã®ååã®å€æŽïŒããšãã°ãããæ £çšçãªååãäžè²«æ§ã®ããååïŒã¯ã確ãã«åççã«å®è¡ããããªãã¡ã¯ã¿ãªã³ã°ã®äžçš®ã§ãããããã±ãŒãžãåºã䜿çšãããŠããå Žåã¯ã段éçãªä¿®åŸ©ãå¿ èŠã«ãªããŸãã
ããã±ãŒãžä¿®é£Ÿåã®ã¿ã«å¶éããã®ã¯ééãã ãšæããŸãã ïŒãšã¯ã¹ããŒããããååã®ã¿ã«å¶éããæ¹ã蚱容ã§ããå ŽåããããŸããïŒ
@btracey
ãããã代ããã«ãgcã«ããšã€ãªã¢ã¹ãã®ãªã¹ããæäŸããã¡ã«ããºã ãããå¯èœæ§ããããŸãã gcã¯äžæçã«çœ®æãè¡ãå¯èœæ§ããããããŠã³ã¹ããªãŒã ã³ãŒãããŒã¹ã®äœæè ã¯ãä¿®æ£ãããŒãžããããšãã«ãã®ãã¡ã€ã«å ã®ã¢ã€ãã ãåŸã ã«åé€ããå¯èœæ§ããããŸãã
gc
ã®ã¡ã«ããºã ã¯ãã³ãŒãã修埩ããã»ã¹äžã«gc
ã®ã¿ãã«ãå¯èœã§ããããšããŸãã¯ã¡ã«ããºã ãä»ã®ã³ã³ãã€ã©ãŒã«ãã£ãŠãµããŒããããå¿
èŠãããããšãæå³ããŸãïŒäŸïŒ gccgo
ãšllgo
ïŒãã ãã¹ãŠã®å®è£
ã§ãµããŒããããªããã°ãªããªããéèšèªå€æŽãã¡ã«ããºã ã¯ãäºå®äžã®èšèªå€æŽã§ããããã¯ãããã¥ã¡ã³ããäžååãªã¡ã«ããºã ã«ãããŸããã
ã³ã³ãã€ã©ã ãã§ãªãã @ btraceyãš@bcmills ïŒæç¥ãä»ã®äººã ãæ§ç¯ãããã®ãªã©ããœãŒã¹ã³ãŒããåæããããŒã«ã ã©ã®ããã«ã¹ã©ã€ã¹ããŠããããã¯ç¢ºãã«èšèªã®å€åã§ãã
ããããŸãããããããšãã
ãã1ã€ã®å¯èœæ§ã¯ã constsãé€ããã¹ãŠã®ãšã€ãªã¢ã¹ã§ãïŒ
constsã®å Žåã =>
ã¯ãå®éã«ã¯=
ãèšè¿°ããããã®ããé·ãæ¹æ³ã§ãã ã¿ã€ããå€æ°ã®ããã«ãæ°ããã»ãã³ãã£ã¯ã¹ã¯ãããŸããã funcsã®ããã«ä¿åãããããŒã¹ãããŒã¯ã¯ãããŸããã
ããã¯å°ãªããšãïŒ17784ã解決ããã§ãããã
åè«ã¯ãããŒã«ãã±ãŒã¹ãç°ãªãæ¹æ³ã§åŠçããå¯èœæ§ãããããããæå³ã®ææšã«ãªãå¯èœæ§ããããšããããšã§ãã ããã¯è¯ãåè«ã§ããããŸã£ããåãããšãè¡ãã«ã¯åºæ¬çã«2ã€ã®æ¹æ³ããããšããäºå®ãäžåããšã¯æããŸããã
ãšã¯èšããã®ã®ãä»ã®ãšããç§ã¯ã¿ã€ããšã€ãªã¢ã¹ã ãã§å€§äžå€«ã§ãããããã¯ç¢ºãã«æãéèŠã§ãã ç§ã¯@Meroviusã«ééããªãåæãã§ãããã ãããããããã°ããã®éçºçããªãå Žåã§ãåæ§ã§ãã
ãCãããunsafeãã®å Žåãšåæ§ã«ãã€ã³ããŒãã®èåŸã«ãšã€ãªã¢ã¹ãé衚瀺ã«ããŠããã®äœ¿çšãããã«é»æ¢ããã®ã¯ã©ãã§ããããã åæ§ã«ããšã€ãªã¢ã¹ã®æ§æã¯åé·ã§ããªãã¡ã¯ã¿ãªã³ã°ãé²ããããã®è¶³å ŽãšããŠç®ç«ã€ããã«ããããšæããŸãã
ãã¶ã€ã³ã¹ããŒã¹ãå°ãéæŸããè©Šã¿ãšããŠãããã«ããã€ãã®ã¢ã€ãã¢ããããŸãã 圌ãã¯èä»ããããŠããŸããã ãããã¯ããããæªãããã³/ãŸãã¯äžå¯èœã§ãã åžæã¯äž»ã«ä»ã®äººã«æ°ãã/ããè¯ãã¢ã€ãã¢ãåŒãèµ·ããããšã§ãã ãããŠãèå³ãããã°ãããã«æ¢æ±ããããšãã§ããŸãã
ïŒ1ïŒãšïŒ2ïŒã®åæ©ä»ããšãªãã¢ã€ãã¢ã¯ããšã€ãªã¢ã¹ã®ä»£ããã«å€æã䜿çšããããšã§ãã ïŒ17746ã§ã¯ããšã€ãªã¢ã¹ãåãã¿ã€ãã®è€æ°ã®ååãæã€ããšã«é¢ããåé¡ã«ééããŸããïŒãŸãã¯ããšã€ãªã¢ã¹ã#defineã®ããã«èããããããŒããªã³ã¯ã®ããã«èãããã«å¿ããŠãåãååã綎ãè€æ°ã®æ¹æ³ïŒã å€æã䜿çšãããšãã¿ã€ããåºå¥ããããšã§åé¿ã§ããŸãã
fmt.Println("abc")
ãåŒã³åºããã var e interface{} = "abc"
æžã蟌ããšã "abc"
ã¯èªåçã«interface{}
å€æãããŸãã type T struct { S }
ã宣èšããTã«ããã¢ãŒããããŠããªãã¡ãœããããªãå Žåãã³ã³ãã€ã©ãå¿
èŠã«å¿ããŠãä»ã®æ§é äœå
ãååž°çã«å«ããŠãSãšTã®éã§èªåçã«å€æããããã«èšèªãå€æŽã§ããŸãã Tã¯ã段éçãªãªãã¡ã¯ã¿ãªã³ã°ã®ç®çã§ãSã®äºå®äžã®ãšã€ãªã¢ã¹ïŒãŸãã¯ãã®éïŒãšããŠæ©èœããå¯èœæ§ããããŸãã
type T ~S
ãããSã®ããã«èŠãããåã§ããæ°ããåTã宣èšããŸãã ããæ£ç¢ºã«ã¯ãTã¯ãã¿ã€ãSãšã®éã§å€æå¯èœãªä»»æã®ã¿ã€ããã§ãã ïŒãã€ãã®ããã«ãæ§æã«ã€ããŠã¯åŸã§èª¬æã§ããŸããïŒã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ããšåæ§ã«ãTã«ã¯ã¡ãœãããå«ããããšã¯ã§ããŸããã åºæ¬çã«Tã§äœã§ãããããã«ã¯ããããSïŒãŸãã¯Sãšã®éã§å€æå¯èœãªã¿ã€ãïŒã«å€æããå¿
èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ããšã¯ç°ãªãããå
·è±¡ã¿ã€ããã¯ãããŸãããSããTããã³TããSãžã®å€æã«ã¯ãè¡šçŸã®å€æŽã¯å«ãŸããŸããã 段éçãªãªãã¡ã¯ã¿ãªã³ã°ã®å Žåããããã®ãèŠãç®ãã¿ã€ãã«ãããäœæè
ã¯å€ãã¿ã€ããšæ°ããã¿ã€ãã®äž¡æ¹ãåãå
¥ããAPIãäœæã§ããŸãã ïŒãLookslikeãã¿ã€ãã¯ãåºæ¬çã«éåžžã«å¶éãããåçŽåãããå
±çšäœã¿ã€ãã§ããïŒ
ããŒãã¹è¶
æãããã¢ã€ãã¢ã ïŒãããã²ã©ãããšãããããèšããªãã§ãã ãã-ç§ã¯ãããç¥ã£ãŠããŸããç§ã¯ä»ã®äººã«æ°ããã¢ã€ãã¢ãåºæ¿ããããšããŠããã ãã§ããïŒã¿ã€ãã¿ã°ïŒæ§é äœã¿ã°ãªã©ïŒãå°å
¥ããç¹å¥ãªã¿ã€ãã¿ã°ã䜿çšããŠèšå®ããå Žåã¯ã©ããªããŸããïŒ type T S "alias:\"T\""
ãªã©ã®ãšã€ãªã¢ã¹ãå¶åŸ¡ããŸãã ã¿ã€ãã¿ã°ã«ã¯ä»ã®çšéããããåã«ããã®ã¿ã€ãã¯ãšã€ãªã¢ã¹ã§ãããã ãã§ãªããããã±ãŒãžäœæè
ã«ãããšã€ãªã¢ã¹ã®æå®ã®ç¯å²ãæäŸããŸãã ããšãã°ãã³ãŒãã®äœæè
ã¯åã蟌ã¿åäœãæå®ã§ããŸãã
ãšã€ãªã¢ã¹ãåè©Šè¡ããå Žåã¯ããiotaã®æ©èœãããåã蟌ã¿ã®æ©èœãã®åé¡ãšåæ§ã«ããgodocã®æ©èœãã«ã€ããŠæ€èšãã䟡å€ããããããããŸããã
å ·äœçã«ã¯ã
type OldAPI => NewPackage.API
NewPackage.APIã«ã¯ããã¥ã¡ã³ãã³ã¡ã³ãããããŸãããtypeOldAPIãã®æšªã«ãã®ã³ã¡ã³ããã³ããŒããŠè²Œãä»ããããã³ã¡ã³ããä»ããªãã§ãããïŒgodocãèªåçã«ãªã³ã¯ãæäŸããããèªåçã«ã³ããŒããŠè²Œãä»ããŸãïŒããŸãã¯ä»ã®æ £ç¿ã¯ãããŸããïŒ
äž»ãªåæ©ã¯æ®µéçãªã³ãŒã修埩ããµããŒãããããšã§ããããµããŒãããå¿ èŠããããŸããããã€ããŒãªãŠãŒã¹ã±ãŒã¹ïŒå ·äœçãªææ¡ã§ããããããšã€ãªã¢ã¹ã®ææ¡ã«æ»ãïŒã¯ãåäžã®é¢æ°ãæ瀺ãããšãã«äºéã®é¢æ°åŒã³åºãã®ãªãŒããŒããããåé¿ããããšã§ããè€æ°ã®ãã«ãã¿ã°ã«äŸåããå®è£ ã«æ¯ããããŠããŸãã ä»ã¯æãæ¯ã£ãŠããã ãã§ãããæè¿ã®https://groups.google.com/d/topic/golang-nuts/wb5I2tjrwoc/discussionã§ãšã€ãªã¢ã¹ã圹ã«ç«ã£ããšæã
@nigeltao re godocãç§ã¯æãïŒ
é¢ä¿ãªããåžžã«ãªãªãžãã«ã«ãªã³ã¯ããå¿ èŠããããŸãã
ãšã€ãªã¢ã¹ã«ããã¥ã¡ã³ããããå Žåã¯ãé¢ä¿ãªããããã衚瀺ããå¿ èŠããããŸãã
ãšã€ãªã¢ã¹ã«ããã¥ã¡ã³ãããªãå Žåãgodocã«å ã®ããã¥ã¡ã³ãã衚瀺ãããããªããŸããããšã€ãªã¢ã¹ãååãå€æŽãããšãã¿ã€ãã®ååãééã£ãŠããŸããããã¥ã¡ã³ããçŸåšã®ããã±ãŒãžã«ãªãã¢ã€ãã ãåç §ããå¯èœæ§ããããŸãã段éçãªãªãã¡ã¯ã¿ãªã³ã°ã«äœ¿çšãããŠããå Žåã¯ãXã衚瀺ããŠãããšãã«ããéæšå¥šïŒXã䜿çšããŠãã ããããšããã¡ãã»ãŒãžã衚瀺ãããå¯èœæ§ããããŸãã
ãã ããã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ããã¯åé¡ã§ã¯ãªããããããŸããã ãããã¯ããŸããããªãå¯èœæ§ã®ãããã®ã§ãããããŸããããªããã®ã§ã¯ãããŸããã ãŸããååãå€æŽããããšã€ãªã¢ã¹ã誀ã£ãŠéæšå¥šã®èŠåãã³ããŒãããªã©ããªã³ãã£ã³ã°ã«ãã£ãŠæ€åºãããå¯èœæ§ããããŸãã
次ã®ã¢ã€ãã¢ã以åã«æçš¿ããããã©ããã¯ããããŸããããã»ãšãã©ãããŒã«ããŒã¹ã®ãgofixã/ãgorenameãã®ãããªã¢ãããŒãã«ã€ããŠã¯ã©ãã§ããããã 詳现ã«ïŒ
pkg.Ident => otherpkg.Ident
ïŒ//+rewrite ...
ã¿ã°ã§æå®ã§ããŸããpkg.MyFunc(a) => pkg.MyFunc(context.Contex(), a)
ïŒãæåŸã®ã¹ãããã¯ã³ã³ãã€ã©ãå°ãè€éã«ãããé ãããããããããããŸããããããã¯åºæ¬çã«ã¯åãªãããªããã»ããµã§ããããšã«ããæžãæãã«ãŒã«ã®éã¯å°ãªãä¿ã€å¿ èŠããããŸãã ã ãããä»æ¥ã®ããã®ååãªãã¬ã€ã³ã¹ããŒãã³ã°:)
ãšã€ãªã¢ã¹ã䜿çšããŠé¢æ°åŒã³åºãã®ãªãŒããŒããããåé¿ããããšã¯ãã³ã³ãã€ã©ãéãªãŒãé¢æ°ãã€ã³ã©ã€ã³åã§ããªãããšãåé¿ããããã®ããã¯ã®ããã§ãã å®è£ ã®æ¬ é¥ãèšèªä»æ§ã«åœ±é¿ãäžããã¹ãã§ã¯ãªããšæããŸãã
@josharianããªãã¯ããããå®å šãªææ¡ãšããŠæå³ããŠããŸããã§ããããç§ã«è¿çãããŠãã ããïŒããšãããã§ãã£ãŠããããªãã«è§Šçºããã人ã¯èª°ã§ãå³åº§ã®æ¹å€ãèæ ®ã«å ¥ããããšãã§ããŸãïŒïŒ
å€æã¯å®éã«ã¯åé¡ã§ã¯ãªããããå®éã«ã¯åé¡ã解決ããŸããã x/net/context.Context
ã¯ã context.Context
å²ãåœãŠå¯èœ/å€æå¯èœ/äœã§ãå¯èœã§ãã åé¡ã¯é«æ¬¡ã®åã§ãã ã€ãŸããåŒæ°ãå²ãåœãŠå¯èœã§ãã£ãŠããã¿ã€ãfunc (ctx x/net/context.Context)
ãšfunc (ctx context.Context)
ã¯åãã§ã¯ãããŸããã ãããã£ãŠã1ãåé¡ã解決ããã«ã¯ã type T struct { S }
ã¯ã T
ãšS
ãåãã¿ã€ãã§ããããšãæå³ããå¿
èŠããããŸãã ã€ãŸããçµå±ã®ãšããããšã€ãªã¢ã¹ã«ç°ãªãæ§æã䜿çšããŠããã ãã§ãïŒãã®æ§æã¯ãã§ã«ç°ãªãæå³ãæã£ãŠããã ãã§ãïŒã
å²ãåœãŠå¯èœ/å€æå¯èœãªåã¯å¿
ãããåãã¡ã¢ãªè¡šçŸãæã£ãŠãããšã¯éããªããããé«æ¬¡ã®åã«ãåé¡ããããŸãïŒåãã¡ã¢ãªè¡šçŸãæã£ãŠããå Žåã解éã倧å¹
ã«å€ããå¯èœæ§ããããŸãïŒã ããšãã°ã uint8
ã¯uint64
å€æå¯èœã§ããããã®éãå¯èœã§ãã ããããããã¯ãããšãã°type T ~uint8
å Žåãã³ã³ãã€ã©ã¯func(T)
ãåŒã³åºãæ¹æ³ãç¥ãããšãã§ããªãããšãæå³ããŸãã ã¹ã¿ãã¯ã«1ã2ã4ããŸãã¯8ãã€ããããã·ã¥ããå¿
èŠããããŸããïŒ ãã®åé¡ãåé¿ããæ¹æ³ã¯ãããããããŸããããç§ã«ã¯ããªãè€éã«èãããŸãïŒãããŠãšã€ãªã¢ã¹ãããç解ããã®ãé£ããã§ãïŒã
ããããšãã@ Meroviusã
ã¯ããããã§ã€ã³ã¿ãŒãã§ãŒã¹ã®æºè¶³åºŠãéããŸããã ããã§ããããã§ã¯ããŸããããŸããã
ç§ã¯ãåãã¡ã¢ãªè¡šçŸãæã£ãŠãããããšã念é ã«çœ®ããŠããŸããã ã³ã³ããŒããã«ã®åŸåŸ©ã¯æããã«ããã®æ£ãã解æã§ã¯ãããŸãã-ããããšãã
@uluyolã¯ããããã¯äž»ã«ã³ã³ãã€ã©ãéãªãŒãé¢æ°ãã€ã³ã©ã€ã³åã§ããªãããšã«é¢ãããã®ã§ãããéãªãŒããžã®ã€ã³ã©ã€ã³åãããåŒã³åºããã¹ã¿ãã¯ãã¬ãŒã¹ãruntime.Callersãªã©ã«è¡šç€ºããããã©ããã«é¢ããŠãæ瀺çãªãšã€ãªã¢ã·ã³ã°ã¯ããã»ã©é©ãããšã§ã¯ãªããããããŸããã
ãããã«ãããç§ãèšã£ãããã«ãããã¯ãã€ããŒãªæ¥ç·ã§ãã
@josharianåæ§ã®åé¡ïŒ [2]uintptr
ãšinterface{}
ã¡ã¢ãªè¡šçŸã¯åãã§ãã ãããã£ãŠãã¡ã¢ãªè¡šçŸã®ã¿ã«äŸåããããšã§ãåã®å®å
šæ§ãåé¿ã§ããŸãã uint64
ãšfloat64
ã¯ã©ã¡ããåãã¡ã¢ãªè¡šçŸãæã¡ãååŸã«å€æå¯èœã§ãããã©ã¡ããã©ã¡ããããããªãå Žåã¯ãå°ãªããšãæ¬åœã«å¥åŠãªçµæã«ãªããŸãã
ãã ãããåãåºã«ãªãã¿ã€ããã§ããŸããããããããŸããã ãã®æå³ãããããªãã ããšãã°ããã£ãŒã«ãã§ã¿ã€ãã䜿çšãããŠããå Žåãããã¯ééãã«ã€ãªããå¯èœæ§ããããŸãã type S1 struct { T1 }
ãštype S2 struct { T2 }
ïŒ T1
ãšT2
ãåãåºã«ãªãã¿ã€ãïŒãããå Žåã type L1 ~T1
äž¡æ¹ãšã次ã®ããã«æ©èœããå¯èœæ§ããããŸãã type S struct { L1 }
ã§ããã T1
ãšT2
ãŸã ç°ãªãïŒäŒŒãŠããŸããïŒåºã«ãªãã¿ã€ããããããã type L2 ~S1
ã§ã¯S2
ã¯ãããŸããã S1
䌌ãŠããã L2
ãšããŠã¯äœ¿çšã§ããŸããã
ãããã£ãŠãä»æ§ã®å€ãã®å Žæã§ããåäžã®åãããåãåºã«ãªãåãââã«çœ®ãæãããä¿®æ£ããå¿ èŠããããŸããããã¯æ±ãã«ãããåã®å®å šæ§ã«äºæããªãçµæãããããå¯èœæ§ããããŸãã ããã£ãããã¿ã€ãã¯ããšã€ãªã¢ã¹ã«å¯Ÿããäž»ãªè°è«ã§ãããšæããããšã€ãªã¢ã¹ãIMHOãããããã«å€§ããªä¹±çšãšæ··ä¹±ã®å¯èœæ§ãããããã§ãã
誰ããããã®ããã®ç°¡åãªã«ãŒã«ãæãä»ãããšãã§ãããªãã°ãããããããã¯ãããã®åé¡ãæã£ãŠããŸãããããã¯ééããªã代æ¿ãšããŠèæ ®ãããã¹ãã§ã:)
@josharianã®èãã«ç¶ããŠãããã«åœŒã®çªå·2ã®ããªãšãŒã·ã§ã³ããããŸãã
ã代æ¿å¯èœãªã¿ã€ããã®æå®ãèš±å¯ããŸãã ããã¯ãé¢æ°ã®åŒæ°ãæ»ãå€ãªã©ã§ååä»ãåã®ä»£ããã«äœ¿çšã§ããåã®ãªã¹ãã§ããã³ã³ãã€ã©ãŒã¯ãååä»ãåãŸãã¯ãã®ä»£æ¿ã®åŒæ°ã䜿çšããŠé¢æ°ãåŒã³åºãããšãèš±å¯ããŸãã 代æ¿ã¿ã€ãã¯ãæå®ãããã¿ã€ããšäºææ§ã®ããå®çŸ©ãæã£ãŠããå¿ èŠããããŸãã ããã§äºææ§ããããšã¯ã宣èšã§ä»ã®ä»£æ¿ã¿ã€ããèš±å¯ããåŸã®åäžã®ã¡ã¢ãªè¡šçŸãšåäžã®å®£èšãæå³ããŸãã
å·®ãè¿«ã£ãåé¡ã®1ã€ã¯ããã®é¢ä¿ã®æ¹åæ§ããäŸåé¢ä¿ã°ã©ããå転ãããšã€ãªã¢ã¹ææ¡ãšå察ã§ãããšããããšã§ãã ããã ãã§ã¯ããŸããããªããããããŸããããä»ã®äººããããåé¿ããæ¹æ³ãèãããããããªãã®ã§ãããã§ææ¡ããŸãã 1ã€ã®æ¹æ³ã¯ãã€ã³ããŒãã°ã©ãã§ã¯ãªãã// goã³ã¡ã³ããšããŠä»£æ¿ã宣èšããããšã§ãã ãã®ããã«ããŠããããã¯ãããããã¯ãã®ããã«ãªããŸãã
éã«ããã®æ¹åæ§ã®é転ã«ã¯ããã€ãã®å©ç¹ããããŸãã
ãããã³ã³ããã¹ããªãã¡ã¯ã¿ãªã³ã°ã«é©çšããïŒæšæºã©ã€ãã©ãªã³ã³ããã¹ãããã±ãŒãžã¯ã context.Context
ãgolang.org/x/net/context.Context
ã§çœ®ãæããããšãã§ãããšå®£èšããŸãã ããã¯ãcontext.Contextãåãå
¥ãããã¹ãŠã®äœ¿çšæ³ãã代ããã«golang.org/x/net/context.Context
ãåãå
¥ããå¯èœæ§ãããããšãæå³ããŸãã ãã ããã³ã³ããã¹ããè¿ãã³ã³ããã¹ãããã±ãŒãžå
ã®é¢æ°ã¯ãåžžã«context.Context
è¿ããŸãã
ãã®ææ¡ã¯ãåã蟌ã¿åã®ååãå€æŽãããªããããåã蟌ã¿ã®åé¡ïŒïŒ17746ïŒãåé¿ããŸãã ãã ããåã蟌ã¿åã¯ã代æ¿åã®å€ã䜿çšããŠåæåã§ããŸãã
@ iand @ josharianããªãã¯å ±å€åã®ç¹å®ã®å€çš®ãæ±ããŠããŸãã
@josharian ãææ¡ãããããšãã
type T struct { S }
ã«ã€ããŠã¯ããšã€ãªã¢ã¹ã®æ§æãç°ãªãããã«èŠããŸãããå¿
ãããæ確ãªæ§æã§ãããšã¯éããŸããã
type T ~S
ã«é¢ããŠã¯ããšã€ãªã¢ã¹ãšã®éããããããªããããªãã¡ã¯ã¿ãªã³ã°ã«ã©ã®ããã«åœ¹ç«ã€ãããããŸããã ãªãã¡ã¯ã¿ãªã³ã°ïŒããšãã°ãio.ByteBuffer-> bytes.BufferïŒã§ã¯ã次ã®ããã«èšè¿°ããŸãã
package io
type ByteBuffer ~bytes.Buffer
ããããããªããèšãããã«ããåºæ¬çã«Tã§äœããè¡ãã«ã¯ããããSã«å€æããå¿ èŠããããå Žåãio.ByteBufferã§äœããè¡ããã¹ãŠã®ã³ãŒãã¯ãŸã å£ããŠããŸãã
Re type T S "alias"
ïŒäžèšã®@bcmillsã®éèŠãªãã€ã³ãã¯ãã¿ã€ãã«åçã®ååãè€æ°æã€ããšã¯ãã¹ãã«ã«é¢ä¿ãªãèšèªã®å€æŽã§ãããšããããšã§ãã ãã¹ãŠã®ã³ã³ãã€ã©ã¯ãããšãã°ãio.ByteBufferãšbytes.Bufferãåãã§ããããšãç¥ã£ãŠããå¿
èŠããããŸããããã¯ãã³ãŒããåæããããåãã§ãã¯ãããããããŒã«ãšåãã§ãã ããªãã®ææ¡ã®éèŠãªéšåã¯ããå€åãä»ã®è¿œå ãåãã£ãŠèšç»ããå¿
èŠãããããšãããããªãã®ã®ããã«æããŸãã ãã¶ããããããæååããããã説æããããã®æè¯ã®æ¹æ³ã§ãããã©ããã¯äžæã§ãããæ確ãªå¿
èŠæ§ãªãã«æ§æïŒJavaã®äžè¬åããã泚éãªã©ïŒãèšèšãããããšãäžæã§ãã äžè¬çãªåœ¢åŒãæã£ãŠãããšããŠããå°å
¥ããæ°ããã»ãã³ãã£ã¯ã¹ã®ãã¹ãŠã®åœ±é¿ãæ
éã«æ€èšããå¿
èŠããããã»ãšãã©ã®å Žåããã¹ãŠã®ããŒã«ãæŽæ°ããå¿
èŠãããèšèªã®å€æŽã«ãªããŸãïŒç¢ºãã«ãgofmtãé€ãïŒã çµå±ã®ãšãããããçš®ã®ã¡ã¿èšèªãäœæããã®ã§ã¯ãªããå¿
èŠãªãã©ãŒã ã1ã€ãã€äœæããããã®æãæ確ãªæ¹æ³ãèŠã€ãç¶ããæ¹ãç°¡åãªããã§ãã
@Merovius FWIWã[2] uintptrãšinterface {}ã¯åãã¡ã¢ãªè¡šçŸãæã£ãŠããªããšæããŸãã ã€ã³ã¿ãŒãã§ã€ã¹{}ã¯[2] unsafe.Pointerã§ããã[2] uintptrã§ã¯ãããŸããã uintptrãšãã€ã³ã¿ãŒã¯ç°ãªãè¡šçŸã§ãã ããããããªãã®äžè¬çãªãã€ã³ãã¯æ£ãããšæããŸããç§ãã¡ã¯å¿ ããããã®ãããªãã®ã®çŽæ¥å€æãèš±å¯ããããªããšããããšã§ãã ã€ãŸããinterface {}ãã[2] * byteã«ãå€æã§ããŸããïŒ ããã§å¿ èŠãšããã以äžã®ãã®ã§ãã
@jimmyfrascheãš@ nigeltao ãre godocïŒç§ãã¡ããããæ©æã«æ©èœãããå¿ èŠãããããšã«åæããŸãã ãæ°æ©èœã¯ããããäœã§ãããã³ãŒãããŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°ã«ã®ã¿äœ¿çšãããããšããä»®å®ãããŒãã³ãŒãã£ã³ã°ããŠã¯ãªããªãããšã«åæããŸãã ãšã€ãªã¢ã¹ã䜿çšããŠæç»æ¡åŒµããã±ãŒãžãäœæããã®ã«åœ¹ç«ã€Nigelã®ããã«ãä»ã®éèŠãªçšéãããå ŽåããããŸãã ãžããŒãèšã£ãããã«ãéæšå¥šã®ãã®ã¯ããã¥ã¡ã³ãã³ã¡ã³ãã§æ瀺çã«éæšå¥šãšããŠããŒã¯ãããããšãæåŸ ããŠããŸãã ããã¥ã¡ã³ãã³ã¡ã³ãããªãå Žåã¯èªåçã«çæããããšãèããŸããããæ§æïŒäžè¬çã«èšãã°ïŒãããŸã æ確ã«ãªã£ãŠã¯ãªããªãããšãèšãã®ã¯æããã§ã¯ãããŸããã å ·äœçãªäŸã瀺ãããã«ãå€ãGo1.8ãšã€ãªã¢ã¹ã«ã€ããŠèããŠã¿ãŸãã äžãããã
type ByteBuffer => bytes.Buffer
ãByteBufferã¯bytes.Bufferã®ãšã€ãªã¢ã¹ã§ãããšããããã¥ã¡ã³ãã³ã¡ã³ããåæããããšãã§ããŸãããããã¯å®çŸ©ã衚瀺ããã®ã«åé·ãªããã§ãã ä»æ¥èª°ãããtypeXstruct {}ããšæžãããšããŠãããXã¯struct {}ã®ååä»ãåããåæããŸããã
@iand ãããããšãã ããªãã®ææ¡ã§ã¯ãæ°ããããã±ãŒãžã®äœæè ãå€ãããã±ãŒãžããæ£ç¢ºãªå®çŸ©ãèšè¿°ãã次ã«ïŒæ§æãæ§æããïŒã®ããã«2ã€ããªã³ã¯ãã宣èšãèšè¿°ããå¿ èŠãããããã§ãã
package old
type T { x int }
package new
import "old"
type T1 { x int }
substitutable T1 <- old.T
èŒžå ¥ã®åãæ¶ãã«ã¯åé¡ããããããèªäœãç®éãã«ãªãå¯èœæ§ãããããšã«åæããŸãããããã¯ã¹ãããããŸãããã ãã®æç¹ã§ãã³ãŒãããŒã¹ã¯å£ããããç¶æ ã«ããããã«èŠããŸããããã±ãŒãžoldã«æ§é äœãã£ãŒã«ããè¿œå ããããã«å€æŽããããšã§ãããã±ãŒãžnewãå£ãããšãã§ããããã«ãªããŸããã 眮æå¯èœãªè¡ãèãããšãT1ã®å¯èœãªå®çŸ©ã¯1ã€ã ãã§ããold.TãšãŸã£ããåãã§ãã 2ã€ã®ã¿ã€ãããŸã ç°ãªãå®çŸ©ãæã£ãŠããå Žåã¯ãã¡ãœããã«ã€ããŠãå¿é ããå¿ èŠããããŸããã¡ãœããã®å®è£ ãäžèŽããå¿ èŠããããŸããïŒ ããã§ãªãå Žåã¯ãã€ã³ã¿ãŒãã§ã€ã¹{}ã«Tãé 眮ããã¿ã€ãã¢ãµãŒã·ã§ã³ãT1ãšããŠäœ¿çšããŠãããåŒãåºããMïŒïŒãåŒã³åºããšã©ããªããŸããïŒ T1.Mã¯ããããŸããïŒ T1ã«çŽæ¥ååãä»ããã«ãã€ã³ã¿ãŒãã§ã€ã¹{MïŒïŒ}ãšããŠåŒãåºããMïŒïŒãåŒã³åºããšã©ããªããŸããïŒ ããªãã¯TMãæã«å ¥ããŸããïŒ ãœãŒã¹ããªãŒã«äž¡æ¹ã®å®çŸ©ãããããšã®ãããŸããã«ãã£ãŠåŒãèµ·ããããå€ãã®è€éãããããŸãã
ãã¡ããã眮æå¯èœãªè¡ã¯æ®ããåé·ã«ããã¿ã€ãT1ãŸãã¯ã¡ãœããã®å®çŸ©ãå¿
èŠãšããªããšèšãããšãã§ããŸãã ããããããã¯åºæ¬çã«ïŒå€ããšã€ãªã¢ã¹æ§æã§ïŒ type T1 => old.T
ãæžãããšãšåãã§ãã
ã€ã³ããŒãã°ã©ãã®åé¡ã«æ»ããšãèšäºã®äŸã§ã¯ãã¹ãŠå€ãã³ãŒããæ°ããã³ãŒãã§å®çŸ©ãããŠããŸãããããã±ãŒãžã°ã©ãã§ãæ°ãããã®ãå€ããã®ãã€ã³ããŒãããå¿ èŠãããå Žåã¯ããªãã€ã¬ã¯ããã«é 眮ããããšãåæ§ã«å¹æçã§ãã移è¡äžã®æ°ããããã±ãŒãžã
ããã¯ããã®ãããªç§»è¡ã§ã¯ãæ°ããããã±ãŒãžã®äœæè ãšå€ãããã±ãŒãžã®äœæè ã®éã«æçšãªåºå¥ããããããªãããšã瀺ããŠãããšæããŸãã æçµçã«ã¯ãã³ãŒããæ°ãããã®ã«è¿œå ãããå€ããã®ããåé€ãããããšãç®æšã§ãããã®ãããäž¡æ¹ã®äœæè ïŒç°ãªãå ŽåïŒãé¢äžããå¿ èŠããããŸãã ãããŠããã®2ã€ã¯ãæ瀺çïŒããçš®ã®ãªãã€ã¬ã¯ãïŒãŸãã¯æé»çïŒä»£æ¿å¯èœæ§ã®èŠä»¶ã®ããã«ãåå®çŸ©ãæ£ç¢ºã«äžèŽããå¿ èŠãããïŒã§ãããã©ããã«ããããããéäžã§ãããçš®ã®èª¿æŽãããäºææ§ãå¿ èŠãšããŸãã
@rscã®ç Žæã·ããªãªã¯ãã¿ã€ããšã€ãªã¢ã·ã³ã°ã¯åæ¹åã§ããå¿ èŠãããããšã瀺åããŠããŸãã 以åã®ãšã€ãªã¢ã¹ææ¡ã®äžã§ããæ°ããããã±ãŒãžãå€æŽãããšããã®ã¿ã€ãããšã€ãªã¢ã¹ããããã±ãŒãžãããã€ã§ãç Žæããå¯èœæ§ããããŸãã
@iandå®çŸ©ã1ã€ãããªãå ŽåïŒä»ã®å®çŸ©ããåãããšèšã£ãŠããããïŒãããããåæããŠããªãããšãå¿é ããå¿ èŠã¯ãããŸããã
ïŒ13467ã§ã @ joegrasseã¯ããã®ææ¡ããè€æ°ã®ããã±ãŒãžã§cgoã䜿çšãããšãã«ãåäžã®Cã¿ã€ããåäžã®Goã¿ã€ãã«ãªãããšãèš±å¯ããã¡ã«ããºã ãæäŸãããšãããšææããŠããŸãã ããã¯ããã®åé¡ã®åé¡ãšãŸã£ããåãåé¡ã§ã¯ãããŸããããã©ã¡ãã®åé¡ãã¿ã€ããšã€ãªã¢ã·ã³ã°ã«é¢é£ããŠããŸãã
ãšã€ãªã¢ã¹ã«é¢ããææ¡/æ¿èª/æåŠãããå¶é/å¶éã®æŠèŠã¯ãããŸããïŒ é ã«æµ®ãã¶ããã€ãã®è³ªåã¯æ¬¡ã®ãšããã§ãã
@rscäŒè©±ãããŸãæµçšããããªãã®ã§ããããšã€ãªã¢ã¹ã®ææ¡ã§ã¯ããnewãããoldãã«äŸåããŠãããã£ãŒã«ããåé€ãããšããoldãã®ã¯ã©ã€ã¢ã³ãã¯ã³ã³ãã€ã«ã§ããªããªããŸãã
ãã ãã代æ¿æ¡ã§ã¯ãæ°æ§äž¡æ¹ã䜵çšããã¯ã©ã€ã¢ã³ãã®ã¿ãç Žæããå¯èœæ§ããããšæããŸãã ãã®ããã«ã¯ãã³ã³ãã€ã©ããæ°ãããããã±ãŒãžã§ãå€ããã¿ã€ãã®äœ¿çšãæ€åºããå Žåã«ã®ã¿ã眮æãã£ã¬ã¯ãã£ããæ€èšŒããå¿ èŠããããŸãã
@thwdãŸã è¯ãèšäºã¯ãªããšæããŸãã ç§ã®ããŒãïŒ
x/image/draw.Image
ãšã€ãªã¢ã¹draw.Image
ãæ³åããŠãã ããããã®åŸã誰ããdraw.Image
ããšã€ãªã¢ã¹çµç±ã§image.Draw
ã«ç§»åããããšã決å®ããå®å
šã ãšæ³å®ããŸããçªç¶x/image/draw
ãšã€ãªã¢ã¹ãããšã€ãªã¢ã¹ãžã®ãšã€ãªã¢ã¹ã¯èš±å¯ãããŠããªãããã @ iand ãreãå€ããã®ãšæ°ãããã®ã®äž¡æ¹ãäžç·ã«äœ¿çšããã¯ã©ã€ã¢ã³ãã ããå£ããŸããããããå¯äžã®èå³æ·±ãã±ãŒã¹ã§ãã ããã段éçãªã³ãŒã修埩ã«ããã®ã¯æ··åã¯ã©ã€ã¢ã³ãã§ãã æ°ããã³ãŒãã®ã¿ããŸãã¯å€ãã³ãŒãã®ã¿ã䜿çšããã¯ã©ã€ã¢ã³ãã¯ãä»æ¥ã¯æ©èœããŸãã
ä»ã«èæ ®ãã¹ãããšããããŸãããä»ã®å Žæã§ã¯ãŸã èšåãããŠããŸããã
ããã§ã®æ確ãªç®æšã¯ã倧èŠæš¡ãªåæ£åã³ãŒãããŒã¹ã§å€§èŠæš¡ã§æ®µéçãªãªãã¡ã¯ã¿ãªã³ã°ãå¯èœã«ããããšã§ãããããã©ã€ãã©ãªã®ææè ããã³ãŒããå€æŽããããã«äžæãªæ°ã®ã¯ã©ã€ã¢ã³ããå¿ èŠãšããããçš®ã®ã¯ãªãŒã³ã¢ãããå®è¡ãããå ŽåããããŸãïŒæçµçã«å€ãAPIãå»æ¢ãããã¹ãããïŒã ãããè¡ãäžè¬çãªæ¹æ³ã¯ãéæšå¥šã®èŠåãè¿œå ããããšã§ãããGoã³ã³ãã€ã©ã«ã¯èŠåããããŸããã
ã³ã³ãã€ã©ã®èŠåããªãå Žåãã©ã€ãã©ãªã®ææè ã¯ããªãã¡ã¯ã¿ãªã³ã°ãå®å šã«å®äºã§ãããšã©ã®ããã«ç¢ºä¿¡ã§ããŸããïŒ
1ã€ã®çãã¯ãããçš®ã®ããŒãžã§ã³ç®¡çã¹ããŒã ã§ããå¯èœæ§ããããŸããããã¯ãäºææ§ã®ãªãæ°ããAPIãåããã©ã€ãã©ãªã®æ°ãããªãªãŒã¹ã§ãã ãã®å ŽåãããããããŒãžã§ã³ç®¡çãçãã§ãããã¿ã€ããšã€ãªã¢ã¹ã§ã¯ãããŸããã
ãããã¯ãã©ã€ãã©ãªã®äœæè ããå®éã«ã¯ã©ã€ã¢ã³ãã®ã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããéæšå¥šã®èŠåããè¿œå ã§ããããã«ããã®ã¯ã©ãã§ããããããã ããã¯ã©ã€ã¢ã³ããå®è¡ããå¿ èŠã®ãããªãã¡ã¯ã¿ãªã³ã°ã®æ瀺çãªã¢ã«ãŽãªãºã ã䜿çšããŸãã ç§ã¯æ¬¡ã®ãããªãã®ãæ³åããŠããŸãïŒ
Error: os.time is obsolete, use time.time instead. Run "go upgrade" to fix this.
åãšã€ãªã¢ã¹ã®å Žåããªãã¡ã¯ã¿ãªã³ã°ã¢ã«ãŽãªãºã ã¯ãOldTypeã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãNewTypeã«çœ®ãæãããã ãã ãšæããŸããã埮åŠãªç¹ããããããããŸãããããããããŸããã
ãšã«ãããããã«ãããã©ã€ãã©ãªã®äœæè ã¯ãå€ãAPIãå®å šã«åé€ããåã«ãã³ãŒããå£ããããšããŠããããšããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«èŠåããç°¡åã«ä¿®æ£ã§ããããã«æåãå°œããããšãã§ããŸãã
@iainmerrickãããã«ã¯
@rscã®èšäºã§æŠèª¬ãããŠããããã«ã段éçãªã³ãŒã修埩ã®åé¡ã解決ãããšã2ã€ã®ã¿ã€ãã亀æå¯èœã«ããæ¹æ³ãå¿ èŠã«ãªããŸãïŒvarãfuncsãããã³constsã«ã¯åé¿çãååšããããïŒã
ããã«ã¯ãããŒã«ãŸãã¯èšèªã®å€æŽãå¿ èŠã§ãã
2ã€ã®åã亀æå¯èœã«ããããšã¯ãå®çŸ©äžãèšèªã®åäœãå€æŽããããšã§ãããããã©ã®ããŒã«ããããããå€ãåã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãæ°ããåã«æžãæããããšã«ãã£ãŠãã³ã³ãã€ã©ãŒã®å€éšã§åçæ§ãã·ãã¥ã¬ãŒãããã¡ã«ããºã ã«ãªããŸãã ãã ããããã¯ãstdlibã³ã³ããã¹ãããã±ãŒãžã®ä»£ããã«golang.org/x/net/contextã䜿çšãããã³ããŒããã±ãŒãžã®ããã«ããã®ãããªããŒã«ãææããŠããªãã³ãŒããæžãçŽãå¿ èŠãããããšãæå³ããŸãã å€æŽã®ä»æ§ã¯ãå¥ã®ãããã§ã¹ããã¡ã€ã«ãŸãã¯æ©æ¢°å¯èªã³ã¡ã³ãã®ããããã«ããå¿ èŠããããŸãã ããŒã«ãå®è¡ããªããšããã«ããšã©ãŒãçºçããŸãã ããã¯ãã¹ãŠå¯ŸåŠããã®ãé¢åã«ãªããŸãã ããŒã«ã¯ããã解決ããã®ãšåããããå€ãã®åé¡ãåŒãèµ·ããããã§ãã äžéšãèªååãããŠããã®ã§å€å°ã¯è¯ãã§ããããããã®ããã±ãŒãžã䜿çšãããã¹ãŠã®äººã察åŠããªããã°ãªããªãåé¡ã¯äŸç¶ãšããŠãããŸãã
èšèªãå€æŽãããå Žåãã³ãŒãã¯ãã®ã¡ã³ããã«ãã£ãŠå€æŽãããã ãã§ãããã»ãšãã©ã®äººã«ãšã£ãŠãç©äºã¯ããŸãæ©èœããŸãã ã¡ã³ãããæ¯æŽããããŒã«ã¯ãŸã ãªãã·ã§ã³ã§ããããœãŒã¹ãä»æ§ã§ãããããã±ãŒãžã®ã¡ã³ããã ãããããåŒã³åºãå¿ èŠããããããã¯ããã«ç°¡åã§ãã
@griesemerãææããããã«ïŒã©ãã«ããã®ãæãåºããŸããããããã«ã€ããŠã¯éåžžã«å€ãã®ã¹ã¬ããããããŸãïŒGoã«ã¯ã byte
â uint8
ãããªãã®ã®ããã«ããããŠããã±ãŒãžãã€ã³ããŒããããšãã«ããã§ã«ãšã€ãªã¢ã·ã³ã°ããããŸãåããœãŒã¹ãã¡ã€ã«ã«ãç°ãªãããŒã«ã«åã§2åã
èšèªã§åãæ瀺çã«ãšã€ãªã¢ã¹ããæ¹æ³ãè¿œå ããããšã§ãæ¢åã®ã»ãã³ãã£ã¯ã¹ã䜿çšã§ããããã«ãªããŸãã ããããããšã§ãå®éã®åé¡ã管çå¯èœãªæ¹æ³ã§è§£æ±ºããŸãã
èšèªã®å€æŽã¯ãŸã 倧ããªåé¡ã§ãããå€ãã®ããšã解決ããå¿ èŠããããŸãããæçµçã«ã¯ããã§è¡ãã®ãæ£ããããšã ãšæããŸãã
ç§ã®ç¥ãéãããéšå±ã®äžã®è±¡ãã®1ã€ã¯ãã¿ã€ããšã€ãªã¢ã¹ã®å Žåãããããå°å ¥ãããšãéäžæçãªïŒã€ãŸãããéãªãã¡ã¯ã¿ãªã³ã°ãïŒäœ¿çšãå¯èœã«ãªããšããäºå®ã§ãã ééæã«èšåããããã®ãèŠãŠããŸããïŒããšãã°ããAPIãç°¡çŽ åããããã«ç°ãªãããã±ãŒãžã§åèå¥åãåãšã¯ã¹ããŒããããïŒã 以åã®ææ¡ã®è¯ãäŒçµ±ã«é ããã«ã€ããŠããããã«ã ã圱é¿ããµãã»ã¯ã·ã§ã³ã®äžã«ã¿ã€ããšã€ãªã¢ã¹ã®ãã¹ãŠã®æ¢ç¥ã®ä»£æ¿äœ¿çšæ³ã
è¿œå ã®è³ªåïŒåãšã€ãªã¢ã¹ãæ°ããããã±ãŒãžã®åã«ã¡ãœãããè¿œå ã§ãããã©ããïŒããããã«ãã»ã«åãç Žãããšãã§ãããã©ããïŒãæ確ã«ããŠãã ããã ãŸããæ°ããããã±ãŒãžã¯å€ãæ§é äœã®ãã©ã€ããŒããã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸããïŒ
è¿œå ã®è³ªåïŒåãšã€ãªã¢ã¹ãæ°ããããã±ãŒãžã®åã«ã¡ãœãããè¿œå ã§ãããã©ããïŒããããã«ãã»ã«åãç Žãããšãã§ãããã©ããïŒãæ確ã«ããŠãã ããã ãŸããæ°ããããã±ãŒãžã¯å€ãæ§é äœã®ãã©ã€ããŒããã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸããïŒ
ãšã€ãªã¢ã¹ã¯ãã¿ã€ãã®åãªãå¥åã§ãã ã¿ã€ãã®ããã±ãŒãžã¯å€æŽãããŸããã ãããã£ãŠãäž¡æ¹ã®è³ªåã«ã¯åœãŠã¯ãŸããŸããïŒæ°ããããã±ãŒãž==å€ãããã±ãŒãžã§ãªãéãïŒã
@akavelçŸæç¹ã§ã¯ãææ¡ã¯ãŸã£ãããããŸããã ããããGo1.8ãšã€ãªã¢ã¹ãã©ã€ã¢ã«äžã«æµ®ãã³äžãã£ã2ã€ã®èå³æ·±ãå¯èœæ§ãç¥ã£ãŠããŸãã
ãšã€ãªã¢ã¹ïŒãŸãã¯åã«ãšã€ãªã¢ã¹ãå ¥åïŒã䜿çšãããšãä»ã®ããã±ãŒãžãæ¡åŒµããããããã€ã³çœ®æãäœæã§ããŸãã ããšãã°ã httpsïŒ//go-review.googlesource.com/#/c/32145/ ãç¹ã«ã³ãããã¡ãã»ãŒãžã®èª¬æãåç §ããŠ
ãšã€ãªã¢ã¹ïŒãŸãã¯åã«ã¿ã€ããšã€ãªã¢ã¹ïŒã䜿çšãããšãAPIãµãŒãã§ã¹ã¯å°ããããå éšæ§é ãæ¹åããããã®ããã±ãŒãžã®ã³ã¬ã¯ã·ã§ã³ãšããŠã®å®è£ ã¯å€§ãããªããŸãããã¯ã©ã€ã¢ã³ããã€ã³ããŒãããŠäœ¿çšããããã±ãŒãžã¯1ã€ã ãã§ãã https://github.com/golang/go/issues/16339#issuecomment-232813695ã«èª¬æãããŠããããæœè±¡çãªäŸããã
ãšã€ãªã¢ã¹ã®æ ¹æ¬çãªç®æšã¯çŽ æŽãããã§ãããããã§ãæ©èœã®æ倧ã®åæ©ã§ããã«ãããããããã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã®ç®æšã«æ£çŽã§ã¯ãªãããã§ãã ããã€ãã®ææ¡ã¯ååãåºå®ããããšãææ¡ããŠããŸãããããŠç§ã¯ãŸã ã¿ã€ãããã®ãããªãªãã¡ã¯ã¿ãªã³ã°ã§ãããã®è¡šé¢ãå€ããããšããŸã èšåããŠããŸããã ãšã€ãªã¢ã¹ã®åšãã§ããèšåãããos.Error => error
ã®äŸã§ããã os.Error
ã¯Error
ã§ã¯ãªãString
ã¡ãœããããããšããäºå®ãç¡èŠããŠããŸãã ã¿ã€ãã移åããŠååãå€æŽããã ãã§ã¯ããšã©ãŒåŠçã³ãŒãã¯ãã¹ãŠå£ããŠããŸããŸãã ããã¯ãªãã¡ã¯ã¿ãªã³ã°äžã®äžè¬çãªå Žæã§ããå€ãã¡ãœããã¯ååãå€æŽããã移åãããåé€ãããŸããæ°ããã³ãŒããšã®éäºææ§ãç¶æããããããæ°ããã¿ã€ãã«ã¯ããããããŸããã
æäŒãããã«ãããã«ã·ãŒãã®ã¢ã€ãã¢ããããŸãããšã€ãªã¢ã¹ã§ã¯ãªãã¢ããã¿ãŒã®èŠ³ç¹ããåé¡ã調ã¹ãå Žåã¯ã©ããªãã§ããããã ã¢ããã¿ãŒã¯ãæ¢åã®ã¿ã€ãã«ä»£æ¿å_ããã³ã€ã³ã¿ãŒãã§ãŒã¹_ãä»ããå
ã®ã¿ã€ãã以åã«èŠãããå Žæã§è£
食ãªãã§äœ¿çšã§ããŸãã ã¢ããã¿ãŒã¯ãåºç€ãšãªãé©å¿åã®åãã€ã³ã¿ãŒãã§ãŒã¹ãååšãããšæ³å®ããã®ã§ã¯ãªãããµããŒãããã¡ãœãããæ瀺çã«å®çŸ©ããå¿
èŠããããŸãã ããã¯ãæ¢åã®type foo bar
åäœã«ãã䌌ãŠããŸãããããã€ãã®è¿œå ã®ã»ãã³ãã£ã¯ã¹ããããŸãã
ããšãã°ãäžæçãªãadaptsãããŒã¯ãŒããåœé¢äœ¿çšããŠã io.ByteBuffer
ã±ãŒã¹ã«å¯ŸåŠããã¹ã±ã«ãã³ã®äŸã次ã«ç€ºããŸãã
type ByteBuffer adapts bytes.Buffer
func (old *ByteBuffer) Write(b []byte) (n int, err error) {
buf := (*bytes.Buffer)(old)
return buf.Write(b)
}
(... etc ...)
ãããã£ãŠããã®ã¢ããã¿ãŒãé 眮ãããšããã®ã³ãŒãã¯ãã¹ãŠæå¹ã«ãªããŸãã
func newfunc(b *bytes.Buffer) { ... }
func oldfunc(b *io.ByteBuffer) { ... }
func main() {
var newvar bytes.Buffer
var oldvar io.BytesBuffer
// New code using the new type obviously just works.
newfunc(&newvar)
// New code using the old type receive the underlying value that was adapted.
newfunc(&oldvar)
// Old code using the old type receive the adapted value unchanged.
oldfunc(&oldvar)
// Old code gets new variable adapted on the way in.
oldfunc(&newvar)
}
newfunc
ãšoldfunc
ã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯äºææ§ããããŸãã ã©ã¡ããå®éã«ã¯*bytes.Buffer
åãå
¥ãã oldfunc
ã¯éäžã§*io.BytesBuffer
ã«é©å¿ããŸããåãæŠå¿µãå²ãåœãŠãçµæãªã©ã«æ©èœããŸãã
ã³ã³ãã€ã©ã®å®è£
ã¯å°ãããªãããŒã§ãããããããåãããžãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã§ãæ©èœããããã«äœãããŠããŸãã ããã¯os.Error => error
äŸã§ãã¡ãœããã®ååãå€æŽããããšããäºå®ãåŠçããŸãã
package os
type Error adapts error
func (e Error) String() string { return error(e).Error() }
ãã ãã次ã®ãããªæ¹æ³ãããããããã®ã±ãŒã¹ã«ã€ããŠã¯ããã«æ€èšããå¿ èŠããããŸãã
func (v *T) Read(b []byte) (int, os.Error) { ... }`
String
ã¡ãœãããæã€åãè¿ãã®ã§ãã³ãŒããåŸã
ã«ä¿®æ£ã§ããããã«ãéåžžã¯å察æ¹åã«é©å¿ãããããšæããŸãã
_æŽæ°ïŒããã«èããå¿ èŠããããŸãã_
æ©èœã1.8ãããã©ãã°ããåã蟌ã¿ãã°ã«é¢ããŠã¯ãã¢ããã¿ãŒã䜿çšãããšãåããã®ã®åãªãæ°ããååã§ã¯ãªããããçµæãå°ãæ確ã«ãªããŸããã¢ããã¿ãŒãåã蟌ãŸããŠããå Žåã䜿çšããããã£ãŒã«ãåã¯ã¢ããã¿ãŒã¯å€ãããžãã¯ãæ©èœãç¶ããããããã£ãŒã«ãã«ã¢ã¯ã»ã¹ãããšãåºã«ãªãã¿ã€ãããšãã³ã³ããã¹ãã«æ瀺çã«æž¡ãããªãéããã¢ããã¿ãŒã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããŸãã é©å¿ãããŠããªãã¿ã€ããåã蟌ãŸããŠããå Žåãéåžžã¯çºçããŸãã
æçš¿ã«èšèŒãããŠããåé¡ã¯ãäžèšã®åé¡ã®ããªãšãŒã·ã§ã³ã®ããã§ãããææ¡ã«ãã£ãŠè§£æ±ºãããŠããŸãã
ã¡ãœãããçŽæ¥é¢é£ä»ããããšãã§ããªãããããã®ã·ããªãªã§å€æ°ãå®æ°ãé©å¿ãããããšã¯ããŸãæå³ããããŸããã é©å¿ããããã©ããã¯åœŒãã®ã¿ã€ãã§ãã
ã¢ããã¢ããã¿ã§ãããšããäºå®ãæ確ã«ããé©å¿ãããã¢ãããã®ç¬ç«ããã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŠãããããéåžžã©ãããã®ããã¥ã¡ã³ãã衚瀺ããŸãã
çŽ æµãªãã®ãéžãã§ãã ããã ;ïŒ
@iainmerrick @zombiezen
ãŸãããšã€ãªã¢ã¹ã¿ã€ããã¬ã¬ã·ãŒã§ãããæ°ããã¿ã€ãã«çœ®ãæããå¿ èŠãããããšãèªåçã«æšæž¬ããå¿ èŠããããŸããïŒ golintãgodocãããã³åæ§ã®ããŒã«ãé©çšããŠå€ãåãéæšå¥šãšããŠèŠèŠåãããšãåãšã€ãªã¢ã·ã³ã°ã®ä¹±çšãå€§å¹ ã«å¶éãããŸãã ãããŠããšã€ãªã¢ã·ã³ã°æ©èœãæªçšããããšããæåŸã®æžå¿µã¯è§£æ±ºãããã§ãããã
2ã€ã®èŠ³å¯ïŒ
1.ã¿ã€ãåç §ã®ã»ãã³ãã£ã¯ã¹ã¯ããµããŒããããŠãããªãã¡ã¯ã¿ãªã³ã°ã®ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠç°ãªããŸã
Gustavoã®ææ¡ã¯ãååç §ãšãã®çµæã®ã»ãã³ãã£ã¯ã¹ã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠããã«äœæ¥ããå¿ èŠãããããšã瀺ããŠããŸãã
ãã¹ã®æ°ããææ¡ã«ã¯ãæ°ããæ§ætype OldAPI = newpkg.newAPI
å«ãŸããŠããŸãã ããããã»ãã³ãã£ã¯ã¹ã¯äœã§ããïŒ OldAPIãåŸæ¥ã®ãããªãã¯ã¡ãœãããŸãã¯ãã£ãŒã«ãã§æ¡åŒµããããšã¯äžå¯èœã§ããïŒ äºææ§ãç¶æããããã«ãnewAPIãOldAPIã®ãã¹ãŠã®ãããªãã¯ã¡ãœãããšãã£ãŒã«ãããµããŒãããå¿
èŠãããçããšããŠyesãæ³å®ããŸãã ãã©ã€ããŒããã£ãŒã«ããšã¡ãœããã«äŸåããOldAPIãå«ãããã±ãŒãžå
ã®ã³ãŒãã¯ãããã±ãŒãžã®å¯èŠæ§å¶çŽã®å€æŽãããŒãã«ããå€ããŠããããšãåæãšããŠããããªãã¯newAPIã®ã¿ã䜿çšããããã«æžãçŽãå¿
èŠãããããšã«æ³šæããŠãã ããã
代æ¿ãã¹ã¯ãOldAPIã«å¯ŸããŠè¿œå ã®ã¡ãœãããå®çŸ©ã§ããããã«ããããšã§ãã ããã«ããããã¹ãŠã®ãããªãã¯ãªå€ãã¡ãœãããæäŸããããã®NewAPIã®è² æ ã軜æžãããå¯èœæ§ããããŸãã ããããããã¯OldAPIãNewAPIãšã¯ç°ãªãã¿ã€ãã«ããŸãã 2ã€ã®ã¿ã€ãã®å€ã®éã§äœããã®åœ¢ã®å²ãåœãŠå¯èœæ§ãç¶æããå¿ èŠããããŸãããã«ãŒã«ã¯è€éã«ãªããŸãã ãã£ãŒã«ãã®è¿œå ãèš±å¯ãããšãããè€éã«ãªããŸãã
2.NewAPIãå«ãããã±ãŒãžã¯OldAPIãå«ãããã±ãŒãžãã€ã³ããŒãã§ããŸãã
OldAPIãåå®çŸ©ããã«ã¯ãOldAPIã®å®çŸ©ãå«ãããã±ãŒãžOãããã±ãŒãžNãNewAPIãšãšãã«ã€ã³ããŒãããå¿ èŠããããŸãã ããã¯ãããã±ãŒãžNãOãã€ã³ããŒãã§ããªãããšãæå³ããŸããèšåãããŠããªãããšã¯æããã§ããããªãã¡ã¯ã¿ãªã³ã°ã®ãŠãŒã¹ã±ãŒã¹ã«ãšã£ãŠéèŠãªå¶çŽã®ããã«æãããŸãã
æŽæ°ïŒããã±ãŒãžNã¯ããã±ãŒãžOã«äŸåã§ããŸãããããšãã°ãOãã€ã³ããŒãããããã±ãŒãžãã€ã³ããŒãããããšã¯ã§ããŸããã
@niemeyerã¡ãœããã®ååå€æŽãªã©ã®å€æŽã¯ããã§ã«åŸã ã«å¯èœã§ãå éšã§å€ãã¡ãœãããåŒã³åºãïŒãŸãã¯ãã®éïŒãbïŒãã¹ãŠã®ãŠãŒã¶ãŒãæ°ããã¡ãœããã«åŸã ã«å€æŽãããcïŒå€ãã¡ãœãããåé€ããã ãããã¿ã€ããšã€ãªã¢ã¹ãšçµã¿åãããããšãã§ããŸãã ãããå移åã«çŠç¹ãåœãŠãŠããçç±ã¯ããããç¹å®ãããå¯äžã®ãã®ã§ããããŸã å¯èœã§ã¯ãªãããã§ãã ããã€ãã®ã¹ãããã䜿çšããå Žåã§ããä»ã®ãã¹ãŠã®èå¥ãããå€æŽãå¯èœã§ãïŒããšãã°ãã¡ãœããã®ååãå€æŽããã«ã¡ãœããã®åŒæ°ã®ã»ãããå€æŽããïŒã è¡šé¢ç©ãå°ãªãïŒç解ããããšãå°ãªãïŒä¿®æ£ãéžæããããšãæãŸãããšæããŸãã
@rakyllå人çã«ã¯ããšã€ãªã¢ã¹ããªãã¡ã¯ã¿ãªã³ã°ä»¥å€ã®äœãïŒåªãããŠãŒã¹ã±ãŒã¹ã§ããã©ãããŒããã±ãŒãžãªã©ïŒã«åœ¹ç«ã€ãšèããå Žåã¯ããããã䜿çšããã ãã§ãéæšå¥šã®èŠåã¯ç¡èŠãããŸãã 人工çã«ããããäžèªç±ã«ãããŠãŒã¶ãŒãæ··ä¹±ããã人ã«ã¯è ¹ãç«ãŠãŸãããèœèããããšã¯ãããŸããã
ããæç¹ã§ãã©ãããŒããã±ãŒãžãprotobufãããªãã¯ã€ã³ããŒãããŸãã¯å éšããã±ãŒãžAPIã®å ¬éãå®éã«æ€èšãããã©ãããè°è«ããå¿ èŠããããšæããŸãïŒãããŠãäžæ¹ãç¹°ãè¿ãããšãªãããã®äž»èŠ³çãªãã®ãæãããè°è«ããæ¹æ³ãããããŸããäœåºŠãäœåºŠãèªããªããä»ã®äººã¯ãããã§ã¯ãªãããšèšã£ãŠããŸããããã§ã®å®¢èŠ³çãªè°è«ã¯ããŸããããŸããããç§ã«ã¯ããæãããŸãïŒã
ç§ã¯å°ãªããšãïŒæããã«ïŒãããã¯è¯ãããšã ãšæããŸãããŸããèšèªæ©èœãè¿œå ããŠãããã1ã€ã®ãŠãŒã¹ã±ãŒã¹ã ãã«äººçºçã«å¶éããããšã¯æªãããšã ãšæããŸãã çŽäº€ããé©åã«èšèšãããèšèªã䜿çšãããšãå¯èœãªéãå°ãªãæ©èœã§å¯èœãªéãå€ãã®ããšãå®è¡ã§ããŸãã ç¹åŸŽããå¯èœãªããã°ã©ã ã®ã¹ãã³ãã¯ãã«ç©ºéããå¯èœãªéãæ¡å€§ãããã®ã§ã空éã«åäžã®ç¹ãè¿œå ããã ãã®ç¹åŸŽãè¿œå ããããšã¯ç§ã«ã¯å¥åŠã«æããŸãã
ã¿ã€ããšã€ãªã¢ã¹ã®ææ¡ãäœæããããšãã«ããã1ã€ã®å°ãç°ãªããŠãŒã¹ã±ãŒã¹ã念é ã«çœ®ããŠã»ãããšæããŸãã
ãã®åé¡ã§èª¬æããŠããäž»ãªãŠãŒã¹ã±ãŒã¹ã¯ã¿ã€ã_replacement_ã§ãããã¿ã€ããšã€ãªã¢ã¹ã¯ãã¿ã€ããžã®äŸåé¢ä¿ããã³ãŒãæ¬äœãåãé¢ãã®ã«ãéåžžã«åœ¹ç«ã¡ãŸãã
ããšãã°ãã¿ã€ãããäžå®å®ãã§ããããšãå€æãããšããŸãïŒã€ãŸããããããäºææ§ã®ãªãæ¹æ³ã§å€æŽããç¶ããŸãïŒã 次ã«ãäžéšã®ãŠãŒã¶ãŒã¯ãå®å®ããã眮æã¿ã€ãã«ç§»è¡ããããšæããããããŸããã ã¿ã€ãã®ææè ãšãã®ãŠãŒã¶ãŒãå¿ ãããç·å¯ã«ååããããå®å®æ§ã®ç®çã«ã€ããŠåæãããããå¿ èŠããªãgithubãªã©ã§ã®éçºãèããŠããŸãã
ä»ã®äŸãšããŠã¯ãã©ã€ã»ã³ã¹ã®éäºææ§ãçºèŠãããå Žåãªã©ã倧ããªããã±ãŒãžãåé¡ã®ããããã±ãŒãžãžã®äŸåé¢ä¿ãåé€ãããªãããã«ããã®ã¯åäžã®ã¿ã€ãã ãã§ããå ŽåããããŸãã
ãããã£ãŠãããã§ã®ããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ãã®ããã»ã¹ã®æåŸã«ã2ã€ã®ç¬ç«ããã¿ã€ãããããããããã®æ¹åã«èªç±ã«é²åã§ããŸãã
ãã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ã次ã®ç¹ã«æ³šæããŠãã ããã
@Meroviuså€ãã¡ãœãããåé€ãŸãã¯ååå€æŽãããšãããã䜿çšããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ããäžåºŠã«
ã»ãšãã©ã®å ŽåãGoããŒã ã¯ãããžã§ã¯ããå€éšã®é¢ä¿è ã«å æ¬çã«ããããã«å€å€§ãªåŽåãè²»ãããŠãããããæ¹å€ã¯äžå ¬å¹³ã ãšæããŸãããç¹å®ã®ããã±ãŒãžãåŒã³åºããŠããã³ãŒãã®ãã¹ãŠã®è¡ã«ã¢ã¯ã»ã¹ã§ãããšä»®å®ããç¬éãããã¯å£ã«å²ãŸããŠããŸããªãŒãã³ãœãŒã¹ã³ãã¥ããã£ã®ã³ã³ããã¹ããšäžèŽããªãåºã å£ã«å²ãŸããåºã®å éšã§ã®ã¿æ©èœããèšèªã¬ãã«ã®ãªãã¡ã¯ã¿ãªã³ã°æ©èœãè¿œå ããããšã¯ãæ§ããã«èšã£ãŠããç°äŸã§ãã
@niemeyerã©ãããç§ã¯èªåèªèº«ãæ確ã«ããŸããã§ããã ãããã«ãããå€ãAPIãåé€ããããšãæå±ããŠããŸããã§ãããã¿ã€ããšã€ãªã¢ã¹ã§æå¹ã«ãããã¯ãŒã¯ãããŒã¯ãååã®å€æŽæ¹æ³ã§ãã§ã«å¯èœã§ãããšææããŠããŸããïŒåæã«ãã©ããã¯é¢ä¿ãããŸããïŒã ã ãããããªããäœããããã®ãã«é¢ãããã
ããªãã¯3a察3bãè¡ãããšã«ã€ããŠè°è«ããŠããããã§ãã ããããç§ãææããã®ã¯ã1ãã¡ãœããåã§ã¯ãã§ã«å¯èœã§ãããåã§ã¯äžå¯èœã§ãããšããããšã§ããããããã®ç®çã§ãã
ããããç§ã¯ä»ãç§ãããªãã誀解ããŠãããšæãããšã«æ°ã¥ããŸãã:)ããªããææããŠãããããããŸããããos.Errorã¯ç°ãªãã€ã³ã¿ãŒãã§ãŒã¹å®çŸ©ã§ãããããåãã¯å®éã«ã¯ããŸããããŸããã ããã¯æ¬åœã ãšæããŸãã APIã®åé€ãçŠæ¢ããŠããå Žåãåãšã€ãªã¢ã¹ã䜿çšãããšãã€ã³ã¿ãŒãã§ã€ã¹åã®ã¡ãœããã®ååãå€æŽã§ããŸããã
ãã¶ããããªãã¯ç§ã®ããã«ããªãã®ã¢ããã¿ãŒã®ã¢ã€ãã¢ã«ã€ããŠäœããæ確ã«ããããšãã§ããŸãïŒããã¯ãŸãos.ErrorãšããŠä»»æã®fmt.Stringerã䜿çšããããšãå¯èœã«ããŸãããïŒ
ãããã«ãããã¢ããã¿ãŒã®ã¢ã€ãã¢ã¯ãç§ãå°ãæççã§ãã£ãŠããããã«çºå±ããã䟡å€ãããããã«æãããŸãã ããããå¯èœãªå®è£ è ãæ¶è²»è ãå£ãããšãªããã€ã³ã¿ãŒãã§ã€ã¹ãåŸã ã«ãªãã¡ã¯ã¿ãªã³ã°ããæ¹æ³ãæã€ããšã¯è¯ãç®æšã§ãã
@niemeyerã¯ããã¡ãœããåã誀ã£ãŠå€æŽãããããšã«ã€ããŠãè¯ãç¹ããããŸãã ããã¯å€ãã®è€éãããããããŸãããããŠããã¯ç§ãããã§åãçµãããšããŠããããšã§ã¯ãããŸããã error / os.Errorã«èšåããŠããã³ãŒãã®ããäžéšã ããå®éã«ã¡ãœãããåŒã³åºãããã移åã¯ã¡ãœããã®å€æŽãããé¢åãªéšåã§ããã ã¡ãœããã®ååå€æŽã¯ãã³ãŒãã®å Žæãå€æŽããããšãšã¯ç¬ç«ããåé¡ãšããŠæ±ãããšãã§ãããšæããŸãã ä»æ¥ç§»åãè¡ãããŠããŠãããã±ãŒãžã®åç·šæãã·ãŒã ã¬ã¹ã«å®è¡ã§ããããå€ãã¡ãœããåã«åºå·ããå Žåã§ããããã¯å€§ããªé²æ©ã«ãªããŸãã ãã®åé¡ãã³ãŒãã®å Žæã«çŠç¹ãåœãŠãããšã¯ãåçŽåããããšãç®çãšããŠããŸãã
äž¡æ¹ã®çš®é¡ã®å€æŽãåŠçããäžè¬çãªä¿®æ£ãããã°ãããã¯çŽ æŽãããããšã ãšç§ã¯åæããŸãã ãã®ä¿®æ£ãäœã§ãããããããŸããã ç¹ã«ãã¿ã€ãã¹ã€ãããããªãã説æããã¢ããã¿ãŒã§ã©ã®ããã«æ©èœããããç解ããŠããŸããïŒã¿ã€ãã¹ã€ããäžã«å€ãäœããã®åœ¢ã§èªåçã«å€æãããŸããïŒ ãªãã¬ã¯ã·ã§ã³ã¯ã©ãã§ããïŒ 2ã€ã®ååãæã€1ã€ã®ã¿ã€ãã®ã¿ãæã€ããšã§ãååŸã«èªåå€æãã2ã€ã®ã¿ã€ããæã€ããšã§çºçããå€ãã®åé¡ãåé¿ã§ããŸãã
@rscã¯ããã¢ããã¿ãŒã¯ããããç¶æ³ã§äžè²«ããŠèªåçã«å€æããããããã¿ã€ãã¹ã€ãããåãã§ãã ãããŸãã«ãªããããã¢ããã¿ãŒãšãã®åºç€ãšãªãã¿ã€ãã®äž¡æ¹ãå«ãã¿ã€ãã¹ã€ããã¯çŠæ¢ããŸãã äœãã足ããªããããããŸãããããã¹ãŠã®ã³ãŒãã³ã³ããã¹ãã¯å¿
ãé©å¿åãŸãã¯ãã®åºã«ãªãåãæ瀺çã«äœ¿çšããå¿
èŠãããããããªãã¬ã¯ã·ã§ã³ã®åé¡ã¯ãŸã ããããŸããã ä»æ¥ãšåãããã«ããããçã«ããªã£ãŠããã®ã§ããã°ãã©ããã£ãŠããã«ãã©ãçããããç¥ããã«interface{}
ã«å
¥ãããšã¯ã§ããŸããã
@Meroviusäžèšã®2ã€ã®ã³ã¡ã³ãã¯ãããªãããŸã ææããŠããããšãæ£ç¢ºã«ç€ºããŠããŸãã ä»æ¥ã¿ã€ãã移åãããšãä¿®æ£ãå¿ èŠãªã³ãŒããå£ããŸãã ã¡ãœããã®ååãå€æŽãããšãä¿®æ£ãå¿ èŠãªã³ãŒããå£ããŸãã ã¡ãœãããåé€ããåŒæ°ãå€æŽãããšãä¿®æ£ãå¿ èŠãªã³ãŒããå£ããŸãã ãããã®ããããã®å Žåã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããå Žåãæ©èœãç¶ç¶ããã«ã¯ããã¹ãŠã®åŒã³åºããµã€ãã§ç Žæãçºçããå Žåã«ä¿®æ£ãã¢ãããã¯ã«è¡ãå¿ èŠããããŸãã ã¿ã€ãã移åã§ãããå®å šã«å€æŽãããŠããªãããšãèš±å¯ããããšã¯ããªãã¡ã¯ã¿ãªã³ã°ã®éåžžã«éãããã±ãŒã¹ã§ãããIMOã¯èšèªæ©èœãæ£åœåããŸããã
@niemeyerããã¯å
·äœçãªã¿ã€ããåŠçããŸãã .(interface{String() string})
ãš.(interface{Error() string})
ã¿ã€ãã¢ãµãŒã·ã§ã³ããŸãã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ç¹å®ã®éšåãå€æŽãããå Žåã¯ã©ãã§ããããã ãã§ãã¯ã§ã¯ãèããããäž¡æ¹ã®åºã«ãªãåãäœããã®æ¹æ³ã§èæ
®ããå¿
èŠããããŸããïŒ
@niemeyerããããã¡ãœããã®ååãå€æŽããããšã¯éã¢ãããã¯ã«å¯èœã§ãã ããšãã°ãã¡ãœãããA.Foo
ããA.Bar
ã«ç§»åããã«ã¯ã次ã®ããã«ããŸãã
A.Foo
ã©ãããŒãšããŠã¡ãœããA.Bar
ãè¿œå ããŸãA.Bar
ãåŒã³åºãããã«ãŠãŒã¶ãŒã移è¡ããŸãA.Foo
åé€ããããåé€ããªãã§ãã ãããé¢æ°ã®å€æŽåŒæ°ã¯éã¢ãããã¯ã«å¯èœã§ãã ããšãã°ããã©ã¡ãŒã¿x int
ãfunc Foo()
ã«è¿œå ããã«
func FooWithInt(x int) { Foo(); // use x somehow; }
è¿œå ããŸãfunc Foo(x int) { FooWithInt(x) }
ãŸããs/FooWithInt/Foo/g
ãŠãŒã¶ãŒã移è¡ããŸããFooWithInt
åé€ããŸãã移ååïŒå³å¯ã«èšãã°ãå€æ°ïŒåããè¡ãã«ã¯ãä¿®æ£ã§ã¯ãªããéæšå¥šã匷å¶ããå¿ èŠããããŸãïŒãããã£ãŠãæœåšçã«æªç¥ã®ã³ãŒãã®ãã«ããå£ããã€ãŸããããã¯åºãã¿ã€ã ãªãŒãªçºè¡šãå¿ èŠã§ãïŒã ãã ããããã§ãªãå Žåã§ãããã䟿å©ãªååãŸãã¯ãã®ä»ã®äŸ¿å©ãªã©ããã³ã°ïŒx / image / drawãåç §ïŒã§APIãæ¡åŒµããæ©èœã¯ãå€ããã®ãæ°ããååã§åç §ããæ©èœããŸãã¯ãã®éã®æ©èœã«ãäŸåããŸãã
ä»æ¥ã®åã®ç§»åãšä»æ¥ã®é¢æ°ã®ååå€æŽã®éãã¯ãåè ã®å Žåãå®éã«ã¯ã¢ãããã¯ãªå€æŽãå¿ èŠã§ããã®ã«å¯ŸããåŸè ã®å Žåãç¬ç«ãããªããžããªãšã³ããããä»ããŠåŸã ã«å€æŽãå ããããšãã§ãããšããããšã§ãã ãs / Foo / Bar /ãå®è¡ããã³ããããè¡ããŸãããšããŠã§ã¯ãªãããããå®è¡ããããã»ã¹ããããŸãã
ãšãããã ã©ããããç§ãã¡ãã©ãã«ããã®ãããããŸããã @rscã®ããã¥ã¡ã³ãã¯ãç§ã®POVãäŒããã®ã«éåžžã«æ確ã§ãããå®éã«ã¯ããªãã®ãã®ãååŸããŠããŸãã:)
@rscç§ã¯2ã€ã®åççãªçããèŠãããšãã§ããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãå ¥åãããã¿ã€ããã¢ããã¿ãªã©ãäŒéããåçŽãªãã®ã§ãããã€ã³ã¿ãŒãã§ã€ã¹ãã¢ãµãŒããããšãã«éåžžã®ã»ãã³ãã£ã¯ã¹ãé©çšãããŸãã ãã1ã€ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãæºãããªãããåºã«ãªãå€ã¯æºããå Žåãå€ãé©å¿ãããªãå¯èœæ§ãããããšã§ãã åè ã¯ããåçŽã§ãããããç§ãã¡ãèããŠãããªãã¡ã¯ã¿ãªã³ã°ã®ãŠãŒã¹ã±ãŒã¹ã«ã¯ååã§ãããåŸè ã¯ãããããåºã«ãªãåã«ãåã¢ãµãŒãã§ãããšããèããšããäžèŽããŠããŸãã
@Merovius確ãã«ãã¡ãœããã®ååãå€æŽããããšã¯ã_å®éã«ååãå€æŽããªãã§_ã代ããã«åŒã³åºããµã€ãã«æ°ããAPIã䜿çšããããã«åŒ·å¶ããéãå¯èœã§ãã åæ§ã«ãã¿ã€ãã移åããããšã¯ã_å®éã«ç§»åããªãéã_å¯èœã§ããã代ããã«åŒã³åºããµã€ãã«æ°ããAPIã䜿çšããããã«åŒ·å¶ããŸãã å€ãã³ãŒãã®åäœãç¶æããããã«ãç§ãã¡ã¯çããããã®äž¡æ¹ãäœå¹Žãè¡ã£ãŠããŸããã
@niemeyerããããç¹°ãè¿ãã«ãªããŸãããã¿ã€ãã®å Žåãé©åãªæ¹æ³ã§ç©äºãè¿œå ããããšããã§ããŸããã x / image / drawãåç §ããŠãã ããã ãããŠã誰ããå®å®æ§ã«ã€ããŠãã®ãããªçµ¶å¯ŸçãªèŠæ¹ãããŠããããã§ã¯ãããŸããã ç§èªèº«ãã6ã12ãâŠæã«$ functionã$ typeãâŠããªããªãã®ã§ããã®æç¹ã§ç§»è¡ããããã«ããŠãã ããããšèšã£ãŠãåé¡ãããŸããããã®åŸãã¡ã³ããã³ã¹ãããŠããªãã³ãŒããå£ããŠããŸããŸãããªããšããã®éæšå¥šã®éç¥ã«åŸãããšãã§ããŸãïŒèª°ããAPIã®é·æãµããŒããå¿ èŠã ãšæããªãã圌ãã¯ç¢ºãã«ãããæäŸããããã«æ¯æã誰ããèŠã€ããããšãã§ããŸãïŒã ç§ã¯ãã»ãšãã©ã®äººãå®å®æ§ã«ã€ããŠãã®çµ¶å¯ŸçãªèŠæ¹ãæã£ãŠããªããšãã䞻匵ããŸãã ã»ãã³ãã£ãã¯ããŒãžã§ã³ã®æè¿ã®ããã·ã¥ãåç §ããŠãã ãããããã¯ãäºææ§ãç Žããªãã·ã§ã³ãå¿ èŠãªå Žåã«ã®ã¿æ¬åœã«æå³ããããŸãã ãããŠãããã¥ã¡ã³ãã¯éåžžã«ããè°è«ããŠããŸãããã®å Žåã§ãã段éçãªä¿®çãè¡ãèœåããå©çãåŸãæ¹æ³ãšããã€ã€ã¢ã³ãã®äŸåé¢ä¿ã®åé¡ãæ¬è³ªçã«è§£æ±ºããªãå Žåã§ãããããã©ã®ããã«è»œæžã§ãããã«ã€ããŠã§ãã
å®å®æ§ã«å¯Ÿããããªãã®ã¹ã¿ã³ã¹ã¯çµ¶å¯Ÿçã§ããããã段éçãªä¿®åŸ©ã®ããã«ãšã€ãªã¢ã¹ã®ãŠãŒã¹ã±ãŒã¹ã®ã»ãšãã©ãåŽäžããå¯èœæ§ããããŸãã ããããã»ãšãã©ã®å²ç¢ã³ãã¥ããã£ã§ã¯ãããã¯ç°ãªããŸãããç Žæãçºçããå Žåã«ãç Žæãšããããå¯èœãªéãã¹ã ãŒãºã«ããããã®äœ¿çšãå¿ èŠã§ãããšç§ã¯äž»åŒµããŸãã
@niemeyer @rsc @Meroviusç§ã¯ããªãã®è°è«ïŒãããŠè°è«å šäœïŒããã©ããŒããŠããŸããããããŠç§ã¯ãã®çãäžã§ãã®æçš¿ãé²éªšã«å©ãããã§ãã
åé¡ãå埩ããã»ã©ãäœããã®åœ¢ã®æ¡åŒµå ±åæ£ã»ãã³ãã£ã¯ã¹ã«è¿ã¥ããŸãã ãããã£ãŠãããã§èããŸããå ·äœçãªã¿ã€ãããã€ã³ã¿ãŒãã§ã€ã¹ãããã³ã€ã³ã¿ãŒãã§ã€ã¹éã§å®çŸ©ããããµãã¿ã€ãã®ã»ãã³ãã£ã¯ã¹ïŒ "is-a"ïŒããã§ã«ãããŸãã ç§ã®ææ¡ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ãïŒçŸåšã®åæ£ã«ãŒã«ã«åŸã£ãŠïŒã¡ãœããã®åŒæ°ãŸã§ååž°çã«å ±å€ã«ããããšã§ãã
ããã¯ãçŸåšã®ãã¹ãŠã®ããã±ãŒãžã®åé¡ã解決ããããã§ã¯ãããŸããã ãã ããAPIã®ãå¯åéšåããã€ã³ã¿ãŒãã§ã€ã¹ã«ããããšãã§ãããšããç¹ã§ããŸã äœæãããŠããªãå°æ¥ã®ãã¹ãŠã®ããã±ãŒãžã®åé¡ã解決ã§ããŸãïŒåªããèšèšãä¿é²ãããŸãïŒã
ãã®ããã«ã€ã³ã¿ãŒãã§ãŒã¹ãïŒabïŒäœ¿çšããããšã§ããã¹ãŠã®èŠä»¶ã解決ã§ãããšæããŸãã Go 1.0ãå£ããŠããŸããïŒ ããããŸããããããã§ã¯ãªããšæããŸãã
@thwd ãã€ã³ã¿ãŒãã§ãŒã¹ãååž°çã«å ±å€ã«ããããšã¯ã©ãããæå³ããããæ£ç¢ºã«å®çŸ©ããå¿ èŠããããšæããŸãã éåžžããµãã¿ã€ãã³ã°ã§ã¯ãã¡ãœããåŒæ°ã¯åå€ã®æ¹æ³ã§å€æŽããå¿ èŠããããçµæã¯å ±å€ã®æ¹æ³ã§å€æŽãããŸãã ãŸããããªããèšã£ãŠããããšãããããã¯å ·äœçãªïŒéã€ã³ã¿ãŒãã§ãŒã¹ïŒã¿ã€ãã®æ¢åã®åé¡ã解決ããŸããã
@thwdç§ã¯åæããã¹ãŠãã€ã³ã¿ãŒãã§ãŒã¹ã«ããå¿ èŠããããŸãïŒããæç¹ã§äœã移å/å€æŽããããããããªãããïŒããã¹ãŠãããã¯è¯ããã¶ã€ã³ã§ãïŒç§ã¯ãããJavaã§èŠãŸãããããã¯ç§ãæªåãããŸãïŒã äœããæ§é äœã§ããå Žåã¯ããããæ§é äœã«ããŸãã ä»ã®ãã¹ãŠã¯ãããã±ãŒãžã«å¥åŠãªæ§æãªãŒããŒããããè¿œå ãããã¹ãŠã®éäŸåé¢ä¿ãè¿œå ããã ãã§ãå®è³ªçã«ã¡ãªããã¯ãããŸããã ããã¯ããªããå§ãããšãã«æ£æ°ãä¿ã€å¯äžã®æ¹æ³ã§ããããŸãã åçŽãªãã®ããå§ããŠãåŸã§ãã£ãšäžè¬çãªãã®ã«ç§»ããŸãã ç§ããããŸã§ã«èŠãAPIã®å€ãã®è€éãã¯ãAPIã®èšèšãèããããŠããããŸã§ã«å¿ èŠãšããããããã¯ããã«äžè¬çãªãã®ãèšç»ããŠãã人ã ããæ¥ãŠããŸãã ãããŠãã±ãŒã¹ã®80ïŒ ïŒãã®æ°ã¯æãããªåã§ãïŒã§ã¯ããã¯ãªãŒã³ãªAPIèšèšãããªããããäœãèµ·ãããŸããã
ïŒæ確ã«ããããã«ïŒç§ã¯å ±å€ã€ã³ã¿ãŒãã§ãŒã¹ãè¯ãèãã§ã¯ãªããšèšã£ãŠããã®ã§ã¯ãããŸãããç§ã¯ãããããããã®åé¡ã®è¯ã解決çã§ã¯ãªããšèšã£ãŠããã ãã§ãïŒ
@Meroviusã®ãã€ã³ãã«å ããŠãç§ãèŠãå€ãã®æ®µéçãªã³ãŒã修埩ã¯ãäžè¬çã«æçšãªéã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ããã¯ããã«å€§ããªããã±ãŒãžãã移åãããšãã圢ããšã£ãŠããŸãã 次ã®ããšãèæ ®ããŠãã ããã
package foo
type Authority struct {
Host string
Port int
}
æéã®çµéãšãšãã«ãfooããã±ãŒãžã¯å€§ãããªãã Authority
ã¿ã€ããæ¬åœã«å¿
èŠãªäººãããå€ãã®è²¬ä»»ïŒããã³ã³ãŒããµã€ãºïŒãåŸãããšã«ãªããŸãã äœæã®ä»æ¹æã€ã®ã§ã fooauthority
ã ããå«ãŸããŠããããã±ãŒãžãAuthority
ããæ¢åã®ãŠãŒã¶ãŒæã€foo.Authority
ãŸã äœæ¥ãæãŸãããŠãŒã¹ã±ãŒã¹ã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã®ã¿ãèæ
®ãããœãªã¥ãŒã·ã§ã³ã¯ãããã§ã¯åœ¹ã«ç«ããªãããšã«æ³šæããŠãã ããã
@Meroviusããªãã®æåŸã®ã³ã¡ã³ãã¯å®å šã«äž»èŠ³çãªãã®ã§ãããç§ã®ææ¡ã§ã¯ãªãå人çã«ç§ã«å®ãŠããã®ã§ãã ããã¯ããŸãçµãããªãã®ã§ãããã§ãã®è°è«ããããŸãã
@ griesemer @ Meroviusç§ã¯ããªãã®äž¡æ¹ã«åæããŸãã ã«ãŒããéããããã«ããããŸã§ã®è°è«ããµãã¿ã€ã/å ±åæ£ã®æŠå¿µã«ã€ãªãã£ãããšã«åæããããšãã§ããŸãã ãŸãããããå®è£ ããŠããå®è¡æã®éæ¥åç §ãçºçããªãããã«ããå¿ èŠããããŸãã ããã¯@niemeyerãææ¡ããŠããããšã®ãããªãã®
@ niemeyer @ Meroviusã®ã³ã¡ã³ãã«ã¯
å€ãã¡ãœãããåé€ãŸãã¯ååå€æŽãããšãããã䜿çšããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ããäžåºŠã«åŒ·å¶çµäºãããŸãã
ãš
ãã¡ãããã¡ãœããã®ååãå®éã«å€æŽããã代ããã«åŒã³åºããµã€ãã«æ°ããAPIã䜿çšããããã«åŒ·å¶ããªãéããã¡ãœããã®ååãå€æŽããããšã¯å¯èœã§ãã åæ§ã«ãã¿ã€ããå®éã«ç§»åããªãéããã¿ã€ãã移åããããšã¯å¯èœã§ããã代ããã«åŒã³åºããµã€ãã«æ°ããAPIã䜿çšããããã«åŒ·å¶ããŸãã å€ãã³ãŒãã®åäœãç¶æããããã«ãç§ãã¡ã¯çããããã®äž¡æ¹ãäœå¹Žãè¡ã£ãŠããŸããã
ç§ã¯ãããã®å£°æããã¡ããŽã£ã¯ã¹ãšåãå°è±¡ãåããŸããâããªãã¯ãã°ããã®éäœããéé£ãããããŠæçµçã«ãããåãé€ãããšã«åæ ããŠããªããšããããšã§ãã ã³ãŒããç¡æéã«æ©èœããç¶ããããšãçŽæããŠããããšã ãå®å®ã«å¯Ÿããããªãã®ã¹ã¿ã³ã¹ã¯çµ¶å¯Ÿçã§ããã ïŒãããŠããããªã誀解ãæªç¶ã«é²ãããã«ãç§ã¯ãããªããã䜿çšããŠãããªãã®æ§æ Œã§ã¯ãªããããªãã®ã¢ã€ãã¢ãåç §ããŠããŸããïŒ
@niemeyerããªããææ¡ããŠããadapts
宣èšã¯ãHaskellåã¯ã©ã¹ã®instance
ãšå¯æ¥ã«é¢é£ããŠããããã§ãã ãããGoã«å€§ãŸãã«ç¿»èš³ãããšã次ã®ããã«ãªããŸãã
package os
type Error interface {
String() string
}
instance error Error (
func (e error) String() string { return e.Error() }
)
æ®å¿µãªããïŒ @zombiezenãææããŠããããã«ïŒããããéã€ã³ã¿ãŒãã§ãŒã¹ã¿ã€ãã«ã©ã®ããã«åœ¹ç«ã€ãã¯æããã§ã¯ãããŸããã
ãŸããé¢æ°åïŒåŒæ°ãšæ»ãå€ïŒãšã©ã®ããã«çžäºäœçšãããã¯ç§ã«ã¯ããããŸããã ããšãã°ã adapts
ã®ã»ãã³ãã£ã¯ã¹ã¯ã Context
ãæšæºã©ã€ãã©ãªã«ç§»è¡ããã®ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ç§ã¯ãããã®å£°æããã¡ããŽã£ã¯ã¹ãšåãå°è±¡ãåããŸããâããªãã¯ãã°ããã®éäœããéé£ããããšã«åæ ããŠããªããšããããšã§ã
@jbaãããã¯çµ¶å¯Ÿçãªäºå®ã§ããã絶察çãªæèŠã§ã¯ãããŸããã ã¡ãœãããŸãã¯ã¿ã€ããåé€ãããšãããã䜿çšããGoã³ãŒããå£ããããããããã®å€æŽã¯ã¢ãããã¯ã«è¡ãå¿ èŠããããŸãã ãã ããç§ã®ææ¡ã¯ãã³ãŒãã®æ®µéçãªãªãã¡ã¯ã¿ãªã³ã°ã«é¢ãããã®ã§ããããã¯ãããã§ã®äž»é¡ã§ãããéæšå¥šãæå³ããŸãã ãããããã®éæšå¥šã®ããã»ã¹ã¯åæ ã®åé¡ã§ã¯ãããŸããã ç§ã¯ãããããæ°åã®å®éã®äŸåé¢ä¿ãæã€è€æ°ã®ãããªãã¯Goããã±ãŒãžãšããã®æ®µéçãªé²åã®ããã«è€æ°ã®ç¬ç«ããAPIãæã£ãŠããŸãã APIãå£ããšãã人ã ãçãããªãããšãæåŸ ãããã®ã§ããã°ãããããã¹ããªãŒãã³ã°ããã®ã§ã¯ãªãããããã§ãã®ãããªå£ããè¡ãã®ã¯è¯ãããšã§ãã ãã¡ãããããªããå£ã«å²ãŸããåºã«äœãã§ããŠããããä¿®æ£ããããã«ãã¹ãŠã®åŒã³åºããµã€ãã«æãå·®ã䌞ã¹ãããšãã§ããªãéãã ããããç§ã¯èªåèªèº«ãç¹°ãè¿ããŠããŸã..ãã®ãã¹ãŠã¯ãããæ確ãªæ¹æ³ã§äžèšã®å ã®ææ¡ã§èªãããšãã§ããŸãã
@Merovius
å人çã«ã¯ããšã€ãªã¢ã¹ããªãã¡ã¯ã¿ãªã³ã°ä»¥å€ã®äœãïŒåªãããŠãŒã¹ã±ãŒã¹ã§ããã©ãããŒããã±ãŒãžãªã©ïŒã«åœ¹ç«ã€ãšèããå Žåã¯ããããã䜿çšããã ãã§ãéæšå¥šã®èŠåã¯ç¡èŠãããŸãã
éåžžã«å€ãã®æ°ããAPIãšéæšå¥šã®APIãå«ãããã±ãŒãžãç¶æããå€ãïŒãšã€ãªã¢ã¹åãããïŒã¿ã€ãã®ç¶æ ãæ確ã«èª¬æããã«ãšã€ãªã¢ã¹ãèšå®ããŠããã³ãŒãã®æ®µéçãªä¿®åŸ©ã«ã¯åœ¹ç«ãããAPIãµãŒãã§ã¹ã®å¢å ã«å§åãããã ãã§ãã ç§ã¯@niemeyerã«åæããŸããç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³ã¯ãAPIããéæšå¥šãã§ãããšããèªç±åœ¢åŒã®godocããã¹ã以å€ã®ã·ã°ãã«ãçŸåšãªãåæ£åéçºè ã³ãã¥ããã£ã®èŠä»¶ã«å¯ŸåŠããå¿ èŠããããŸãã å€ãåã®éæšå¥šåã«åœ¹ç«ã€èšèªæ©èœã®è¿œå ã¯ãã®ã¹ã¬ããã®ãããã¯ã§ãããããåœç¶ãå€ãïŒãšã€ãªã¢ã¹åãããïŒåã®ç¶æ ãäœã§ããããšããçåãçããŸãã
åãŸãã¯éšåããã±ãŒãžã«æ¡åŒµæ©èœãæäŸãããªã©ãå¥ã®ããŒãã§åãšã€ãªã¢ã¹ã«ã€ããŠèª¬æããããšæããŸããããã®ã¹ã¬ããã§ã¯èª¬æããŸããã ãã®ãããã¯èªäœã«ã¯ãæ€èšããåã«å¯ŸåŠããå¿ èŠã®ããããŸããŸãªã«ãã»ã«ååºæã®åé¡ããããŸãã
ç¹å®ã®æŒç®åããŸãã¯ãšã€ãªã¢ã¹åããããã眮ãæããããŠããããšã瀺åããããšã¯ããŠãŒã¶ãŒãåãæ¿ããå¿ èŠãããããšããŠãŒã¶ãŒã«äŒããããã«å¥å šã§ããå¯èœæ§ããããŸãã ãã®ãããªå·®å¥åã«ãããããŒã«ã¯çœ®ãæããããAPIãèªåçã«å ±åã§ããããã«ãªããŸãã
æ確ã«ããããã«ãéæšå¥šããªã·ãŒã¯ãæšæºã©ã€ãã©ãªå€ã®ã¿ã€ãã«å¯ŸããŠæè¡çã«ã¯äžå¯èœã§ãã ã¿ã€ãã¯ããšã€ãªã¢ã·ã³ã°ããã±ãŒãžã®èŠ³ç¹ããã®ã¿å€ããã®ã§ãã ãšã³ã·ã¹ãã ã§ããã匷å¶ããããšã¯æ±ºããŠã§ããªãã®ã§ãæšæºã©ã€ãã©ãªã®ãšã€ãªã¢ã¹ãå³å¯ã«éæšå¥šãæå³ããããšãæãã§ããŸãïŒé©åãªéæšå¥šéç¥ã«ãã£ãŠç€ºåãããŠããŸãïŒã
ãŸãã䞊è¡ããŠè°è«ããéã«éæšå¥šã®æŠå¿µãæšæºåããã³ã¢ããŒã«ïŒgolintãgodocãªã©ïŒã§ãããããµããŒãããããšãææ¡ããŸãã éæšå¥šã®éç¥ããªãããšã¯ãGoãšã³ã·ã¹ãã ã®æ倧ã®åé¡ã§ããã段éçãªã³ãŒã修埩ã®åé¡ãããåºç¯å²ã«åãã§ããŸãã
@rakyllã³ã³ãã¥ãŒã¿ãŒã§èªã¿åãå¯èœãªéæšå¥šéç¥ããããŠãŒã¹ã±ãŒã¹ã«åæ ããŠããŸãã ç§ã¯ãaïŒãšã€ãªã¢ã¹ãããã§ãããbïŒã³ã³ãã€ã©ã®èŠåãšããŠããããçºè¡ãããšããæŠå¿µã«å察ããŸãã
aïŒã®å Žåã移å以å€ã®ç®çã§ãšã€ãªã¢ã¹ãçç£çã«äœ¿çšããããšããäºå®ã¯å¥ãšããŠãããã¯éåžžã«å°æ°ã®éæšå¥šã®ã»ããã«ã®ã¿é©çšãããŸãã ããšãã°ãããã€ãã®ãªãªãŒã¹ã§é¢æ°ããããã€ãã®ãã©ã¡ãŒã¿ãŒãåé€ããããšããŸãã æ°ããAPIã®çœ²åãç°ãªãããããšã€ãªã¢ã¹ã䜿çšããããšã¯ã§ããŸããããããã§ãçºè¡šããããšæããŸãã bïŒã®å ŽåãIMHOã³ã³ãã€ã©ã®èŠåã¯äžè¬çã«æªããã®ã§ãã ããã¯ãgoããã§ã«è¡ã£ãŠããããšãšã»ãŒäžèŽããŠãããšæãã®ã§ãæ£åœåããå¿ èŠã¯ãªããšæããŸãã
éæšå¥šã®éç¥ã«ã€ããŠããªããèšã£ãŠããããšãã¹ãŠã«åæããŸãã ããã«ã¯ãã§ã«æ§æããããŸãããæããã«ïŒïŒ10909ã§ãããããã£ãŠããã䟿å©ã«ããããã®æ¬¡ã®ã¹ãããã¯ãgodocã§ãããã匷調衚瀺ããŠããŒã«ã®ãµããŒãã匷åãããããã®äœ¿çšæ³ã«ã€ããŠèŠåãããã§ãã¯ãè¡ãããšã§ãïŒããšãã°ãgo vetãgolintããŸãã¯äžç·ã«å¥ã®ããŒã«ïŒã
@rakyll stdlibã¯ãå°å ¥ãããå Žåãåãšã€ãªã¢ã¹ã®ä¿å®çãªäœ¿çšããéå§ããå¿ èŠãããããšã«åæããŸãã
ãµã€ãããŒïŒ
Goããã³é¢é£ããŒã«ã®éæšå¥šã³ã¡ã³ãã®ã¹ããŒã¿ã¹ã«æ°ä»ããŠããªã人ã®èæ¯ã¯ãããªãåºãã£ãŠããããã§ãã
@Meroviusãäžèšã§è¿°ã¹ãããã«ãã¢ã€ãã ãéæšå¥šãšããŠããŒã¯ããããã®æšæºçãªèŠåããããŸãã ïŒ10909ãhttps ãã ããã
TL; DRïŒãéæšå¥šïŒãã§å§ãŸãéæšå¥šã¢ã€ãã ã®ããã¥ã¡ã³ãã«æ®µèœãäœæãã眮æãšã¯äœãã説æããŸãã
éæšå¥šã®ã¢ã€ãã ããã䟿å©ãªæ¹æ³ã§è¡šç€ºãããšããgodocã®ææ¡ãåãå ¥ããããŠããŸãïŒïŒ17056ã
@rakyllã¯ãéæšå¥šã®ã¢ã€ãã ã䜿çšããããšãã«golintãèŠåããããšãææ¡ããŸããïŒgolang / lintïŒ238ã
stdlibãstdlibå ã§ã®ãšã€ãªã¢ã¹ã®äœ¿çšã«é¢ããŠä¿å®çãªç«å Žãåã£ãŠãããšããŠããã¿ã€ããšã€ãªã¢ã¹ã®ååšãïŒæ©æ¢°çã«æ€åºããããèŠèŠçã«ç€ºããããããæ¹æ³ã§ïŒå€ãã¿ã€ããéæšå¥šã§ããããšãæå³ããã¹ãã§ã¯ãªããšæããŸãããããåžžã«å®éã«ãããæå³ããå Žåã
ããããããšã¯ã次ã®ãããããæå³ããŸãã
å€ãã¿ã€ããéæšå¥šã«ãªã£ãããã«ã¿ã€ããšã€ãªã¢ã¹ãå°å ¥ãããå Žåã¯ãæ°ããã¿ã€ããžã®åç §ã«é¢ä¿ãªããå€ãã¿ã€ããéæšå¥šãšããŠããŒã¯ããããšã«ãã£ãŠåŠçããå¿ èŠããããŸãã
ããã«ãããããã·ã³ãã«ã§äžè¬çãªããŒã«ãååšã§ããããã«ãªããŸããç¹æ®ãªã±ãŒã¹ãæå®ããããåãšã€ãªã¢ã¹ã«ã€ããŠç¥ã£ããããå¿ èŠã¯ãããŸãããããã¥ã¡ã³ãã®ã³ã¡ã³ãã®ãéæšå¥šïŒããšäžèŽããå¿ èŠããããŸãã
stdlibã®ãšã€ãªã¢ã¹ã¯éæšå¥šã®ã¿ã§ãããšããå ¬åŒã®ãããããäžæçãªããªã·ãŒã¯é©åã§ãããæšæºã®éæšå¥šã³ã¡ã³ãã䜿çšããä»ã®äœ¿çšãçŠæ¢ããŠã³ãŒãã¬ãã¥ãŒãééãããããšã«ãã£ãŠã®ã¿å®æœããå¿ èŠããããŸãã
@niemeyer以åã®è¿ä¿¡ã¯ãé»æºãåããããã«å€±ãããŸãã:(æ éïŒ
ããããç§ã¯èªåèªèº«ãç¹°ãè¿ããŠããŸãã
FWIWãããªãã®æåŸã®è¿ä¿¡ã¯ãšãŠã圹ã«ç«ã¡ãŸããã 以åã«æã£ãŠãããããïŒãããŠãŸã ããªãã«èŠãããããããªããããïŒãç§ãã¡ã¯ãã£ãšåæããŠãããšç§ã¯ç¢ºä¿¡ããŸããã ãããããŸã ã©ããã§èª€è§£ãããããã§ãã
ããããç§ã®ææ¡ã¯ãã³ãŒãã®æ®µéçãªãªãã¡ã¯ã¿ãªã³ã°ã«é¢ãããã®ã§ãã
ããã¯è«äºã®äœå°ããªããšæããŸãã :)ç§ã¯æåãããããªãã®ææ¡ãåé¡ã«å¯ŸåŠããããã«èæ ®ãããã¹ãèå³æ·±ã代æ¿æ¡ã§ããããšã«åæããŸããã ç§ãæ··ä¹±ãããã®ã¯ã次ã®ãããªã¹ããŒãã¡ã³ãã§ãã
ã¡ãœãããŸãã¯ã¿ã€ããåé€ãããšãããã䜿çšããGoã³ãŒããå£ããããããããã®å€æŽã¯ã¢ãããã¯ã«è¡ãå¿ èŠããããŸãã
ç§ã¯ãŸã ããã§ããªãã®æšè«ãäœã§ãããçåã«æããŸãã ååæ§ã®åäœã¯åäžã®ã³ãããã§ãããšç解ããŠããŸãã ãã®ä»®å®ã§ã¯ãã¡ãœãããŸãã¯ã¿ã€ãã®åé€ããäŸåãããªããžããªã§æåã«åå¥ã®ä»»æã®æ°ã®ã³ãããã§çºçãããã®åŸãæãããªãŠãŒã¶ãŒããªããªããšïŒãããŠååãªéæšå¥šã«ãªãïŒããªãããªãã確信ããŠããã®ãç解ã§ããŸãããééãçµéããïŒã¡ãœãããŸãã¯ã¿ã€ãã¯ãã¢ããã¹ããªãŒã ã®ã³ãããã§åé€ãããŸãïŒèª°ãäŸåããªããªã£ããããäœãå£ããã«ïŒã ç§ã¯ãéäŸåé¢ä¿ã®åšãã«ãéæšå¥šã«åŸããªãããŸãã¯èŠã€ããããšãã§ããªãïŒãŸãã¯åççã«ä¿®æ£ã§ããªãïŒç¹å®ã®ãããŸããã®èŠå ãããããšã«åæããŸãããç§ã«ã¯ãç®åã®åé¡ãšã¯ã»ãšãã©ç¡é¢ä¿ã®ããã§ãã é倧ãªå€æŽãé©çšãããšãã¯ãã€ã§ãããããã©ã®ããã«èª¿æŽããããšããŠãããã®åé¡ãçºçããŸãã
ãããŠãå ¬å¹³ãæãããã«ïŒæ··ä¹±ã¯æ¬¡ã®ãããªæã«ãã£ãŠå®éã«ã¯å©ããããŸãã
ãã¡ãããããªããå£ã«å²ãŸããåºã«äœãã§ããŠããããä¿®æ£ããããã«ãã¹ãŠã®åŒã³åºããµã€ãã«æãå·®ã䌞ã¹ãããšãã§ããªãéãã
ç§ãèšã£ãããšã¯ããããç§ã䞻匵ããŠããç¹ã§ãããšããå°è±¡ãããªãã«äžãããªããç§ããªãŒãã³ãœãŒã¹ã®ç«å Žããå®å šã«è°è«ããŠãããšããä»®å®ã®äžã§ãäžæ©äžãã£ãŠãå€åãããèªã¿çŽããŠãããããšãé¡ã£ãŠããŸãã³ãã¥ããã£ïŒç§ãä¿¡ããŠããªãå Žåã¯ããã®ãããã¯ãžã®ä»¥åã®è²¢ç®ãèªç±ã«èª¿ã¹ãŠãã ãããããã¯ãã¢ãã¬ãã®åé¡ãããã³ãã¥ããã£ã®åé¡ã®ã»ããã¯ããã«å€ãããšãåžžã«æåã«ææããŸããã¢ãã¬ãã«ã¯ãããåé¿ããæ¹æ³ããããŸãã ãããªããææããããã«ïŒã
ãšãããã ç§ã¯ãããããªããšåãããã«æ¶èããŠãããšæããŸãã ã§ãããã€ãããªãã®ç«å Žãç解ã§ãããšããã®ã§ããã
åæã«ãprotobuf publicimportsã®ãããªãã®ããµããŒããããã©ãããšãã®æ¹æ³ã«ã€ããŠè©±ããŸã...
ããæç¹ã§ãã©ãããŒããã±ãŒãžãprotobufãããªãã¯ã€ã³ããŒãããŸãã¯å éšããã±ãŒãžAPIã®å ¬éãå®éã«æ€èšãããã©ãããè°è«ããå¿ èŠããããšæããŸãã
nitïŒprotobufã®å ¬å ±èŒžå ¥åãç¹å¥ãªäºæ¬¡ãŠãŒã¹ã±ãŒã¹ãšããŠèšåããå¿ èŠã¯ãªããšæããŸãã ãããã¯ãå éšèšèšããã¥ã¡ã³ããšå ¬éããã¥ã¡ã³ãã®äž¡æ¹ã§æ瀺çã«èšåãããŠããããã«ã段éçãªã³ãŒã修埩çšã«èšèšãããŠããããããã®åé¡ã§èª¬æãããŠããåé¡ã®åäžã«ãã§ã«ãããŸãã ãŸããprotobuf public importsãå®è£ ããã«ã¯ãåãšã€ãªã¢ã¹ã§ååã ãšæããŸãã ïŒprotoã³ã³ãã€ã©ã¯varãçæããŸãããè«ççã«ã¯constã§ããããããvar Enum_name = import.Enum_nameãã§ååã§ããïŒ
@Meroviusçç£çãªå¯Ÿå¿ãããããšãã ããã€ãã®ã³ã³ããã¹ããæäŸããŠã¿ãŸãããïŒ
ç§ã¯ãŸã ããã§ããªãã®æšè«ãäœã§ãããçåã«æããŸãã ååæ§ã®åäœã¯åäžã®ã³ãããã§ãããšç解ããŠããŸãã ãã®ä»®å®ã§ã¯ãã¡ãœãããŸãã¯ã¿ã€ãã®åé€ãæåã«å¥ã ã«è¡ãããããšãã§ããªããšããªãã確信ããŠããçç±ãç§ã¯åã«ç解ããŠããŸããã
ãããèµ·ããåŸãªããšã¯æ±ºããŠèšããªãã£ãã äžæ©äžãã£ãŠãããæ確ã«èšãæããããŠãã ããã
ç§ãã¡ã¯ãããããæçµç®æšã2ã€ããããšã«åæããŸããã€ãŸããåäœãããœãããŠã§ã¢ãå¿ èŠãªããšãšããœãããŠã§ã¢ãæ¹åããŠãæ£åžžãªæ¹æ³ã§äœæ¥ãç¶ç¶ã§ããããã«ããããšã§ãã åŸè ã®ããã€ãã¯å€åãå£ããŠãããåè ã®ç®æšãšå¯Ÿç«ããŠããŸãã ã€ãŸããç·åŒµæããããŸããã€ãŸããã¹ã€ãŒãã¹ããããã©ãã«ãããã«ã¯ããçšåºŠã®äž»èŠ³æ§ããããŸãã ç§ãã¡ã®è°è«ã®èå³æ·±ãéšåã¯ããã«ãããŸãã
ãã®ã¹ã€ãŒãã¹ããããæ¢ãã®ã«åœ¹ç«ã€æ¹æ³ã®1ã€ã¯ã人éã®ä»å ¥ã«ã€ããŠèããããšã§ãã ã€ãŸããã³ãŒããæ©èœããç¶ããããã«æåã§ã³ãŒããå€æŽããå¿ èŠãããããšãè¡ããšãæ £æ§ãçºçããŸãã ãã¹ãŠã®äŸåã³ãŒãããŒã¹ã®é¢é£éšåããã®ããã»ã¹ãééãããŸã§ã«ã¯é·ãæéãããããŸãã ç§ãã¡ã¯å¿ãã人ãã¡ã«ãã»ãšãã©ã®å Žåãæ°ã«ããªãããšãããããã«æ±ããŠããŸãã
ãã®ã¹ã€ãŒãã¹ããããèŠãå¥ã®æ¹æ³ã¯ãåäœãããœãããŠã§ã¢ã®å¯èœæ§ã§ãã éæšå¥šã®æ¹æ³ã䜿çšããªãããã«äººã ã«ã©ãã ãæ±ããŠãããŸããŸããã ç°¡åã«ã¢ã¯ã»ã¹ã§ããä»ããã§åé¡ã解決ããå Žåãã»ãšãã©ã®éçºè ã¯ããã䜿çšããã ãã§ãã ããã§ã®äžè¬çãªåè«ã¯æ¬¡ã®ãšããã§ãã_ãããã§ããããå£ãããšãã®åé¡ã§ãïŒ_ããããããã¯è¿°ã¹ãããç®æšã«åããŸãã
ãããã£ãŠãããã«ãããåã移åããã ãã§ã¯åœ¹ã«ç«ããªãçç±ã«ã€ããŠãããå°ãæŽå¯ãåŸãããããšãé¡ã£ãŠããŸãã 人ã ããã®æ°ããã¿ã€ããæ°ãã家ã§å®éã«äœ¿çšããã«ã¯ã人éã®ä»å ¥ãå¿ èŠã§ãã æåã§ã³ãŒããå€æŽããæéãçããšãã¯ãè¿ãå°æ¥åã³è¶³å ã§åã³å€æŽããããã®ã§ã¯ãªãã_æ°ããã¿ã€ãã䜿çšãã_ä»å ¥ãè¡ãã®ãæåã§ãã ãªãã¡ã¯ã¿ãªã³ã°ã«åœ¹ç«ã€èšèªæ©èœãè¿œå ããæéãçããšãçæ³çã«ã¯ãäžèšã®çç±ã«ãããã³ãŒããåã«æ°ãã家ã«ç§»åããã®ã§ã¯ãªããæ°ããã¿ã€ãã«åŸã ã«ç§»åã§ããããã«ãªããŸãã
説æããŠãããŠããããšãã ç§ã¯ããªãã®ç«å Žãããããç解ããããªãã®ä»®å®ã«åæãããšæããŸãïŒã€ãŸãã人ã ã¯äœããã£ãŠãéæšå¥šã®ãã®ã䜿çšããã®ã§ã圌ãã亀æã«å°ãããã«å¯èœãªéãã®å©ããæäŸããããšãæãéèŠã§ãïŒã FWIWããã®åé¡ã«å¯ŸåŠããããã®ç§ã®çŽ æŽãªèšç»ã¯ïŒæ®µéçãªä¿®åŸ©ã®ããã®ã©ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããã«é¢ä¿ãªãïŒéæšå¥šæéã«ã³ãŒããããã±ãŒãžããšã«èªåçã«ç§»è¡ããããŒã«ã®ãããªgo-fixã§ãããç§ã¯èªç±ã«åžœåãèªããŸããããå®éã«ã©ã®ããã«æ©èœãããããããŠãããå®éã«æ©èœãããã©ããã¯ãŸã è©ŠããŠããŸããã
@niemeyer Goåã·ã¹ãã ã«æ·±å»ãªæ··ä¹±ã
ãã®ã³ãŒãã«ãã£ãŠæ瀺ããããžã¬ã³ããèââããŠã¿ãŸãããã
package old
import "new"
type A adapts new.A
func (a A) NewA() {}
package new
type A struct{}
func (a A) OldA() {}
package main
import (
"new"
"old"
"reflect"
)
func main() {
oldv := reflect.ValueOf(old.A{})
newv := reflect.ValueOf(new.A{})
if oldv.Type() == newv.Type() {
// The two types are equal, therefore they must
// have exactly the same method set, so either
// oldv doesn't have the OldA method or newv doesn't
// have the NewA method - both of which imply a contradiction
// in the type system.
} else {
// The two types are not equal, which means that the
// old adapted type is not fully compatible with the old
// one. Any type that includes either new.A or new.B will
// be incompatible as one of its components will likewise be
// unequal, so any code that relies on dynamic type checking
// will fail when presented with the type that's not using the
// expected version.
}
}
ãªãã¬ã¯ãããã±ãŒãžã®çŸåšã®å ¬çã®1ã€ã¯ã2ã€ã®ã¿ã€ããåãã§ããå Žåããããã®reflect.Typeå€ã¯çãããšããããšã§ãã ããã¯ãGoã®ã©ã³ã¿ã€ã åå€æã®å¹çã®åºç€ã®1ã€ã§ãã ç§ãèŠãéãããããå£ããã«ãadaptsãããŒã¯ãŒããå®è£ ããæ¹æ³ã¯ãããŸããã
@rogpeppeäžèšã®åçã«ã€ããŠã®@rscãšã®äŒè©±ãåç §ããŠãã ããã 2ã€ã®ã¿ã€ãã¯åãã§ã¯ãªãã®ã§ãreflectã¯çå®ãèšããããã«ã€ããŠå°ãããããšãã«ã¢ããã¿ãŒã®è©³çŽ°ãæäŸããŸãã
@niemeyer 2ã€ã®ã¿ã€ããåãã§ãªãå Žåãããã±ãŒãžéã§ã¿ã€ãã移åããéã®æ®µéçãªã³ãŒã修埩ããµããŒãã§ãããšã¯æããŸããã ããšãã°ãã¿ã€ãã®äºææ§ãç¶æããæ°ããç»åããã±ãŒãžãäœæããããšããŸãã
ç§ãã¡ã¯ãããããããŸããïŒ
package newimage
import "image"
type RGBA adapts image.RGB
func (r *RGBA) At(x, y) color.Color {
return (*image.Buffer)(r).At(x, y)
}
etc for all the methods
段éçãªã³ãŒã修埩ã®ç®çãèãããšããããæåŸ
ããã®ã¯åççã ãšæããŸã
æ°ããããã±ãŒãžã§äœæãããã€ã¡ãŒãžã¯ãæ¢åã®æ©èœãšäºææ§ããããŸã
å€ãç»åã¿ã€ãã䜿çšããŸãã
è°è«ã®ããã«ãimage / pngããã±ãŒãžãæã£ãŠãããšä»®å®ããŸããã
newimageã䜿çšããããã«å€æãããŸããããimage / jpegã¯å€æãããŠããŸããã
ãã®ã³ãŒããæ©èœããããšãæåŸ ããå¿ èŠããããšæããŸãã
img, err := png.Decode(r)
if err != nil { ... }
err = jpeg.Encode(w, img, nil)
ãã ãã* newimage.RGBAã§ã¯ãªã* image.RGBAã«å¯ŸããŠåã¢ãµãŒããè¡ãããã
ã¿ã€ããç°ãªããããAFAICSã¯å€±æããŸãã
ã¿ã€ãã* image.RGBAã§ãããã©ããã«é¢ä¿ãªããäžèšã®ã¿ã€ãã¢ãµãŒããæåããããšããŸãã
ãåŠãã ããã¯çŸåšã®äžå€æ¡ä»¶ãå£ããŸãïŒ
Reflect.TypeOfïŒxïŒ== Reflect.TypeOfïŒxãïŒanyStaticTypeïŒïŒ
ã€ãŸããéçåã¢ãµãŒã·ã§ã³ã䜿çšãããšãéçåãã¢ãµãŒããããã ãã§ã¯ãããŸããã
å€ã§ãããå®éã«å€æŽãããããšããããŸãã
倧äžå€«ã ãšå€æãããšããããããããç§ãã¡ãå¿
èŠã ãšæããŸã
é©åããã¿ã€ãããäºææ§ã®ããä»»æã®ã€ã³ã¿ãŒãã§ãŒã¹ã«å€æã§ããããã«ãããã
é©ååã¯ãµããŒãããŸããããã§ãªãå Žåãæ°ããã³ãŒããŸãã¯å€ãã³ãŒãã®ãããããåæ¢ããŸã
ãšäºææ§ã®ããã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã«å€æãããšãã«æ©èœãã
圌ãã䜿çšããŠããã¿ã€ãã
ããã¯å¥ã®ççŸããç¶æ³ã«ã€ãªãããŸãïŒ
// oldInterface is some interface with methods that
// are only supported by the old type.
type oldInterface interface {
OldMethod()
}
var x = interface{} = newpackage.Type{}
switch x.(type) {
case oldInterface:
// This would fail because the newpackage.Type
// does not implement OldMethod, even though we
// we just supposedly checked that x implements OldMethod.
reflect.TypeOf(x).Method("OldMethod")
}
å
šäœçã«ãåãã§ãããç°ãªã2ã€ã®ã¿ã€ãããããšæããŸã
åã·ã¹ãã ã説æããã®ãéåžžã«é£ãããäºæããªãéäºææ§ã«ã€ãªãã
åçåã䜿çšããã³ãŒãã§ã
ãã¿ã€ãX = Yãã®ææ¡ãæ¯æããŸãã 説æããã®ã¯ç°¡åã§ã説æããŸãã
åã·ã¹ãã ãæ··ä¹±ãããããŸãã
@rogpeppe ïŒ @niemeyerã®ææ¡ã¯ã @ josharianã®ä»¥åã®ææ¡ãšåæ§ã«ãé©å¿åããã®åºæ¬åã«æé»çã«å€æããããšã ãšæããŸãã
ããã段éçãªãªãã¡ã¯ã¿ãªã³ã°ã§æ©èœãããã«ã¯ãé©å¿åã®åŒæ°ã䜿çšããŠé¢æ°ãæé»çã«å€æããå¿ èŠããããŸãã æ¬è³ªçã«ã¯ãèšèªã«å ±åæ£ãè¿œå ããå¿ èŠããããŸãã ããã¯ç¢ºãã«äžå¯èœãªäœæ¥ã§ã¯ãããŸããâç¹ã«åãåºæ¬æ§é ãæã€åã®å Žåãå€ãã®èšèªã§å ±åæ£ãå¯èœã§ãâããããç¹ã«ã€ã³ã¿ãŒãã§ãŒã¹åã®å Žåãåã·ã¹ãã ã«å€ãã®è€éããå ãã
ããªããææããããã«ãããã¯ããã€ãã®èå³æ·±ããšããžã±ãŒã¹ã«ã€ãªãããŸããããããã¯å¿ ãããããèªäœããççŸãããŠããããã§ã¯ãããŸããã
type oldInterface interface {
OldMethod()
}
var x = interface{} = newpackage.Type{}
switch y := x.(type) {
case oldInterface:
reflect.TypeOf(y).Method("OldMethod") // ok
reflect.TypeOf(x).Method("NewMethod") // ok
// This would fail because y has been implicitly converted to oldInterface.
reflect.TypeOf(y).Method("NewMethod")
// This would fail because accessing OldMethod on newpackage.Type requires
// a conversion to oldInterface.
reflect.TypeOf(x).Method("OldMethod")
}
// This would fail because accessing OldMethod on newpackage.Type requires
// a conversion to oldInterface.
ããã¯ãŸã ç§ã«ã¯ççŸããŠããããã§ãã çŸåšã®ã¢ãã«ã¯éåžžã«åçŽãªãã®ã§ããã€ã³ã¿ãŒãã§ã€ã¹å€ã«ã¯ãæ確ã«å®çŸ©ãããåºã«ãªãéçåããããŸãã äžèšã®ã³ãŒãã§ã¯ããã®åºã«ãªãåã«ã€ããŠäœããæšæž¬ããŠããŸãããå€ãèŠããŠã¿ããšãæšæž¬ãããã®ãšã¯ç°ãªããŸãã ããã¯ãç§ã®èŠè§£ã§ã¯ãèšèªã«å¯Ÿããé倧ãªïŒãããŠèª¬æããã®ãé£ããïŒå€æŽã§ãã
ããã§ã®è°è«ã¯çµãããåããŠããããã§ãã äž@egonelbreã®ææ¡ã«åºã¥ããŠhttps://github.com/golang/go/issues/16339#issuecomment -247536289ãç§ã¯è°è«ã®ãªã³ã¯èŠçŽãå«ããããã«ïŒäžéšïŒåœåçºè¡ã®ã³ã¡ã³ããæŽæ°ããŸããé ãã èŠçŽãæŽæ°ãããã³ã«ããã®ãããªæ°ããã³ã¡ã³ããæçš¿ããŸãã
å šäœãšããŠãããã§ã®ææ ã¯ãäžè¬åããããšã€ãªã¢ã¹ã§ã¯ãªããã¿ã€ããšã€ãªã¢ã¹ã«å¯Ÿãããã®ã®ããã§ãã ããããGustavoã®ã¢ããã¿ã®ã¢ã€ãã¢ã¯ãåãšã€ãªã¢ã¹ã眮ãæããŸãããããã§ã¯ãªãå¯èœæ§ããããŸãã çŸæç¹ã§ã¯å°ãè€éã«æããŸãããããããè°è«ã®çµãããŸã§ã«ãããåçŽãªåœ¢åŒã«å°éããã§ãããã å°ãé·ãè°è«ãç¶ããããšããå§ãããŸãã
å¯å€ã°ããŒãã«å€æ°ããéåžžã¯ãã°ãã§ãããšã¯ãŸã 確信ããŠããŸããïŒãããŠããããããã°ã§ããå Žåãã¬ãŒã¹æ€åºåšã¯ãã®çš®ã®ãã°ãèŠã€ããããã®æé©ãªããŒã«ã§ãïŒã æ¡åŒµå¯èœãªæ§æã®æ¬ åŠãæ£åœåããããã«ãã®åŒæ°ã䜿çšãããå ŽåãinitïŒïŒãŸãã¯ãã®å®£èšã«ãã£ãŠæä»çã«å°éã§ããªãã³ãŒãå ã®ã°ããŒãã«å€æ°ãžã®å²ãåœãŠããã§ãã¯ããvet-checkãå®è£ ãããããšãèŠæ±ããŸãã ãããå®è£ ããã®ã¯ç¹ã«é£ããããšã§ã¯ãªããå®è¡ããã®ã¯ããã»ã©æéãããããªããšæããŸããããšãã°ããã¹ãŠã®godoc.orgç»é²ããã±ãŒãžã䜿çšããŠãå¯å€ã°ããŒãã«å€æ°ã®ãŠãŒã¹ã±ãŒã¹ã確èªããŸããããããã¹ãŠããã°ãšèããŠãã ããã
ïŒgoãäžå€ã®ã°ããŒãã«å€æ°ãæé·ãããå Žåããããã¯const-declarationsã®äžéšã§ããå¿ èŠãããããšãä¿¡ããããšæããŸããããã¯ãæŠå¿µçã«ã¯ããã§ãããäžäœäºææ§ãããããã§ãããããã«ãããããšãã°ãé ååã§äœ¿çšã§ããåŒã®çš®é¡ã«é¢ããè€éãã§ãããããã«æ€èšããå¿ èŠããããŸãïŒ
Reãå¶éïŒæšæºã©ã€ãã©ãªã¿ã€ãã®ãšã€ãªã¢ã¹ã¯ãæšæºã©ã€ãã©ãªã§ã®ã¿å®£èšã§ããŸããã -ç¹ã«ããšã€ãªã¢ã¹ã®äœ¿çšã«é¢å¿ã瀺ããŠããæ¢åã®ããã±ãŒãžã§ããx/image/draw
ã®ããããã€ã³ãŠãŒã¹ã±ãŒã¹ãé²ãããšãã§ããŸãã ããšãã°ãã«ãŒã¿ãŒããã±ãŒãžãªã©ãåæ§ã®æ¹æ³ã§net/http
ã«ãšã€ãªã¢ã¹ã䜿çšããããšãéåžžã«ããæ³åã§ããŸãïŒæãæ¯ãïŒã
ç§ã¯ãŸãããã¹ãŠã®å¶éã«ã€ããŠã®åè«ã«åæããŸããã€ãŸããç§ã¯ãããã®ããããæããªãããšã«è³æã§ãã
@Merovius ãå¯å€ã®_exported_ã°ããŒãã«å€æ°ã¯ã©ãã§ããïŒ ããã±ãŒãžå ã®ãã¹ãŠã®ã³ãŒãããããé©åã«åŠçããæ¹æ³ãç¥ã£ãŠããã®ã§ããšã¯ã¹ããŒããããŠããªãã°ããŒãã«ã§åé¡ãªããããããªãã®ã¯äºå®ã§ãã ãšã¯ã¹ããŒããããå¯å€ã°ããŒãã«ãæå³ããªãã®ã¯ããã»ã©æçœã§ã¯ãããŸããã ç§ãã¡ã¯ãæšæºã©ã€ãã©ãªã§äœåºŠããã®ééããç¯ããŸããã ããšãã°ãruntime.MemProfileRateãæŽæ°ããå®å šã«å®å šãªæ¹æ³ã¯ãããŸããã ããªããã§ããæåã®ããšã¯ãããã°ã©ã ã®æ©ã段éã§ãããèšå®ããã€ã³ããŒãããããã±ãŒãžãã¡ã¢ãªãå²ãåœãŠãŠããå¯èœæ§ã®ããåæåãŽã«ãŒãã³ãéå§ããªãããšãæåŸ ããããšã§ãã var vs constã«ã€ããŠã¯æ£ãããããããŸããããããã¯å¥ã®æ¥ã«ä»»ããããšãã§ããŸãã
x / image / drawã®è¯ãç¹ã 次åã®æŽæ°æã«èŠçŽã«è¿œå ãããŸãã
ããªããæèµ·ãããããªè³ªåã«çããããã«åæã§ããGoã³ãŒãã®ä»£è¡šçãªã³ãŒãã¹ãéããããšæããŸãã ç§ã¯æ°é±éåã«ãããè©Šã¿å§ããŸããããããŠç§ã¯ããã€ãã®åé¡ã«ééããŸããã æã£ãããå°ãæéãããããŸããããã®ããŒã¿ã»ãããçšæããããšã¯éåžžã«éèŠã§ãããããã«å°éããããšãæåŸ ããŠããŸãã
@rscãã®ãããã¯ã«ã€ããŠã®ãGothamGoã®ãã¬ãŒã³ããŒã·ã§ã³ããŠãŒãã¥ãŒãã«æ²èŒãããŠããŸãhttps://www.youtube.com/watch?v=h6Cw9iCDVcUãšæåã®æçš¿ã«è¯ãã»ãã«ãªãã ããã
ãã¿ã€ããšã€ãªã¢ã¹ã®ææ¡ã§å¯ŸåŠããå¿ èŠãããä»ã®åé¡ã¯äœã§ããïŒã ã»ã¯ã·ã§ã³ã§ã¯ãããšã€ãªã¢ã¹ã§ååãä»ããããåã§ã¡ãœãããå®çŸ©ã§ããŸããïŒãã«å¯Ÿããåçãæå®ãããšäŸ¿å©ã§ãã é£ããã§ãã ããã¯ã»ã¯ã·ã§ã³ã®æ³ä»€ã®ç²Ÿç¥ã«åããããšãç§ã¯ç解ããŠããŸããããšã€ãªã¢ã¹ã«ã€ããŠã®å€ãã®äŒè©±ã®äžã§ããããä»ã®å Žæã§ããšã€ãªã¢ã¹ã¯å¿ ç¶çã«ãããèš±å¯ãããããã£ãŠåŒãèµ·ãããšä¿¡ããŠãããããããã«æŠå¿µãæåŠãã人ã ãããããšã«æ°ä»ããŸããããã解決ãããããåé¡ã ããã¯å®çŸ©ã«æé»çã«å«ãŸããŠããŸãããæ瀺çã«èšåãããšãå€ãã®äžèŠãªååŸãç絡ããŸãã ããã¯ãšã€ãªã¢ã¹ã®æ°ããææ¡ã®ãšã€ãªã¢ã¹FAQã«å«ãŸããŠãããããããŸããããããããã®ã¹ã¬ããã®çµæã§ããå¿ èŠããããŸãã
@Meroviusãšã¯ã¹ããŒããããããã±ãŒãžã°ããŒãã«
ããã±ãŒãžã®ããŒãžã§ã³nãäžããããå Žåp
ã
package p
var Global = 0
ããŒãžã§ã³n + 1ã§ã¯ãã²ãã¿ãŒãšã»ãã¿ãŒãå°å ¥ã§ããå€æ°ã¯éæšå¥šã«ãªããŸãã
package p
//Deprecated: use GetGlobal and SetGlobal.
var Global = 0
func GetGlobal() int {
return Global
}
func SetGlobal(n int) {
Global = n
}
ããŒãžã§ã³n + 2ã¯ã Global
ãšã¯ã¹ããŒã解é€ã§ããŸãã
package p
var global = 0
func GetGlobal() int {
return global
}
func SetGlobal(n int) {
global = n
}
ïŒæŒç¿ã¯èªè
ã«ä»»ããŸãã global
ãžã®ã¢ã¯ã»ã¹ãn + 2ã®ãã¥ãŒããã¯ã¹ã§ã©ãããã GetGlobal()
ãå»æ¢ããŠãããæ
£çšçãªGlobal()
ãåªå
ããããšãã§ããŸããïŒ
ããã¯è¿ éãªä¿®æ£ã§ã¯ãããŸããããåé¡ã軜æžãããããã³ãŒãã®æ®µéçãªä¿®åŸ©ã«ã¯funcãšã€ãªã¢ã¹ïŒãŸãã¯çŸåšã®åé¿çïŒã®ã¿ãå³å¯ã«å¿ èŠã§ãã
@rscèŠçŽããé€å€ãããšã€ãªã¢ã¹ã®ç°¡åãªäœ¿çš
@jimmyfrascheããªãã¯æ£ããã§ãã ã²ãã¿ãŒãšã»ãã¿ãŒã䜿çšãããšããã¢ã€ãã¢ã¯å¥œãã§ã¯ãããŸãããïŒæ§é äœãã£ãŒã«ãã«äœ¿çšããããªãã®ãšåãããã«ïŒããã¡ãããããªãã®åæã¯æ£ããã§ãã
ãšã€ãªã¢ã¹ã®é修埩䜿çšïŒããããã€ã³çœ®æããã±ãŒãžã®äœæãªã©ïŒã«ã€ããŠã¯æ³šæãå¿ èŠã§ãããvar-aliasesã®å Žåã¯åŒ±ããªããšæããŸãã
@Meroviusã¯ãã¹ãŠã®ç¹ã§åæããŸããã ç§ãããã«ã€ããŠã¯æºè¶³ããŠããŸããããè«çvâ¹vã«åŸãå¿ èŠããããŸã
@niemeyerã¯ãå€ããã®ãšæ°ãããã®ã®äž¡æ¹ãåãååã§çœ²åãç°ãªãã¡ãœãããæã€ã¿ã€ãã®ç§»è¡ãã¢ããã¿ãŒãã©ã®ããã«æ¯æŽããããæ確ã«ã§ããŸãã ã¡ãœããã«åŒæ°ãè¿œå ããããåŒæ°ã®ã¿ã€ããå€æŽãããããããšã¯ãã³ãŒãããŒã¹ã®äžè¬çãªé²åã®ããã«æãããŸãã
@rogpeppeããã¯ãŸãã«ä»æ¥ã®åºæ¥äºã§ããããšã«æ³šæããŠãã ããã
type two one
ããã«ããã one
ãštwo
ç¬ç«ããã¿ã€ãã«ãªãã interface{}
åæ ããŠãããã©ããã«é¢ä¿ãªããããã衚瀺ãããŸãã one
ãštwo
éã§å€æããããšãã§ããŸãã äžèšã®ã¢ããã¿ãŒã®ææ¡ã¯ãã¢ããã¿ãŒã®æåŸã®ã¹ããããèªååããã ãã§ãã ããªãã¯è€æ°ã®çç±ã§ææ¡ãæ°ã«å
¥ããªããããããŸããããããã«ã€ããŠççŸããããšã¯äœããããŸããã
@iand type two one
ã®å Žåãšåæ§ã«ã2ã€ã®ã¿ã€ãã«ã¯å®å
šã«ç¬ç«ããã¡ãœããã»ããããããããååã®äžèŽã«ã€ããŠç¹å¥ãªããšã¯äœããããŸããã å€ãã³ãŒãããŒã¹ã移è¡ãããåã¯ã以åã®ã¿ã€ãïŒçŸåšã¯ã¢ããã¿ãŒïŒã®å€ã眲åã䜿çšãããŸãŸã«ãªããŸãã æ°ããã¿ã€ãã䜿çšããæ°ããã³ãŒãã¯ãæ°ãã眲åã䜿çšããŸãã æ°ããã¿ã€ãã®å€ãå€ãã³ãŒãã«æž¡ããšãã³ã³ãã€ã©ãŒã¯åŸè
ãåè
ã®ã¢ããã¿ãŒã§ããããšãèªèããããããã®ã¡ãœããã»ããã䜿çšãããããèªåçã«ãããé©å¿ãããŸãã
@niemeyerå®å šã«æå®ãããŠããªãããããã®ã¢ããã¿ãŒã®èåŸã«é ããŠããå€ãã®è€éããããããã§ãã ãã®æç¹ã§ãåãšã€ãªã¢ã¹ã®åçŽãã圌ãã«æå©ã«åããšç§ã¯æããŸãã ç§ã¯ã¿ã€ããšã€ãªã¢ã¹ã®ããã ãã«æŽæ°ããå¿ èŠããããã¹ãŠã®ãã®ããªã¹ãããããã«åº§ã£ãããããŠããã¯éåžžã«é·ããªã¹ãã§ããã ã¢ããã¿ãŒã®ãªã¹ãã¯ç¢ºãã«é·ããªããŸãããç§ã¯ãŸã ãã¹ãŠã®è©³çŽ°ãå®å šã«ã¯ç解ããŠããŸããã å®å šãªææ¡ãäœæãããå Žåã¯ãä»ã®ãšããã¿ã€ããšã€ãªã¢ã¹ãå®è¡ããæ¯èŒçéãã¢ããã¿ãŒã«ã€ããŠã®æ±ºå®ãåŸã§ä»»ããããšããå§ãããŸãïŒãã ãããã©ãŽã³ãããã«æœãã§ããªãããšã«æççã§ãïŒ ã
@jimmyfrascheãšã€ãªã¢ã¹ã®ã¡ãœããã«é¢ããŠã¯ã確ãã«ãšã€ãªã¢ã¹ã¯éåžžã®ã¡ãœããå®çŸ©ã®å¶éããã€ãã¹ããããšãèš±å¯ããŸãããããã±ãŒãžãã¿ã€ãT1 = otherpkg.T2ãå®çŸ©ããå Žåãotherpkg.T2ã§ã¡ãœãããçŽæ¥å®çŸ©ã§ããªãã®ãšåæ§ã«ãT1ã§ã¡ãœãããå®çŸ©ã§ããŸããã ãã ããããã±ãŒãžãã¿ã€ãT1 = T2ïŒäž¡æ¹ãšãåãããã±ãŒãžå ïŒãå®çŸ©ããŠããå Žåãçãã¯ããŸãæ確ã§ã¯ãããŸããã å¶éãå°å ¥ããããšã¯ã§ããŸãããïŒãŸã ïŒãã®å¿ èŠæ§ã¯æããã§ã¯ãããŸããã
ãããã¬ãã«ã®ãã£ã¹ã«ãã·ã§ã³ã®æŠèŠãæŽæ°ããŸããã å€æŽç¹ïŒ
ãã¶ã€ã³ããã¥ã¡ã³ããè¿œå ãããŸããïŒ golang.org/design/18130-type-alias
1é±éåã®å Žåãšåæ§ã«ãã¿ã€ããšã€ãªã¢ã¹ã«ã€ããŠã¯ãŸã äžè¬çãªã³ã³ã»ã³ãµã¹ãããããã§ãã ãããŒããšç§ã¯ããã§ãã¯ã€ã³ããã°ããã®æ£åŒãªèšèšããã¥ã¡ã³ããäœæããŸããïŒäžèšã®ãªã³ã¯ïŒã
ææ¡ããã»ã¹ã«ç¶ããŠããã®åé¡ã«é¢ããææ¡ã«ã€ããŠã®å®è³ªçãªã³ã¡ã³ãã_ãã_ã«æçš¿ããŠãã ããã ã¹ãã«/ææ³/ etcã¯ãGerritã³ãŒãã¬ãã¥ãŒããŒãžhttps://go-review.googlesource.com/#/c/34592/ã«ç§»åã§ã
ãåã蟌ã¿ãžã®åœ±é¿ããåèããŠããã ããããšæããŸãã ããã¯ã段éçãªã³ãŒã修埩ã®ããã®åãšã€ãªã¢ã¹ã®äœ¿ãããããå¶éããŸãã ã€ãŸãã p1
ãã¿ã€ãtype T1 = T2
ååãå€æŽããããã±ãŒãžp2
ãæ§é äœã«p1.T2
ãåã蟌ãã å Žåããã®å®çŸ©ãp1.T1
ã«æŽæ°ããããšã¯ã§ããŸããã p3
ãåã蟌ã¿æ§é äœãååã§åç
§ããå¯èœæ§ãããããã p2
ããã®åŸã«åãæ¿ããããšã¯ã§ããŸããp1.T1
å£ãããšãªãã p3
ã p3
ã¯ãçŸåšã®p2
ãå£ããã«ãååãp1.T1
ã«æŽæ°ããããšã¯ã§ããŸããã
ãããåé¿ããæ¹æ³ã¯ãaïŒäºææ§/éæšå¥šæéã®çŽæããååã§åã蟌ã¿ãã£ãŒã«ããåç
§ããªãã³ãŒãã«äžè¬çã«å¶éããããbïŒåå¥ã®éæšå¥šã¹ããŒãžãè¿œå ããããšã§ãããããã£ãŠã p1
è¿œå type T1 = T2
ãšéé£ããT2
ããã®åŸã«ã p2
ïŒäŸãã°ïŒãåç
§éé£ããs2.T2
åã§ããã¹ãŠã®èŒžå
¥p2
修埩ãããŸãããããªããšã p2
ãåãæ¿ãããŸãã
ããŠãçè«çã«ã¯ãåé¡ã¯ç¡æéã«åçºããå¯èœæ§ããããŸãã p4
ã¯p3
ã€ã³ããŒãããå¯èœæ§ããããããèªäœãp2
ããã®åãåã蟌ã¿ãŸãã p3
ãã2ååã蟌ãŸãããã£ãŒã«ããååã§åç
§ããããã«ãéæšå¥šæéãå¿
èŠã§ããããã«æãããŸããïŒ ãã®å Žåãæãå
åŽã®éæšå¥šæéã¯åŸ®å°ã«ãªãããæãå€åŽã®éæšå¥šæéã¯ç¡éã«ãªããŸãã ããããåé¡ãååž°çãšèŠãªããªããŠããbïŒæéãèšãã®ã¯ããªãé£ããããã«æãããŸãïŒ p2
ã®éæšå¥šæéã¯p1
éæšå¥šæéã«å®å
šã«å«ãŸããå¿
èŠããããŸãã«å°ãªããšã2Tãéžæããå¿
èŠããããŸããããã«ããããªãªãŒã¹ãæŽåããŸãïŒã
aïŒç§ã«ãå®çšçã§ã¯ãªãããã§ãã ããšãã°ãåã«*byte.Buffer
åã蟌ãŸããŠããŠããã®ãã£ãŒã«ããèšå®ãããïŒãŸãã¯ãã®ãããã¡ãŒãä»ã®é¢æ°ã«æž¡ãããïŒå Žåãååã§åç
§ããã«ãããè¡ãæ¹æ³ã¯ãããŸããïŒstructinitializersã䜿çšããå Žåãé€ãïŒååããªããšãäºææ§ã®ä¿èšŒã倱ãããŸã:)ïŒã
ãšã€ãªã¢ã¹ãšããŠbyte
ãšrune
ãšäºææ§ãããããšã®é
åãç解ããŠããŸãã ããããå人çã«ã¯ã段éçãªä¿®åŸ©ã®ããã«åãšã€ãªã¢ã¹ã®æçšæ§ãç¶æããããšã®äºæ¬¡çãªãã®ãšèããŠããŸãã äž¡æ¹ãååŸããã¢ã€ãã¢ã®ïŒããããæªãïŒäŸã¯ããšã¯ã¹ããŒããããååã®å Žåãä»»æã®ãšã€ãªã¢ã¹ã䜿çšããŠåã蟌ã¿ãã£ãŒã«ããåç
§ã§ããããã«ããããšãšããšã¯ã¹ããŒããããŠããªãååïŒæ¬è³ªçã«åãããã±ãŒãžã«å¶éãããŠãããããäœæè
ã®å¶åŸ¡äžã«ããïŒã§ãã ïŒçŸåšææ¡ãããŠããã»ãã³ãã£ã¯ã¹ãç¶æããŸããïŒ ã¯ããç§ããã®åºå¥ãå«ãã§ãã å€å誰ããããè¯ãèããæã£ãŠããŸãã
ãšã€ãªã¢ã¹ã®@rscreã¡ãœãã
äž¡æ¹ãšãåãããã±ãŒãžã§å®çŸ©ãããŠããã¿ã€ãTã®ãšã€ãªã¢ã¹ã§ããã¿ã€ãSããããSã§ã¡ãœãããå®çŸ©ã§ããå ŽåãTãå¥ã®ããã±ãŒãžã§å®çŸ©ãããŠããpFã®ãšã€ãªã¢ã¹ã§ãããšãããã©ãã§ããããã ãããæããã«å€±æããã¯ãã§ãããèæ ®ãã¹ããœãŒã¹ã®åŒ·å¶ãå®è£ ãããã³å¯èªæ§ã«ã¯åŸ®åŠãªç¹ããããŸãïŒTãSãšã¯ç°ãªããã¡ã€ã«ã«ããå ŽåãTã§ã¡ãœãããå®çŸ©ã§ãããã©ããã¯ããã«ã¯ããããŸããã Tã®å®çŸ©ïŒã
ã«ãŒã«ïŒ type T = S
å Žåã T
ã¡ãœããã宣èšããããšã¯ã§ããŸããïŒã¯çµ¶å¯Ÿçã§ããããœãŒã¹ã®ãœãŒã¹ã調æ»ããªããŠãããœãŒã¹ã®ãã®1è¡ããé©çšãããããšãæããã§ãã Sããšã€ãªã¢ã¹ã·ãã¥ãšãŒã·ã§ã³ã®ãšã€ãªã¢ã¹ã®å Žåãšåãããã«ã
ããã«ãããŒã«ã«ã®åãšã€ãªã¢ã¹ã§ã¡ãœãããèš±å¯ãããšãåãšã€ãªã¢ã¹ãšåå®çŸ©ã®åºå¥ãææ§ã«ãªããŸãã ãšã«ããã¡ãœããã¯SãšTã®äž¡æ¹ã§å®çŸ©ãããã®ã§ãäžæ¹ã«ããèšè¿°ã§ããªããšããå¶éã¯ãè¡šçŸã§ãããã®ãå¶éããŸããã ããã¯ç©äºãããåçŽã§ããåäžã«ä¿ã€ã ãã§ãã
@jimmyfrasche type T1 = T2
ãèšè¿°ããŠããŠãT2ãåãããã±ãŒãžã«å«ãŸããŠããå ŽåãT2ãšããååã¯ããããéæšå¥šã«ãªã£ãŠããŸãã ãã®å Žåãgodocã§ã®T2ã®çºçãã§ããã ãå°ãªãããå¿
èŠããããŸãã ãããã£ãŠããã¹ãŠã®ã¡ãœãããfunc (T1) M()
ãšããŠå®£èšããããšæããŸãã
@jbaã¯ããšã€ãªã¢ã¹ã®ã¡ãœããããã®ãšã€ãªã¢ã¹ã§å®£èšãããŠããããšãå ±åããgodocã®å€æŽã§ããããœãŒã¹ã®å¯èªæ§ãå€æŽããããšãªãããã®èŠä»¶ãæºãããŸãã äžè¬ã«ããšã€ãªã¢ã·ã³ã°ãåã蟌ã¿ãå«ãŸããå Žåãç¹ã«åãå¥ã®ããã±ãŒãžããã®ãã®ã§ããå Žåã¯ãgodocãåã®å®å šãªã¡ãœããã»ããã衚瀺ãããšäŸ¿å©ã§ãã ãã®åé¡ã¯ãèšèªã»ãã³ãã£ã¯ã¹ã§ã¯ãªããããã¹ããŒããªããŒã«ã§è§£æ±ºããå¿ èŠããããŸãã
@jbaãã®å Žåããšã€ãªã¢ã¹ã®æ¹åãéã«ããªãã®ã¯ãªãã§ããïŒ type T2 = T1
ã§ã¯ãåãããã±ãŒãžæ§é ã§T1
ã¡ãœãããå®çŸ©ã§ããŸãã å¯äžã®éãã¯ã reflect
ããã±ãŒãžã«ãã£ãŠå ±åãããã¿ã€ãåã§ãããšã€ãªã¢ã¹ãè¿œå ããåã«ãååã«äŸåããªãåŒã³åºããµã€ããååã«äŸåããªãããã«ä¿®æ£ããããšã§ã移è¡ãéå§ã§ããŸãã
@jimmyfrascheææ¡æžããïŒ
ãT1ã¯T2ãèšè¿°ããå¥ã®æ¹æ³ã§ãããããç¬èªã®ã¡ãœãã宣èšã®ã»ããã¯ãããŸããã代ããã«ãT1ã®ã¡ãœããã»ããã¯T2ã®ã¡ãœããã»ãããšåãã§ããå°ãªããšãæåã®è©Šè¡ã§ã¯ãT1ã次ã®ããã«äœ¿çšããã¡ãœãã宣èšã«å¯Ÿããå¶éã¯ãããŸãããåã宣èšã§T2ã䜿çšããŠæäŸãããã¬ã·ãŒããŒã¿ã€ãã¯
ã¡ãœããã¬ã·ãŒããŒã¿ã€ããšããŠpFã䜿çšããããšã¯æ±ºããŠæå¹ã§ã¯ãããŸããã
@mdempskyã¯ã£ããããŠããŸããã§ããããç¡å¹ã ãšèšã£ãŠããŸããã
ç§ã®ãã€ã³ãã¯ããã®ç¹å®ã®ã³ãŒãè¡ãèŠãã ãã§ã¯ããããæå¹ãã©ãããã¯ã£ããããªããšããããšã§ãã
type S = T
äžããããå Žåã T
ã調ã¹ãŠãå¥ã®ããã±ãŒãžã®ã¿ã€ãããšã€ãªã¢ã¹ãããšã€ãªã¢ã¹ã§ããªãããšã確èªããå¿
èŠããããŸãã å¯äžã®å©ç¹ã¯è€éãã§ãã
ãšã€ãªã¢ã¹ã®ã¡ãœãããåžžã«çŠæ¢ããæ¹ãç°¡åã§èªã¿ããããäœã倱ãããšã¯ãããŸããã çŽããããã±ãŒã¹ãé »ç¹ã«çºçããããšã¯ãªããšæããŸãããä»ã®å Žæã§ããŸãã¯å¥ã®åçã®ã¢ãããŒãã§ã¯ããŸãåŠçã§ããªããã®ãåŸãããªãå Žåã«ããã®å¯èœæ§ã玹ä»ããå¿ èŠã¯ãããŸããã
@Merovius
p1ãåã¿ã€ãT1 = T2ã®ååãå€æŽããããã±ãŒãžp2ãp1.T2ãæ§é äœã«åã蟌ãå Žåãã€ã³ããŒã¿ãŒp3ãåã蟌ãŸããæ§é äœãååã§åç §ããå¯èœæ§ãããããããã®å®çŸ©ãp1.T1ã«æŽæ°ããããšã¯ã§ããŸããã
å€ãã®å Žåãå¿åãã£ãŒã«ããååä»ããã£ãŒã«ãã«å€æŽããã¡ãœãããæ瀺çã«è»¢éããããšã§ããã®åé¡ãåé¿ããããšãã§ããŸãã ãã ããããã¯ãšã¯ã¹ããŒããããŠããªãã¡ãœããã§ã¯æ©èœããŸããã
å¥ã®ãªãã·ã§ã³ã¯ãè£åããããã«2çªç®ã®æ©èœãè¿œå ããããšãããããŸããã ãã£ãŒã«ãã®ã¡ãœããã»ãããå¿åã«ããã«ïŒãŸãã¯æ瀺çãªååå€æŽã䜿çšããŠïŒæ¡çšã§ããå Žåã¯ãåºã«ãªãåãå€æŽãããŠããã£ãŒã«ãåãå€æŽããªãã§ããããšãã§ããŸãã
ããªãã®äŸããã®å®£èšãèããŠã¿ãŸãããïŒ
package p2
type S struct {
p1.T2
}
è£æ£æ©èœã®1ã€ã¯ãããã£ãŒã«ããšã€ãªã¢ã¹ãã§ããå¯èœæ§ããããŸããããã¯ããšã€ãªã¢ã¹ãå ¥åããã®ãšåæ§ã®æ§æã«åŸããŸãã
package p2
type S struct {
p1.T1
T2 = T1 // field T2 is an alias for field T1.
}
var s S // &s.T2 == &s.T1
å¥ã®è£æ£æ©èœã¯ãå§ä»»ãã§ããå¯èœæ§ããããŸããããã¯ãå¿åãã£ãŒã«ãã®ã¡ãœããã»ãããæ瀺çã«æ¡çšããŸãã
package p2
type S struct {
T2 p1.T1 delegated // T2 is a field of type T1.
// The method set of S includes the method set of T1 and forwards those calls to field T2.
}
ç§ã¯ãã£ãŒã«ããšã€ãªã¢ã¹ãèªåã§å¥œããšæããŸãããªããªãããããã¯å¥ã®çš®é¡ã®æ®µéçãªä¿®åŸ©ãå¯èœã«ããããã§ãããã€ã³ã¿ãšã€ãªã¢ã¹ãäžè²«æ§ã®ãã°ãå°å ¥ããã«æ§é äœã®ãã£ãŒã«ãã®ååãå€æŽããããšã§ãã
@Meroviusäž»ãªåé¡ã¯ãã¿ã€ãã®ååããšã€ãªã¢ã¹ã«ãã£ãŠå€æŽãããå Žåã§ãã
ç§ã¯ãããå®å šã«ã¯èæ ®ããŠããŸããâãããããŠééããã ãã§ããã ã©ã³ãã ãªèãã§ãïŒ
ããã±ãŒãžã«ååãä»ããŠãããåã蟌ããšã€ãªã¢ã¹ãå°å ¥ãããšã©ããªããŸããïŒ
ãããäœããä¿®æ£ãããã©ããã¯ããããŸããããã«ãŒããå£ãã®ã«æéãããããããããŸãããïŒ
@bcmillsãã®åé¿çã«ã€ããŠã¯èããŠããŸããã§ãããããããšãã ãšã¯ã¹ããŒããããŠããªãã¡ãœããã«é¢ããèŠåã¯ãå®éã«ã¯ãã£ãã«çºçããªããããäžè¬çã«ç§ã®æèŠãæºãããããšã¯ãªããšæããŸãïŒå®å šã«ç解ããŠããªãéããããã圹ç«ã€ãšæãããå Žåã¯ãé æ ®ãªãæ確ã«ããŠãã ããã ïŒã ãã以äžã®å€æŽãç©ã¿éããããšã¯æ£åœåãããªããšæããŸãïŒãŸãã¯è¯ãèãã§ãïŒã
@Meroviusèããã°èããã»ã©ããã£ãŒã«ããšã€ãªã¢ã¹ã®ã¢ã€ãã¢ã奜ãã«ãªããŸãã
ã¡ãœãããæ瀺çã«è»¢éããããšã¯ããšã¯ã¹ããŒãããããšããŠãé¢åã§ãããä»ã®çš®é¡ã®ãªãã¡ã¯ã¿ãªã³ã°ãå£ããŸãïŒããšãã°ãåã蟌ã¿åã«ã¡ãœãããè¿œå ãããããåã蟌ãåãåãã€ã³ã¿ãŒãã§ã€ã¹ãæºããç¶ããããšãæåŸ ããŸãïŒã ãŸããæ§é äœãã£ãŒã«ãã®ååãå€æŽããããšããã³ãŒãã®æ®µéçãªä¿®åŸ©ãå¯èœã«ãããšããäžè¬çãªç¯å²ã«å«ãŸããŸãã
@Merovius
p1ãåã¿ã€ãT1 = T2ã®ååãå€æŽããããã±ãŒãžp2ãp1.T2ãæ§é äœã«åã蟌ãå Žåãã€ã³ããŒã¿ãŒp3ãåã蟌ãŸããæ§é äœãååã§åç §ããå¯èœæ§ãããããããã®å®çŸ©ãp1.T1ã«æŽæ°ããããšã¯ã§ããŸããã ãã®å Žåãp2ã¯p3ãå£ããã«p1.T1ã«åãæ¿ããããšã¯ã§ããŸããã p3ã¯ãçŸåšã®p2ãå£ããã«ãååãp1.T1ã«æŽæ°ããããšã¯ã§ããŸããã
ããªãã®äŸãç解ãããšã次ã®ããã«ãªããŸãã
package p1
type T2 struct {}
type T1 = T2
package p2
import "p1"
type S struct {
p1.T2
F2 string // see below
}
ããã¯ãæ§é äœãã£ãŒã«ãã®ååãå€æŽãããäžè¬çãªã±ãŒã¹ã®ç¹å®ã®äŸã«ãããªããšæããŸãã S.F2ã®ååãS.F1ã«å€æŽããå Žåããåãåé¡ãåœãŠã¯ãŸããŸãã
ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãããŒã«ã«ã¿ã€ããšã€ãªã¢ã¹ã§p1ã®æ°ããAPIã䜿çšããããã«ããã±ãŒãžp2ãæŽæ°ããå ŽåããããŸãã
package p2
import "p1"
type T2 = p1.T1
type S struct {
T2
}
ãã¡ãããããã¯é·æçãªè§£æ±ºçãšããŠã¯é©åã§ã¯ãããŸããã p2ããšã¯ã¹ããŒããããAPIãå€æŽããŠT2åãåé€ããå¿ èŠããããšããäºå®ãåé¿ããæ¹æ³ã¯ãªããšæããŸããããã£ãŒã«ãã®ååå€æŽãšåãããã«é²è¡ããŸãã
ãããã±ãŒãžéã§ã®ã¿ã€ãã®ç§»åãã«é¢ãã泚æäºé ã ãã®å®åŒåã¯å°ãåé¡ããããŸãããïŒ
ç§ãç解ããŠããéãããã®ææ¡ã§ã¯ãæ°ããååãä»ããŠå¥ã®ããã±ãŒãžã«ãããªããžã§ã¯ãå®çŸ©ããåç §ãããããšãã§ããŸãã
ãªããžã§ã¯ãå®çŸ©ã¯ç§»åããŸãããã ïŒãããããšã€ãªã¢ã¹ã䜿çšããŠã³ãŒããèšè¿°ããªãéãããŠãŒã¶ãŒã¯ãdraw pkgã®å Žåãšåæ§ã«ããšã€ãªã¢ã¹ãåç §ããå Žæãèªç±ã«å€æŽã§ããŸãïŒã
@atdiarå¥ã®ããã±ãŒãžã®ã¿ã€ããåç §ããããšã¯ãã¿ã€ãã移åããã¹ããããšããŠäœ¿çšã§ããŸãã ã¯ãããšã€ãªã¢ã¹ã¯ã¿ã€ãã移åããŸãããã移åããããã®ããŒã«ãšããŠäœ¿çšã§ããŸãã
@Meroviusãããè¡ããšããªãã¬ã¯ã·ã§ã³ãšãã©ã°ã€ã³ãç Žæããå¯èœæ§ããããŸãã
@atdiarç³ãèš³ãããŸããããããªããäœãèšãããšããŠããã®ãããããŸããã ãã®ã¹ã¬ããã®å ã®ã³ã¡ã³ããããã«ãªã³ã¯ãããŠãã段éçãªä¿®åŸ©ã«é¢ããèšäºãããã³ãããŸã§ã®è°è«ãèªãã ããšããããŸããïŒ ãããŸã§èæ ®ãããŠããªãã£ãè°è«ãè°è«ã«å ããããšããŠããã®ã§ããã°ããã£ãšæ確ã«ããå¿ èŠããããšæããŸãã
æåŸã«ãæçšã§ããæžãããææ¡ã åãšã€ãªã¢ã¹ãå¿ èŠã§ããåãšã€ãªã¢ã¹ãªãã§åäžã®APIãäœæããããšã«ã¯å€§ããªåé¡ããããŸãããããŸã§ã®ãšããããããå®çŸããããã«ããŸã奜ãã§ã¯ãªãæ¹æ³ã§ã³ãŒããäœæããå¿ èŠããããŸãã ããã¯gov1.8ã«å«ãŸããŠããå¿ èŠããããŸãããæé ãã«ãªãããšã¯ãªãã®ã§ã1.9ã«é²ãã§ãã ããã
@Merovius
ç§ã¯ããã±ãŒãžéã®ãã¿ã€ãã®ç§»åãã«ã€ããŠæ瀺çã«è©±ããŠããã ãªããžã§ã¯ãå®çŸ©ãå€æŽããŸãã ããšãã°ãpkg Reflectã§ã¯ãäžéšã®æ
å ±ã¯ãªããžã§ã¯ããå®çŸ©ãããããã±ãŒãžã«é¢é£ä»ããããŠããŸãã
å®çŸ©ã移åãããšãå£ããããšããããŸãã
@katarasããã¯æ¬åœã«è¯ãããã¥ã¡ã³ããã³ã¡ã³ãã«ã€ããŠã§ã¯ãªããåã«åå®çŸ©ã移åããŠã¯ãªããªããšããããšã§ãã ãšã€ãªã¢ã¹ã®ææ¡ã«æè¬ããŠããã®ãšåããããã人ã ããããã§ãããšæã£ãŠããã®ã§ã¯ãªãããšå¿é ããŠããŸãã
@atdiarããäžåºŠãå ã®ã³ã¡ã³ããšãããŸã§ã®è°è«ããã®èšäºãèªãã§ãã ããã 移åã¿ã€ããšæžå¿µäºé ãžã®å¯ŸåŠæ¹æ³ã¯ããã®ã¹ã¬ããã®äž»ãªæžå¿µäºé ã§ãã ã©ã¹ã®èšäºãããªãã®æžå¿µã«é©åã«å¯ŸåŠããŠãããšæããªãå Žåã¯ã圌ã®èª¬æãæºè¶³ã®ãããã®ã§ã¯ãªãçç±ãå ·äœçã«èª¬æããŠãã ããã :)
@katarasç§ã¯å人çã«ã¯åæããŸããããã®æ©èœãã©ãã»ã©éèŠã§ããããåçŽã«äž»åŒµããããšã¯ãç¹ã«åœ¹ç«ã€ãšã¯æããŸããã 人ã ã®æžå¿µã«å¯ŸåŠããããã«å»ºèšçãªè°è«ãããå¿ èŠããããŸãã :)
@Meroviusããã¥ã¡ã³ããèªã¿ãŸããã ããã¯ç§ã®è³ªåã«çããŸããã ç§ã¯ååã«æ確ã«ãããšæããŸãã ããã¯ã以åã®ãšã€ãªã¢ã¹ææ¡ãå®è£ ããããšãæããšã©ãŸãããã®ãšåãåé¡ã«é¢é£ããŠããŸãã
@atdiarå°ãªããšããããããŸããã ã¿ã€ãã移åãããšåé¡ãçºçãããšãã£ããã£ãŠããŸãã ææ¡ã¯ããšã€ãªã¢ã¹ã䜿çšããŠæ®µéçãªä¿®åŸ©ã§ãã®ãããªç Žæãåé¿ããå€ãã¿ã€ãã䜿çšããã³ãŒãããªããªããŸã§åéäŸåé¢ä¿ãæŽæ°ããŠãããå€ãã¿ã€ããåé€ããæ¹æ³ã«é¢ãããã®ã§ãã ããªãã¬ã¯ã·ã§ã³ãšãã©ã°ã€ã³ããå£ããŠãããšããããªãã®äž»åŒµãããããã®ä»®å®ã®äžã§ã©ã®ããã«æãç«ã€ãã¯ããããŸããã ããªããä»®å®ã«çåãåãããã®ã§ããã°ãããã¯ãã§ã«è°è«ãããŠããŸãã
ãŸãããšã€ãªã¢ã¹ã1.8ã«å ¥ãã®ã劚ããåé¡ããããªãã®èšã£ãããšã«ã©ã®ããã«é¢ä¿ããŠãããããããŸããã ç§ã®ç¥ãéããããããã®åé¡ã¯ïŒ17746ãšïŒ17784ã§ãã åã蟌ã¿ã®åé¡ïŒç§ã¯åæããŸããããç Žæãåçã«é¢é£ããŠãããšè§£éãããå¯èœæ§ããããŸãïŒã«ã€ããŠèšåããŠããå Žåãããã¯æ£åŒãªææ¡ã§æ±ãããŸãïŒãã ããäžèšãåç §ããŠãã ãããææ¡ããã解決çã¯ãã£ãšè°è«ãã䟡å€ããããšæããŸãïŒãããŠãããªãã¯ãããä¿¡ããããªãçç±ã«ã€ããŠå ·äœçã«ããå¿ èŠããããŸãã
ããã§ãç³ãèš³ãããŸããããããããããªãã¯ååã«å ·äœçã§ã¯ãããŸããã§ããã ããªããèšåããŠããã以åã®ãšã€ãªã¢ã¹ææ¡ã®å®è£ ãæããšã©ãŸãããã®ãšåãåé¡ãã®åé¡çªå·ããããŸãããããã¯ãç解ãå©ããããã«ããããŸã§ã«è¿°ã¹ãããšã«é¢é£ããŠããŸããã ããªãã話ããŠããç Žæã®å ·äœäŸãæããŠããã ããŸããïŒãã®ã¢ããã¹ã¬ããã®äŸãåç §ããŠãã ãããäžé£ã®ããã±ãŒãžãåå®çŸ©ãããã³ããã€ãã®ã³ãŒãã瀺ããææ¡ã©ããã«å€æãããšãã«ã©ã®ããã«ç Žæãããã説æããŠãã ããïŒã ããªããããªãã®æžå¿µã«å¯ŸåŠãããã®ãªããããªãã¯æ¬åœã«ä»ã®äººãæåã«ããããç解ããã®ãå©ããå¿ èŠããããŸãã
@Meroviusã§ã¯ããããã®äŸåé¢ä¿ã®1ã€ãreflect.Type.PkgPathïŒïŒã調ã¹ãŠããæšç§»çãªäŸåé¢ä¿ã®å Žåãã©ããªããŸããïŒ
ããã¯ãåã蟌ã¿ã®åé¡ã§çºçããã®ãšåãåé¡ã§ãã
@atdiarç³ãèš³ãããŸãããããããŸã§ã®ãã®ã¹ã¬ããã§ã®è°è«ãšãã®ææ¡ã®å 容ãèæ ®ãããšããããã©ã®ããã«ç解ã§ããæžå¿µã§ãããã¯ããããŸããã ç§ã¯ä»ããã®ç¹å®ã®ãµãã¹ã¬ããããæãåºããããªãã®ç°è°ãããããç解ããŠãããããããªãä»ã®äººã«ãããã«å¯ŸåŠããæ©äŒãäžããŸãã
ç°¡æœã«èšãæããŸãã
åé¡ã¯ãåå®çŸ©ãããèªäœã®å ŽæãããŒãã³ãŒãããŠãããšããäºå®ãèãããšãåã®åçæ§ã«é¢ãããã®ã§ãã
åã®åçæ§ã¯å®è¡æã«ãã¹ããããå¯èœæ§ãããããã¹ãããããããåã®ç§»åãããã«ç°¡åã§ãããã¯ããããŸããã
ãã®ãã¿ã€ãã®ç§»åãã®ãŠãŒã¹ã±ãŒã¹ã¯ãé¢ããå Žæã«ããå€ãã®ããã±ãŒãžãå£ããŠããŸãå¯èœæ§ããããšããèŠåãçºããŠããã ãã§ãã ãã©ã°ã€ã³ã«ã€ããŠãåæ§ã®å¿é ããããŸãã
ïŒåãããã«ãããã±ãŒãžå ã®ãã€ã³ã¿ãŒã®ã¿ã€ããå€æŽãããšãä»ã®å€ãã®ããã±ãŒãžãå£ããŸãããã®äžŠååŠçã«ãã£ãŠç¶æ³ãæ確ã«ãªãå Žåã§ããïŒ
@atdiarç¹°ãè¿ããŸããããã®åé¡ã¯2ã€ã®ã¹ãããã§åã移åããããšã«é¢ãããã®ã§ããæåã«å€ãå Žæãéæšå¥šã«ããéã®äŸåé¢ä¿ãæŽæ°ããŠãããåã移åããŸãã _ãã¡ãã_ã¿ã€ãã移åããã ãã§åé¡ãçºçããŸãããããã¯ãã®åé¡ã®åå ã§ã¯ãããŸããã ããã¯ããããè¡ãããã®æ®µéçãªãã«ãã¹ããããœãªã¥ãŒã·ã§ã³ãå¯èœã«ããããšã§ãã ããã§ææ¡ããããœãªã¥ãŒã·ã§ã³ã®ããããããã®ãã«ãã¹ãããããã»ã¹ãæå¹ã«ããªããšããæžå¿µãããå Žåã¯ãæ£ç¢ºã«ã段éçãªä¿®åŸ©ã³ãããã®åççãªã·ãŒã±ã³ã¹ãç Žæãé²ãããšãã§ããªãç¶æ³ã説æããŠãã ããã
@niemeyer
ããã«ããã1ã€ãš2ã€ã®ç¬ç«ããã¿ã€ããäœæãããã€ã³ã¿ãŒãã§ã€ã¹{}ãåæ ãããã©ããã«é¢ä¿ãªããããã
åãããŸããã 1ãš2ã®éã§å€æããããšãã§ããŸãã äžèšã®ã¢ããã¿ãŒã®ææ¡ã¯ãããæåŸã«ããŸã
ã¢ããã¿ãŒã®èªåã¹ãããã ããªãã¯è€æ°ã®çç±ã§ææ¡ãæ°ã«å ¥ããªããããããŸããããäœããããŸãã
ããã«ã€ããŠççŸããŠããã
éã§å€æããããšã¯ã§ããŸãã
func() one
ãš
func() two
@Meroviusããããã
æ確ã«ããããã«ãç§ã¯ãšã€ãªã¢ã¹ã®ææ¡ã«å察ããŠããã®ã§ã¯ãªãããããã±ãŒãžéã§ã¿ã€ãã移åããããšããå®åŒåã«å察ããŠããŸããããã¯ããŸã å®å šã§ããããšã蚌æãããŠããªããŠãŒã¹ã±ãŒã¹ãæå³ããŸãã
@jimmyfrasche reäºæž¬å¯èœæ§ã®ã¡ãœãããªã³ãšã€ãªã¢ã¹ã®åŠ¥åœæ§ïŒ
func (t T) M()
ãæå¹ãªå Žåãããã°ãç¡å¹ãªå ŽåããããŸãã 人ã
ã¯ãããã®å¢çãããŸãé »ç¹ã«æŒãåºããªãã®ã§ãããã¯ããŸãåºãŠããŸããã ã€ãŸããå®éã«ã¯ããŸãæ©èœããŸãã https://play.golang.org/p/bci2qnldejã ãããã«ãããããã¯_å¯èœæ§ã®ãã_å¶éã®ãªã¹ãã«ãããŸãã èãããããã¹ãŠã®å¶éãšåæ§ã«ãè€éããå¢ãããããã®è€éããè¿œå ããåã«ãå
·äœçãªå®äžçã®èšŒæ ã確èªããå¿
èŠããããŸãã
@Merovius ãååã®ååã蟌ã¿ïŒ
ç§ã¯ç¶æ³ãå®å šã§ã¯ãªãããšã«åæããŸãã ãã ããio.ByteBufferãžã®åç §ã§ãã£ã±ãã®ã³ãŒãããŒã¹ãããããããbytes.Bufferã«ç§»åãããå Žåã¯ãå°å ¥ã§ããããã«ããããšæããŸãã
package io
type ByteBuffer = bytes.Buffer
io.ByteBufferãžã®æ¢åã®åç §ãæŽæ°ããã«ã ã¿ã€ãå®çŸ©ããšã€ãªã¢ã¹ã«çœ®ãæããçµæãio.ByteBufferãåã蟌ãŸããŠãããã¹ãŠã®å Žæã§ããã£ãŒã«ãã®ååãèªåçã«Bufferã«å€æŽãããå Žåãç§ã¯äžçãå£ãã段éçãªä¿®åŸ©ã¯ãããŸããã å¯Ÿç §çã«ãåã蟌ãŸããio.ByteBufferã®ååããŸã ByteBufferã§ããå Žåã¯ã䜿çšæ³ãäžåºŠã«1ã€ãã€æŽæ°ããŠã段éçã«ä¿®åŸ©ããããšãã§ããŸãïŒè€æ°ã®æé ãå®è¡ããå¿ èŠãããå¯èœæ§ããããŸããããããçæ³çã§ã¯ãããŸããïŒã
ããã«ã€ããŠã¯ãïŒ17746ã§ããçšåºŠè©³ãã説æããŸããã ç§ã¯ããšããšãåã蟌ãŸããio.ByteBufferãšã€ãªã¢ã¹ã®ååãBufferã§ãããšããåŽã«ããŸããããäžèšã®è°è«ã¯ç§ãééã£ãŠãããšç¢ºä¿¡ããŸããã ç¹ã«@jimmyfrascheã¯ãåã蟌ãŸãããã®ã®å®çŸ©ã«å¿ããŠã³ãŒããå€æŽãããªãããšã«ã€ããŠãããã€ãã®è¯ãè°è«ãããŸããã åã蟌ãŸãããšã€ãªã¢ã¹ãå®å šã«çŠæ¢ããã®ã¯é£ãããšæããŸãã
ããªãã®äŸã®p2ã«ã¯åé¿çãããããšã«æ³šæããŠãã ããã p2ãio.ByteBufferãåç §ããã«ByteBufferãšããååã®åã蟌ã¿ãã£ãŒã«ããæ¬åœã«å¿ èŠãšããå Žåã¯ã次ã®ããã«å®çŸ©ã§ããŸãã
type ByteBuffer = bytes.Buffer
次ã«ãio.ByteBufferã®ä»£ããã«ByteBufferïŒã€ãŸããp2.ByteBufferïŒãåã蟌ã¿ãŸãã ãããå®ç§ã§ã¯ãããŸããããä¿®çãç¶ããããšãã§ãããšããããšã§ãã
ãããå®å šã§ã¯ãªãããã£ãŒã«ãã®ååå€æŽãäžè¬çã«ãã®ææ¡ã§å¯ŸåŠãããŠããªãã®ã¯ééããããŸããã åã蟌ã¿ã¯åºã«ãªãååã«ææã§ãã£ãŠã¯ãªããããååNãšããŠXãåã蟌ããããã®ããçš®ã®æ§æãå¿ èŠã§ããå¯èœæ§ããããŸãã åŸã§ãã£ãŒã«ããšã€ãªã¢ã¹ãè¿œå ããå¿ èŠãããå ŽåããããŸãã ã©ã¡ããå éšçã«åççãªã¢ã€ãã¢ã®ããã«æãããããããäž¡æ¹ãšãå¥ã ã§ããå¿ èŠããããåŸã®ææ¡ã¯å¿ èŠæ§ã®å®éã®èšŒæ ã«åºã¥ããŠè©äŸ¡ãããŸãã ã¿ã€ããšã€ãªã¢ã¹ãããã£ãŒã«ããšã€ãªã¢ã¹ã®æ¬ åŠã倧èŠæš¡ãªãªãã¡ã¯ã¿ãªã³ã°ã®æ¬¡ã®å€§ããªé害ãšãªãç¹ã«å°éããã®ã«åœ¹ç«ã€å Žåãããã¯é²æ©ããã§ãããïŒ
ïŒ/ cc @neildããã³@bcmillsïŒ
@atdiar ãã¯ãã
@rscç§ã念é ã«çœ®ããŠããã®ã¯ãaïŒãšã€ãªã¢ã¹ãšãã®å®çŸ©ã¿ã€ãã®äž¡æ¹ãåãæ§é äœã«åã蟌ãããšãçŠæ¢ããïŒbããã®ãããŸãããé²ãããïŒãbïŒãœãŒã¹ã³ãŒãå ã®ããããã®ååã§ãã£ãŒã«ããåç §ã§ããããã«ãããcïŒãããããéžæãããŸãã¯çæãããã¿ã€ãæ å ±/ãªãã¬ã¯ã·ã§ã³ãªã©ã®ãã®ä»ïŒã©ã¡ãã§ãæ§ããŸããïŒã
ããã¯ãç§ã説æããããšããçš®é¡ã®ç Žæãåé¿ããã®ã«åœ¹ç«ã€ãšåæã«ãéžæãå¿ èŠãªå Žåã®æ確ãªéžæãè¡ãã®ã«åœ¹ç«ã€ãšãç§ã¯æãæ¯ã£ãŠäž»åŒµããŸãã ãããŠãå人çã«ã¯ããªãã¬ã¯ã·ã§ã³ã«äŸåããã³ãŒããå£ããªãããšãããããªãã¬ã¯ã·ã§ã³ã«äŸåããã³ãŒããå£ããªãããšã«é¢å¿ããããŸãã
ããªãã®ByteBufferåŒæ°ãç解ããŠãããã©ããã¯ä»ã®ãšããããããŸããããç§ãé·ãä»äºã®çµããã«ããã®ã§ããã以äžèª¬æããå¿ èŠã¯ãããŸãããçŽåŸããããªãå Žåã¯ãæçµçã«å¿çããŸã:)
@MeroviusåçŽãªã«ãŒã«ãè©ŠããŠãããè€éãªã«ãŒã«ãå°å ¥ããåã«ãã©ããŸã§å°éã§ãããã確èªããã®ã¯çã«ããªã£ãŠãããšæããŸãã å¿ èŠã«å¿ããŠãåŸã§ïŒaïŒãšïŒbïŒãè¿œå ã§ããŸãã ïŒcïŒã¯äœããã£ãŠãäžããããŸãã
ç§ã¯ãïŒbïŒãç¹å®ã®ç¶æ³ã§ã¯è¯ãèãã§ãããããããªãããä»ã®ç¶æ³ã§ã¯ããã§ã¯ãªããããããªãããšã«åæããŸãã åè¿°ã®ã1ã€ã®ããã±ãŒãžAPIãè€æ°ã®å®è£ ããã±ãŒãžã«æ§é åããããŠãŒã¹ã±ãŒã¹ã«ã¿ã€ããšã€ãªã¢ã¹ã䜿çšããŠããå Žåã¯ããšã€ãªã¢ã¹ãåã蟌ãã§ä»ã®ååïŒå éšããã±ãŒãžã«å«ãŸããŠããå¯èœæ§ããããŸãïŒãå ¬éããããªãå ŽåããããŸãããã以å€ã®å Žåãã»ãšãã©ã®ãŠãŒã¶ãŒã¯ã¢ã¯ã»ã¹ã§ããŸããïŒã ãã£ãšçµéšãç©ãã§ããã ããã°ãšæããŸãã
@rsc
ããããããšã€ãªã¢ã¹å¯èœæ§ã«é¢ããããã±ãŒãžã¬ãã«ã®æ
å ±ããªããžã§ã¯ããã¡ã€ã«ã«è¿œå ãããšåœ¹ç«ã€å ŽåããããŸãã
ïŒgoãã©ã°ã€ã³ãé©åã«æ©èœãç¶ããå¿
èŠããããã©ãããèæ
®ã«å
¥ããªãããïŒ
@Merovius @rsc
aïŒãšã€ãªã¢ã¹ãšãã®å®çŸ©åã®äž¡æ¹ãåãæ§é äœã«åã蟌ãããšãçŠæ¢ãã
å€ãã®å Žåãåã蟌ã¿ãã¡ãœããã»ãããšçžäºäœçšããæ¹æ³ã®çµæãšããŠãããã¯ãã§ã«çŠæ¢ãããŠããããšã«æ³šæããŠãã ããã ïŒåã蟌ã¿åã«ç©ºã§ãªãã¡ãœãããèšå®ãããŠããŠããããã®ã¡ãœããã®1ã€ãåŒã³åºãããå Žåãããã°ã©ã ã¯ã³ã³ãã€ã«ã«å€±æããŸãïŒhttpsïŒ//play.golang.org/p/XkaB2a0_RKãïŒ
ãããã£ãŠãäºéåã蟌ã¿ãçŠæ¢ããæ瀺çãªã«ãŒã«ãè¿œå ããŠããããäžéšã®ã±ãŒã¹ã§ã®ã¿éããçããããã«æãããŸãã ç§ã«ã¯è€éã«ãã䟡å€ããªãããã§ãã
代ããã«ä»£æ°åãšããŠåãšã€ãªã¢ã¹ã«ã¢ãããŒãããåã®ã»ãããžã®ãšã€ãªã¢ã¹ããµããŒãããŠãã³ã³ãã€ã«æã®åãã§ãã¯ãšåçã®ç©ºã®ã€ã³ã¿ãŒãã§ã€ã¹ãããŒãã¹ãšããŠååŸããŠã¿ãŸãããïŒ
type Stringeroonie = {string,fmt.Stringer}
@ j7b
代ããã«ä»£æ°åãšããŠåãšã€ãªã¢ã¹ã«ã¢ãããŒãããäžé£ã®åãžã®ãšã€ãªã¢ã¹ããµããŒãããŠã¿ãŸããã
ãšã€ãªã¢ã¹ã¯ãæå³çããã³æ§é çã«å ã®ã¿ã€ããšåçã§ãã 代æ°çããŒã¿åã¯ããã§ã¯ãããŸãããäžè¬çãªå Žåãã¿ã€ãã¿ã°çšã«è¿œå ã®ã¹ãã¬ãŒãžãå¿ èŠã§ãã ïŒGoã€ã³ã¿ãŒãã§ãŒã¹åã¯ãã§ã«ãã®åæ å ±ãæã£ãŠããŸãããæ§é äœãä»ã®éã€ã³ã¿ãŒãã§ãŒã¹åã¯æã£ãŠããŸãããïŒ
@bcmills
ããã¯èª€ã£ãæšè«ãããããŸããããã¿ã€ãTã®ãšã€ãªã¢ã¹Aã¯ãAãã€ã³ã¿ãŒãã§ã€ã¹{}ãšããŠå®£èšããã¿ã€ãAã®å€æ°ã宣èšãããŠããã¹ã³ãŒãã§ã³ã³ãã€ã©ã«ã¿ã€ãAã®å€æ°ãééçã«å€æãããããšãšåçã§ãããããåé¡ã«åãçµãããšãã§ãããšæããŸããã ãããã¯ã»ãšãã©ç·åœ¢ã®ã³ã³ãã€ã«æã³ã¹ãã§ãããæ確ã§ããã type T =
æ§æã䜿çšããŠä»£æ°ãå«ãã³ã³ãã€ã©ç®¡çã®ç䌌åã®åºç€ãäœæããã³ã³ãã€ã«æã«äžå€ã®åç
§ãªã©ã®åãå®è£
ã§ããããã«ããããšãã§ããŸãããŠãŒã¶ãŒã³ãŒãã«é¢ããéããã€ã³ã¿ãŒãã§ãŒã¹{}ã¯ãå
éšãã«ãããŸããã
ãã®äžé£ã®æèã®æ¬ é¥ã¯ããããç¡ç¥ã®ç£ç©ã§ãããç§ã¯æŠå¿µã®å®çšçãªèšŒæãæäŸããç«å Žã«ãªãã®ã§ããããäžååã§ããããšãåãå ¥ããŠå»¶æããããšãå¬ããæããŸãã
@ j7b 1ã€ã®æ®µéçãªä¿®åŸ©åé¡ã®è§£æ±ºçãããADTã§ãã£ãŠããç¬èªã®åé¡ãäœæããŸãã äŸåé¢ä¿ãå£ããã«ADTã®ã¡ã³ããŒãè¿œå ãŸãã¯åé€ããããšã¯äžå¯èœã§ãã ãããã£ãŠãæ¬è³ªçã«ã¯ã解決ãããããå€ãã®åé¡ãäœæããããšã«ãªããŸãã
interface {}ãšã®éã§ééçã«å€æãããšããããªãã®èãã¯ã []interface{}
ãããªé«æ¬¡ã®åã§ãæ©èœããŸããã ãããŠæçµçã«ã¯ãgoã®é·æã®1ã€ã倱ãããšã«ãªããŸããããã¯ããŠãŒã¶ãŒãããŒã¿ã¬ã€ã¢ãŠããå¶åŸ¡ã§ããããã«ãã代ããã«ãã¹ãŠãã©ããããJavaã®åŠçãå®è¡ããããšã§ãã
ADTã¯ããã§ã®è§£æ±ºçã§ã¯ãããŸããã
@Merovius代æ°åã®æ§æã«ååã®å€æŽãå«ãŸããŠããå ŽåïŒããã¯åãã®åççãªå®çŸ©ãšäžèŽããŸãïŒãããã¯è§£æ±ºçã§ããããã®ã€ã³ã¿ãŒãã§ã€ã¹{}ã¯ã³ã³ãã€ã©ã管çããå°åœ±ãšéžæã®åœ¢åŒã®ãããã·ãšããŠæ©èœã§ãããšç¢ºä¿¡ããŠããŸãã説æãããŠãããããŒã¿ã¬ã€ã¢ãŠããã©ã®ããã«é¢é£ããŠãããããé«æ¬¡ãåãã©ã®ããã«å®çŸ©ããŠãããã¯ããããŸãããåã¯ã宣èšã§ããå Žåã¯åãªãåã§ããã[] interface {}ã¯åãªãåã§ãã
ããã¯ããŠããã type T =
ã¯ãååã®å€æŽãè¶
ããçŽæçã§äŸ¿å©ãªæ¹æ³ã§ãªãŒããŒããŒããããå¯èœæ§ãããããšã確信ããŠããŸãã代æ°åãšå
¬çã«äžå€ã®åç
§ã¯æãæçœãªã¢ããªã±ãŒã·ã§ã³ã®ããã§ãããããã£ãŠãä»æ§ã«ãã®æ§æãèšèŒãããŠããããšãé¡ã£ãŠããŸããã³ã³ãã€ã©ã管çããã¡ã¿åãŸãã¯ç䌌åã瀺ããã³ã³ãã€ã©ã管çããåã圹ç«ã€å¯èœæ§ã®ãããã¹ãŠã®æ¹æ³ãšããããã®äœ¿çšæ³ãæãããè¡šãæ§æãèæ
®ãããŸãã æ°ããæ§æã¯ã修食åãšããŠäœ¿çšãããšãã«ã°ããŒãã«ã«äºçŽãããåèªã®ã»ããã«é¢ä¿ããå¿
èŠããªãããã type A = alias Type
ãããªãã®ã¯æ確ã§æ¡åŒµå¯èœã§ãã
@ j7b
ããã¯ããŠãããç§ã¯ããžãã£ãã¿ã€ãã§ãT =ååãå€æŽããã ãã§ãªããçŽæçã§äŸ¿å©ãªæ¹æ³ã§ãªãŒããŒããŒããããå¯èœæ§ããããŸãã
ç§ã¯ç¢ºãã«ããããªãããšãæã¿ãŸãã ä»æ¥ãGoã¯ïŒã»ãšãã©ïŒããŸãçŽäº€ããŠããããã®çŽäº€æ§ãç¶æããããšã¯è¯ãããšã§ãã
ä»æ¥ãGoã§æ°ããåTã宣èšããæ¹æ³ã¯type T def
ãããã§ã def
ã¯æ°ããåã®å®çŸ©ã§ãã 代æ°çããŒã¿åïŒå¥åã¿ã°ä»ãå
±çšäœïŒãå®è£
ããå Žåãåãšã€ãªã¢ã¹ã®æ§æã§ã¯ãªãããã®æ§æã«åŸãããšãæåŸ
ããŸãã
ç§ã¯ã¿ã€ããšã€ãªã¢ã¹ã®å¥ã®èŠç¹ïŒãµããŒãïŒãæå ¥ããã®ã奜ãã§ããããã¯ããªãã¡ã¯ã¿ãªã³ã°ä»¥å€ã®ä»£æ¿ãŠãŒã¹ã±ãŒã¹ãžã®æŽå¯ãæäŸããå¯èœæ§ããããŸãã
å°ãåã«æ»ã£ãŠã type T <a type>
ã®åœ¢åŒã®éåžžã®å€ãGoå宣èšããªããåãšã€ãªã¢ã¹å®£èštype A = <a type>
ã®ã¿ããããšä»®å®ããŸãããã
ïŒå šäœåãå®æãããããã«ãã¡ãœãããäœããã®åœ¢ã§ç°ãªãæ¹æ³ã§å®£èšãããŠãããšä»®å®ããŸããã-ã¬ã·ãŒããŒãšããŠäœ¿çšãããååä»ãåãžã®é¢é£ä»ãã§ã¯ãªããã§ããªãããã§ããããšãã°ãæåéãã¡ãœãããæã€ã¯ã©ã¹åã®æŠå¿µãæ³åã§ããŸããå éšã§ãããããã¡ãœããã宣èšããããã«ååä»ãåã«äŸåããå¿ èŠã¯ãããŸãããæ§é çã«åäžã§ãããã¡ãœãããç°ãªã2ã€ã®åã¯ãç°ãªãåã«ãªããŸãããã®æèå®éšã§ã¯ã詳现ã¯éèŠã§ã¯ãããŸãããïŒ
ãã®ãããªäžçã§ã¯ãä»æžããŠããã®ãšã»ãŒåãã³ãŒããæžãããšãã§ãããšç§ã¯äž»åŒµããŸããïŒãšã€ãªã¢ã¹ïŒååã䜿çšããã®ã§ãç¹°ãè¿ãå¿ èŠã¯ãããŸãããåèªäœã¯ãåã§ããŒã¿ã䜿çšããããšã確èªããŸãã -å®å šãªæ¹æ³ã
èšãæããã°ãGoããã®ããã«èšèšãããŠãããšããããç§ãã¡ãæŠããŠå€§äžå€«ã ã£ãã§ãããã
ããã«ããã®ãããªäžçã§ã¯ãã¿ã€ãã¯æ§é çã«åäžã§ããã°ïŒååã«é¢ä¿ãªãïŒåäžã§ããããããªãã¡ã¯ã¿ãªã³ã°ã§çºçããåé¡ã¯ããããçŸãããå¿ èŠããããŸãããèšèªã®å€æŽã
ããããçŸåšã®Goã«ãããããªå®å šã¡ã«ããºã ã¯ãããŸãããã¿ã€ãã®ååãå°å ¥ããŠããããæ°ããå¥ã®ã¿ã€ãã«ããå¿ èŠãããããšã瀺ãããšã¯ã§ããŸããã ïŒããã§ããããã¯æ¬è³ªçã«å®å šã¡ã«ããºã ã§ããããšãèŠããŠããããšãéèŠã§ããïŒ
ä»ã®ããã°ã©ãã³ã°èšèªã§ã¯ãæ¢åã®åãšã¯ç°ãªãæ°ããåãäœæãããšããæŠå¿µã¯ããã©ã³ãã£ã³ã°ããšåŒã°ããŸããågetã¯ããã«ä»ãããããã©ã³ãã§ãããä»ã®ãã¹ãŠã®åãšã¯ç°ãªããŸãã ããšãã°ãModula-3ã§ã¯ããããå®çŸããããã®ç¹å¥ãªããŒã¯ãŒãBRANDED
ãŸããïŒããšãã°ã TYPE T = BRANDED REF T0
ã¯T0ãžã®æ°ããç°ãªãåç
§ãäœæããŸãïŒã Haskellã§ã¯ãåã®åã®new
ãšããåèªãåæ§ã®å¹æããããŸãã
代æ¿ã®Goã®äžçã«æ»ããšããªãã¡ã¯ã¿ãªã³ã°ã«åé¡ã¯ãªãããã³ãŒãã®å®å
šæ§ãåäžãããŠtype MyBuffer = []byte
ãštype YourBuffer = []byte
è¡šãããã«ããããšæããããããŸããã誀ã£ãŠééã£ããã®ã䜿çšããªãããã«ãããŸããŸãªã¿ã€ãããããŸãã ãŸãã«ãã®ç®çã®ããã«ãã¿ã€ããã©ã³ãã£ã³ã°ã®åœ¢åŒãå°å
¥ããããšãææ¡ãããããããŸããã ããšãã°ã type MyBuffer = new []byte
ããŸãã¯type MyBuffer = new YourBuffer
ãèšè¿°ããŠãMyBufferãYourBufferãšã¯ç°ãªãã¿ã€ãã«ãªãããã«ããããšãã§ããŸãã
ããã¯æ¬è³ªçã«ãç§ãã¡ãä»æã£ãŠãããã®ã®äºéã®åé¡ã§ãã Goã§ã¯ãåæ¥ãããååãä»ãããããšããã«ããã©ã³ããã¿ã€ããåžžã«äœ¿çšããŠããŸããã èšãæããã°ã type T <a type>
ã¯äºå®äžtype T = new <a type>
ã§ãã
èŠçŽãããšãæ¢åã®Goã§ã¯ãååä»ãã¿ã€ãã¯åžžã«ããã©ã³ãåããããã¿ã€ãã§ãããã¿ã€ãã®ååã ãã®æŠå¿µããããŸããïŒçŸåšã¯ã¿ã€ããšã€ãªã¢ã¹ãšåŒãã§ããŸãïŒã ä»ã®ããã€ãã®èšèªã§ã¯ãã¿ã€ããšã€ãªã¢ã¹ãæšæºã§ãããããã©ã³ãã£ã³ã°ãã¡ã«ããºã ã䜿çšããŠãæ瀺çã«æ°ããç°ãªãã¿ã€ããäœæããå¿ èŠããããŸãã
éèŠãªã®ã¯ãäž¡æ¹ã®ã¡ã«ããºã ãæ¬è³ªçã«æçšã§ãããã¿ã€ããšã€ãªã¢ã¹ã䜿çšããŠãæçµçã«äž¡æ¹ããµããŒãããããã«åé¿ã§ãããšããããšã§ãã
@griesemerãã®æ©èœã®æ¡åŒµã¯ãçæ³çã«ã¯ãªãã¡ã¯ã¿ãªã³ã°ãã¯ãªãŒã³ã¢ããããå¿ èŠãããæåã®ãšã€ãªã¢ã¹ææ¡ã§ãã ã¹ã³ãŒããå¶éãããŠãããããã¿ã€ããšã€ãªã¢ã¹ã®ã¿ãé£ãããªãã¡ã¯ã¿ãªã³ã°ãšããžã±ãŒã¹ãäœæããã®ã§ã¯ãªãããšå¿é ããŠããŸãã
ã©ã¡ãã®ææ¡ã§ãã説æããããã«ååã¯Goã®åå®çŸ©ã®äžéšã§ããããããªã³ã«ãŒããã®ã³ã©ãã¬ãŒã·ã§ã³ã¯å¿ èŠãªãã®ã§ã¯ãªãããšçåã«æã£ãŠããŸãã
ç§ã¯ãªããžã§ã¯ãã³ãŒãã«ãŸã£ãã粟éããŠããªãã®ã§ãããã¯åãªãã¢ã€ãã¢ã§ããããªããžã§ã¯ããã¡ã€ã«ã«ã«ã¹ã¿ã ã»ã¯ã·ã§ã³ãè¿œå ããããšã¯å¯èœã®ããã§ãã å¶ç¶ã«ããã¿ã€ãåãšãã®ãšã€ãªã¢ã¹ã®ãªã³ã¯æã«åãããããããçš®ã®å±éããããªã³ã¯ãªã¹ããä¿æããããšãå¯èœã§ãã£ãå Žåã¯ãããã圹ç«ã€å¯èœæ§ããããŸãã ã©ã³ã¿ã€ã ã«ã¯ãåå¥ã®ã³ã³ãã€ã«ãç ç²ã«ããããšãªããå¿ èŠãªãã¹ãŠã®æ å ±ãå«ãŸããŸãã
ãšã©ãŒã¡ãã»ãŒãžãæ確ãªãŸãŸã«ãªãããã«ãã©ã³ã¿ã€ã ã¯ç¹å®ã®ã¿ã€ãã®ããŸããŸãªãšã€ãªã¢ã¹ãåçã«è¿ãããšãã§ããå¿ èŠããããšããèãã§ãïŒãšã€ãªã¢ã¹ã«ãã£ãŠå®è¡äžã®ã³ãŒããšèšè¿°ãããã³ãŒãã®éã«ååã®äžäžèŽãçããããïŒã
ãšã€ãªã¢ã·ã³ã°ã®äœ¿çšã远跡ãã代ããã«ãã³ã³ããã¹ãããã±ãŒãžã§è¡ãããããã«ãããã±ãŒãžéã§ãªããžã§ã¯ãå®çŸ©ãã移åãã§ããããã«ãå ·äœçãªããŒãžã§ã³ç®¡çã¹ããŒãªãŒã倧èŠæš¡ã«äœæããããšãã§ããŸãã ããããããã¯ãŸã£ããå¥ã®åé¡ã§ãã
çµå±ã®ãšãããã€ã³ã¿ãŒãã§ã€ã¹ãšååã®åçæ§ãåã«æ®ããŠããããšã¯ãäŸç¶ãšããŠè¯ãèãã§ãã
ã¿ã€ãã¯ããå€ãã®å¶çŽã®ããã€ã³ã¿ãŒãã§ãŒã¹ãšèŠãªãããšãã§ãããšããäºå®ãèãããšããšã€ãªã¢ã¹ã®å®£èšã¯ãã¹ã©ã€ã¹ã®ã¿ã€ãåæååã®ããã±ãŒãžããšã®ã¹ã©ã€ã¹ãä¿æããããšã«ãã£ãŠå®è£
ããå¿
èŠããã/ã§ããããã§ãã
@atdiar ãåå¥ã®ã³ã³ãã€ã«ããšèšã£ããšãã«ç§ãäœãããã®ã
@ j7dã¯ãåã·ã¹ãã ã¬ãã«ã§ã¯ãåèšåãŸãã¯ä»»æã®çš®é¡ã®ãµãã¿ã€ãïŒèª¬æã®ååã§ä»ã®äººãææ¡ããããã«ïŒã¯ãç¹å®ã®çš®é¡ã®äœ¿çšã«ã®ã¿åœ¹ç«ã¡ãŸãã bytes.Bufferãio.Readerã®ãµãã¿ã€ããšèããããšãã§ããã®ã¯äºå®ã§ãïŒããããã¡ã¯ãªãŒããŒã§ããããŸãã¯ããªãã®äŸã§ã¯ãæååã¯Stringeroonieã§ããïŒã ãããã䜿çšããŠããè€éãªåãæ§ç¯ãããšãåé¡ãçºçããŸãã ãã®ã³ã¡ã³ãã®æ®ãã®éšåã§ã¯ãGoã¿ã€ãã«ã€ããŠèª¬æããŠããŸãããèšèªãå®éã«å®è£ ããŠããGoã§ã¯ãªãããµãã¿ã€ãã¬ãã«ã§ã®åºæ¬çãªé¢ä¿ã«ã€ããŠèª¬æããŠããŸãã ãã ããGoã¯åºæ¬çãªé¢ä¿ãšäžèŽããã«ãŒã«ãå®è£ ããå¿ èŠããããŸãã
åæ§ç¯åïŒãåã䜿çšããæ¹æ³ããèšãããã®æŽŸæãªæ¹æ³ïŒã¯ããµãã¿ã€ãã®é¢ä¿ãä¿æããå Žåã¯å ±å€ã§ãããé¢ä¿ãå転ããå Žåã¯åå€ã§ãã
é¢æ°ã®çµæã§åã䜿çšããããšã¯å ±å€ã§ãã funcïŒïŒãããã¡ã¯ãfuncïŒïŒãªãŒããŒã§ããããã¯ããããã¡ãè¿ãããšã¯ããªãŒããŒãè¿ããããšãæå³ããããã§ãã é¢æ°ã®åŒæ°ã§åã䜿çšããããšã¯ãå ±å€ã§ã¯ãããŸããã funcã«ã¯Bufferãå¿ èŠã§ãããäžéšã®Readerã¯Bufferã§ã¯ãªããããfuncïŒBufferïŒã¯funcïŒReaderïŒã§ã¯ãããŸããã
é¢æ°ã®åŒæ°ã§åã䜿çšããããšã¯éå€ã§ãã funcïŒReaderïŒã¯funcïŒBufferïŒã§ããããã¯ãfuncã«ã¯Readerã®ã¿ãå¿ èŠã§ãããBufferã¯Readerã§ããããã§ãã é¢æ°ã®çµæã§åã䜿çšããããšã¯ãåå€ã§ã¯ãããŸããã funcïŒïŒãªãŒããŒã¯funcïŒïŒãããã¡ãŒã§ã¯ãããŸãããããã¯ãfuncããªãŒããŒãè¿ããäžéšã®ãªãŒããŒããããã¡ãŒã§ã¯ãªãããã§ãã
ãã®2ã€ãçµã¿åããããšãfuncïŒReaderïŒReaderã¯funcïŒBufferïŒBufferã§ã¯ãªãããã®éãåæ§ã§ããåŒæ°ãæ©èœããªãããçµæãæ©èœããªãããã§ãã ïŒãããã®ç·ã«æ²¿ã£ãŠæ©èœããå¯äžã®çµã¿åããã¯ãfuncïŒReaderïŒBufferãfuncïŒBufferïŒReaderã§ãããšããããšã§ããïŒ
äžè¬ã«ãfuncïŒX1ïŒX2ãfuncïŒX3ïŒX4ïŒã®ãµãã¿ã€ãïŒã§ããå ŽåãX3ã¯X1ïŒã®ãµãã¿ã€ãïŒã§ãããåæ§ã«X2ã¯X4ïŒã®ãµãã¿ã€ãïŒã§ããå¿ èŠããããŸãã T1ãšT2ã亀æå¯èœã«ãããšã€ãªã¢ã¹äœ¿çšã®å ŽåãT1ãT2ã®ãµãã¿ã€ãã§ãããT2ãT1ã®ãµãã¿ã€ãã§ããå Žåã«ã®ã¿ãfuncïŒT1ïŒT1ã¯funcïŒT2ïŒT2ã®ãµãã¿ã€ãã§ãã ã€ãŸããåºæ¬çã«ãT1ã¯T2ãš_åã_ã¿ã€ãã§ãããããäžè¬çãªã¿ã€ãã§ã¯ãããŸããã
é¢æ°ã®åŒæ°ãšçµæã䜿çšããã®ã¯ããããæšæºçãªäŸïŒãããŠè¯ãäŸïŒã ããã§ãããè€éãªçµæãäœæããä»ã®æ¹æ³ã§ãåãããšãèµ·ãããŸãã äžè¬ã«ãåºåã®å ±åæ£ïŒfuncïŒïŒTã<-chan TããŸãã¯map [...] Tãªã©ïŒãšå ¥åã®å ±åæ£ïŒfuncïŒTïŒãchan <-TããŸãã¯map [Tãªã©ïŒãååŸããŸãã ] ...ïŒããã³å ¥åºåã®åŒ·å¶åã®åçæ§ïŒfuncïŒTïŒTãchan Tã* Tã[10] Tã[] Tãstruct {Field T}ããŸãã¯å€æ°ãªã©ïŒã¿ã€ãTã®ïŒã å®éãäŸãããããããã«ãGoã§æãäžè¬çãªã±ãŒã¹ã¯å ¥å+åºåã§ãã
å ·äœçã«ã¯ã[]ãããã¡ã¯[]ãªãŒããŒã§ã¯ãããŸããïŒãã¡ã€ã«ã[]ãªãŒããŒã«ä¿åã§ããŸããã[]ãããã¡ã«ã¯ä¿åã§ããªãããïŒããŸãã[]ãªãŒããŒã¯[]ãããã¡ã§ã¯ãããŸããïŒ[]ãããã§ããããããïŒã [] Bufferãããã§ãããããšBufferãè¿ãå¿ èŠããããŸãããReaderã¯Fileãè¿ãå ŽåããããŸãã
ããããã¹ãŠããã®çµè«ã¯ãã³ãŒããT1ãŸãã¯T2ã®ããããã䜿çšã§ããããã«äžè¬çãªã³ãŒã修埩ã®åé¡ã解決ãããå ŽåãT1ãT2ã®ãµãã¿ã€ãã®ã¿ã«ããïŒãŸãã¯ãã®éïŒã¹ããŒã ã§ã¯å®è¡ã§ããªããšããããšã§ãã ãããããä»ã®ãµãã¿ã€ãã§ããå¿ èŠããããŸãïŒã€ãŸããåãã¿ã€ãã§ããå¿ èŠããããŸãïŒãããã§ãªãå Žåããããã®ãªã¹ãããã䜿çšæ³ã®äžéšã¯ç¡å¹ã«ãªããŸãã
ã€ãŸãã段éçãªã³ãŒã修埩ã®åé¡ã解決ããã«ã¯ããµãã¿ã€ãåã ãã§ã¯äžååã§ãã ããããã¿ã€ããšã€ãªã¢ã¹ãåãã¿ã€ãã«æ°ããååãå°å ¥ããçç±ã§ãããã®ããããµãã¿ã€ããè©Šè¡ãã代ããã«ãT1 = T2ã«ãªããŸãã
ãã®ã³ã¡ã³ãã¯ã2é±éåã®ããçš®ã®ã代æ¿å¯èœãªã¿ã€ããã®@iandã®ææ¡ãããã³åºæ¬çã«ã¯ãã以éã®@griesemerã®å¿çã®æ¡åŒµã«ã
ãããã¬ãã«ã®ãã£ã¹ã«ãã·ã§ã³ã®æŠèŠãæŽæ°ããŸããã å€æŽç¹ïŒ
åå¥ã®ã³ã³ãã€ã«ã«é¢ãã@rsc ãç§ã®ã³ã¡ã³ãã¯ãåå®çŸ©ããšã€ãªã¢ã¹ã®ãªã¹ããä¿æããå¿ èŠããããïŒåå¥ã®ã³ã³ãã€ã«èŠä»¶ã®ããã«å€§èŠæš¡ã«æ±ãã«ããïŒããŸãã¯åãšã€ãªã¢ã¹ã次ã®ãšã€ãªã¢ã¹åã®ãªã¹ããç¹°ãè¿ãäœæããããšãå«ããã©ããã«é¢é£ããŠããŸãã€ã³ããŒãã°ã©ãããã¹ãŠãã¿ã€ãå®çŸ©ã§æå®ãããæå®ãããåæã¿ã€ãåã«é¢é£ããŠããŸãã ïŒãããŠãã©ã³ã¿ã€ã ããã®æ å ±ã«ã¢ã¯ã»ã¹ã§ããããã«ããã®æ å ±ãã©ãã«ã©ã®ããã«ä¿æãããïŒã
@atdiarã·ã¹ãã ã®ã©ãã«ããã®ãããªãšã€ãªã¢ã¹åã®ãªã¹ãã¯ãããŸããã ã©ã³ã¿ã€ã ã¯ããã«ã¢ã¯ã»ã¹ã§ããŸããã ãšã€ãªã¢ã¹ã¯å®è¡æã«ååšããŸããã
@rscãã¡ããããããªããã ç§ã¯é ã®äžã§æåã®ãšã€ãªã¢ã¹ã®ææ¡ã«åºå·ããŠããŠãfuncã®ãšã€ãªã¢ã·ã³ã°ã«ã€ããŠèããŠããŸããïŒã¿ã€ãã®ãšã€ãªã¢ã·ã³ã°ã«ã€ããŠè°è«ããŠããéïŒã ãã®å Žåãã³ãŒãå
ã®ååãšå®è¡æã®ååã®éã«äžäžèŽãçããŸãã
ãã®å Žåãruntime.Frameã®æ
å ±ããã®ã³ã°ã«äœ¿çšããã«ã¯ãåèãå¿
èŠã«ãªããŸãã
ç§ã«æ§ããã«ã
@rscåèŠçŽããŠããããŸãã åã蟌ãŸãããã£ãŒã«ãåã¯ãŸã ç§ãèç«ãããŸãã ææ¡ããããã¹ãŠã®åé¿çã¯ãå€ãååãç¶æããããã«æä¹ çãªå¿æ¥ä¿®çã«äŸåããŠããŸãã ãã®ã³ã¡ã³ãã®ãã倧ããªãã€ã³ããã€ãŸãããã¯ãã£ãŒã«ãã®ååå€æŽã®ç¹æ®ãªã±ãŒã¹ã§ããããããäžå¯èœã§ãããšããããšã§ãããããã¯ç¢ºãã«å¥ã®åé¡ãšèŠãªããïŒãããŠè§£æ±ºããïŒãªããã°ãªããªãããšãç§ã«ç¢ºä¿¡ãããŸãã 段éçãªä¿®åŸ©ã®ããã«ãã£ãŒã«ãã®ååå€æŽããµããŒãããããã«ãèŠæ±/ææ¡/ãã£ã¹ã«ãã·ã§ã³ã«å¯ŸããŠå¥ã®åé¡ãéãããšã¯æå³ããããŸããïŒããããåãgoãªãªãŒã¹ã§å¯ŸåŠãããŸãïŒïŒ
@Merovius ããã£ãŒã«ãåã®å€æŽã®ããã®æ®µéçãªã³ãŒã修埩ãã·ãŒã±ã³ã¹ã®æ¬¡ã®åé¡ã®ããã«èŠããããšã«åæããŸãã ãã®è°è«ãå§ããããã«ã誰ããå®éã®äŸã®ã¹ã€ãŒããéããå¿ èŠããããšæããŸããããã¯ããããåºç¯å²ã«ãããåé¡ã§ãããšãã蚌æ ãåŸããšåæã«ãæœåšçãªè§£æ±ºçããã§ãã¯ããããã§ãã çŸå®çã«ã¯ãåããªãªãŒã¹ã§ãããèµ·ãã£ãŠãããšã¯æããŸããã
2é±éå ããæ»ã£ãŠããŸããã è°è«ã¯åæããããã§ãã 2é±éåã®ãã£ã¹ã«ãã·ã§ã³ã®æŽæ°ã§ãããããªããã€ããŒã§ããã
ç§ã¯ç§ãã¡ã«ææ¡ããŸãïŒ
+1
ãã®å€æŽã®èåŸã«ããè°è«ã®æŽå²ã«æè¬ããŸãã å®è£ ãããŠãããšããŸãããã ééããªããããã¯ã³ã¢æ©èœã§ã¯ãªããèšèªã®ããªãããªã³ãžãªè©³çŽ°ã«ãªãã§ãããã ãã®ãããå®éã®äœ¿çšé »åºŠã«äžé£ãåããªèšèªãšããŒã«ãè€éã«ãªããŸãã ãŸããèšèªã誀ã£ãŠæªçšãããå¯èœæ§ã®ããè¡šé¢ç©ãå¢ããŸãã ãã®ãããæ éãããã®ã¯è¯ãããšã§ããããããŸã§ã«ããããã®è°è«ããã£ãããšãããããæããŸãã
@Merovius ïŒç§ã®æçš¿ãç·šéããŠãã¿ãŸããïŒ èª°ãèªãã§ããªããšæã£ãã æåã«ãã®ã³ã¡ã³ãã§ã gorename
ããŒã«ã®ãããªããŒã«ããã§ã«ååšããå Žåããã®èšèªã®å€æŽãå¿
èŠã§ããããšã«æççãªèŠæ¹ã瀺ããŸããã
@ jcao219ããã¯ä»¥åã«è°è«ãããŸããããé©ãã¹ãããšã«ãç§ã¯ãããããã§ããã«èŠã€ããããšãã§ããªãããã§ãã äžè¬çãªãšã€ãªã¢ã¹ïŒ16339ã®å ã®ã¹ã¬ãããšãé¢é£ããgolang-nutsã¹ã¬ããã§è©³çŽ°ã«èª¬æãããŠããŸãã ã€ãŸãããã®çš®ã®ããŒã«ã¯ã修埩ã³ããããæºåããæ¹æ³ã®ã¿ãæ±ããç Žæãé²ãããã«å€æŽãé åºä»ããæ¹æ³ã¯æ±ããŸããã å€æŽãããŒã«ã«ãã£ãŠè¡ãããã人éã«ãã£ãŠè¡ããããã«ããããããçŸåšãã³ãŒããå£ããªãã³ãããã®ã·ãŒã±ã³ã¹ã¯ãããŸããïŒãã®åé¡ã®å ã®ã³ã¡ã³ããšé¢é£ããããã¥ã¡ã³ãã¯ããã®ã¹ããŒãã¡ã³ããããæ£åœåããŸã-æ·±ãïŒã
ããèªååãããããŒã«ïŒããšãã°ãgoããŒã«ãªã©ã«çµ±åãããŠããïŒã®å Žåãå ã®ã³ã¡ã³ãã¯ããããã¯ãèšèªã®å€æŽã§ã¯ãªããããŒã«ãŸãã¯ã³ã³ãã€ã©ã®ã¿ã®å€æŽã§ããå¯èœæ§ããããŸããïŒããšããèŠåºãã®äžã§ããã«å¯ŸåŠããŸãã
çµè«ãšããŠãå€æŽãå®è£ ããããšããŸãããã ééããªããããã¯ã³ã¢æ©èœã§ã¯ãªããèšèªã®ããªãããªã³ãžãªè©³çŽ°ã«ãªãã§ãããã
çåãè¡šæããããšæããŸãã :)ç§ã¯ãããåœç¶ã®çµè«ãšã¯èããŠããŸããã
@Merovius
çåãè¡šæããããšæããŸãã :)ç§ã¯ãããåœç¶ã®çµè«ãšã¯èããŠããŸããã
ãã®æ©èœã䜿çšããã®ã¯ãäž»ã«ãå€ãã®äŸåã¯ã©ã€ã¢ã³ããæã€éèŠãªGoããã±ãŒãžã®ã¡ã³ãããŒã«ãªããšããããšã ãšæããŸãã èšãæããã°ãããã¯ãã§ã«Goã®å°é家ã§ãã人ã ã«å©çããããããŸãã åæã«ãæ°ããGoããã°ã©ããŒãã³ãŒããèªã¿ã«ããããé åçãªæ¹æ³ãæäŸããŸãã äŸå€ã¯ãé·ãååã®ååãå€æŽãããŠãŒã¹ã±ãŒã¹ã§ãããéåžžãèªç¶ãªGoã¿ã€ãåã¯é·ããããè€éããããããããšã¯ãããŸããã
ãããã€ã³ããŒãæ©èœã®å Žåãšåæ§ã«ããã¥ãŒããªã¢ã«ãšããã¥ã¡ã³ãã§ã¯ããã®æ©èœã«ã€ããŠã®èšåã«äœ¿çšã¬ã€ãã©ã€ã³ã®èª¬æãæ·»ä»ããããšããå§ãããŸãã
ããšãã°ãç§ã䜿çšããŠãããšèšããgithub.com/gonum/graph/simple".DirectedGraphãããããŠç§ã¯ãšã®å¥åããããã£ãã®digraph
å
¥åãé¿ããããã«simple.DirectedGraph
ããã¯è¯ãã§ãããã䜿çšäºäŸïŒ ãŸãã¯ããã®çš®ã®ååå€æŽã¯ãprotobufãªã©ã«ãã£ãŠçæãããäžåœã«é·ãååã«å¶éããå¿
èŠããããŸããïŒ
@ jcao219 ããã®ããŒãžã®äžéšã«ãããã£ã¹ã«ãã·ã§ã³ã®èŠçŽãããªãã®è³ªåã«çããŸãã ç¹ã«ã次ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
Goã®å°é家ãšæ°ããGoããã°ã©ããŒã«ã€ããŠã®ããäžè¬çãªãã€ã³ããšããŠãGoã®æ確ãªç®æšã¯ã倧èŠæš¡ãªã³ãŒãããŒã¹ã§ã®ããã°ã©ãã³ã°ã容æã«ããããšã§ãã ããªããå°é家ã§ãããã©ããã¯ãããªããäœæ¥ããŠããã³ãŒãããŒã¹ã®ãµã€ãºãšã¯å€å°é¢ä¿ãããŸããïŒãã¶ããããªãã¯ä»ã®èª°ããå§ããæ°ãããããžã§ã¯ãã§å§ããã°ããã§ããããªãã¯ãŸã ãã®çš®ã®ä»äºãããå¿ èŠããããããããŸãããïŒ
OKãããã§ã®å šäŒäžèŽ/éå¯ã«åºã¥ããŠãïŒå é±https://github.com/golang/go/issues/18130#issuecomment-268614964ã§ææ¡ããããã«ïŒãã®ææ¡ãæ¿èªæžã¿ãšããŠããŒã¯ããdev.typealiasãã©ã³ããäœæããŸãã
åªããèŠçŽã«ã¯ããã¿ã€ããšã€ãªã¢ã¹ã®ææ¡ã§å¯ŸåŠããå¿ èŠãããä»ã®åé¡ã¯äœã§ããïŒããšããã»ã¯ã·ã§ã³ããããŸãã ææ¡ãæ¿èªããããšå®£èšãããåŸããããã®åé¡ã«å¯ŸåŠããããã®èšç»ã¯äœã§ããïŒ
CLhttps ïŒ //golang.org/cl/34986ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/34987ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/34988ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
@ulikunitzãåé¡ãå確èªããŸãïŒèšèšããã¥ã¡ã³ãããã®ãããã®åŒçšã¯ãã¹ãŠããã¿ã€ãT1 = T2ããæ³å®ããŠããŸãïŒïŒ
CL https://golang.org/cl/35091ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35092ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35093ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
@rsc説æã«æè¬ããŸãã
ä»®å®ããŸãããïŒ
package a
import "b"
type T1 = b.T2
ç§ãç解ããŠããéããT1ã¯b.T2ãšæ¬è³ªçã«åäžã§ããããããã£ãŠéããŒã«ã«ã¿ã€ãã§ãããæ°ããã¡ãœãããå®çŸ©ããããšã¯ã§ããŸããã ãã ããèå¥åT1ã¯ããã±ãŒãžaã§åãšã¯ã¹ããŒããããŸãã ããã¯æ£ãã解éã§ããïŒ
æ£ãã@ulikunitz
T1ã¯ãb.T2ãšãŸã£ããåãã¿ã€ãã瀺ããŸãã ããã¯åã«å¥ã®ååã§ãã äœãããšã¯ã¹ããŒãããããã©ããã¯ããã®ååã ãã«åºã¥ããŠããŸãïŒããã瀺ãã¿ã€ããšã¯é¢ä¿ãããŸããïŒã
@griesemerã®å¿çãæ瀺çã«ããã«ã¯ïŒã¯ããT1ã¯ããã±ãŒãžaãããšã¯ã¹ããŒããããŸãïŒt1ã§ã¯ãªãT1ã§ããããïŒã
CL https://golang.org/cl/35099ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35100ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35101ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35102ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35104ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35106ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35108ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35120ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35121ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35129ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35191ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35233ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35268ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35269ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35670ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35671ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35575ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35732ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CL https://golang.org/cl/35733ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/35831ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
CLhttps ïŒ //golang.org/cl/36014ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
ããã¯ãGo 1.9ã®ãªãŒãã³ã«å ç«ã£ãŠãçŸåšãã¹ã¿ãŒã«ãªã£ãŠããŸãã ãã¹ã¿ãŒã§åæããŠãè©ŠããŠã¿ãŠãã ããã ããããšãã
ïŒ18893ãããªãã€ã¬ã¯ã
package main
import (
"fmt"
"q"
)
func main() {
var a q.A
var b q.B // i'm a named unnamed type !!!
fmt.Printf("%T\t%T\n", a, b)
}
deadwood(~/src) % go run main.go
q.A q.B
deadwood(~/src) % go run main.go
q.A []int
ååã®ãªãã¿ã€ãã«ãšã€ãªã¢ã¹ãé©çšããªãã§ãã ããã ãããã¯ãããååã®ãªãã¿ã€ãããå¥ã®ã¿ã€ãã«ç§»åããéã®ãã³ãŒã修埩ãã®è©±ã§ã¯ãããŸããã ååã®ãªãã¿ã€ãã§ãšã€ãªã¢ã¹ãèš±å¯ãããšãGoãåã«ååã®ä»ããã¿ã€ããšååã®ãªãã¿ã€ããšããŠæããããšãã§ããªããªããŸãã 代ããã«ç§ã¯èšããªããã°ãªããŸãã
ãããããããšã€ãªã¢ã¹ã§ãªãéãããã®å Žåãå¥ã®ããã±ãŒãžããã€ã³ããŒãããå Žåã§ããååã®ãªãã¿ã€ãã§ããå¯èœæ§ãããããšãèŠããŠããå¿ èŠããããŸãã
ããã«æªãããšã«ãããã¯äººã ã次ã®ãããªèªã¿ãããã®ã¢ã³ããã¿ãŒã³ãå ¬åžããããšãå¯èœã«ããŸã
type Any = interface{}
ååã®ãªãã¿ã€ãã«ãšã€ãªã¢ã¹ãä»ããªãã§ãã ããã
@davecheney
ååã®ãªãã¿ã€ãããå¥ã®ã¿ã€ãã«ç§»åããå Žåããã³ãŒã修埩ãã®è©±ã¯ãããŸããã
éããŸãã ã¡ãœãããã©ã¡ãŒã¿ã®åãååä»ãåããååãªãåã«ããŸãã¯ãã®éã«å€æŽãããå Žåã¯ã©ããªããŸããïŒ ã¹ããã1ã¯ãšã€ãªã¢ã¹ãè¿œå ããããšã§ãã ã¹ããã2ã¯ããã®ã¡ãœãããå®è£ ããã¿ã€ããæŽæ°ããŠãæ°ããã¿ã€ãã䜿çšããããšã§ãã æé 3ã¯ããšã€ãªã¢ã¹ãåé€ããããšã§ãã
ïŒã¡ãœããã®ååã2åå€æŽããããšã§ãä»æ¥ãããå®è¡ã§ããã®ã¯äºå®ã§ããååã®å€æŽã2åè¡ãã®ã¯ãããããé¢åã§ããïŒ
ããã«æªãããšã«ãããã¯äººã ã次ã®ãããªèªã¿ãããã®ã¢ã³ããã¿ãŒã³ãå ¬åžããããšãå¯èœã«ããŸã
type Any = interface{}
ä»æ¥ã人ã
ã¯ãã§ã«type Any interface{}
æžãããšãã§ããŸãã ãã®å Žåããšã€ãªã¢ã¹ã¯ã©ã®ãããªè¿œå ã®å®³ããããããŸããïŒ
ä»æ¥ã人ã ã¯ãã§ã«ã¿ã€ãAny interface {}ãæžãããšãã§ããŸãã ãã®å Žåããšã€ãªã¢ã¹ã¯ã©ã®ãããªè¿œå ã®å®³ããããããŸããïŒ
ããããŸãã«ããã§ãããããç§ã¯ãããã¢ã³ããã¿ãŒã³ãšåŒã³ãŸããã type Any interface{}
ãã³ãŒããæžã人ã¯å°ãçããã®ãã¿ã€ãããã®ã§ãããã¯åœŒãã«ãšã£ãŠããå°ãæå³ããããŸãã
å察ã«ãGoã³ãŒãã®èªã¿åãã«çµéšããããé¡ã®äžã®é¡ãšåããããæ¬èœçã«interface{}
ãèªèããèªè
ã®_ãã¹ãŠ_ã¯ã Any
ãã¹ãŠã®ããªãšãŒã·ã§ã³ãåŠç¿ããŠååŠç¿ããå¿
èŠããããŸãã ã Object
ã T
ãããã³ããã±ãŒãžããšã«type Any interface{}
ã type Any map[interface{}]interface{}
ã type Any struct{}
ãªã©ã«ãããããŸãã
確ãã«ãäžè¬çãªGoã€ãã£ãªã ã®ããã±ãŒãžåºæã®ååãèªã¿ãããã®æ£å³ã®ãã¬ãã£ãã§ããããšã«åæããŸããïŒ
確ãã«ãäžè¬çãªGoã€ãã£ãªã ã®ããã±ãŒãžåºæã®ååãèªã¿ãããã®æ£å³ã®ãã¬ãã£ãã§ããããšã«åæããŸããïŒ
ç§ã¯åæããŸãããåé¡ã®äŸïŒç§ãééãããã®åãã¿ãŒã³ã®æãäžè¬çãªçºçïŒã¯ãšã€ãªã¢ã¹ãªãã§å®è¡ã§ããããããã®äŸãã¿ã€ããšã€ãªã¢ã¹ã®ææ¡ã«ã©ã®ããã«é¢é£ããŠãããããããŸããã
ã¢ã³ããã¿ãŒã³ãåãšã€ãªã¢ã¹ãªãã§å¯èœã§ãããšããäºå®ã¯ãååã®ãªãåãžã®ãšã€ãªã¢ã¹ãååšã§ãããã©ããã«é¢ä¿ãªãããããåé¿ããããã«Goããã°ã©ããŒããã§ã«æè²ããå¿ èŠãããããšãæå³ããŸãã
å®éãåãšã€ãªã¢ã¹ã䜿çšãããšãã¢ã³ããã¿ãŒã³ããã§ã«ååšããã³ãŒãããŒã¹ãããã®ã¢ã³ããã¿ãŒã³ã_段éçã«åé€_ã§ããŸãã
æ€èšïŒ
package antipattern
type Any interface{} // not an alias
type Widget interface{
Frozzle(Any) error
}
func Bozzle(w Widget) error {
âŠ
}
ä»æ¥ã antipattern.Bozzle
ãŠãŒã¶ãŒã¯ã Widget
å®è£
ã§antipattern.Any
ã䜿çšããŠã¹ã¿ãã¯ãã段éçãªä¿®åŸ©ã§antipattern.Any
ãåé€ããæ¹æ³ã¯ãããŸããã ãã ããã¿ã€ããšã€ãªã¢ã¹ã䜿çšãããšã antipattern
ããã±ãŒãžã®ææè
ã¯æ¬¡ã®ããã«åå®çŸ©ã§ããŸãã
// Any is deprecated; please use interface{} directly.
type Any = interface{}
ããã§ãçºä¿¡è
ã¯Any
ããinterface{}
åŸã
ã«ç§»è¡ã§ããããã«ãªãã antipattern
ã¡ã³ãããæçµçã«ãããåé€ã§ããããã«ãªããŸãã
ç§ã®ãã€ã³ãã¯ãååã®ãªãã¿ã€ãããšã€ãªã¢ã¹ããçç±ããªãã®ã§ã
ãã®ãªãã·ã§ã³ãçŠæ¢ãããšã
ç·Žç¿ã
éã«ãååã®ãªãã¿ã€ãã®ãšã€ãªã¢ã·ã³ã°ãèš±å¯ãããšã1ã€ã§ã¯ãªã2ã€ãæå¹ã«ãªããŸã
ãã®ã¢ã³ããã¿ãŒã³ã®åœ¢åŒã
æšã2017幎2æ2æ¥ã«ã¯ã16æ34ãã©ã€ã¢ã³C.ãã«ãº[email protected]ã¯æžããŸããïŒ
確ãã«ãäžè¬çãªGoã€ãã£ãªã ã®ããã±ãŒãžåºæã®ååã¯æ¬¡ã®ãšããã§ãã
èªã¿ãããã®æ£å³ã®ãã¬ãã£ãïŒç§ã¯åæããŸãããåé¡ã®äŸä»¥æ¥ïŒã¯ããã«æãäžè¬çã§ã
ç§ãééãããã®åãã¿ãŒã³ã®çºçïŒã¯ãªãã§è¡ãããšãã§ããŸã
ãšã€ãªã¢ã¹ããã®äŸãææ¡ã«ã©ã®ããã«é¢é£ããŠãããããããŸãã
ã¿ã€ããšã€ãªã¢ã¹ãã¿ã€ããšã€ãªã¢ã¹ãªãã§ã¢ã³ããã¿ãŒã³ãå¯èœã§ãããšããäºå®ã¯ã
ãããåé¿ããããã«ãGoããã°ã©ããŒãæè²ããå¿ èŠããããŸãã
ååã®ãªãã¿ã€ãã®ãšã€ãªã¢ã¹ãååšããå¯èœæ§ããããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/golang/go/issues/18130#issuecomment-276872714 ããŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AAAcA6BGrFjjTi7eW1BPp7o81XIekbGXks5rYWr-gaJpZM4LBBEL
ã
@davecheneyä»»æã®åã®ãªãã©ã«ã«ååãä»ããããšãã§ããããšã¯æ害ã§ãããšãã蚌æ ã¯ãŸã ãªããšæããŸãã ãããäºæããªããé©ããã®æ©èœã§ã¯ãããŸãããèšèšããã¥ã¡ã³ãã§è©³çŽ°ã«èª¬æãããŠ
åäŸãšããŠãAPIãã¯ã©ã€ã¢ã³ããç¹å®ã®åã«å¶éããããªããšããçç±ã ãã§åãªãã©ã«ã䜿çšãããããªãã¯APIããããŸãïŒããšãã°ãhttpsïŒ//golang.org/pkg/go/types/#Infoãåç
§ããŠãã ããïŒã ïŒã ãã®æ瀺çãªåãªãã©ã«ãæã€ããšã¯ãæçšãªããã¥ã¡ã³ããããããŸããã ãããåæã«ãåãã¿ã€ãã®ãªãã©ã«ããã¡ãã¡ã§ç¹°ãè¿ããªããã°ãªããªãã®ã¯éåžžã«é¢åãªå ŽåããããŸãã å®éãèªã¿ãããã®åŠšãã«ãªããŸãã map[int]struct{}
ã«çžãããããšãªãIntSet
ã§ã¯ãªãã IntSet
å®çŸ©ã ããç§ã®é ã®äžã§ãã©ã¹ã«ãªããŸãã ãããtype IntSet = map[int]struct{}
ãæ£ç¢ºã«æ£ãããšããã§ãã
æåŸã«ãèŠéããå Žåã«åããŠã httpsïŒ //github.com/golang/go/issues/18130#issuecomment-268411811ãåç
§ããŠ=
ã䜿çšããç¡å¶éã®å宣èšã¯ãå®éã«ã¯ãåºæ¬çãªãå宣èšã§ãããã€ãã«Goã«çµã¿èŸŒãŸããããšãããããæããŸãã
ããããtype intSet = map[int]struct{}
ïŒãšã¯ã¹ããŒããããªãïŒãååã®ãªãåãšã€ãªã¢ã¹ã䜿çšããããã®ããè¯ãæ¹æ³ã§ãããããã¯æ©èœãå¶éããã®ã§ã¯ãªããCodeReviewCommentsã®ãã¡ã€ã³ãšæšå¥šãããããã°ã©ãã³ã°ææ³ã®ããã«èãããŸãã
ãšã¯èšããã®ã®ã %T
ã¯ãåã·ã¹ãã ããããã°ãŸãã¯æ¢çŽ¢ãããšãã«åã確èªããããã®äŸ¿å©ãªããŒã«ã§ãã ãšã€ãªã¢ã¹ãå«ãåæ§ã®åœ¢åŒã®åè©ãããã¹ããã©ããçåã«æããŸããïŒ @davecheneyã®äŸã§ã¯q.B = []int
ã
@nathanyãã®åè©ãã©ã®ããã«å®è£
ããŸããïŒ ãšã€ãªã¢ã¹æ
å ±ã¯å®è¡æã«ååšããŸããã ïŒ reflect
ããã±ãŒãžã«é¢ããéãããšã€ãªã¢ã¹ã¯ãšã€ãªã¢ã¹ã®å¯Ÿè±¡ãšãªããã®ãš_åãã¿ã€ã_ã§ããïŒ
@bcmillsãããããããªããšæã£ã...ð
ãšã€ãªã¢ã¹ã®æäœã«åœ¹ç«ã€éçåæããŒã«ãšãšãã£ã¿ãŒãã©ã°ã€ã³ããŸã æ®ã£ãŠãããšæããŸãã®ã§ãåé¡ãããŸããã
2017幎2æ2æ¥17:01ããNathanYoungmanã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
ãšã¯èšããã®ã®ãïŒ
Tã¯ããããã°ãŸãã¯æ¢çŽ¢ãããšãã«åã確èªããããã®äŸ¿å©ãªããŒã«ã§ãã
åã·ã¹ãã ã 䌌ããããªãã©ãŒãããã®åè©ãããã¹ãããã
ãšã€ãªã¢ã¹ãå«ãŸããŠããŸããïŒ qB = [] int in @davecheney
https://github.com/davecheneyã®äŸã
ããè¯ã解決çã¯ãããã«çããããã«æç¥ã«ã¯ãšãªã¢ãŒããè¿œå ããããšã ãšæããŸã
質åïŒ
ããã¯ãGOPATHå
šäœïŒãŸãã¯ç¹å®ã®ããã±ãŒãžïŒã§å®£èšããããšã€ãªã¢ã¹ã§ãã
ã³ãã³ãã©ã€ã³ã§ãã®ç¹å®ã®ã¿ã€ãïŒ
ååã®ãªãã¿ã€ãã®ãšã€ãªã¢ã·ã³ã°ã®ä¹±çšã«ã€ããŠã¯å¿é
ããŠããŸããããå¯èœæ§ããããŸã
åãååã®ãªãã¿ã€ãã«ãšã€ãªã¢ã¹ãè€è£œããŸããã
@davecheneyäžéšã®ãã£ã¹ã«ãã·ã§ã³ãµããªãŒã®ãå¶éãã»ã¯ã·ã§ã³ã«ããªãã®ææ¡ãè¿œå ããŸããã ãã¹ãŠã®å¶éãšåæ§ã«ãç§ãã¡ã®äžè¬çãªèŠè§£ã¯ãå¶éã¯è€éããå¢ããšãããã®ã§ããïŒäžèšã®æ³šãåç §ïŒãå¶éãå°å ¥ããããã«ã¯ãåºç¯å²ã«ãããå±å®³ã®å®éã®èšŒæ ã確èªããå¿ èŠããããŸãã Goã®æãæ¹ãå€ããã ãã§ã¯äžååã§ããèšèªãå€æŽããã«ã¯ãGoã®æãæ¹ãå€ããå¿ èŠããããŸãã
ãã¶ã€ã³ããã¥ã¡ã³ããšã¡ãŒãªã³ã°ãªã¹ãã«èšèŒãããŠããããã«ã説æãç°¡åã«ããããã«ãããé©åãªçšèªã«åãçµãã§ããŸãã
@minuxã¯ã @ bcmillsãææããããã«ãå®è¡æã«ãšã€ãªã¢ã¹æ å ±ãååšããŸããïŒå®å šã«èšèšã®åºæ¬ã§ãïŒã ããšã€ãªã¢ã¹ãå«ãïŒ Tããå®è£ ããæ¹æ³ã¯ãããŸããã
2017幎2æ2æ¥ååŸ8æ33åããRussCoxã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
@minux https://github.com/minuxã@bcmillsãªã©
https://github.com/bcmillsãææããŸãããããšã€ãªã¢ã¹æ
å ±ã¯ååšããŸãã
å®è¡æïŒå®å
šã«èšèšã®åºæ¬ïŒã ããæ¹æ³ã¯ãããŸãã
ããšã€ãªã¢ã¹ãå«ãïŒ
Tããå®è£
ããŸãã
Goã®ç¬¬äžäººè
ïŒhttps://golang.org/x/tools/cmd/guruïŒã¯ãšãªã¢ãŒããææ¡ããŠããŸã
éçã³ãŒãåæã«åºã¥ãéãšã€ãªã¢ã¹ãããã³ã°çšã ãã
å®è¡æã«ãšã€ãªã¢ã¹æ
å ±ãå©çšå¯èœãã©ããã¯é¢ä¿ãããŸããã
@minux ããªãã»ã©ãããªãã¯ã¡ãŒã«ã§è¿ä¿¡ããŠããŠãGithubã¯åŒçšãããããã¹ããããªããèªåã§æžããããã¹ãã®ããã«èŠããŸãã ãã€ãµã³ã»ã€ã³ã°ãã³ããåŒçšããããã¹ãã«ãããªãã®ãã®ã ãšæã£ãŠè¿ä¿¡ããŠããŸããã æ··ä¹±ãããŠç³ãèš³ãããŸããã
çšèªãšæè²ã«é¢ããŠã¯ã @ griesemerãæçš¿ãããã©ã³ãã¿ã€ãã®èæ¯ãéåžžã«æçã§ããããšãããããŸããã ãããããããšãã
åãšåå€æã説æãããšããèµ€ã¡ããã®ããªããºãã¯æåãããããä»ã®èšèªã«ç²ŸéããŠããããã«ãç§ãåãšã€ãªã¢ã¹ã«ã€ããŠè©±ããŠãããšæããŸãã
æçµçãªçšèªãäœã§ãããååä»ãïŒãã©ã³ãïŒã¿ã€ãã®åã«ã¿ã€ããšã€ãªã¢ã¹ãå°å
¥ããããšãæ³åã§ããŸããç¹ã«ãæ°ããååä»ãã¿ã€ãã®å®£èšã¯ãæ¬ãã«ãªãã¥ã©ã ã«byte
ãšrune
ãå°å
¥ããåŸã«è¡ãããå¯èœæ§ãé«ãããã§ãã ãã ããã¢ã³ããã¿ãŒã³ã奚å±ããªããšãã@davecheneyã®æžå¿µã«çæããããšæããŸãã
type intSet map[int]struct{}
å Žåã map[int]struct{}
ã¯_underlying_ã¿ã€ãã§ãããšèšããŸãã type intSet = map[int]struct{}
ã©ã¡ããã®åŽãäœãšåŒã³ãŸããïŒ ãšã€ãªã¢ã¹ãšãšã€ãªã¢ã¹ã¿ã€ãïŒ
%T
ã«ã€ããŠã¯ã byte
ãšrune
ãuint8
ãšint32
ã«ãªãããšã説æããå¿
èŠãããã®ã§ãããã¯éããŸããéãã
ã©ã¡ãããšããã°ãã¿ã€ããšã€ãªã¢ã¹ã«ãã£ãŠbyte
ãšrune
説æãç°¡åã«ãªããšæããŸãã IMOã®èª²é¡ã¯ãååä»ãã¿ã€ããšã¿ã€ããšã€ãªã¢ã¹ããã€äœ¿çšããããç¥ãããããäŒéã§ããããã«ããããšã§ãã
@nathanyæåã«ããšã€ãªã¢ã¹ã¿ã€ãããå°å ¥ããããšã¯çã«
åŸæ¥ã®ïŒãšã€ãªã¢ã¹ä»¥å€ã®ïŒå宣èšã¯ãããå€ãã®äœæ¥ãè¡ããŸããå·ŠåŽã®èå¥åããã€ã³ãããåã«ããŸãå³åŽã®åããæ°ããåãäœæããŸãã ãããã£ãŠãå³åŽã®èå¥åãšåã¯åãã§ã¯ãããŸããïŒåãåºã«ãªãåã®ã¿ãå ±æããŸãïŒã ããã¯æããã«ããè€éãªæŠå¿µã§ãã
ã©ã®ã¿ã€ãã«ãååãä»ããããšãã§ããããã«ãªã£ãããããããã®æ°ããäœæãããã¿ã€ãã«ã¯æ°ããçšèªãå¿ èŠã§ãã ãããŠãããããåç §ããã¹ããã¯ã«ãŒã«ïŒã¿ã€ãIDãå²ãåœãŠå¯èœæ§ãã¬ã·ãŒããŒããŒã¹ã¿ã€ãïŒããããããããããåç §ã§ããå¿ èŠããããŸãã
ããã説æããå¥ã®æ¹æ³ããããŸããããã¯ãæè²ç°å¢ã§åœ¹ç«ã€å ŽåããããŸããã¿ã€ãã¯ãè²ä»ããŸãã¯è²ãªãã®ããããã§ãã äºåã«å®£èšããããã¹ãŠã®åãããã³ãã¹ãŠã®åãªãã©ã«ã¯è²ä»ããããŠããŸããã æ°ããè²ä»ãã®åãäœæããå¯äžã®æ¹æ³ã¯ãåŸæ¥ã®ïŒãšã€ãªã¢ã¹ä»¥å€ã®ïŒå宣èšã䜿çšããããšã§ãããã®å®£èšã§ã¯ãæåã«å³åŽã®åããŸã£ããæ°ããããããŸã§äœ¿çšãããããšã®ãªãè²ã§ãã€ã³ãããŸãïŒå€ãè²ãåãé€ããŸããå·ŠåŽã®èå¥åããã€ã³ãããåã«ãããããã°ãå®å šã«åŠçäžã§ãã ç¹°ãè¿ããŸãããèå¥åãšïŒæé»çããã³ç®ã«èŠããªã圢ã§äœæãããïŒè²ä»ãã®ã¿ã€ãã¯åãã§ãããå³åŽã«èšèŒãããŠããïŒç°ãªãè²ãŸãã¯è²ãªãã®ïŒã¿ã€ããšã¯ç°ãªããŸãã
ãã®ã¢ãããžãŒã䜿çšããŠãä»ã®ããŸããŸãªæ¢åã®ã«ãŒã«ãåå®åŒåããããšãã§ããŸãã
å®æ°åããšã€ãªã¢ã¹ãšã¯åŒã°ããå®æ°å€ããšã€ãªã¢ã¹å®æ°ãšåŒã³ãŸã
è¯ãç¹ð
è²ä»ããšè²ãªãã®ã¢ãããžãŒãç解ãããããã©ããã¯ããããŸããããæŠå¿µã説æããæ¹æ³ãè€æ°ããããšã瀺ããŠããŸãã
äŒçµ±çãªååä»ã/ãã©ã³ã/è²ä»ãã®ã¿ã€ãã¯ç¢ºãã«ãã£ãšèª¬æãå¿ èŠã§ãã ç¹ã«ãæ¢åã®ååä»ãåã䜿çšããŠååä»ãåã宣èšã§ããå Žåã èŠããŠããã¹ãããªã埮åŠãªéãããããŸãã
type intSet map[int]struct{} // a new type with an underlying type map[int]struct{}
type myIntSet intSet // a new type with an underlying type map[int]struct{}
type otherIntSet = intSet // just another name (alias) for intSet, add methods to intSet (only in the same package)
type literalIntSet = map[int]struct{} // just another name for map[int]struct{}, no adding methods
ããããããã¯ä¹ãè¶ããããªãããã§ã¯ãããŸããã ãããGo1.9ã«ãããšä»®å®ãããšãããã€ãã®Goæ¬ã®ç¬¬2çã衚瀺ããããšæããŸãã ð
åãå ¥ããããŠããçšèªã«ã€ããŠã¯ãå®æçã«Goä»æ§ãåç §ããŠããã®ã§ãæçµçã«ã©ã®çšèªãéžæãããã®ãéåžžã«èå³ããããŸãã
ã©ã®ã¿ã€ãã«ãååãä»ããããšãã§ããããã«ãªã£ãããããããã®æ°ããäœæãããã¿ã€ãã«ã¯æ°ããçšèªãå¿ èŠã§ãã
ããã€ãã®ã¢ã€ãã¢ïŒ
@bcmillsç§ãã¡ã¯ãåºå¥ãããããŠããŒã¯ãªãåºå¥ãããããã©ã³ãåããããè²ä»ãããããå®çŸ©ããããéãšã€ãªã¢ã¹ãªã©ã®ã¿ã€ãã«ã€ããŠèããŠããŸããã ãå ·è±¡ãã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã«ãè²ãä»ããããšãã§ããã€ã³ã¿ãŒãã§ãŒã¹ã¯æœè±¡åã®å身ã§ããããã誀解ãæãæãããããŸãã ãstruct {int}ãã¯æ瀺çã«ïŒãšã€ãªã¢ã¹ä»¥å€ã®ïŒååãä»ããããåãšåãããã«èå¥å¯èœã§ããããããèå¥å¯èœãã誀解ãæãããã«æãããŸãã
ç§ã¯å察ããããšããå§ãããŸãïŒ
ããã©ã³ããã¯æ©èœããå¯èœæ§ããããŸãããçã®ãããªã¿ã€ãããšããæå³åãããããŸãããæ¬è³ªçã«æªããšã¯æããŸããã
ãŠããŒã¯ã§ç¬ç¹ãªãã®ã¯ããããŸã§ã®ãšããéç«ã£ãéžæè¢ã®ããã§ãã
ãããã¯ãå€ãã®è¿œå ã®ã³ã³ããã¹ããç¥èããªããŠããã·ã³ãã«ã§ç解ãããããã®ã§ãã ç§ããã®åºå¥ãç¥ããªãã£ããªãã°ãç§ã¯å°ãªããšãããããäœãæå³ãããã«ã€ããŠã®äžè¬çãªæèŠãæã£ãŠãããšæããŸãã ä»ã®éžæè¢ã«ã€ããŠã¯èšããŸããã
çšèªãåŠãã ãããã¯éèŠã§ã¯ãããŸããããæå³ã®ããååã¯åºå¥ãå é¢åããããã®äžå¿ èŠãªéå£ãåé¿ããŸãã
ããã¯ãèªè»¢è»å°å±ã®è°è«ã®å®çŸ©ã§ãã ãããŒãã¯https://go-review.googlesource.com/#/c/36213/ã«ä¿çäžã®CLãæã£ãŠã
CLhttps ïŒ //golang.org/cl/36213ã¯ãã®åé¡ã«ã€ããŠèšåããŠããŸãã
go fix
ããäžåºŠåãäžããããšæããŸãã
ç§ããšã€ãªã¢ã¹ããåé€ãããããšãææ¡ããŠããªãããšãæ確ã«ããããã«ã å€åããã¯ä»ã®ä»äºã«æçšã§é©åãªãã®ã§ãããããã¯å¥ã®è©±ã§ãã
ã¿ã€ãã«ã移åã¿ã€ãã«é¢ãããã®ã§ããããšã¯ãéåžžã«éèŠãªIMOã§ãã ç§ã¯ãã®åé¡ãåœæãããããããŸããã ç§ãã¡ã®ç®çã¯ããããžã§ã¯ãã®äžçš®ã®ã€ã³ã¿ãŒãã§ãŒã¹å€æŽã«å¯ŸåŠããããšã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã®å€æŽã«é¢ããŠã¯ããã¹ãŠã®ãŠãŒã¶ãŒãããã2ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒå€ããã®ãšæ°ãããã®ïŒãæçµçã«åããã®ãšããŠäœ¿çšããããšãæãã§ããããã§ã¯ãããŸããããã®ãããã段éçãªã³ãŒã修埩ããšèšããŸãã ãŠãŒã¶ãŒãå€ããã®ã®äœ¿çšæ³ãåé€/å€æŽããããšãé¡ã£ãŠããŸãã
@ tux21bãææ¡ããã¢ã€ãã¢ã®ããã«ãç§ã¯ä»ã§ãããŒã«ãã³ãŒãã修埩ããããã®æè¯ã®æ¹æ³ã ãšèããŠããŸãã äŸãã°ïŒ
$ cat "$GOROOT"/RENAME
# This file could be used for `go fix`
[package]
x/net/context=context
[type]
io.ByteBuffer=bytes.Buffer
$ go fix -rename "$GOROOT"/RENAME [packages]
# -- or --
# use a standard libraries rename table as default
$ go fix -rename [packages]
# -- or --
# include this fix as default
$ go fix [packages]
@rscãããã§ãããããã®ã¯ãŒã¯ãããŒã§ã¯æ£ãããªããšæããŸããå€ãããã±ãŒãžïŒäŸåé¢ä¿ãªã©ïŒãããã±ãŒãžã®éæšå¥šã®åå/ãã¹ïŒ x/net/context
ãªã©ïŒã䜿çšããŠããå Žåã¯ãæåã«ã³ãŒããä¿®æ£ã§ããŸããããã¥ã¡ã³ããã³ãŒããæ°ããããŒãžã§ã³ã«ç§»è¡ããæ¹æ³ã説æããŠããããã«ãããã¹ã圢åŒã®æ§æå¯èœãªããŒãã«ãä»ããŠããŒãã³ãŒãã£ã³ã°ã¯ããŠããŸããã ããããã°ãæ°ããããŒãžã§ã³ã®Goãšåãããã«ããã€ã§ã奜ããªãšãã«ä»»æã®ããŒã«ã䜿çšã§ããŸãã å¯äœçšããããŸãïŒããã¯ã³ãŒããå€æŽããŸãã
@LionNatsu ãããªãã¯æ£ãããšæããŸãããããã¯å¥ã®åé¡ã ãšæããŸããAPIã®å€æŽã«å¿ããŠæ©æ¢°çãªæ¹æ³ã§ã³ãŒããæŽæ°ããæ¹æ³ãæœåšçãªã¯ã©ã€ã¢ã³ãã«èª¬æããããã«ãããã±ãŒãžã®èŠåãæ¡çšããå¿ èŠããããŸããïŒ ããããããããããããã®èŠåãäœã§ããããç解ããå¿ èŠããããŸãã ãã®äŒè©±ãæ¯ãè¿ã£ãŠããã®ãããã¯ã«ã€ããŠå¥ã®åé¡ãéãããšãã§ããŸããïŒ ããããšãã
CL https://golang.org/cl/36691ã¯ããã®åé¡ã«ã€ããŠèšåããŠããŸãã
ãã®ææ¡ããã³ãã«ãããšã次ã®ããã±ãŒãžãäœæã§ããŸãã
package safe
import "unsafe"
type Pointer = unsafe.Pointer
ããã«ãããããã°ã©ã ã¯unsafe
çŽæ¥ã€ã³ããŒãããã«unsafe.Pointer
å€ãäœæã§ããŸãã
package main
import "safe"
func main() {
x := []int{4, 9}
y := *(*int)(safe.Pointer(uintptr(safe.Pointer(&x[0])) + 8))
println(y)
}
å ã®ãšã€ãªã¢ã¹å®£èšã®èšèšããã¥ã¡ã³ãã§ã¯ããããæ瀺çã«ãµããŒããããŠãããšåŒã³ãããŠããŸãã ãã®æ°ããã¿ã€ãã®ãšã€ãªã¢ã¹ææ¡ã§ã¯æ瀺çã§ã¯ãããŸããããæ©èœããŸãã
ãšã€ãªã¢ã¹å®£èšã®åé¡ã«ã€ããŠãããã®çç±ã¯æ¬¡ã®ãšããã§ãã_ "unsafe.Pointerã®ãšã€ãªã¢ã¹ãèš±å¯ããçç±ã¯ãunsafe.Pointerãæã€åãåºã«ãªãåãšããŠå®çŸ©ããããšããã§ã«å¯èœã§ããããã§ãã" _ httpsïŒ//github.com/ golang / go / issues / 16339ïŒissuecomment -232435361
ããã¯æ¬åœã§ããã unsafe.Pointer
ãšã€ãªã¢ã¹ãèš±å¯ãããšãäœãæ°ããããšãå°å
¥ããããšæããŸããããã°ã©ã ã¯ãå®å
šã§ãªããã®ãæ瀺çã«ã€ã³ããŒãããããšãªãã unsafe.Pointer
å€ãäœæã§ããããã«ãªããŸããã
ãã®ææ¡ã®åã«äžèšã®ããã°ã©ã ãäœæããã«ã¯ãsafe.Pointerãã£ã¹ããå®å šã§ãªããã®ãã€ã³ããŒãããããã±ãŒãžã«ç§»åããå¿ èŠããããŸãã ããã«ãããããã°ã©ã ã®å®å šã§ãªã䜿çšãç£æ»ããããšãå°ãé£ãããªãå¯èœæ§ããããŸãã
@crawshaw ããããŸã§ã«ããããã£ãããšããªãã£ãã®ã§ããïŒ
package safe
import (
"reflect"
"unsafe"
)
func Pointer(p interface {}) unsafe.Pointer {
switch v := reflect.ValueOf(p); v.Kind() {
case reflect.Uintptr:
return unsafe.Pointer(uintptr(v.Uint()))
default:
return unsafe.Pointer(v.Pointer())
}
}
ããã«ãããããã±ãŒãžmain
åãã€ã³ããŒãããªãç¶æ
ã§ããŸã£ããåãããã°ã©ã ãã³ã³ãã€ã«ã§ããããã«ãªããšæããŸãã
ïŒå¿
ãããæå¹ãªããã°ã©ã ã§ãããšã¯éããŸããã uintptr
ããPointer
ãžã®å€æã«ã¯é¢æ°åŒã³åºããå«ãŸããŠããããã " unsafe
ããã±ãŒãžã®å¶çŽãæºãããŠããŸãããäž¡æ¹ã®å€æã¯åãåŒã«å«ãŸããŠããå¿
èŠãããããããã®éã«ç®è¡æŒç®ãä»åšããŠããã ãã§ããããã ãã main
ããunsafe
ãã€ã³ããŒãããªããŠããåçã®æå¹ãªããã°ã©ã ãäœæã§ãããšæããŸãã reflect.SliceHeader
ãããªãã®ã®äœ¿çšãïŒ
é衚瀺ã®å®å šã§ãªãã¿ã€ãããšã¯ã¹ããŒãããããšã¯ãç£æ»ã«è¿œå ãããã1ã€ã®ã«ãŒã«ã®ããã§ãã
ã¯ããç§ã¯çŽæ¥ãšã€ãªã¢ã·ã³ã°ãå®å šã§ã¯ãªãããšãææããããšæããŸããããã€ã³ã¿ãŒã¯ã³ãŒãã®ç£æ»ãé£ããããã®ã§ã誰ãããããªãããšãé¡ã£ãŠããŸãã
@crawshawç§ã®ã³ã¡ã³ãã«ãããšãããã¯ã¿ã€ããšã€ãªã¢ã·ã³ã°ãçºçããåã«ãåœãŠã¯ãŸããŸããã 以äžãæå¹ã§ãã
package a
import "unsafe"
type P unsafe.Pointer
package main
import "./a"
import "fmt"
var x uint64 = 0xfedcba9876543210
var h = *(*uint32)(a.P(uintptr(a.P(&x)) + 4))
func main() {
fmt.Printf("%x\n", h)
}
ã€ãŸããããã±ãŒãžmainã§ã¯ã unsafe
ããã±ãŒãžããªãã a.P
ããšã€ãªã¢ã¹ã§ã¯ãªãå Žåã§ãã a.P
ã䜿çšããŠå®å
šã§ãªãæŒç®ãå®è¡ã§ããŸãã ããã¯åžžã«å¯èœã§ããã
ããªããèšåããŠããä»ã®äœãããããŸããïŒ
ç§ã®ééãã ç§ã¯ãããããŸããããªãã£ããšæããŸããã ïŒunsafe.Pointerã«é©çšãããç¹å¥ãªã«ãŒã«ã¯ãããããå®çŸ©ãããæ°ããåã«ã¯äŒæããªããšããå°è±¡ãåããŸãããïŒ
ä»æ§ã¯å®éã«ã¯ããã«ã€ããŠæ確ã§ã¯ãããŸããã go / typesã®å®è£
ãèŠããšãç§ã®æåã®å®è£
ã§ã¯ãåºç€ãšãªãã¿ã€ããunsafe.Pointer
ã§ãã£ãã¿ã€ãã ãã§ãªããæ£ç¢ºã«unsafe.Pointer
å¿
èŠã§ããããšãããããŸããã go / typesãgcæºæ ã«å€æŽãããšãã®ïŒ6326ãèŠã€ããŸããã
ãããããéåžžã®åå®çŸ©ã§ã¯ãããçŠæ¢ãã unsafe.Pointer
ãšã€ãªã¢ã¹ãçŠæ¢ããå¿
èŠããããŸãã ç§ã¯ãããèš±å¯ããæ£åœãªçç±ãèŠãããšãã§ãããå®å
šã§ãªãã³ãŒãã®ããã«unsafe
ãã€ã³ããŒãããªããã°ãªããªããšããæ瀺æ§ãå±ããããŸãã
https://github.com/golang/go/issues/19306ãäœæããŸãã
ãããèµ·ãããŸããã ããã«ã¯äœãæ®ã£ãŠããªããšæããŸãã
æãåèã«ãªãã³ã¡ã³ã
@ cznic ã @ iand ããã®ä»ïŒ _ããšã«æ³šæããŠãã ããã ãããã¯æ©èœã®èª¬æãè€éã«ããæ©èœã®ãã¹ãŠã®ãŠãŒã¶ãŒã«èªç¥çè² è·ãè¿œå ããŸããå¶éãå¿ããå Žåãæ©èœããã¯ãã ãšæã£ããã®ãæ©èœããªãçç±ãããºã«ã§è§£ãå¿ èŠããããŸãã
æ¶ç©ºã®èª€çšã®ã¿ãçç±ãšããŠãæå ã®è©Šè¡ã«å¶éãå®è£ ããããšã¯ãã°ãã°ééãã§ãã ããã¯ãšã€ãªã¢ã¹ææ¡ã®è°è«ã§èµ·ããããã©ã€ã¢ã«ã®ãšã€ãªã¢ã¹ã¯èšäºããã®
io.ByteBuffer
=>bytes.Buffer
å€æãåŠçã§ããªããªããŸããã èšäºãæžãç®çã®äžéšã¯ãåŠçã§ããããã«ãããããšãããã£ãŠããããã€ãã®ã±ãŒã¹ãå®çŸ©ããŠãäžæ³šæã«ããããå¶éããªãããã«ããããšã§ããå¥ã®äŸãšããŠãéãã€ã³ã¿ãŒåã®ã¬ã·ãŒããŒãçŠæ¢ããããéæ§é äœåã®ã¡ãœãããçŠæ¢ãããããããã«ã誀çšã®åŒæ°ãäœæããã®ã¯ç°¡åã§ãã ãããã®ãããããå®è¡ããå ŽåãStringïŒïŒã¡ãœããã䜿çšããŠåæåãäœæããŠããèªäœãå°å·ããããšã¯ã§ããŸããããŸãã
http.Headers
ãã¬ãŒã³ãããã«ããŠãã«ããŒã¡ãœãããæäŸããããšãã§ããŸããã å€ãã®å Žåã誀çšãæ³åããã®ã¯ç°¡åã§ãã 説åŸåã®ããç©æ¥µçãªäœ¿çšã¯ã衚瀺ããããŸã§ã«æéããããå¯èœæ§ããããå®éšçšã®ã¹ããŒã¹ãäœæããããšãéèŠã§ããããã«å¥ã®äŸãšããŠããã€ã³ã¿ãŒãšå€ã®ã¡ãœããã®å ã®èšèšãšå®è£ ã§ã¯ãTãš* Tã®ã¡ãœããã»ãããåºå¥ãããŸããã§ããã* Tãããå Žåã¯ãå€ã¡ãœããïŒã¬ã·ãŒããŒTïŒãåŒã³åºãããšãã§ãã Tã®å Žåããã€ã³ã¿ã¡ãœããïŒã¬ã·ãŒããŒ* TïŒãåŒã³åºãããšãã§ããŸãã ããã¯åçŽã§ã説æããå¶éã¯ãããŸããã§ããã ããããå®éã®çµéšãããå€ã«å¯Ÿãããã€ã³ã¿ãŒã¡ãœããã®åŒã³åºããèš±å¯ãããšãç¹å®ã®ã¯ã©ã¹ã®çŽããããé©ãã¹ããã°ãçºçããããšãããããŸããã ããšãã°ã次ã®ããã«æžãããšãã§ããŸãã
io.Copyã¯æåããŸãããbufã«ã¯äœãå«ãŸããŸããã ãã®ããã°ã©ã ãæ£ããå®è¡ãããªãã£ãçç±ã説æãããããã®ããã°ã©ã ãã³ã³ãã€ã«ãããªãã£ãçç±ã説æããããéžæããå¿ èŠããããŸããã ãããã«ããã質åããããŸããããç§ãã¡ã¯èª€ã£ãå®è¡ãé¿ããåŽã«èœã¡ãŸããã ããã§ãããã¶ã€ã³ã«ç©ŽãéããŠããçç±ã«ã€ããŠã®FAQãšã³ããªã
ç¹°ãè¿ããŸãããå¶éã«ããè€éããå¢ãããšãå¿ããªãã§ãã ããã ãã¹ãŠã®è€éãã®ããã«ãå¶éã«ã¯éèŠãªæ£åœåãå¿ èŠã§ãã èšèšããã»ã¹ã®ãã®æ®µéã§ã¯ãç¹å®ã®èšèšã«é©ããŠããå¯èœæ§ã®ããå¶éã«ã€ããŠèããã®ã¯è¯ãããšã§ãããå¶éã®ãªãåçŽãªèšèšãå®éã«çµéšããåŸã§ã®ã¿ãå¶éãååãªã¡ãªããããããããã©ãããç解ããã®ã«åœ¹ç«ã€å¯èœæ§ããããŸãããã®è²»çšãæ¯æãããã«ã