ãã®æçš¿ã¯ãç§èªèº«ã®è±èªã®èšäºãGoã§ãŽããã£ãé¿ããæ¹æ³ãã®ããŒãžã§ã³ã§ããã ãŽããã£ãšããåèªã¯ãã·ã¢èªã«ç¿»èš³ãããŠããŸããã
Gotchaã¯ã説æã©ããã«åäœããã·ã¹ãã ãããã°ã©ã ããŸãã¯ããã°ã©ãã³ã°èšèªã®æ£ããèšèšã§ãããåæã«èª€ã£ãŠäœ¿ãããããããçŽæã«åãããšã©ãŒãåŒãèµ·ãããŸãã
Goèšèªã«ã¯ãã®ãããªèœãšã穎ãããã€ãããããããã詳现㫠説æããã³èª¬æããå€ãã®åªããèšäºããããŸã ã ç§ã¯å®æçã«åãã¬ãŒãã«èœã¡ã人ãèŠãã®ã§ããããã®èšäºã¯ãç¹ã«Goã®åå¿è
ã«ãšã£ãŠéåžžã«éèŠã ãšæããŸãã
ãããããã質åãé·ãéç§ãèŠãããŸãã-ãªãç§ã¯èªåã§ãããã®ééããç¯ããããšããªãã®ã§ããïŒ çå£ã«ãnilã€ã³ã¿ãŒãã§ãŒã¹ãšã®æ··ä¹±ãappendïŒïŒã«ããäžå¯è§£ãªçµæ-eã¹ã©ã€ã¹-ãªã©ã®æã人æ°ã®ãããã®ã¯ãç§ã®ç·Žç¿ã§ã¯æ±ºããŠåé¡ã«ãªããŸããã§ããã ã©ãããããããGoã§ã®ä»äºã®æåã®æ¥ãããããã®èœãšã穎ãåé¿ã§ããã®ã¯å¹žéã§ããã äœãç§ãå©ããŸãããïŒ
ãããŠçãã¯éåžžã«ç°¡åã§ããã Goã®ããŒã¿æ§é ã®å
éšæ§é ãšãã®ä»ã®å®è£
ã®è©³çްã«ã€ããŠãããã€ãã®åªããèšäºãããã«èªã¿ãŸããã ãããŠãããã¯å®éã«ã¯éåžžã«è¡šé¢çãªãã®ã§ãããç¥èã¯çŽèгãéçºãããããã®èœãšã穎ãåé¿ããã®ã«ååã§ããã
å®çŸ©ã«æ»ããŸãããã ãgotcha ...ã¯æ£ããæ§é ã§ã...ããã¯çŽæã«åããŸã...ãã§ãã ããããã¹ãŠã®å¡©ã§ãã å®éã2ã€ã®ãªãã·ã§ã³ããããŸãã
- èšèªããä¿®æ£ããã
- çŽèгãçŽããŸã
æåã®ãªãã·ã§ã³ã¯ãå€ãã®habrachitatelã«ã¢ããŒã«ããŸããããã¡ãããªãã·ã§ã³ã§ã¯ãããŸããã Goã«ã¯åŸæ¹äºææ§ã®çŽæããããŸã -èšèªã¯ãã以äžå€ããããããã¯çŽ æŽãããããšã§ã-2012å¹Žã«æžãããããã°ã©ã ã¯ã仿¥ãææ°ããŒãžã§ã³ã®Goã§ã³ã³ãã€ã«ããã1åãæžŠå·»ãããšã¯ãããŸããã ã¡ãªã¿ã«ãå²inã«ã¯æ··ä¹±ã¯ãããŸãã:)
2çªç®ã®ãªãã·ã§ã³ã¯ã çŽæãéçºããããã«ããæ£ç¢ºã«åŒã³åºãããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯ã¹ã©ã€ã¹ãã©ã®ããã«æ©èœããããè£ããç¥ããšããã«ãçŽæãããæ£ç¢ºã«ããã³ãââããåºããééããé¿ããã®ã«åœ¹ç«ã¡ãŸãã ãã®æ¹æ³ã¯ç§ã倧ãã«å©ããŠãããŸããããä»ã®äººã«ããã£ãšåœ¹ç«ã€ã§ãããã ããã§ãGoã®å
éšã«é¢ãããã®åºæ¬çãªç¥èã1ã€ã®æçš¿ã«å
¥ããŠãGoãå
éšããã©ã®ããã«æ§ç¯ããããã«ã€ããŠã®çŽæãä»ã®äººãéçºã§ããããã«ããããšã«ããŸããã
ããŒã¿åãã¡ã¢ãªã«æ ŒçŽãããæ¹æ³ã®åºæ¬çãªçè§£ããå§ããŸãããã 以äžã«ãåŠç¿ããå
容ã®çããªã¹ãã瀺ããŸãã
ãã€ã³ã¿
Goã¯ãå®¶ç³»å³ã«Cèšèªãå«ãŸããŠãããããå®éã«ã¯ããªãéã«è¿ããã®ã§ãã int64
åïŒ64ãããã®æŽæ°å€ïŒã®å€æ°ãäœæããå Žåãã¡ã¢ãªã«å¿
èŠãªå®¹éãæ£ç¢ºã«ç¢ºèªã§ããŸãããŸãã unsafe.SizeofïŒïŒã䜿çšããŠä»ã®åãèŠã€ããããšãã§ããŸãã
ç§ã¯ãã¡ã¢ãªå
ã®ããŒã¿ã®èŠèŠç衚çŸã䜿çšããŠã倿°ãé
åããŸãã¯ããŒã¿æ§é ã®ãµã€ãºããèŠããããšãæ¬åœã«å¥œãã§ãã èŠèŠçã¢ãããŒãã¯ãèŠæš¡ããã°ããçè§£ããçŽæãéçºããçç£æ§ãªã©ãèŠèŠçã«è©äŸ¡ããã®ã«åœ¹ç«ã¡ãŸãã
ããšãã°ãGoã®æãåçŽãªåºæ¬ã¿ã€ãããå§ããŸãããã

ãã®ãããªèŠèŠåã§ã¯ã int64åã®å€æ°ãint32ã® 2åã®ãã¹ããŒã¹ããå æãã intãint32ã å æããããšã¯æããã§ãïŒ32ãããã®ãã·ã³ã§ãããšä»®å®ïŒã
ãã€ã³ã¿ã¯å°ãè€éã«èŠããŸã-å®éãããã¯ãããŒã¿ãé
眮ãããŠããå¥ã®ã¡ã¢ãªãããã¯ãæãã¡ã¢ãªå
ã®ã¢ãã¬ã¹ãå«ã1ã€ã®ã¡ã¢ãªãããã¯ã§ãã ããã€ã³ã¿ã®éåç
§ããšãããã¬ãŒãºãèãããå Žåãããã€ã³ã¿ã®ã¡ã¢ãªãããã¯ã§ã¢ãã¬ã¹ãæããŠããã¡ã¢ãªãããã¯ããããŒã¿ãæ€çŽ¢ããããšããæå³ã§ãã æ¬¡ã®ããã«æ³åã§ããŸãã

ã¡ã¢ãªã¢ãã¬ã¹ã¯éåžž16é²åœ¢åŒã§ç€ºããããããå³ã®ã0x ...ãã§ãã ãã ããããã§éèŠãªç¹ã¯ãããã€ã³ã¿ã®ã¡ã¢ãªãããã¯ãã1ã€ã®å Žæã«ããããã¢ãã¬ã¹ãæãããŒã¿ãããŸã£ããç°ãªãå Žæã«ããããšã§ãã ããã¯ããå°ã圹ã«ç«ã€ã§ãããã
ãããŠãããã§Goã®èœãšã穎ã®1ã€ã«ã€ããŠèª¬æããŸããä»ã®èšèªã®ãã€ã³ã¿ãŒã䜿çšããçµéšã®ãªã人ã¯ã颿°ã®ã倿ž¡ãããã©ã¡ãŒã¿ãŒã®çè§£ã«æ··ä¹±ãçããŸãã ãåç¥ã®ãšããããã¹ãŠãGoã«ãå€ã§ãæž¡ãããŸããã€ãŸããæåéãã³ããŒãããŸãã ãã©ã¡ãŒã¿ãŒããã®ãŸãŸæž¡ããããã€ã³ã¿ãŒãä»ããŠæž¡ããã颿°ã«ã€ããŠããããèŠèŠåããŠã¿ãŸãããã

æåã®ã±ãŒã¹ã§ã¯ãããããã¹ãŠã®ã¡ã¢ãªãããã¯ãã³ããŒããŸããå®éã«ã¯ã2ã€ä»¥äžãå°ãªããšã200äžãããã¯ãç°¡åã«ååšãããããã¯ãã¹ãŠã³ããŒãããŸããããã¯æãé«äŸ¡ãªæäœã®1ã€ã§ãã 2çªç®ã®ã±ãŒã¹ã§ã¯ãã¡ã¢ãªã®1ã€ã®ãããã¯ã®ã¿ãã³ããŒããŸãïŒã¢ãã¬ã¹ã¯ã¡ã¢ãªã«ä¿åãããŸãïŒãé«éã§å®äŸ¡ã§ãã ãã ããå°ããªããŒã¿ã®å Žåã¯ãå€ã§æž¡ãããšããå§ãããŸããããã¯ããã€ã³ã¿ãŒãGCã«è¿œå ã®è² è·ãäœæãããã®çµæãããé«äŸ¡ã«ãªãããšã倿ããããã§ãã
ããããä»ããã€ã³ã¿ãŒã颿°ã«æž¡ãããæ¹æ³ã®ãã®èŠèŠç衚çŸãããã°ãæåã®ã±ãŒã¹ã§ã¯ã Foo()
颿°ã®å€æ°p
ã倿Žãããšãã³ããŒãæäœããå
ã®å€æ°ïŒ p1
ïŒã®å€ã倿Žããªãããšãèªç¶ã«ãèŠããããšãã§ããŸããæ¬¡ã«ããã€ã³ã¿ãå
ã®å€æ°ãåç
§ããããã倿ŽããŸãã ã©ã¡ãã®å Žåã§ãããã©ã¡ãŒã¿ãŒã転éããããšãããŒã¿ãã³ããŒãããŸãã
ããŠããŠã©ãŒã ã¢ããã¯çµãããŸãããæ·±ãæãäžããŠãããå°ãè€éãªããšãèŠãŠã¿ãŸãããã
é
åãšã¹ã©ã€ã¹
ã¹ã©ã€ã¹ã¯æåã¯éåžžã®é
åãšããŠååŸãããŸãã ããããããã¯ããã§ã¯ãããŸãããå®éããããã¯Goã®2ã€ã®ç°ãªãã¿ã€ãã§ãã æåã«é
åãèŠãŠã¿ãŸãããã
é
å
var arr [5]int var arr [5]int{1,2,3,4,5} var arr [...]int{1,2,3,4,5}
é
åã¯åãªãã¡ã¢ãªãããã¯ã®ã·ãŒã±ã³ã·ã£ã«ã»ããã§ãããGoã®ãœãŒã¹ïŒ src / runtime / malloc.go ïŒãèŠããšãé
åã®äœæã¯åºæ¬çã«é©åãªãµã€ãºã®ã¡ã¢ãªãå²ãåœãŠãã ãã§ããããšãããããŸãã å€ãè¯ãmallocãå°ãã ãè³¢ãïŒ
ããã¯ç§ãã¡ã«ãšã£ãŠäœãæå³ããã®ã§ããããïŒ ããã¯ã次ã
ã«é
眮ãããã¡ã¢ãªãããã¯ã®ã»ãããšããŠåçŽã«é
åãèŠèŠçã«è¡šçŸã§ããããšãæå³ããŸãã

é
åã®åèŠçŽ ã¯åžžã«ãã®åã®ãŒãå€ã«åæåãããŸã -ãã®å Žåã¯0ãé·ã5ã®æŽæ°ã®é
åã§ããã€ã³ããã¯ã¹ã§ãããã«ã¢ã¯ã»ã¹ããçµã¿èŸŒã¿ã®len()
颿°ã䜿çšããŠé
åã®ãµã€ãºãèŠã€ããŸãã ã€ã³ããã¯ã¹ã«ãã£ãŠé
åã®åäžã®èŠçŽ ã«ã¢ã¯ã»ã¹ããæ¬¡ã®ãããªããšãããå ŽåïŒ
var arr [5]int arr[4] = 42
次ã«ã5çªç®ïŒ4 + 1ïŒã®èŠçŽ ãååŸããŠãã¡ã¢ãªå
ã®ãã®ãããã¯ã®å€ã倿ŽããŸãã

ããŠãã¹ã©ã€ã¹ãæ±ããŸãããã
ã¹ã©ã€ã¹æ°
äžèŠãé
åã®ããã«èŠããŸãã ãŸããå³ã圌ãã¯éåžžã«äŒŒãŠããŸãïŒ
var foo []int
ããããGoã®ãœãŒã¹ïŒ src / runtime / slice.go ïŒãèŠããšãã¹ã©ã€ã¹ã¯å®éã«ã¯3ã€ã®ãã£ãŒã«ãã®æ§é ã§ããããšãããããŸã-é
åãžã®ãã€ã³ã¿ãŒãé·ããããã³å®¹éïŒ
type slice struct { array unsafe.Pointer len int cap int }
æ°ããã¹ã©ã€ã¹ãäœæãããšãããã³ãããã®äžãã©ã³ã¿ã€ã ã¯ãnullãã€ã³ã¿ãŒïŒ nil
ïŒã§é·ãããã³å®¹éããŒãã®ãã®ã¿ã€ãã®æ°ãã倿°ãäœæããŸãã ããã¯ãã¹ã©ã€ã¹ã®ãŒãå€ã§ãã ãããèŠèŠåããŠã¿ãŸãããïŒ

ããã¯ããŸãé¢çœããªãã®ã§ãçµã¿èŸŒã¿ã®make()
ã³ãã³ãã§å¿
èŠãªãµã€ãºã®ã¹ã©ã€ã¹ãåæåããŸãããã
foo = make([]int, 5)
ãã®ã³ãã³ãã¯ãæåã«5ã€ã®èŠçŽ ã®é
åãäœæãïŒã¡ã¢ãªãå²ãåœãŠãŠãŒãã§åããŸãïŒã len
ãšcap
å€ã5ã«èšå®ããŸãCap
ã¯å®¹éãæå³ããã¹ã©ã€ã¹ã倧ãããªã£ããšãã«äžèŠãªã¡ã¢ãªå²ãåœãŠæäœãé¿ããããã«å°æ¥ã®ã¡ã¢ãªé åãäºçŽããã®ã«åœ¹ç«ã¡ãŸãã å°ãé«åºŠãªåœ¢åŒmake([]int, len, cap)
ã䜿çšããŠã容éãæåã«ç€ºãããšãã§ããŸãã ã¹ã©ã€ã¹ãèªä¿¡ãæã£ãŠäœ¿çšããã«ã¯ãé·ããšå®¹éã®éããçè§£ããããšãéèŠã§ãã
foo = make([]int, 3, 5)
äž¡æ¹ã®åŒã³åºããèŠãŠã¿ãŸãããã

次ã«ããã€ã³ã¿ãŒãé
åãã¹ã©ã€ã¹ã®é
çœ®æ¹æ³ã«é¢ããç¥èãçµã¿åãããŠã次ã®ã³ãŒããåŒã³åºããããšãã«äœãèµ·ããããèŠèŠåããŸãããã
foo = make([]int, 5) foo[3] = 42 foo[4] = 100

ç°¡åã§ããã ãããã foo
ããæ°ãããµãã¹ã©ã€ã¹ãäœæããèŠçŽ ã倿Žãããšã©ããªããŸããïŒ èŠãŠã¿ãŸãããïŒ
foo = make([]int, 5) foo[3] = 42 foo[4] = 100 bar := foo[1:4] bar[1] = 99

åãèŠãïŒ bar
ã¹ã©ã€ã¹ã倿Žããããšã§ãå®éã«é
åã倿Žãbar
ããããã¯foo
ã¹ã©ã€ã¹ãæãé
åãšåãã§ãã ãããŠãããã¯å®éã«æ¬ç©ã§ã-ãã®ãããªã³ãŒããæžãããšãã§ããŸãïŒ
var digitRegexp = regexp.MustCompile("[0-9]+") func FindDigits(filename string) []byte { b, _ := ioutil.ReadFile(filename) return digitRegexp.Find(b) }
ãããŠãããšãã°ããã¡ã€ã«ãã10 MBã®ããŒã¿ãã¹ã©ã€ã¹ã«èªã¿èŸŒãã åŸãæ°åãå«ã3ãã€ããèŠã€ããŸããããµã€ãºã10 MBã®é
åãåç
§ããã¹ã©ã€ã¹ãè¿ããŸãã

ããã¯ãGoã§æãé »ç¹ã«èšåãããèœãšã穎ã®1ã€ã§ãã ãããä»ããããã©ã®ããã«æ©èœããããæç¢ºã«çè§£ãããšãããªãããã®ãããªééããç¯ãããšã¯é£ããã§ãããã
ã¹ã©ã€ã¹ãžã®è¿œå ïŒè¿œå ïŒ
ã¹ã©ã€ã¹ã®ããªãããŒãªãšã©ãŒã«ç¶ããŠãçµã¿èŸŒã¿é¢æ°append()
åäœã¯ããŸãæç¢ºã§ã¯ãããŸããã 圌女ã¯ãååãšããŠã1ã€ã®ç°¡åãªæäœãè¡ããŸã-èŠçŽ ã远å ããŸãã ããããå
éšã§ã¯ããªãè€éãªæäœãè¡ãããå¿
èŠãªå Žåã«ã®ã¿ã¡ã¢ãªãå²ãåœãŠã广çã«å®è¡ããŸãã
次ã®ã³ãŒããèŠãŠãã ããã
a := make([]int, 32) a = append(a, 1)
圌ã¯32åã®æŽæ°ã®æ°ããã¹ã©ã€ã¹ãäœæããããã«33çªç®ã®èŠçŽ ã远å ããŸãã
cap
-ã¹ã©ã€ã¹å®¹éãèŠããŠããŸããïŒ å®¹éã¯ãã¢ã¬ã€ã«å²ãåœãŠãããã¹ããŒã¹ã®éãæå³ããŸãã append()
颿°ã¯ãã¹ã©ã€ã¹ã«å¥ã®èŠçŽ ã远å ããã®ã«ååãªã¹ããŒã¹ããããã©ããã確èªãããªãå Žåã¯ãããå€ãã®ã¡ã¢ãªãå²ãåœãŠãŸãã ã¡ã¢ãªã®å²ãåœãŠã¯åžžã«é«äŸ¡ãªæäœã§ããããã append()
ã¯æé©åã詊ã¿append()
ãã®å Žåã1ã€ã®å€æ°ã§ã¯ãªããå¥ã®32xïŒåæãµã€ãºã®2åïŒã®ã¡ã¢ãªãèŠæ±ããŸãã ã¡ã¢ãªããã¯ã®å²ãåœãŠã¯ãæ°åã«åããŠè¡ãããã1åå®ããªããŸãã
ããã§æãããªããšã¯ãããŸããŸãªçç±ã§ãã¡ã¢ãªãå²ãåœãŠãããšã¯éåžžãã¡ã¢ãªãå¥ã®ã¢ãã¬ã¹ã«å²ãåœãŠãå€ãå Žæããæ°ããå Žæã«ããŒã¿ãç§»åããããšãæå³ããããšã§ãã ããã¯ãã¹ã©ã€ã¹ã«ãã£ãŠåç
§ãããé
åã®ã¢ãã¬ã¹ã倿Žãããããšãæå³ããŸãïŒ ãããèŠèŠåããŸãããïŒ

å€ãé
åãšæ°ããé
åã®2ã€ã®é
åãç°¡åã«ç¢ºèªã§ããŸãã è€éãªããšã¯äœããªãããã§ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ã次ã®ãã¹ã§å€ãã¢ã¬ã€ãå æããŠããã¹ããŒã¹ãåçŽã«è§£æŸããŸãã ããããããã¯å®éãã¹ã©ã€ã¹ã䜿çšããèœãšã穎ã®1ã€ã§ãã ãµãã¹ã©ã€ã¹b
ãå®è¡ããã¹ã©ã€ã¹b
ãå¢ãããŠãåãé
åã䜿çšããããšãæå³ããå Žåã¯ã©ããªããŸããïŒ
a := make([]int, 32) b := a[1:16] a = append(a, 1) a[2] = 42
ãããååŸããŸãã

ããã§ãã2ã€ã®ç°ãªãé
åãååŸãã2ã€ã®ã¹ã©ã€ã¹ã¯ã¡ã¢ãªã®å®å
šã«ç°ãªãã»ã¯ã·ã§ã³ãæããŸãïŒ ãããŠãããã¯ãæ§ããã«èšã£ãŠããéåžžã«çŽæã«åãããã®ã§ããåæããŸãã ãããã£ãŠãååãšããŠã append()
ããã³sub-slicesã䜿çšããŠããå Žåã¯ã泚æããŠããã«çæããŠãã ããã
ã¡ãªã¿ã«ã append()
ã¯ãã¹ã©ã€ã¹ã1024ãã€ãã«åå¢ããã ãã§å¢ãããå¥ã®ã¢ãããŒãïŒãããããã¡ã¢ãªãµã€ãºã¯ã©ã¹ãïŒã®äœ¿çšãéå§ããŸããããã«ãããæå€§12.5ïŒ
ãå²ãåœãŠãããŸãã 32ãã€ãã®é
åã«64ãã€ããå²ãåœãŠãã®ã¯åé¡ãããŸããããã¹ã©ã€ã¹ã®ãµã€ãºã4GBã®å ŽåãèŠçŽ ã1ã€ã ã远å ãããå Žåã§ããå¥ã®4GBãå²ãåœãŠãã®ã¯ã³ã¹ããããããããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹
ããŠãã€ã³ã¿ãŒãã§ã€ã¹ã¯ããããGoã«ã€ããŠæããããã«ãããã®ã§ãã éåžžãçè§£ãé ã«åãŸããŸã§ãç¹ã«ä»ã®èšèªã®ã¯ã©ã¹ã§ã®é·æéã®äœæ¥ã®æ²æšãªçµæã®åŸã¯ãããçšåºŠæéãããããŸãã æãäžè¬çãªåé¡ã®1ã€ã¯ã nil
ã€ã³ã¿ãŒãã§ã€ã¹ãçè§£ããããšã§ãã
ãã€ãã®ããã«ãå
ã®Goã³ãŒãã«æ»ããŸãããã ã€ã³ã¿ãŒãã§ãŒã¹ãšã¯äœã§ããïŒ ããã¯äžè¬çãª2ãã£ãŒã«ãæ§é ã§ããããã®å®çŸ©ïŒ src / runtime / runtime2.go ïŒã¯æ¬¡ã®ãšããã§ãã
type iface struct { tab *itab data unsafe.Pointer }
itab
ã¯ã€ã³ã¿ãŒãã§ã€ã¹ããŒãã«ãæå³ããã€ã³ã¿ãŒãã§ã€ã¹ãšããŒã¹ã¿ã€ãã«é¢ããè¿œå æ
å ±ãæ ŒçŽãããæ§é äœã§ããããŸãã
type itab struct { inter *interfacetype _type *_type link *itab bad int32 unused int32 fun [1]uintptr
ã€ã³ã¿ãŒãã§ãŒã¹ã§ã®å匷å¶ã®ä»çµã¿ã«ã€ããŠã¯è©³ãã説æããŸããããæ¬è³ªçã«ã€ã³ã¿ãŒãã§ãŒã¹ã¯åã«é¢ããããŒã¿ã®ã»ããïŒã€ã³ã¿ãŒãã§ãŒã¹ãšãã®äžã®å€æ°ã®åïŒãšãå®éã«ã¯éçãªå€æ°èªäœãžã®ãã€ã³ã¿ãŒã§ããããšãçè§£ããããšãéèŠã§ãïŒã³ã³ã¯ãªãŒãïŒã¿ã€ãïŒ iface
data
ãã£ãŒã«ãïŒã ãããã©ã®ããã«èŠããããèŠãŠã error
ã€ã³ã¿ãŒãã§ã€ã¹ã¿ã€ãã®err
倿°ãå®çŸ©ããŠã¿ãŸãããã
var err error

ãã®èŠèŠåã§ç¢ºèªã§ããã®ã¯ãnilã€ã³ã¿ãŒãã§ã€ã¹ã§ãã error
ãè¿ã颿°ã§nil
ãè¿ããšããŸãã«ãã®ãªããžã§ã¯ããè¿ããŸãã ã€ã³ã¿ãŒãã§ãŒã¹èªäœã«é¢ããæ
å ±ïŒ itab.inter
ïŒãitab.type
ãã data
ãšitab.type
空ã§ãitab.type
ãšçããã§ãã ãã®ãªããžã§ã¯ããnil
ãšæ¯èŒãããšif err == nil {}
ã«æ¡ä»¶ã§true
ãè¿ãtrue
ã
func foo() error { var err error
ããŠãGoã®æåãªèœãšã穎ã§ããããã®ã±ãŒã¹ãèŠãŠã¿ãŸãããã
func foo() error { var err *os.PathError
ã€ã³ã¿ãŒãã§ã€ã¹ãäœã§ãããããããªãå Žåããããã®2ã€ã®ã³ãŒãã¯éåžžã«äŒŒãŠããŸãã ãããã *os.PathError
å倿°ããã©ããããããŠããerror
ã€ã³ã¿ãŒãã§ã€ã¹ãã©ã®ããã«èŠããããèŠãŠã¿ãŸãããã

ããã§ã¯ã倿°èªäœ*os.PathError
ã¿ã€ããæç¢ºã«ç¢ºèªã§ããŸããããã¯ã nil
æžã蟌ãŸããã¡ã¢ãªã®äžéšã§ããããã¯ããããä»»æã®ãã€ã³ã¿ãŒã®ãŒãå€ã§ããããã§ãã ãããã颿°foo()
ããè¿ããããªããžã§ã¯ãã¯ãããè€éãªæ§é ã§ãããã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããæ
å ±ã ãã§ãªãã倿°ã®åã«é¢ããæ
å ±ãšã nil
ãã€ã³ã¿ãŒãååšãããããã¯ã®ã¡ã¢ãªå
ã®ã¢ãã¬ã¹ãæ ŒçŽããŸãã éããæããŸããïŒ
ã©ã¡ãã®å Žåãnil
ã衚瀺ãããããã§ããã ãå€ãnilã§ããå
éšå€æ°ã æã€ã€ã³ã¿ãŒãã§ã€ã¹ ããšãå
éšå€æ°ã®ãªãã€ã³ã¿ãŒãã§ã€ã¹ ãã®éã«ã¯å€§ããªéãããããŸã ã ãã®éããçè§£ããããæ¬¡ã®2ã€ã®äŸãæ··åããŠã¿ãŠãã ããã

ããã§ãã³ãŒãå
ã§ãã®ãããªåé¡ã«ééããã®ã¯é£ããã¯ãã§ãã
空ã®ã€ã³ã¿ãŒãã§ã€ã¹
ãããã空ã®ã€ã³ã¿ãŒãã§ãŒã¹- interface{}
ã«é¢ããããã€ãã®èšèã GoãœãŒã¹ã§ã¯ã eface
ïŒ src / runtime / malloc.go ïŒãšããå¥ã®æ§é äœã«ãã£ãŠå®è£
ãããŸã ã
type eface struct { _type *_type data unsafe.Pointer }
ãã®æ§é ãiface
ã«äŒŒãŠããããšã¯ç°¡åã«ããããŸãããã€ã³ã¿ãŒãã§ã€ã¹ããŒãã«ïŒitabïŒã¯ãããŸããã å®çŸ©äžãéçåã¯ç©ºã®ã€ã³ã¿ãŒãã§ã€ã¹ãæºãããããããã¯è«ççã§ãã ãããã£ãŠã interface{}
ã§å€æ°ãæç€ºçã«ãŸãã¯æé»çã«ïŒåŒæ°ãšããŠæž¡ããã颿°ããæ»ããªã©ïŒäœããã®ãã©ããããããšãå®éã«ãã®æ§é ãæäœããŸãã
func foo() interface{} { foo := int64(42) return foo }

空ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«é¢ããããç¥ãããŠããåé¡ã®1ã€ã¯ãç¹å®ã®ã¿ã€ãã®ã¹ã©ã€ã¹ãäžæ°ã«ã€ã³ã¿ãŒãã§ã€ã¹ã®ã¹ã©ã€ã¹ã«æã¡èŸŒãããšãã§ããªãããšã§ãã ãã®ãããªãã®ãæžãå ŽåïŒ
func foo() []interface{} { return []int{1,2,3} }
ã³ã³ãã€ã©ã¯éåžžã«æç¢ºã«èªããŸãïŒ
$ go build cannot use []int literal (type []int) as type []interface {} in return argument
ããã¯æåã¯æ··ä¹±ããŸãã äœãåé¡ãªã®ã-ä»»æã®ã¿ã€ãã®å€æ°ã空ã®ã€ã³ã¿ãŒãã§ã€ã¹ã«æã¡èŸŒããã®ã«ãã¹ã©ã€ã¹ã§åãããšãã§ããªãã®ã¯ãªãã§ããïŒ ãã ãã空ã®ã€ã³ã¿ãŒãã§ã€ã¹ãšã¹ã©ã€ã¹ã®é
çœ®æ¹æ³ãç¥ã£ãŠããå Žåããã®ãã¹ã©ã€ã¹ã®ãã£ã¹ããã¯å®éã«ã¯ããªãé«äŸ¡ãªæäœã§ãããã¹ã©ã€ã¹ã®å
šé·ãæž¡ããŠã¡ã¢ãªãæ¯äŸé
åããããšãçŽæçã«çè§£ããå¿
èŠããããŸãã¢ã€ãã ã®æ°ã ãŸããGoã®ååã®1ã€ã¯- äœãé«äŸ¡ãªããšããããå Žå-æç€ºçã«è¡ãããšãªã®ã§ããã®ãããªå€æã¯ããã°ã©ããŒã«å§ããããŸãã
[]interface{}
ãžã®[]int
ãã£ã¹ããäœã§ããããèŠèŠåããŠã¿ãŸãããã

ãã®ç¬éãããªãã«ãšã£ãŠæå³ãããããšãé¡ã£ãŠããŸãã
ãããã«
ãã¡ãããå®è£
ã®å
éšãæãäžããŠãèšèªã®èœãšã穎ã誀解ããã¹ãŠè§£æ±ºã§ããããã§ã¯ãããŸããã ãããã®ããã€ãã¯ãåã«å€ãçµéšãšæ°ããçµéšã®éãã§ãããç§ãã¡å
šå¡ã«ãšã£ãŠã¯ç°ãªããŸãã ããã«ãããããããæã人æ°ã®ãããã®ã¢ãããŒãã¯åé¿ã«åœ¹ç«ã¡ãŸãã ãã®æçš¿ããããã°ã©ã ã§äœãèµ·ãã£ãŠããã®ããGoãå
éšã§ã©ã®ããã«é
眮ãããŠããã®ããããæ·±ãçè§£ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã Goã¯ããªãã®å人ã§ããããããããå°ãè¯ãç¥ãããšã¯åžžã«æçã§ãã
Goã®å
éšã«ã€ããŠã®è©³çްãèªãããšã«èå³ãããå Žåã¯ãããã§ç§ã圹ç«ã£ãèšäºã®çãéžæã以äžã«ç€ºããŸãã
ãŸãããã¡ããããããã®ãªãœãŒã¹ãªãã§ã¯ã©ãã§ãããã:)
è¯ãã³ãŒãã£ã³ã°ïŒ