mirror of
https://github.com/teivah/100-go-mistakes.git
synced 2026-06-22 01:17:11 +08:00
1426 lines
No EOL
109 KiB
Markdown
1426 lines
No EOL
109 KiB
Markdown
---
|
||
title: Japanese Version
|
||
comments: true
|
||
---
|
||
|
||
# Goèšèªã§ãããã¡ãªééã
|
||
|
||
ãã®ããŒãžã¯ã100 Go Mistakesãã®å
容ããŸãšãããã®ã§ããäžæ¹ã§ãã³ãã¥ããã£ã«éãããããŒãžã§ããããŸããããããã¡ãªééãããæ°ãã«è¿œå ãããã¹ãã ãšãèãã§ããã [community mistake issue](https://github.com/teivah/100-go-mistakes/issues/new?assignees=&labels=community+mistake&template=community_mistake.md&title=) ãäœæããŠãã ããã
|
||
|
||
???+ warning "泚æ"
|
||
|
||
çŸåšã倧å¹
ã«å€ãã®ã³ã³ãã³ãã远å ããŠåŒ·åããŠããæ°ããããŒãžã§ã³ãé²èЧããŠããŸãããã®ããŒãžã§ã³ã¯ãŸã éçºäžã§ããåé¡ãèŠã€ããå Žåã¯ã©ããæ°è»œã«PRãäœæããŠãã ããã
|
||
|
||

|
||
|
||
## ã³ãŒããšãããžã§ã¯ãæ§æ
|
||
|
||
### æå³çã§ãªã倿°ã®ã·ã£ããŒã€ã³ã° (#1)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
倿°ã®ã·ã£ããŒã€ã³ã°ãé¿ããããšã¯ã誀ã£ã倿°ã®åç
§ãèªã¿æã®æ··ä¹±ãé²ããŸãã
|
||
|
||
倿°ã®ã·ã£ããŒã€ã³ã°ã¯ã倿°åããããã¯å
ã§å宣èšãããããšã§çããŸãããããã¯ééããåŒãèµ·ãããããããŸãã倿°ã®ã·ã£ããŒã€ã³ã°ãçŠæ¢ãããã©ããã¯å人ã®å¥œã¿ã«ãããŸããããšãã°ããšã©ãŒã«å¯Ÿã㊠`err` ã®ãããªæ¢åã®å€æ°åãåå©çšãããšäŸ¿å©ãªå ŽåããããŸãããšã¯ãããã³ãŒãã¯ã³ã³ãã€ã«ããããã®ã®ãå€ãåãåã£ã倿°ãäºæãããã®ã§ã¯ãªããšããã·ããªãªã«çŽé¢ããå¯èœæ§ããããããååãšããŠåŒãç¶ã泚æãæãå¿
èŠããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/1-variable-shadowing/main.go)
|
||
|
||
### äžå¿
èŠã«ãã¹ããããã³ãŒã (#2)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãã¹ããæ·±ããªããªãããã«ããããããŒãã¹ãå·ŠåŽã«æããããšã§ã¡ã³ã¿ã«ã³ãŒãã¢ãã«ãæ§ç¯ããããšã容æã«ãªããŸãã
|
||
|
||
äžè¬çã«ã颿°ãããæ·±ããã¹ããèŠæ±ããã»ã©ãèªãã§çè§£ããããšãããè€éã«ãªããŸããç§ãã¡ã®ã³ãŒãã®å¯èªæ§ãæé©åããããã«ããã®ã«ãŒã«ã®é©ç𿹿³ãèŠãŠãããŸãããã
|
||
|
||
* `if` ãããã¯ãè¿ããããšãããã¹ãŠã®å Žåã«ãã㊠`else` ãããã¯ãçç¥ããå¿
èŠããããŸãã ããšãã°ã次ã®ããã«æžãã¹ãã§ã¯ãããŸããã
|
||
|
||
```go
|
||
if foo() {
|
||
// ...
|
||
return true
|
||
} else {
|
||
// ...
|
||
}
|
||
```
|
||
|
||
代ããã«ã次ã®ããã« `else` ãããã¯ãçç¥ããŸãã
|
||
|
||
```go
|
||
if foo() {
|
||
// ...
|
||
return true
|
||
}
|
||
// ...
|
||
```
|
||
|
||
* ãã³ããããŒãã¹ã§ããã®ããžãã¯ã«åŸãããšãå¯èœã§ãã
|
||
|
||
```go
|
||
if s != "" {
|
||
// ...
|
||
} else {
|
||
return errors.New("empty string")
|
||
}
|
||
```
|
||
|
||
ããã§ã¯ã空㮠`s` ããã³ããããŒãã¹ã衚ããŸãããããã£ãŠã次ã®ããã«æ¡ä»¶ãã²ã£ããè¿ãå¿
èŠããããŸãã
|
||
|
||
```go
|
||
if s == "" {
|
||
return errors.New("empty string")
|
||
}
|
||
// ...
|
||
```
|
||
|
||
èªã¿ãããã³ãŒããæžãããšã¯ããã¹ãŠã®éçºè
ã«ãšã£ãŠéèŠãªèª²é¡ã§ãããã¹ãããããããã¯ã®æ°ãæžããããåªããããããŒãã¹ãå·ŠåŽã«æããã§ããã ãæ©ãæ»ãããšããã³ãŒãã®å¯èªæ§ãåäžãããå
·äœçãªææ®µã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/2-nested-code/main.go)
|
||
|
||
### init颿°ã®èª€çš (#3)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
倿°ãåæåãããšãã¯ãinit颿°ã®ãšã©ãŒåŠçãå¶éãããŠãããç¶æ
ã®åŠçãšãã¹ããããè€éã«ãªãããšã«æ³šæããŠãã ãããã»ãšãã©ã®å Žåãåæåã¯ç¹å®ã®é¢æ°ãšããŠåŠçãããã¹ãã§ãã
|
||
|
||
init颿°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãåæåããããã«äœ¿çšããã颿°ã§ããåŒæ°ãåãããçµæãè¿ããŸããïŒ `func()` 颿°ïŒãããã±ãŒãžãåæåããããšãããã±ãŒãžå
ã®ãã¹ãŠã®å®æ°ããã³å€æ°ã®å®£èšãè©äŸ¡ãããŸããæ¬¡ã«ãinit颿°ãå®è¡ãããŸãã
|
||
|
||
init颿°ã¯ããã€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
|
||
|
||
* ãšã©ãŒåŠçãå¶éãããå¯èœæ§ããããŸãã
|
||
* ãã¹ãã®å®è£
æ¹æ³ãè€éã«ãªãå¯èœæ§ããããŸã (ããšãã°ãå€éšäŸåé¢ä¿ãèšå®ããå¿
èŠããããŸãããåäœãã¹ãã®ç¯å²ã§ã¯å¿
èŠãªãå¯èœæ§ããããŸã)ã
|
||
* åæåã§ç¶æ
ãèšå®ããå¿
èŠãããå Žåã¯ãã°ããŒãã«å€æ°ã䜿çšããŠè¡ãå¿
èŠããããŸãã
|
||
|
||
init颿°ã«ã¯æ³šæãå¿
èŠã§ãããã ããéçæ§æã®å®çŸ©ãªã©ãç¶æ³ã«ãã£ãŠã¯åœ¹ç«ã€å ŽåããããŸãããã以å€ã®ã»ãšãã©ã®å ŽåãåæååŠçã¯ãã®ããã ãã«ååšãã颿°ãéããŠè¡ãããã¹ãã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/3-init-functions/)
|
||
|
||
### ã²ãã¿ãŒãšã»ãã¿ãŒã®ä¹±çš (#4)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Goèšèªã§ã¯ãæ
£çšçã«ã²ãã¿ãŒãšã»ãã¿ãŒã®äœ¿çšã匷å¶ããããšã¯ãããŸãããå®å©ãéèŠããå¹çæ§ãšç¹å®ã®æ
£ç¿ã«åŸãããšãšã®éã®é©åãªãã©ã³ã¹ãèŠã€ããããšããé²ãã¹ãéã§ããã¯ãã§ãã
|
||
|
||
ããŒã¿ã®ã«ãã»ã«åãšã¯ããªããžã§ã¯ãã®å€ãŸãã¯ç¶æ
ãé ãããšãæããŸããã²ãã¿ãŒãšã»ãã¿ãŒã¯ããšã¯ã¹ããŒããããŠããªããªããžã§ã¯ããã£ãŒã«ãã®äžã«ãšã¯ã¹ããŒããããã¡ãœãããæäŸããããšã§ã«ãã»ã«åãå¯èœã«ããææ®µã§ãã
|
||
|
||
Goèšèªã§ã¯ãäžéšã®èšèªã§èŠããããããªã²ãã¿ãŒãšã»ãã¿ãŒã®èªåãµããŒãã¯ãããŸããããŸããã²ãã¿ãŒãšã»ãã¿ãŒã䜿çšããŠæ§é äœãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããšã¯å¿
é ã§ãæ
£çšçã§ããããŸãããå€ããããããªãæ§é äœã®ã²ãã¿ãŒãšã»ãã¿ãŒã§ã³ãŒããåããã¹ãã§ã¯ãããŸãããå®å©ãéèŠããä»ã®ããã°ã©ãã³ã°ãã©ãã€ã ã§æã«ã¯è°è«ã®äœå°ããªããšèããããŠããæ
£ç¿ã«åŸãããšãšãå¹çæ§ãšã®éã®é©åãªãã©ã³ã¹ãèŠã€ããããåªããã¹ãã§ãã
|
||
|
||
Goèšèªã¯ãã·ã³ãã«ããå«ãå€ãã®ç¹æ§ãèæ
®ããŠèšèšãããç¬èªã®èšèªã§ããããšãå¿ããªãã§ãã ããããã ããã²ãã¿ãŒãšã»ãã¿ãŒã®å¿
èŠæ§ãèŠã€ãã£ãå ŽåããŸãã¯åè¿°ã®ããã«ãåæ¹äºææ§ãä¿èšŒããªããå°æ¥ã®å¿
èŠæ§ãäºæž¬ãããå Žåã¯ããããã䜿çšããããšã«åé¡ã¯ãããŸããã
|
||
|
||
### ã€ã³ã¿ãã§ãŒã¹æ±æ (#5)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
æœè±¡åã¯äœæãããã¹ããã®ã§ã¯ãªããçºèŠãããã¹ããã®ã§ããäžå¿
èŠãªè€éããé¿ããããã«ãã€ã³ã¿ãã§ãŒã¹ã¯ãå¿
èŠã«ãªããšäºæž¬ãããšãã§ã¯ãªããå¿
èŠã«ãªã£ããšãã«äœæããããå°ãªããšãæœè±¡åãæå¹ã§ããããšã蚌æã§ããå Žåã«äœæããŠãã ããã
|
||
|
||
ã€ã³ã¿ãã§ãŒã¹ã¯ããªããžã§ã¯ãã®åäœãæå®ããæ¹æ³ãæäŸããŸããè€æ°ã®ãªããžã§ã¯ããå®è£
ã§ããå
±éé
ãæœåºããããã«ãã€ã³ã¿ãã§ãŒã¹ã¯äœ¿çšãããŸããGoèšèªã®ã€ã³ã¿ãã§ãŒã¹ã倧ããç°ãªãã®ã¯ãæé»çã«æºããããããšã§ãããªããžã§ã¯ã `X` ãã€ã³ã¿ãã§ãŒã¹ `Y` ãå®è£
ããŠããããšã瀺ã `implements` ã®ãããªæç€ºçãªããŒã¯ãŒãã¯ãããŸããã
|
||
|
||
äžè¬ã«ãã€ã³ã¿ãã§ãŒã¹ã䟡å€ããããããšèããããäž»èŠãªäœ¿çšäŸã¯ïŒã€ãããŸããããã¯ãå
±éã®åäœãé€å€ãããäœããã®åé¢ãäœæãããããã³åãç¹å®ã®åäœã«å¶éãããšãããã®ã§ãããã ãããã®ãªã¹ãã¯ãã¹ãŠãç¶²çŸ
ããŠããããã§ã¯ãªããçŽé¢ããç¶æ³ã«ãã£ãŠãç°ãªããŸãã
|
||
|
||
å€ãã®å Žåãã€ã³ã¿ãã§ãŒã¹ã¯æœè±¡åããããã«äœæãããŸãããããŠãããã°ã©ãã³ã°ã§æœè±¡åãããšãã®äž»ãªæ³šæç¹ã¯ãæœè±¡åã¯äœæãããã¹ãã§ã¯ãªããçºèŠãããã¹ãã§ãããšããããšãèŠããŠããããšã§ããããªãã¡ãããããçŽæ¥ã®çç±ããªãéããã³ãŒãå
ã§æœè±¡åãã¹ãã§ã¯ãªããšããããšã§ããã€ã³ã¿ãã§ãŒã¹ã䜿ã£ãŠèšèšããã®ã§ã¯ãªããå
·äœçãªããŒãºãåŸ
ã€ã¹ãã§ããå¥ã®èšãæ¹ãããã°ãã€ã³ã¿ãã§ãŒã¹ã¯å¿
èŠã«ãªããšäºæž¬ãããšãã§ã¯ãªããå¿
èŠã«ãªã£ããšãã«äœæããå¿
èŠããããŸãã
|
||
ã€ã³ã¿ãã§ãŒã¹ã®é床ãªäœ¿çšãããå Žåã®äž»ãªåé¡ã¯äœã§ãããããçãã¯ãã³ãŒããããŒãããè€éã«ãªãããšã§ãã圹ã«ç«ããªã鿥åç
§ã远å ããŠãäœã®äŸ¡å€ããããŸãããããã¯äŸ¡å€ã®ãªãæœè±¡åãããããšã§ãã³ãŒããèªã¿ãçè§£ããæšè«ããããšãããã«å°é£ã«ããŸããã€ã³ã¿ãã§ãŒã¹ã远å ããæç¢ºãªçç±ããªããã€ã³ã¿ãã§ãŒã¹ã«ãã£ãŠã³ãŒããã©ã®ããã«æ¹åãããããäžæçãªå Žåã¯ããã®ã€ã³ã¿ãã§ãŒã¹ã®ç®çã«ç°è°ãå±ããå¿
èŠããããŸããå®è£
ãçŽæ¥åŒã³åºãã®ãäžã€ã®æã§ãã
|
||
|
||
ã³ãŒãå
ã§æœè±¡åãããšãã¯æ³šæãå¿
èŠã§ãïŒæœè±¡åã¯äœæããã®ã§ã¯ãªããçºèŠããå¿
èŠããããŸãïŒãåŸã§å¿
èŠã«ãªãå¯èœæ§ããããã®ãèæ
®ããå®ç§ãªæœè±¡åã¬ãã«ãæšæž¬ããŠãç§ãã¡ãœãããŠã§ã¢éçºè
ã¯ã³ãŒãããªãŒããŒãšã³ãžãã¢ãªã³ã°ããããšããããããŸããã»ãšãã©ã®å Žåãã³ãŒããäžå¿
èŠãªæœè±¡åã§æ±æãããèªã¿ã«ãããªãããããã®ããã»ã¹ã¯é¿ããã¹ãã§ãã
|
||
|
||
!!! quote "ããã»ãã€ã¯"
|
||
|
||
ã€ã³ã¿ãã§ãŒã¹ã§ãã¶ã€ã³ãããªãã€ã³ã¿ãã§ãŒã¹ãèŠã€ãåºãã
|
||
|
||
æœè±¡çã«åé¡ã解決ããããšããã®ã§ã¯ãªããä»è§£æ±ºãã¹ãããšã解決ããŸããããæåŸã«éèŠãªããšã§ãããã€ã³ã¿ãã§ãŒã¹ã«ãã£ãŠã³ãŒããã©ã®ããã«æ¹åãããããäžæçãªå Žåã¯ãã³ãŒããç°¡çŽ åããããã«ã€ã³ã¿ãã§ãŒã¹ãåé€ããããšãæ€èšããå¿
èŠãããã§ãããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/5-interface-pollution/)
|
||
|
||
### çç£è
åŽã®ã€ã³ã¿ãã§ãŒã¹ (#6)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã€ã³ã¿ãã§ãŒã¹ãã¯ã©ã€ã¢ã³ãåŽã§ä¿æããããšã§äžå¿
èŠãªæœè±¡åãåé¿ã§ããŸãã
|
||
|
||
Goèšèªã§ã¯ã€ã³ã¿ãã§ãŒã¹ãæé»çã«æºããããŸããããã¯ãæç€ºçãªå®è£
ãæã€èšèªãšæ¯èŒããŠå€§ããªå€åãããããåŸåããããŸããã»ãšãã©ã®å ŽåãåŸãã¹ãã¢ãããŒãã¯åã®ã»ã¯ã·ã§ã³ã§èª¬æãããã®ââ_æœè±¡ã¯äœæããã®ã§ã¯ãªããçºèŠããå¿
èŠããã_ââã«äŒŒãŠããŸããããã¯ããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã«å¯ŸããŠç¹å®ã®æœè±¡åã匷å¶ããã®ã¯çç£è
ã®åœ¹å²ã§ã¯ãªãããšãæå³ããŸãã代ããã«ãäœããã®åœ¢åŒã®æœè±¡åãå¿
èŠãã©ããã倿ãããã®ããŒãºã«æé©ãªæœè±¡åã¬ãã«ã決å®ããã®ã¯ã¯ã©ã€ã¢ã³ãã®è²¬ä»»ã§ãã
|
||
|
||
ã»ãšãã©ã®å Žåãã€ã³ã¿ãã§ãŒã¹ã¯æ¶è²»è
åŽã«ååšããå¿
èŠããããŸãããã ããç¹å®ã®ç¶æ³ïŒããšãã°ãæœè±¡åãæ¶è²»è
ã«ãšã£ãŠåœ¹ç«ã€ããšãããã£ãŠããââäºæž¬ã¯ããŠããªãââå ŽåïŒã§ã¯ããããçç£è
åŽã§äœ¿çšãããå ŽåããããŸããããããå Žåãå¯èœãªéãæå°éã«æããåå©çšå¯èœæ§ãé«ããããç°¡åã«æ§æã§ããããã«åªããã¹ãã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/6-interface-producer/)
|
||
|
||
### ã€ã³ã¿ãã§ãŒã¹ãè¿ã (#7)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
æè»æ§ã«åé¡ããªãããã«ããããã«ã颿°ã¯ã»ãšãã©ã®å Žåãã€ã³ã¿ãã§ãŒã¹ã§ã¯ãªãå
·äœçââãªå®è£
ãè¿ãå¿
èŠããããŸããéã«ã颿°ã¯å¯èœãªéãã€ã³ã¿ãã§ãŒã¹ãåãå
¥ããå¿
èŠããããŸãã
|
||
|
||
ã»ãšãã©ã®å Žåãã€ã³ã¿ãã§ãŒã¹ã§ã¯ãªãå
·äœçãªå®è£
ãè¿ãå¿
èŠããããŸããããã§ãªããšããã±ãŒãžã®äŸåé¢ä¿ã«ããèšèšããã£ããè€éã«ãªãããã¹ãŠã®ã¯ã©ã€ã¢ã³ããåãæœè±¡åã«äŸåããå¿
èŠããããããæè»æ§ã«æ¬ ããå¯èœæ§ããããŸããçµè«ã¯åã®ã»ã¯ã·ã§ã³ãšäŒŒãŠããŸããæœè±¡åãã¯ã©ã€ã¢ã³ãã«ãšã£ãŠåœ¹ç«ã€ããšãïŒäºæž¬ãããã§ã¯ãªãïŒããã£ãŠããå Žåã¯ãã€ã³ã¿ãã§ãŒã¹ãè¿ãããšãæ€èšããŠãããã§ãããããã以å€ã®å Žåã¯ãæœè±¡åã匷å¶ãã¹ãã§ã¯ãããŸããããããã¯ã¯ã©ã€ã¢ã³ãã«ãã£ãŠçºèŠãããå¿
èŠããããŸããäœããã®çç±ã§ã¯ã©ã€ã¢ã³ããå®è£
ãæœè±¡åããå¿
èŠãããå Žåã§ããã¯ã©ã€ã¢ã³ãåŽã§ãããè¡ãããšãã§ããŸãã
|
||
|
||
### `any` ã¯äœãèšããªã (#8)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`json.Marshal` ãªã©èããããã¹ãŠã®åãåãå
¥ãããè¿ãå¿
èŠãããå Žåã«ã®ã¿ `any` ã䜿çšããŠãã ããããã以å€ã®å Žåã`any` ã¯æå³ã®ããæ
å ±ãæäŸãããåŒã³åºãå
ãä»»æã®ããŒã¿åã®ã¡ãœãããåŒã³åºãããšãèš±å¯ãããããã³ã³ãã€ã«æã«åé¡ãçºçããå¯èœæ§ããããŸãã
|
||
|
||
`any` åã¯ãèããããã¹ãŠã®åãåãå
¥ãããè¿ãå¿
èŠãããå ŽåïŒããšãã°ãããŒã·ã£ãªã³ã°ããã©ãŒãããã®å ŽåïŒã«åœ¹ç«ã¡ãŸããååãšããŠã³ãŒããé床ã«äžè¬åããããšã¯äœãšããŠãé¿ããã¹ãã§ããã³ãŒãã®è¡šçŸåãªã©ã®ä»ã®åŽé¢ãåäžããå Žåã¯ãã³ãŒããå°ãéè€ãããã»ããè¯ãããšããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/8-any/main.go)
|
||
|
||
### ãžã§ããªãã¯ã¹ããã€äœ¿çšããã¹ããçè§£ããŠããªã (#9)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãžã§ããªãã¯ã¹ãšåãã©ã¡ãŒã¿ãŒãå©çšããããšã§ãèŠçŽ ãåäœãé€å€ããããã®ãã€ã©ãŒãã¬ãŒãã³ãŒããé¿ããããšãã§ããŸãããã ããåãã©ã¡ãŒã¿ã¯ææå°æ©ã«äœ¿çšãããå
·äœçãªå¿
èŠæ§ãããã£ãå Žåã«ã®ã¿äœ¿çšããŠãã ãããããã§ãªããã°ãäžå¿
èŠãªæœè±¡åãšè€éããçããŸãã
|
||
|
||
ã»ã¯ã·ã§ã³ã®å
šæã¯[ãã¡ã](9-generics.md)ã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/9-generics/main.go)
|
||
|
||
### åã®åã蟌ã¿ã§èµ·ããããåé¡ãææ¡ããŠããªã (#10)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ååã蟌ã¿ã䜿çšãããšããã€ã©ãŒãã¬ãŒãã³ãŒããåé¿ããããšãã§ããŸãããã ããããããããšã§ãäžéšã®ãã£ãŒã«ããé衚瀺ã«ããŠããå¿
èŠãããå Žåã«åé¡ãçºçããªãããã«ããŠãã ããã
|
||
|
||
æ§é äœãäœæãããšããGoèšèªã¯åãåã蟌ããªãã·ã§ã³ãæäŸããŸãããã ããååã蟌ã¿ã®æå³ããã¹ãŠçè§£ããŠããªããšãäºæããªãåäœãçºçããå¯èœæ§ããããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ãåãåãèŸŒãæ¹æ³ãããããããããã®ãããã³èããããåé¡ã«ã€ããŠèŠãŠãããŸãã
|
||
|
||
Goèšèªã§ã¯ãååãªãã§å®£èšãããæ§é äœãã£ãŒã«ãã¯ãåã蟌ã¿ãšåŒã°ããŸããããšãã°ã次ã®ãããªãã®ã§ãã
|
||
|
||
```go
|
||
type Foo struct {
|
||
Bar // åã蟌ã¿ãã£ãŒã«ã
|
||
}
|
||
|
||
type Bar struct {
|
||
Baz int
|
||
}
|
||
```
|
||
|
||
`Foo` æ§é äœã§ã¯ã`Bar` åãé¢é£ä»ããããååãªãã§å®£èšãããŠããŸãããããã£ãŠãããã¯åã蟌ã¿ãã£ãŒã«ãã§ãã
|
||
|
||
åã蟌ã¿ã䜿çšããããšã§ãåã蟌ã¿åã®ãã£ãŒã«ããšã¡ãœããã¯ææ ŒããŸããBar ã«ã¯ Baz ãã£ãŒã«ããå«ãŸããŠããããããã®ãã£ãŒã«ã㯠`Foo` ã«ææ ŒããŸãããããã£ãŠãFoo ãã Baz ãå©çšã§ããããã«ãªããŸãã
|
||
|
||
åã®åã蟌ã¿ã«ã€ããŠäœãèšããã§ããããããŸãããããå¿
èŠã«ãªãããšã¯ã»ãšãã©ãªãããŠãŒã¹ã±ãŒã¹ãäœã§ãããããããååã蟌ã¿ãªãã§ãåæ§ã«è§£æ±ºã§ããããšãæå³ããŸããåã®åã蟌ã¿ã¯äž»ã«å©äŸ¿æ§ãç®çãšããŠäœ¿çšãããŸããã»ãšãã©ã®å Žåãããã¯åäœãææ Œããããã«äœ¿çšãããŸãã
|
||
|
||
ååã蟌ã¿ã䜿çšããå Žåã¯ã次㮠2 ã€ã®äž»ãªå¶çŽã念é ã«çœ®ãå¿
èŠããããŸãã
|
||
|
||
* ãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãç°¡çŽ åããããã®ç³è¡£æ§æãšããŠã®ã¿äœ¿çšããªãã§ãã ããïŒ `Foo.Bar.Baz()` ã®ä»£ããã« `Foo.Baz()` ãªã©ïŒã ãããå¯äžã®æ ¹æ ã§ããå Žåã¯ãå
éšåãåã蟌ãŸãã代ããã«ãã£ãŒã«ãã䜿ããŸãããã
|
||
* å€éšããé ãããããŒã¿ïŒãã£ãŒã«ãïŒãåäœïŒã¡ãœããïŒãææ ŒããŠã¯ãªããŸãããããšãã°ãæ§é äœã«å¯ŸããŠãã©ã€ããŒããªãŸãŸã«ããŠããå¿
èŠãããããã¯åäœã«ã¯ã©ã€ã¢ã³ããã¢ã¯ã»ã¹ã§ããããã«ããå Žåãªã©ã§ãã
|
||
|
||
ãããã®å¶çŽã念é ã«çœ®ããŠååã蟌ã¿ãæèçã«äœ¿çšãããšã远å ã®è»¢éã¡ãœããã«ãããã€ã©ãŒãã¬ãŒãã³ãŒããåé¿ããã®ã«åœ¹ç«ã¡ãŸãããã ããèŠãç®ã ããç®çãšããããé ãã¹ãèŠçŽ ãææ Œãããããªãããã«æ³šæããŸãããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/10-type-embedding/main.go)
|
||
|
||
### Functional Options ãã¿ãŒã³ã䜿çšããŠããªã (#11)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
API ã«é©ããæ¹æ³ã§ãªãã·ã§ã³ã䟿å©ã«åŠçããã«ã¯ãFunctional Options ãã¿ãŒã³ã䜿çšããŸãããã
|
||
|
||
ããŸããŸãªå®è£
æ¹æ³ãååšããå€å°ã®éãã¯ãããŸãããäž»ãªèãæ¹ã¯æ¬¡ã®ãšããã§ãã
|
||
|
||
* æªãšã¯ã¹ããŒãã®æ§é äœã¯ãªãã·ã§ã³èšå®ãä¿æããŸãã
|
||
* åãªãã·ã§ã³ã¯åãåã`type Option func(options *options)` ãšã©ãŒãè¿ã颿°ã§ããããšãã°ã`WithPort` ã¯ããŒãã衚ã `int` åŒæ°ãåãåãã`options` æ§é äœã®æŽæ°æ¹æ³ã衚ã `Option` åãè¿ããŸãã
|
||
|
||

|
||
|
||
```go
|
||
type options struct {
|
||
port *int
|
||
}
|
||
|
||
type Option func(options *options) error
|
||
|
||
func WithPort(port int) Option {
|
||
return func(options *options) error {
|
||
if port < 0 {
|
||
return errors.New("port should be positive")
|
||
}
|
||
options.port = &port
|
||
return nil
|
||
}
|
||
}
|
||
|
||
func NewServer(addr string, opts ...Option) ( *http.Server, error) { <1>
|
||
var options options <2>
|
||
for _, opt := range opts { <3>
|
||
err := opt(&options) <4>
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
|
||
// ãã®æ®µéã§ããªãã·ã§ã³æ§é äœãæ§ç¯ãããæ§æãå«ãŸããŸãã
|
||
// ãããã£ãŠãããŒãèšå®ã«é¢é£ããããžãã¯ãå®è£
ã§ããŸãã
|
||
var port int
|
||
if options.port == nil {
|
||
port = defaultHTTPPort
|
||
} else {
|
||
if *options.port == 0 {
|
||
port = randomPort()
|
||
} else {
|
||
port = *options.port
|
||
}
|
||
}
|
||
|
||
// ...
|
||
}
|
||
```
|
||
|
||
Functional Options ãã¿ãŒã³ã¯ããªãã·ã§ã³ãåŠçããããã®æè»œã§ API ãã¬ã³ããªãŒãªæ¹æ³ãæäŸããŸãã Builder ãã¿ãŒã³ã¯æå¹ãªãªãã·ã§ã³ã§ãããããã€ãã®å°ããªæ¬ ç¹ïŒç©ºã®å¯èœæ§ãããæ§ææ§é äœãæž¡ããªããã°ãªããªãããŸãã¯ãšã©ãŒãåŠçããæ¹æ³ãããŸã䟿å©ã§ã¯ãªãïŒãããããã®çš®ã®åé¡ã«ãã㊠Functional Options ãã¿ãŒã³ãGoèšèªã«ãããæ
£çšçãªå¯ŸåŠæ¹æ³ã«ãªãåŸåããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/11-functional-options/)
|
||
|
||
### 誀ã£ããããžã§ã¯ãæ§æ (ãããžã§ã¯ãæ§é ãšããã±ãŒãžæ§æ) (#12)
|
||
|
||
å
šäœçãªæ§æã«é¢ããŠã¯ãããŸããŸãªèãæ¹ããããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ãã³ã³ããã¹ãããšã«æŽçãã¹ããããããšãã¬ã€ã€ãŒããšã«æŽçãã¹ãããããã¯å¥œã¿ã«ãã£ãŠç°ãªããŸããã³ã³ããã¹ãïŒé¡§å®¢ã³ã³ããã¹ããå¥çŽã³ã³ããã¹ããªã©ïŒããšã«ã³ãŒããã°ã«ãŒãåããããšãéžã¶å Žåãããã°ãå
è§åœ¢ã®ã¢ãŒããã¯ãã£ååã«åŸãããšãšãæè¡å±€ããšã«ã°ã«ãŒãåããããšãéžã¶å ŽåããããŸããç§ãã¡ãè¡ã決å®ãäžè²«ããŠããéããããããŠãŒã¹ã±ãŒã¹ã«é©åãããªãããããééã£ãŠããããšã¯ãããŸããã
|
||
|
||
ããã±ãŒãžã«é¢ããŠã¯ãåŸãã¹ããã¹ããã©ã¯ãã£ã¹ãè€æ°ãããŸãããŸãããããžã§ã¯ããé床ã«è€éã«ãªãå¯èœæ§ããããããææå°æ©ãªããã±ãŒãžåã¯é¿ããã¹ãã§ããå Žåã«ãã£ãŠã¯ãå®ç§ãªæ§é ãæåããç¡çã«äœãããšããããããåçŽãªæ§æã䜿çšãããã®å
容ãçè§£ããäžã§ãããžã§ã¯ããçºå±ãããã»ããè¯ãå ŽåããããŸãã
|
||
ç²åºŠãèæ
®ãã¹ãéèŠãªç¹ã§ãã 1 ã€ãŸã㯠2 ã€ã®ãã¡ã€ã«ã ããå«ãæ°åã®ããããã±ãŒãžãäœæããããšã¯é¿ããã¹ãã§ãããã®å Žåããããããããã®ããã±ãŒãžéã®è«ççãªæ¥ç¶ã®äžéšãæãèœã¡ãèªã¿æã«ãšã£ãŠãããžã§ã¯ããçè§£ãã«ãããªãããã§ããéã«ãããã±ãŒãžåã®æå³ãèãããããªå·šå€§ãªããã±ãŒãžãé¿ããã¹ãã§ãã
|
||
|
||
ããã±ãŒãžã®ååä»ããæ³šæããŠè¡ãå¿
èŠããããŸããïŒéçºè
ãªãïŒèª°ããç¥ã£ãŠããããã«ãååãä»ããã®ã¯é£ããã§ããã¯ã©ã€ã¢ã³ãã Go ãããžã§ã¯ããçè§£ããããããã«ãããã±ãŒãžã«å«ãŸãããã®ã§ã¯ãªããæäŸãããã®ã«åºã¥ããŠããã±ãŒãžã«ååãä»ããå¿
èŠããããŸãããŸããããŒãã³ã°ã«ã¯æå³ã®ãããã®ãä»ããå¿
èŠããããŸãããããã£ãŠãããã±ãŒãžåã¯çããç°¡æœã§ã衚çŸåè±ãã§ãæ
£äŸã«ããåäžã®å°æåã«ããå¿
èŠããããŸãã
|
||
|
||
äœããšã¯ã¹ããŒããããã«ã€ããŠã®ã«ãŒã«ã¯éåžžã«ç°¡åã§ããããã±ãŒãžéã®çµåãæžããããšã¯ã¹ããŒããããäžèŠãªèŠçŽ ãé衚瀺ã«ããããã«ããšã¯ã¹ããŒãããå¿
èŠããããã®ãã§ããéãæå°éã«æããå¿
èŠããããŸããèŠçŽ ããšã¯ã¹ããŒããããã©ããäžæãªå Žåã¯ãããã©ã«ãã§ãšã¯ã¹ããŒãããªãããã«ããå¿
èŠããããŸããåŸã§ãšã¯ã¹ããŒãããå¿
èŠãããããšã倿ããå Žåã¯ãã³ãŒãã調æŽã§ããŸãããŸããæ§é äœã encoding/json ã§ã¢ã³ããŒã·ã£ãªã³ã°ã§ããããã«ãã£ãŒã«ãããšã¯ã¹ããŒããããªã©ãããã€ãã®äŸå€ã«ãçæããŠãã ããã
|
||
|
||
ãããžã§ã¯ããæ§æããã®ã¯ç°¡åã§ã¯ãããŸãããããããã®ã«ãŒã«ã«åŸãããšã§ç¶æã容æã«ãªããŸãããã ããä¿å®æ§ã容æã«ããããã«ã¯äžè²«æ§ãéèŠã§ããããšã«æ³šæããŠãã ããããããã£ãŠãã³ãŒãããŒã¹å
ã§å¯èœãªéãäžè²«æ§ãä¿ã€ããã«ããŸãããã
|
||
|
||
???+ note "è£è¶³"
|
||
|
||
Go ããŒã 㯠Go ãããžã§ã¯ãã®çµç¹å/æ§é åã«é¢ããå
¬åŒã¬ã€ãã©ã€ã³ã2023幎ã«çºè¡ããŸããïŒ [go.dev/doc/modules/layout](https://go.dev/doc/modules/layout)
|
||
|
||
### ãŠãŒãã£ãªãã£ããã±ãŒãžã®äœæ (#13)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ååä»ãã¯ã¢ããªã±ãŒã·ã§ã³èšèšã®éèŠãªéšåã§ãã`common` ã`util` ã`shared` ã®ãããªããã±ãŒãžãäœæããŠããèªã¿æã«ããã»ã©ã®äŸ¡å€ããããããŸããããã®ãããªããã±ãŒãžãæå³ã®ããå
·äœçãªããã±ãŒãžåã«ãªãã¡ã¯ã¿ãªã³ã°ããŸãããã
|
||
|
||
ãŸããããã±ãŒãžã«å«ãŸãããã®ã§ã¯ãªããããã±ãŒãžãæäŸãããã®ã«åºã¥ããŠããã±ãŒãžã«ååãä»ãããšããã®è¡šçŸåãé«ããå¹ççãªæ¹æ³ã«ãªãããšã«ãçæããŠãã ããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/02-code-project-organization/13-utility-packages/stringset.go)
|
||
|
||
### ããã±ãŒãžåã®è¡çªãç¡èŠãã (#14)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
æ··ä¹±ãããã«ã¯ãã°ã«ã€ãªãããããªãã倿°ãšããã±ãŒãžéã®ååã®è¡çªãåé¿ããããã«ãããããã«äžæã®ååã䜿çšããŸãããããããäžå¯èœãªå Žåã¯ãã€ã³ããŒããšã€ãªã¢ã¹ã䜿çšããŠä¿®é£Ÿåã倿ŽããŠããã±ãŒãžåãšå€æ°åãåºå¥ããããããè¯ãååãèããŠãã ããã
|
||
|
||
ããã±ãŒãžã®è¡çªã¯ã倿°åãæ¢åã®ããã±ãŒãžåãšè¡çªããå Žåã«çºçããããã±ãŒãžã®åå©çšã劚ããããŸããææ§ããé¿ããããã«ã倿°åã®è¡çªãé²ãå¿
èŠããããŸããè¡çªãçºçããå Žåã¯ãå¥ã®æå³ã®ããååãèŠã€ããããã€ã³ããŒããšã€ãªã¢ã¹ã䜿çšããå¿
èŠããããŸãã
|
||
|
||
### ã³ãŒãã®æç« åãè¡ãããŠããªã (#15)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã¯ã©ã€ã¢ã³ããšã¡ã³ãããã³ãŒãã®æå³ãçè§£ã§ããããã«ããšã¯ã¹ããŒããããèŠçŽ ãæç« åããŸãããã
|
||
|
||
æç« åã¯ã³ãŒãã£ã³ã°ã®éèŠãªåŽé¢ã§ããããã«ãããã¯ã©ã€ã¢ã³ãã API ãããç°¡åã«äœ¿çšããããšãã§ããŸããããããžã§ã¯ãã®ç¶æã«ã圹ç«ã¡ãŸããGoèšèªã§ã¯ãã³ãŒããæ
£çšçãªãã®ã«ããããã«ãããã€ãã®ã«ãŒã«ã«åŸãå¿
èŠããããŸãã
|
||
|
||
ãŸãããšã¯ã¹ããŒãããããã¹ãŠã®èŠçŽ ãæç« åããå¿
èŠããããŸããæ§é ãã€ã³ã¿ãã§ãŒã¹ã颿°ãªã©ããšã¯ã¹ããŒãããå Žåã¯æç« åããå¿
èŠããããŸããæ
£äŸãšããŠããšã¯ã¹ããŒããããèŠçŽ ã®ååããå§ãŸãã³ã¡ã³ãã远å ããŸãã
|
||
|
||
æ
£äŸãšããŠãåã³ã¡ã³ãã¯å¥èªç¹ã§çµããå®å
šãªæã§ããå¿
èŠããããŸãããŸãã颿°ïŒãŸãã¯ã¡ãœããïŒãæç« åãããšãã¯ã颿°ãã©ã®ããã«å®è¡ãããã§ã¯ãªãããã®é¢æ°ãäœãå®è¡ããã€ããã§ãããã匷調ããå¿
èŠãããããšã«ãçæããŠãã ãããããã¯ããã¥ã¡ã³ãã§ã¯ãªãã颿°ãšã³ã¡ã³ãã«ã€ããŠã§ããããã¥ã¡ã³ãã¯çæ³çã«ã¯ãæ¶è²»è
ããšã¯ã¹ããŒããããèŠçŽ ã®äœ¿ç𿹿³ãçè§£ããããã«ã³ãŒããèŠãå¿
èŠããªãã»ã©ååãªæ
å ±ãæäŸããå¿
èŠããããŸãã
|
||
|
||
倿°ãŸãã¯å®æ°ãæç« åããå Žåããã®ç®çãšå
容ãšãã2ã€ã®åŽé¢ãäŒããããšãéèŠãããããŸãããåè
ã¯ãå€éšã¯ã©ã€ã¢ã³ãã«ãšã£ãŠåœ¹ç«ã€ããã«ãã³ãŒãããã¥ã¡ã³ããšããŠååšããå¿
èŠããããŸãããã ããåŸè
ã¯å¿
ãããå
¬éãããã¹ãã§ã¯ãããŸããã
|
||
|
||
ã¯ã©ã€ã¢ã³ããšã¡ã³ãããããã±ãŒãžã®ç®çãçè§£ã§ããããã«ãåããã±ãŒãžãããã¥ã¡ã³ãããå¿
èŠããããŸããæ
£äŸãšããŠãã³ã¡ã³ã㯠`//Package` ã§å§ãŸãããã®åŸã«ããã±ãŒãžåãç¶ããŸããããã±ãŒãžã³ã¡ã³ãã®æåã®è¡ã¯ãããã±ãŒãžã«è¡šç€ºãããããç°¡æœã«ããå¿
èŠããããŸãããããŠã次ã®è¡ã«å¿
èŠãªæ
å ±ããã¹ãŠå
¥åããŸãã
|
||
|
||
ã³ãŒããæç« åããããšãå¶çŽã«ãªãã¹ãã§ã¯ãããŸãããã¯ã©ã€ã¢ã³ããã¡ã³ãããã³ãŒãã®æå³ãçè§£ããã®ã«åœ¹ç«ã€å¿
èŠããããŸãã
|
||
|
||
### ãªã³ã¿ãŒã䜿çšããŠãªã (#16)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã³ãŒãã®å質ãšäžè²«æ§ãåäžãããã«ã¯ããªã³ã¿ãŒãšãã©ãŒããã¿ãŒã䜿çšããŸããã
|
||
|
||
ãªã³ã¿ãŒã¯ãã³ãŒããåæããŠãšã©ãŒãæ€åºããèªåããŒã«ã§ãããã®ã»ã¯ã·ã§ã³ã®ç®çã¯ãæ¢åã®ãªã³ã¿ãŒã®å®å
šãªãªã¹ããæäŸããããšã§ã¯ãããŸãããããããå Žåãããã«äœ¿ãç©ã«ãªããªããªã£ãŠããŸãããã§ããããããã»ãšãã©ã® Go ãããžã§ã¯ãã«ãªã³ã¿ãŒãäžå¯æ¬ ã§ããçç±ãçè§£ããèŠããŠãããŸãããã
|
||
|
||
* [https://golang.org/cmd/vet](https://golang.org/cmd/vet)ââGoèšèªã®æšæºã³ãŒãã¢ãã©ã€ã¶ãŒ
|
||
* [https://github.com/kisielk/errcheck](https://github.com/kisielk/errcheck)ââãšã©ãŒãã§ãã«ãŒ
|
||
* [https://github.com/fzipp/gocyclo](https://github.com/fzipp/gocyclo)ââ埪ç°çè€é床ã¢ãã©ã€ã¶ãŒ
|
||
* [https://github.com/jgautheron/goconst](https://github.com/jgautheron/goconst)ââå埩æåå宿°ã¢ãã©ã€ã¶ãŒ
|
||
*
|
||
ãªã³ã¿ãŒã®ã»ãã«ãã³ãŒãã¹ã¿ã€ã«ãä¿®æ£ããããã«ã³ãŒããã©ãŒããã¿ãŒãŒã䜿çšããŸãããã以äžã«ãããã€ãã®ã³ãŒããã©ãŒããã¿ãŒã瀺ããŸãã
|
||
* [https://golang.org/cmd/gofmt](https://golang.org/cmd/gofmt)ââGoèšèªã®æšæºã³ãŒããã©ãŒããã¿ãŒ
|
||
* [https://godoc.org/golang.org/x/tools/cmd/goimports](https://godoc.org/golang.org/x/tools/cmd/goimports)ââGoèšèªã®æšæºã€ã³ããŒããã©ãŒããã¿ãŒ
|
||
*
|
||
ã»ãã« golangci-lint ([https://github.com/golangci/golangci-lint](https://github.com/golangci/golangci-lint)) ãšãããã®ããããŸããããã¯ãå€ãã®äŸ¿å©ãªãªã³ã¿ãŒããã©ãŒããã¿ãŒã®äžã«ãã¡ãµãŒããæäŸãããªã³ãã£ã³ã°ããŒã«ã§ãããŸãããªã³ã¿ãŒã䞊åå®è¡ããŠåæé床ãåäžãããããšãã§ããéåžžã«äŸ¿å©ã§ãã
|
||
|
||
ãªã³ã¿ãŒãšãã©ãŒããã¿ãŒã¯ãã³ãŒãããŒã¹ã®å質ãšäžè²«æ§ãåäžããã匷åãªæ¹æ³ã§ããæéããããŠã©ãã䜿çšãã¹ãããçè§£ãããããã®å®è¡ïŒ CI ã Git ããªã³ãããããã¯ãªã©ïŒãèªååããŸãããã
|
||
|
||
## ããŒã¿å
|
||
|
||
### 8鲿°ãªãã©ã«ã§æ··ä¹±ãæã (#17)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
æ¢åã®ã³ãŒããèªããšãã¯ã `0` ã§å§ãŸãæŽæ°ãªãã©ã«ã8鲿°ã§ããããšã«çæããŠãã ããããŸããæ¥é èŸ `0o` ãä»ããããšã§8鲿޿°ã§ããããšãæç¢ºã«ããèªã¿ããããåäžãããŸãããã
|
||
|
||
8 鲿°ã¯ 0 ã§å§ãŸããŸãïŒããšãã°ã`010` 㯠10 鲿°ã® 8 ã«çžåœããŸãïŒãå¯èªæ§ãåäžãããå°æ¥ã®ã³ãŒããªãŒããŒã®æœåšçãªééããåé¿ããã«ã¯ã `0o` æ¥é èŸã䜿çšã㊠8 鲿°ã§ããããšãæããã«ããŸãããïŒäŸ: `0o10` ïŒã
|
||
|
||
ä»ã®æŽæ°ãªãã©ã«è¡šçŸã«ã泚æããŠãã ããã
|
||
|
||
* _ãã€ããª_ - æ¥é èŸ `0b` ããã㯠`0B` ã䜿çšããŸãïŒããšãã°ã `0b` ã¯10鲿°ã® 4 ã«çžåœããŸãïŒ
|
||
* _16鲿°_ - æ¥é èŸ `0x` ããã㯠`0X` ã䜿çšããŸãïŒããšãã°ã `0xF` ã¯10鲿°ã® 15 ã«çžåœããŸãïŒã
|
||
* _èæ°_ - æ¥å°ŸèŸ `i` ã䜿çšããŸãïŒããšãã°ã `3i` ïŒ
|
||
|
||
èªã¿ãããããããã«ãåºåãæåãšããŠã¢ã³ããŒã¹ã³ã¢ïŒ _ ïŒã䜿çšããããšãã§ããŸããããšãã°ã 10 å㯠`1_000_000_000` ã®ããã«æžãããšãã§ããŸããã¢ã³ããŒã¹ã³ã¢ã¯ `0b)00_00_01` ã®ããã«ä»ã®è¡šçŸãšäœµçšããããšãã§ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/17-octal-literals/main.go)
|
||
|
||
### æŽæ°ãªãŒããŒãããŒã®ç¡èŠ (#18)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Goèšèªã§ã¯æŽæ°ã®ãªãŒããŒãããŒãšã¢ã³ããŒãããŒãè£åŽã§åŠçãããããããããããã£ããããç¬èªã®é¢æ°ãå®è£
ã§ããŸãã
|
||
|
||
Goèšèªã§ã¯ãã³ã³ãã€ã«æã«æ€åºã§ããæŽæ°ãªãŒããŒãããŒã«ãã£ãŠã³ã³ãã€ã«ãšã©ãŒãçæãããŸããããšãã°ã次ã®ããã«ãªããŸãã
|
||
|
||
```go
|
||
var counter int32 = math.MaxInt32 + 1
|
||
```
|
||
|
||
```shell
|
||
constant 2147483648 overflows int32
|
||
```
|
||
|
||
ãã ããå®è¡æã«ã¯ãæŽæ°ã®ãªãŒããŒãããŒãŸãã¯ã¢ã³ããŒãããŒã¯çºçããŸãããããã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ã®ãããã¯ãçºçããããšã¯ãããŸããããã®åäœã¯ãã£ãããªãã°ïŒããšãã°ãè² ã®çµæã«ã€ãªããæŽæ°ã®å¢åãæ£ã®æŽæ°ã®å ç®ãªã©ïŒã«ã€ãªããå¯èœæ§ããããããé ã«å
¥ããŠããããšãéèŠã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/18-integer-overflows)
|
||
|
||
### æµ®åå°æ°ç¹ãçè§£ããŠããªã (#19)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ç¹å®ã®ãã«ã¿å
ã§æµ®åå°æ°ç¹æ¯èŒãè¡ããšãã³ãŒãã®ç§»æ€æ§ã確ä¿ã§ããŸããå ç®ãŸãã¯æžç®ãå®è¡ãããšãã¯ã粟床ãåäžãããããã«ãåçšåºŠã®å€§ããã®æŒç®ãã°ã«ãŒãåããŠãã ããããŸããä¹ç®ãšé€ç®ã¯å ç®ãšæžç®ã®åã«å®è¡ããŠãã ããã
|
||
|
||
Goèšèªã«ã¯ãïŒèæ°ãçç¥ããå ŽåïŒ `float32` ãš `float64` ãšãã2ã€ã®æµ®åå°æ°ç¹åããããŸããæµ®åå°æ°ç¹ã®æŠå¿µã¯ãå°æ°å€ã衚çŸã§ããªããšããæŽæ°ã®å€§ããªåé¡ã解決ããããã«çºæãããŸãããäºæãã¬äºæ
ãé¿ããããã«ãæµ®åå°æ°ç¹æŒç®ã¯å®éã®æŒç®ã®è¿äŒŒã§ããããšãç¥ã£ãŠããå¿
èŠããããŸãã
|
||
|
||
ãã®ããã«ãä¹ç®ã®äŸãèŠãŠã¿ãŸãããã
|
||
|
||
```go
|
||
var n float32 = 1.0001
|
||
fmt.Println(n * n)
|
||
```
|
||
|
||
ãã®ã³ãŒãã«ãããŠã¯ 1.0001 * 1.0001 = 1.00020001 ãšããçµæãåºåãããããšãæåŸ
ãããšæããŸããããããªãããã»ãšãã©ã® x86 ããã»ããµã§ã¯ã代ããã« 1.0002 ãåºåãããŸãã
|
||
|
||
Goèšèªã® `float32` ããã³ `float64` åã¯è¿äŒŒå€ã§ãããããããã€ãã®ã«ãŒã«ã念é ã«çœ®ãå¿
èŠããããŸãã
|
||
|
||
* 2 ã€ã®æµ®åå°æ°ç¹æ°ãæ¯èŒããå Žåã¯ããã®å·®ã蚱容ç¯å²å
ã§ããããšã確èªããã
|
||
* å ç®ãŸãã¯æžç®ãå®è¡ããå Žåã粟床ãé«ããããã«ãåãæ¡æ°ã®æŒç®ãã°ã«ãŒãåããã
|
||
* 粟床ãé«ãããããäžé£ã®æŒç®ã§å ç®ãæžç®ãä¹ç®ãé€ç®ãå¿
èŠãªå Žåã¯ãä¹ç®ãšé€ç®ãæåã«å®è¡ããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/19-floating-points/main.go)
|
||
|
||
### ã¹ã©ã€ã¹ã®é·ããšå®¹éãçè§£ããŠããªã (#20)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Go éçºè
ãªãã°ãã¹ã©ã€ã¹ã®é·ããšå®¹éã®éããçè§£ããã¹ãã§ããã¹ã©ã€ã¹ã®é·ãã¯ã¹ã©ã€ã¹å
ã®äœ¿çšå¯èœãªèŠçŽ ã®æ°ã§ãããã¹ã©ã€ã¹ã®å®¹éã¯ãããã³ã°é
åå
ã®èŠçŽ ã®æ°ã§ãã
|
||
|
||
ã»ã¯ã·ã§ã³å
šæã¯[ãã¡ã](20-slice.md).
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/20-slice-length-cap/main.go)
|
||
|
||
### éå¹çãªã¹ã©ã€ã¹ã®åæå (#21)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã¹ã©ã€ã¹ãäœæãããšããé·ãããã§ã«ããã£ãŠããå Žåã¯ãæå®ãããé·ããŸãã¯å®¹éã§ã¹ã©ã€ã¹ãåæåããŸããããããã«ãããå²ãåœãŠã®æ°ãæžããããã©ãŒãã³ã¹ãåäžããŸãã
|
||
|
||
`make` ã䜿çšããŠã¹ã©ã€ã¹ãåæåãããšãã«ãé·ããšãªãã·ã§ã³ã®å®¹éãæå®ã§ããŸãããããã®ãã©ã¡ãŒã¿ã®äž¡æ¹ã«é©åãªå€ãæž¡ãããšãé©åœã§ããã«ããããããããããå¿ããã®ã¯ããããééãã§ããå®éãè€æ°ã®ã³ããŒãå¿
èŠã«ãªããäžæçãªãããã³ã°é
åãã¯ãªãŒã³ã¢ããããããã« GC ã«è¿œå ã®åŽåããããå¯èœæ§ããããŸããããã©ãŒãã³ã¹ã®èгç¹ããèšãã°ãGo ã©ã³ã¿ã€ã ã«æãå·®ã䌞ã¹ãªãçç±ã¯ãããŸããã
|
||
|
||
ãªãã·ã§ã³ã¯ãæå®ããã容éãŸãã¯æå®ãããé·ãã®ã¹ã©ã€ã¹ãå²ãåœãŠãããšã§ãã ããã 2 ã€ã®è§£æ±ºçã®ãã¡ã2 çªç®ã®è§£æ±ºçã®æ¹ããããã«é«éã§ããåŸåãããããšãããããŸããããã ããç¹å®ã®å®¹éãšè¿œå ã䜿çšãããšãå Žåã«ãã£ãŠã¯å®è£
ãšèªã¿åãã容æã«ãªãããšããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/21-slice-init/main.go)
|
||
|
||
### nil ãšç©ºã®ã¹ã©ã€ã¹ãæ··åããŠãã (#22)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`encoding/json` ã `reflect` ããã±ãŒãžãªã©ã䜿çšãããšãã«ããããæ··ä¹±ãé¿ããããã«ã¯ãnil ã¹ã©ã€ã¹ãšç©ºã®ã¹ã©ã€ã¹ã®éããçè§£ããå¿
èŠããããŸããã©ã¡ããé·ããŒãã容éãŒãã®ã¹ã©ã€ã¹ã§ãããå²ãåœãŠãå¿
èŠãšããªãã®ã¯ nil ã¹ã©ã€ã¹ã ãã§ãã
|
||
|
||
Goèšèªã§ã¯ãnil ãšç©ºã®ã¹ã©ã€ã¹ã¯åºå¥ãããŸããnil ã¹ã©ã€ã¹ã¯ `nil` ã«çããã®ã«å¯Ÿãã空ã®ã¹ã©ã€ã¹ã®é·ãã¯ãŒãã§ããnil ã¹ã©ã€ã¹ã¯ç©ºã§ããã空ã®ã¹ã©ã€ã¹ã¯å¿
ããã`nil` ã§ãããšã¯éããŸãããäžæ¹ãnil ã¹ã©ã€ã¹ã«ã¯å²ãåœãŠã¯å¿
èŠãããŸããããã®ã»ã¯ã·ã§ã³å
šäœãéããŠã以äžã®æ¹æ³ã䜿çšããããšã«ãã£ãŠãç¶æ³ã«å¿ããŠã¹ã©ã€ã¹ãåæåããããšãèŠãŠããŸããã
|
||
|
||
* æçµçãªé·ããäžæã§ã¹ã©ã€ã¹ã空ã®å Žå㯠`var s []string`
|
||
* nil ãšç©ºã®ã¹ã©ã€ã¹ãäœæããç³è¡£æ§æãšããŠã® `[]string(nil)`
|
||
* å°æ¥ã®é·ããããã£ãŠããå Žå㯠`make([]string, length)`
|
||
|
||
èŠçŽ ãªãã§ã¹ã©ã€ã¹ãåæåããå ŽåãæåŸã®ãªãã·ã§ã³ `[]string{}` ã¯é¿ããã¹ãã§ããæåŸã«ãäºæããªãåäœãé²ãããã«ã䜿çšããã©ã€ãã©ãªã nil ãšç©ºã®ã¹ã©ã€ã¹ãåºå¥ããŠãããã©ããã確èªããŠã¿ãŸãããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/22-nil-empty-slice/)
|
||
|
||
### ã¹ã©ã€ã¹ã空ãã©ãããé©åã«ç¢ºèªããªã (#23)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã¹ã©ã€ã¹ã«èŠçŽ ãå«ãŸããŠããªãããšã確èªããã«ã¯ããã®é·ãã確èªããŸããããããã¯ãã¹ã©ã€ã¹ã `nil` ã§ããã空ã§ãããã«é¢ä¿ãªãæ©èœããŸãããããã«ã€ããŠãåæ§ã§ããæç¢ºãª API ãèšèšããã«ã¯ãnil ã¹ã©ã€ã¹ãšç©ºã®ã¹ã©ã€ã¹ãåºå¥ããªãã§ãã ããã
|
||
|
||
ã¹ã©ã€ã¹ã«èŠçŽ ããããã©ããã倿ããã«ã¯ãã¹ã©ã€ã¹ã nil ãã©ããããŸãã¯ãã®é·ãã 0 ã«çãããã©ããã確èªããããšã§å€æã§ããŸããã¹ã©ã€ã¹ã空ã§ããå Žåãšã¹ã©ã€ã¹ã nil ã§ããå Žåã®äž¡æ¹ãã«ããŒã§ãããããé·ãã確ãããããšãæè¯ã®æ¹æ³ã§ãã
|
||
|
||
äžæ¹ãã€ã³ã¿ãã§ãŒã¹ãèšèšãããšãã¯ã軜埮ãªããã°ã©ãã³ã°ãšã©ãŒãèµ·ãããªããã nil ã¹ã©ã€ã¹ãšç©ºã®ã¹ã©ã€ã¹ãåºå¥ããªãããã«ããå¿
èŠããããŸããã¹ã©ã€ã¹ãè¿ããšãã«ãnil ãŸãã¯ç©ºã®ã¹ã©ã€ã¹ãè¿ããã©ããã¯ãæå³çã«ãæè¡çã«ãéãã¯ãããŸãããã³ãŒã©ãŒã«ãšã£ãŠã¯ã©ã¡ããåãããšãæå³ããã¯ãã§ãããã®åçã¯é£æ³é
åã§ãåãã§ãã飿³é
åã空ãã©ããã確èªããã«ã¯ãããã nil ãã©ããã§ã¯ãªãããã®é·ãã確èªããŸãããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/23-checking-slice-empty/main.go)
|
||
|
||
### ã¹ã©ã€ã¹ã³ããŒãæ£ããäœæããŠããªã (#24)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
çµã¿èŸŒã¿é¢æ° `copy` ã䜿çšããŠããã¹ã©ã€ã¹ãå¥ã®ã¹ã©ã€ã¹ã«ã³ããŒããã«ã¯ãã³ããŒãããèŠçŽ ã®æ°ã2ã€ã®ã¹ã©ã€ã¹ã®é·ãã®éã®æå°å€ã«çžåœããããšã«æ³šæããŠãã ããã
|
||
|
||
èŠçŽ ãããã¹ã©ã€ã¹ããå¥ã®ã¹ã©ã€ã¹ã«ã³ããŒããæäœã¯ãããªãé »ç¹ã«è¡ãããŸããã³ããŒã䜿çšããå Žåãã³ããŒå
ã«ã³ããŒãããèŠçŽ ã®æ°ã¯ 2 ã€ã®ã¹ã©ã€ã¹ã®é·ãã®éã®æå°å€ã«çžåœããããšã«æ³šæããå¿
èŠããããŸãããŸããã¹ã©ã€ã¹ãã³ããŒããããã®ä»ã®ä»£æ¿ææ®µãååšããããšã«ãçæããŠãã ããããã®ãããã³ãŒãããŒã¹ã§ããããèŠã€ããŠãé©ãããšã¯ãããŸããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/24-slice-copy/main.go)
|
||
|
||
### ã¹ã©ã€ã¹è¿œå ã®äœ¿çšã«ããäºæãã¬å¯äœçš (#25)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
2ã€ã®ç°ãªã颿°ãåãé
åã«åºã¥ãã¹ã©ã€ã¹ã䜿çšããå Žåã«ãcopy ãŸãã¯å®å
šãªã¹ã©ã€ã¹åŒã䜿çšããããšã§ `append` ã«ããè¡çªãé²ãããšãã§ããŸãããã ãã倧ããªã¹ã©ã€ã¹ãçž®å°ããå Žåãã¡ã¢ãªãªãŒã¯ãé²ãããšãã§ããã®ã¯ã¹ã©ã€ã¹ã³ããŒã ãã§ãã
|
||
|
||
ã¹ã©ã€ã¹ã䜿çšãããšãã¯ãäºæãã¬å¯äœçšã«ã€ãªããç¶æ³ã«çŽé¢ããå¯èœæ§ãããããšãèŠããŠããå¿
èŠããããŸããçµæã®ã¹ã©ã€ã¹ã®é·ãããã®å®¹éããå°ããå Žåã远å ã«ãã£ãŠå
ã®ã¹ã©ã€ã¹ã倿Žãããå¯èœæ§ããããŸããèµ·ããåŸãå¯äœçšã®ç¯å²ãå¶éãããå Žåã¯ãã¹ã©ã€ã¹ã³ããŒãŸãã¯å®å
šãªã¹ã©ã€ã¹åŒã䜿çšã§ããŸããããã«ãããã³ããŒãå®è¡ã§ããªããªããŸãã
|
||
|
||
???+ noteã"è£è¶³"
|
||
|
||
`s[low:high:max]`ïŒå®å
šãªã¹ã©ã€ã¹åŒïŒïŒãã®åœä»€æã¯ã容éã `max - low` ã«çããããšãé€ãã°ã`s[low:high]` ã§äœæãããã¹ã©ã€ã¹ãšåæ§ã®ã¹ã©ã€ã¹ãäœæããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/25-slice-append/main.go)
|
||
|
||
### ã¹ã©ã€ã¹ãšã¡ã¢ãªãªãŒã¯ (#26)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãã€ã³ã¿ã®ã¹ã©ã€ã¹ãŸãã¯ãã€ã³ã¿ãã£ãŒã«ããæã€æ§é äœãæäœããå Žåãã¹ã©ã€ã¹æäœã«ãã£ãŠé€å€ãããèŠçŽ ã nil ãšããããšã§ã¡ã¢ãªãªãŒã¯ãåé¿ã§ããŸãã
|
||
|
||
#### å®¹éæŒã
|
||
|
||
倧ããªã¹ã©ã€ã¹ãŸãã¯é
åãã¹ã©ã€ã¹ãããšãã¡ã¢ãªæ¶è²»ãé«ããªãå¯èœæ§ãããããšã«æ³šæããŠãã ãããæ®ãã®ã¹ããŒã¹ã¯ GC ã«ãã£ãŠåå©çšããããå°æ°ã®èŠçŽ ãã䜿çšããªãã«ããããããã倧ããªãããã³ã°é
åãä¿æãããŸããã¹ã©ã€ã¹ã³ããŒã䜿çšããããšã§ããã®ãããªäºæ
ãé²ãããšãã§ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/26-slice-memory-leak/capacity-leak)
|
||
|
||
#### ã¹ã©ã€ã¹ãšãã€ã³ã¿ãŒ
|
||
|
||
ãã€ã³ã¿ãŸãã¯ãã€ã³ã¿ãã£ãŒã«ããå«ãæ§é äœã䜿çšããŠã¹ã©ã€ã¹æäœãããå ŽåãGC ããããã®èŠçŽ ãåå©çšããªãããšãç¥ã£ãŠããå¿
èŠããããŸãããã®å Žåã®éžæè¢ã¯ãã³ããŒãå®è¡ããããæ®ãã®èŠçŽ ãŸãã¯ãã®ãã£ãŒã«ããæç€ºçã« `nil` ãšããããšã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/26-slice-memory-leak/slice-pointers)
|
||
|
||
### éå¹çãªé£æ³é
åã®åæå (#27)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
飿³é
åãäœæãããšãããã®é·ãããã§ã«ããã£ãŠããå Žåã¯ãæå®ãããé·ãã§åæåããŸããããã«ãããå²ãåœãŠã®æ°ãæžããããã©ãŒãã³ã¹ãåäžããŸãã
|
||
|
||
飿³é
åã¯ãããŒã»å€ãã¢ã®é åºãªãã³ã¬ã¯ã·ã§ã³ãæäŸããŸãããªããããããã®ãã¢ã¯åºæã®ããŒãæã¡ãŸããGoèšèªã§ã¯ã飿³é
åã¯ããã·ã¥ããŒãã«ããŒã¿æ§é ã«åºã¥ããŠããŸããå
éšçã«ã¯ãããã·ã¥ããŒãã«ã¯ãã±ããã®é
åã§ãããåãã±ããã¯ããŒã»å€ãã¢ã®é
åãžã®ãã€ã³ã¿ã§ãã
|
||
|
||
飿³é
åã«å«ãŸããèŠçŽ ã®æ°ãäºåã«ããã£ãŠããå Žåã¯ããã®åæãµã€ãºãæå®ããŠäœæããå¿
èŠããããŸãã飿³é
åã®å¢å€§ã¯ãååãªã¹ããŒã¹ãåå²ãåœãŠãããã¹ãŠã®èŠçŽ ã®ãã©ã³ã¹ãå調æŽããå¿
èŠããããããèšç®éãéåžžã«å€ããªããŸãããããã«ãããããåé¿ããããšãã§ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/27-map-init/main_test.go)
|
||
|
||
### 飿³é
åãšã¡ã¢ãªãªãŒã¯ (#28)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
飿³é
åã¯ã¡ã¢ãªå
ã§åžžã«å¢å€§ããå¯èœæ§ããããŸãããçž®å°ããããšã¯ãããŸããã ãããã£ãŠãã¡ã¢ãªã®åé¡ãçºçããå Žåã¯ã飿³é
åã匷å¶çã«åäœæãããããã€ã³ã¿ã䜿çšããããããªã©ãããŸããŸãªææ®µã詊ãããšãã§ããŸãã
|
||
|
||
ã»ã¯ã·ã§ã³å
šæã¯[ãã¡ã](28-maps-memory-leaks.md).
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/28-map-memory-leak/main.go)
|
||
|
||
### 誀ã£ãæ¹æ³ã«ããå€ã®æ¯èŒ (#29)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Goèšèªã§åãæ¯èŒãââãã«ã¯ã2 ã€ã®åãæ¯èŒå¯èœãªãã°ã== æŒç®åãš != æŒç®åã䜿çšã§ããŸããççå€ãæ°å€ãæååããã€ã³ã¿ããã£ãã«ãããã³æ§é äœãå®å
šã«æ¯èŒå¯èœãªåã§æ§æãããŠããŸãããã以å€ã¯ã `reflect.DeepEqual` ã䜿çšããŠãªãã¬ã¯ã·ã§ã³ã®ä»£åãæ¯æãããç¬èªã®å®è£
ãšã©ã€ãã©ãªã䜿çšããããšãã§ããŸãã
|
||
|
||
广çã«æ¯èŒããã«ã¯ã `==` ãš `!=` ã®äœ¿ç𿹿³ãçè§£ããããšãäžå¯æ¬ ã§ãããããã®æŒç®åã¯ãæ¯èŒå¯èœãªè¢«æŒç®åã§äœ¿çšã§ããŸãã
|
||
|
||
* _çåœå€_ - 2 ã€ã®çåœå€ãçãããã©ãããæ¯èŒããŸãã
|
||
* _æ°å€ (intãfloatãããã³ complex å)_ - 2 ã€ã®æ°å€ãçãããã©ãããæ¯èŒããŸãã
|
||
* _æåå_ - 2 ã€ã®æååãçãããã©ãããæ¯èŒããŸãã
|
||
* _ãã£ãã«_ - 2 ã€ã®ãã£ãã«ãåã make åŒã³åºãã«ãã£ãŠäœæããããããŸãã¯äž¡æ¹ã nil ã§ããããæ¯èŒããŸãã
|
||
* _ã€ã³ã¿ãã§ãŒã¹_ - 2 ã€ã®ã€ã³ã¿ãã§ãŒã¹ãåãåçã¿ã€ããšçããåçå€ãæã€ãã©ããããŸãã¯äž¡æ¹ã nil ã§ãããã©ãããæ¯èŒããŸãã
|
||
* _ãã€ã³ã¿_ - 2 ã€ã®ãã€ã³ã¿ãã¡ã¢ãªå
ã®åãå€ãæããŠãããããŸãã¯äž¡æ¹ãšã nil ã§ããããæ¯èŒããŸãã
|
||
* _æ§é äœãšé
å_ - é¡äŒŒããåã§æ§æãããŠãããã©ãããæ¯èŒããŸãã
|
||
|
||
???+ note "è£è¶³"
|
||
|
||
`?` ã `>=` ã `<` ãããã³ `>` æŒç®åãæ°å€åã§äœ¿çšããŠå€ãæ¯èŒããããæååã§åå¥é åºãæ¯èŒãããããããšãã§ããŸãã
|
||
|
||
被æŒç®åãæ¯èŒã§ããªãå ŽåïŒã¹ã©ã€ã¹ãšé£æ³é
åãªã©ïŒããªãã¬ã¯ã·ã§ã³ãªã©ã®ä»ã®æ¹æ³ãå©çšããå¿
èŠããããŸãããªãã¬ã¯ã·ã§ã³ã¯ã¡ã¿ããã°ã©ãã³ã°ã®äžçš®ã§ãããã¢ããªã±ãŒã·ã§ã³ããã®æ§é ãšåäœãå
çããŠå€æŽããæ©èœãæããŸããããšãã°ãGoèšèªã§ã¯ `reflect.DeepEqual` ã䜿çšã§ããŸãããã®é¢æ°ã¯ã2ã€ã®å€ãååž°çã«èª¿ã¹ãããšã«ãã£ãŠã2ã€ã®èŠçŽ ãå®å
šã«çãããã©ãããå ±åããŸããåãå
¥ããããèŠçŽ ã¯ãåºæ¬çãªåã«å ããŠãé
åãæ§é äœãã¹ã©ã€ã¹ã飿³é
åããã€ã³ã¿ãã€ã³ã¿ãã§ãŒã¹ã颿°ã§ããããããæå€§ã®èœãšã穎ã¯ããã©ãŒãã³ã¹äžã®ããã«ãã£ã§ãã
|
||
|
||
å®è¡æã®ããã©ãŒãã³ã¹ãéèŠãªå Žåã¯ãç¬èªã®ã¡ãœãããå®è£
ããããšãæåã®è§£æ±ºçãšãªãå¯èœæ§ããããŸãã
|
||
远èšïŒæšæºã©ã€ãã©ãªã«ã¯æ¢ã«æ¯èŒã¡ãœãããããã€ãããããšãèŠããŠããå¿
èŠããããŸããããšãã°ãæé©åããã `bytes.Compare` 颿°ã䜿çšããŠã2ã€ã®ãã€ãã¹ã©ã€ã¹ãæ¯èŒã§ããŸããç¬èªã®ã¡ãœãããå®è£
ããåã«ãè»èŒªã®åçºæãããªãããã«ããŸãããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/03-data-types/29-comparing-values/main.go)
|
||
|
||
## æ§é ã®å¶åŸ¡
|
||
|
||
### èŠçŽ ã `range` ã«ãŒãå
ã§ã³ããŒãããããšãç¥ããªã (#30)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`range` ã«ãŒãå
ã® value èŠçŽ ã¯ã³ããŒã§ãããããã£ãŠãããšãã°æ§é äœã倿Žããã«ã¯ããã®ã€ã³ããã¯ã¹ãä»ããŠã¢ã¯ã»ã¹ããããåŸæ¥ã® `for` ã«ãŒããä»ããŠã¢ã¯ã»ã¹ããŸãããïŒå€æŽããèŠçŽ ãŸãã¯ãã£ãŒã«ãããã€ã³ã¿ã§ããå Žåãé€ãïŒã
|
||
|
||
range ã«ãŒãã䜿çšãããšãããŸããŸãªããŒã¿æ§é ã«å埩åŠçãè¡ãããšãã§ããŸãã
|
||
|
||
* æåå
|
||
* é
å
|
||
* é
åãžã®ãã€ã³ã¿
|
||
* ã¹ã©ã€ã¹
|
||
* 飿³é
å
|
||
* åä¿¡ãã£ãã«
|
||
|
||
å€å
žç㪠`for` ã«ãŒããšæ¯èŒãããšã`range` ã«ãŒãã¯ãã®ç°¡æœãªæ§æã®ãããã§ããããã®ããŒã¿æ§é ã®ãã¹ãŠã®èŠçŽ ã«å埩åŠçãããã®ã«äŸ¿å©ã§ãã
|
||
|
||
ãã ããrange ã«ãŒãå
ã®å€èŠçŽ ã¯ã³ããŒã§ããããšãèŠããŠããå¿
èŠããããŸãããããã£ãŠãå€ã倿Žããå¿
èŠãããæ§é äœã®å Žåã倿Žããå€ãŸãã¯ãã£ãŒã«ãããã€ã³ã¿ã§ãªãéããèŠçŽ èªäœã§ã¯ãªãã³ããŒã®ã¿ãæŽæ°ããŸããrange ã«ãŒããŸãã¯åŸæ¥ã® for ã«ãŒãã䜿çšããŠã€ã³ããã¯ã¹çµç±ã§èŠçŽ ã«ã¢ã¯ã»ã¹ããããšãæšå¥šãããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/30-range-loop-element-copied/)
|
||
|
||
### `range` ã«ãŒãïŒãã£ãã«ãšé
åïŒã§ã®åŒæ°ã®è©äŸ¡æ¹æ³ãç¥ããªã (#31)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`range` æŒç®åã«æž¡ãããåŒã¯ã«ãŒãã®éå§åã« 1 åã ãè©äŸ¡ãããããšãçè§£ãããšããã£ãã«ãŸãã¯ã¹ã©ã€ã¹ã®å埩åŠçã«ãããéå¹çãªå²ãåœãŠãªã©ã®ãããã¡ãªééããåé¿ã§ããŸãã
|
||
|
||
range ã«ãŒãã¯ãïŒã¿ã€ãã«é¢ä¿ãªãïŒã³ããŒãå®è¡ããããšã«ãããã«ãŒãã®éå§åã«ãæå®ãããåŒã 1 åã ãè©äŸ¡ããŸããããšãã°ã誀ã£ãèŠçŽ ã«ã¢ã¯ã»ã¹ããŠããŸãããšãããããªãããã¡ãªééããé¿ããããã«ããã®åäœãèŠããŠããå¿
èŠããããŸããããšãã°
|
||
|
||
```go
|
||
a := [3]int{0, 1, 2}
|
||
for i, v := range a {
|
||
a[2] = 10
|
||
if i == 2 {
|
||
fmt.Println(v)
|
||
}
|
||
}
|
||
```
|
||
|
||
ãã®ã³ãŒãã¯ãæåŸã®ã€ã³ããã¯ã¹ã 10 ã«æŽæ°ããŸãããããããã®ã³ãŒããå®è¡ãããšã10 ã¯åºåãããŸããã 2 ãåºåãããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/31-range-loop-arg-evaluation/)
|
||
|
||
### `range` ã«ãŒãå
ã«ããããã€ã³ã¿èŠçŽ ã®äœ¿çšãåãŒã圱é¿ãåãã£ãŠããªã (#32)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ããŒã«ã«å€æ°ã䜿çšããããã€ã³ããã¯ã¹ã䜿çšããŠèŠçŽ ã«ã¢ã¯ã»ã¹ãããšãã«ãŒãå
ã§ãã€ã³ã¿ãã³ããŒããéã®ééããé²ãããšãã§ããŸãã
|
||
|
||
`range` ã«ãŒãã䜿çšããŠããŒã¿æ§é ã«å埩åŠçãæœãå Žåããã¹ãŠã®å€ãåäžã®äžæã®ã¢ãã¬ã¹ãæã€äžæã®å€æ°ã«å²ãåœãŠãããããšãæãåºããŠãã ãããããã«ãåå埩åŠçäžã«ãã®å€æ°ãåç
§ãããã€ã³ã¿ãä¿åãããšãåãèŠçŽ ãã€ãŸãææ°ã®èŠçŽ ãåç
§ããåããã€ã³ã¿ãä¿åããããšã«ãªããŸãããã®åé¡ã¯ãã«ãŒãã®ã¹ã³ãŒãå
ã«ããŒã«ã«å€æ°ã匷å¶çã«äœæããããã€ã³ããã¯ã¹ãä»ããŠã¹ã©ã€ã¹èŠçŽ ãåç
§ãããã€ã³ã¿ãäœæããããšã§è§£æ±ºã§ããŸããã©ã¡ãã®è§£æ±ºçã§ãåé¡ãããŸããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/32-range-loop-pointers/)
|
||
|
||
|
||
### 飿³é
åã®å埩åŠçäžã«èª€ã£ãä»®å®ãããïŒå埩åŠçäžã®é åºä»ããšé£æ³é
åã®æ¿å
¥ïŒ (#33)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
飿³é
åã䜿çšãããšãã«äºæž¬å¯èœãªåºåãä¿èšŒããã«ã¯ã飿³é
åã®ããŒã¿æ§é ãæ¬¡ã®ãšããã§ããããšã«æ³šæããŠãã ããã
|
||
|
||
* ããŒã¿ãããŒã§äžŠã¹æ¿ããŸãã
|
||
* æ¿å
¥é åºã¯ä¿æãããŸãã
|
||
* 決å®çãªå埩åŠçé åºã¯ãããŸãã
|
||
* ããå埩åŠçäžã«è¿œå ãããèŠçŽ ããã®åŠçäžã«çæãããããšãä¿èšŒããŸãã
|
||
|
||
<!-- TODO -->
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/33-map-iteration/main.go)
|
||
|
||
### `break` æãã©ã®ããã«æ©èœããããåãã£ãŠããªã (#34)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã©ãã«ãš `break` ãŸã㯠`continue` ã®äœµçšã¯ãç¹å®ã®åœä»€æã匷å¶çã«äžæããŸããããã¯ãã«ãŒãå
ã® `switch` ãŸã㯠`select` æã§åœ¹ç«ã¡ãŸãã
|
||
|
||
éåžžãbreak æã¯ã«ãŒãã®å®è¡ãçµäºããããã«äœ¿çšãããŸããã«ãŒãã switch ãŸã㯠select ãšçµã¿åãããŠäœ¿çšââãããå Žåãç®çã®åœä»€æã§ã¯ãªãã®ã«äžæãããŠããŸãããšãããã¹ãããããšãéçºè
ã«ã¯ãããããŸããããšãã°
|
||
|
||
```go
|
||
for i := 0; i < 5; i++ {
|
||
fmt.Printf("%d ", i)
|
||
|
||
switch i {
|
||
default:
|
||
case 2:
|
||
break
|
||
}
|
||
}
|
||
```
|
||
|
||
break æã¯ `for` ã«ãŒããçµäºãããã®ã§ã¯ãªãã代ããã« `switch` æãçµäºãããŸãããããã£ãŠããã®ã³ãŒã㯠0 ãã 2 ãŸã§ãå埩ãã代ããã«ã0 ãã 4 ãŸã§ãå埩ããŸãïŒ`0 1 2 3 4`ïŒã
|
||
|
||
èŠããŠããã¹ãéèŠãªã«ãŒã«ã®1ã€ã¯ã `break` æã¯æãå
åŽã® `for` ã`switch` ããŸã㯠`select` æã®å®è¡ãçµäºãããšããããšã§ããåã®äŸã§ã¯ã`switch` æãçµäºããŸãã
|
||
|
||
`switch` æã®ä»£ããã«ã«ãŒããäžæããæãæ
£çšçãªæ¹æ³ã¯ã©ãã«ã䜿çšããããšã§ãã
|
||
|
||
```go hl_lines="1 8"
|
||
loop:
|
||
for i := 0; i < 5; i++ {
|
||
fmt.Printf("%d ", i)
|
||
|
||
switch i {
|
||
default:
|
||
case 2:
|
||
break loop
|
||
}
|
||
}
|
||
```
|
||
|
||
ããã§ã¯ã`loop` ã©ãã«ã `for` ã«ãŒãã«é¢é£ä»ããŸãã æ¬¡ã«ã`break` æã« `loop` ã©ãã«ãæå®ããã®ã§ãswitch ã§ã¯ãªã loop ãäžæãããŸãããã£ãŠããã®æ°ããããŒãžã§ã³ã¯äºæ³ã©ãã `0 1 2` ãåºåããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/34-break/main.go)
|
||
|
||
### ã«ãŒãå
ã§ `defer` ã䜿çšãã (#35)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
颿°å
ã®ã«ãŒãããžãã¯ãæœåºãããšãåååŸ©ã®æåŸã« `defer` æãå®è¡ãããŸãã
|
||
|
||
`defer` æã¯ãäžäœãããã¯ã®é¢æ°ãæ»ããŸã§åŒã³åºãã®å®è¡ãé
ãããŸããããã¯äž»ã«å®åã³ãŒããåæžããããã«äœ¿çšãããŸããããšãã°ããªãœãŒã¹ãæçµçã«éããå¿
èŠãããå Žåã¯ã`defer` ã䜿çšããŠã`return` ãå®è¡ããåã«ã¯ããŒãžã£åŒã³åºããç¹°ãè¿ãããšãé¿ããããšãã§ããŸãã
|
||
|
||
`defer` ã§ãããããã¹ã®1ã€ã¯ã_äžäœãããã¯_ ã®é¢æ°ãæ»ã£ããšãã«é¢æ°åŒã³åºããã¹ã±ãžã¥ãŒã«ãããããšãå¿ããããšã§ããããšãã°
|
||
|
||
```go
|
||
func readFiles(ch <-chan string) error {
|
||
for path := range ch {
|
||
file, err := os.Open(path)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
defer file.Close()
|
||
|
||
// ãã¡ã€ã«ã«äœããã®åŠçããã
|
||
}
|
||
return nil
|
||
}
|
||
```
|
||
|
||
`defer` åŒã³åºãã¯ãåã«ãŒãå埩äžã§ã¯ãªãã`readFiles` 颿°ãè¿ããããšãã«å®è¡ãããŸãã `readFiles` ãè¿ããªãå Žåããã¡ã€ã«èšè¿°åã¯æ°žä¹
ã«éãããŸãŸã«ãªãããªãŒã¯ãçºçããŸãã
|
||
|
||
ãã®åé¡ã解決ããããã®äžè¬çãªææ®µã®1ã€ã¯ã `defer` ã®åŸã«ãåå埩äžã«åŒã³åºãããäžäœãããã¯ã®é¢æ°ãäœæããããšã§ãã
|
||
|
||
```go
|
||
func readFiles(ch <-chan string) error {
|
||
for path := range ch {
|
||
if err := readFile(path); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func readFile(path string) error {
|
||
file, err := os.Open(path)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
defer file.Close()
|
||
|
||
// ãã¡ã€ã«ã«äœããã®åŠçããã
|
||
return nil
|
||
}
|
||
```
|
||
|
||
å¥ã®è§£æ±ºçã¯ã`readFile` 颿°ãã¯ããŒãžã£ã«ããããšã§ãããæ¬è³ªçã«ã¯åãã§ããå¥ã®äžäœãããã¯ã®é¢æ°ã远å ããŠãåå埩äžã« `defer` åŒã³åºããå®è¡ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/04-control-structures/35-defer-loop/main.go)
|
||
|
||
## æåå
|
||
|
||
### ã«ãŒã³ãçè§£ããŠããªã (#36)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã«ãŒã³ã Unicode ã³ãŒããã€ã³ãã®æŠå¿µã«å¯Ÿå¿ããè€æ°ã®ãã€ãã§æ§æãããå¯èœæ§ãããããšãçè§£ããããšã¯ã Go éçºè
ãæååãæ£ç¢ºã«æäœããããã«äžå¯æ¬ ã§ãã
|
||
|
||
Goèšèªã§ã¯ã«ãŒã³ãããããå Žæã«äœ¿çšããããããæ¬¡ã®ç¹ãçè§£ããããšãéèŠã§ãã
|
||
|
||
* æåã»ããã¯æåã®éåã§ããããšã³ã³ãŒãã£ã³ã°ã¯æåã»ããããã€ããªã«å€æããæ¹æ³ãèšè¿°ããŸãã
|
||
* Goèšèªã§ã¯ãæååã¯ä»»æã®ãã€ãã®äžå€ã¹ã©ã€ã¹ãåç
§ããŸãã
|
||
â»Goèšèªã®ãœãŒã¹ã³ãŒã㯠UTF-8 ã§ãšã³ã³ãŒããããŠããŸãããããã£ãŠããã¹ã®æååãªãã©ã«ã¯ UTF-8 æååã§ãããã ããæååã«ã¯ä»»æã®ãã€ããå«ãŸããå¯èœæ§ããããããæååãïŒãœãŒã¹ã³ãŒãã§ã¯ãªãïŒä»ã®å ŽæããååŸãããå Žåããã®æååã UTF-8 ãšã³ã³ãŒãã£ã³ã°ã«åºã¥ããŠããä¿èšŒã¯ãããŸããã
|
||
* `rune` 㯠Unicode ã³ãŒããã€ã³ãã®æŠå¿µã«å¯Ÿå¿ããåäžã®å€ã§è¡šãããã¢ã€ãã ãæå³ããŸãã
|
||
* UTF-8 ã䜿çšãããšãUnicode ã³ãŒããã€ã³ãã 1 ïœ 4 ãã€ãã«ãšã³ã³ãŒãã§ããŸãã
|
||
* Goèšèªã§æååã«å¯Ÿã㊠`len()` ã䜿çšãããšãã«ãŒã³æ°ã§ã¯ãªããã€ãæ°ãè¿ãããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/36-rune/main.go)
|
||
|
||
### æååã«å¯Ÿããäžæ£ç¢ºãªå埩åŠç (#37)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`range` æŒç®åã䜿çšããŠæååãå埩åŠçãããšãã«ãŒã³ã®ãã€ãã·ãŒã±ã³ã¹ã®éå§ã€ã³ããã¯ã¹ã«å¯Ÿå¿ããã€ã³ããã¯ã¹ã䜿çšããŠã«ãŒã³ãå埩åŠçãããŸããç¹å®ã®ã«ãŒã³ã€ã³ããã¯ã¹ïŒ 3 çªç®ã®ã«ãŒã³ãªã©ïŒã«ã¢ã¯ã»ã¹ããã«ã¯ãæååã `[]rune` ã«å€æããŸãã
|
||
|
||
æååã®å埩åŠçã¯ãéçºè
ã«ãšã£ãŠäžè¬çãªæäœã§ãããããããæååå
ã®åã«ãŒã³ã«å¯ŸããŠæäœãå®è¡ããããç¹å®ã®éšåæååãæ€çŽ¢ããç¬èªã®é¢æ°ãå®è£
ããå¿
èŠãããã§ããããã©ã¡ãã®å Žåããæååã®ç°ãªãã«ãŒã³ãå埩åŠçããå¿
èŠããããŸããããããå埩ãã©ã®ããã«æ©èœãããã«ã€ããŠã¯å°æããããã§ãã
|
||
|
||
次ã®äŸãèããŠã¿ãŸãããã
|
||
|
||
```go
|
||
s := "hêllo"
|
||
for i := range s {
|
||
fmt.Printf("position %d: %c\n", i, s[i])
|
||
}
|
||
fmt.Printf("len=%d\n", len(s))
|
||
```
|
||
|
||
```
|
||
position 0: h
|
||
position 1: Ã
|
||
position 3: l
|
||
position 4: l
|
||
position 5: o
|
||
len=6
|
||
```
|
||
|
||
æ··ä¹±ãæãå¯èœæ§ã®ãã3ã€ã®ç¹ãåãäžããŸãããã
|
||
|
||
* 2 çªç®ã®ã«ãŒã³ã¯ãåºåã§ã¯ ê ã§ã¯ãªã à ã«ãªããŸãã
|
||
* äœçœ® 1 ããäœçœ® 3 ã«ãžã£ã³ãããŸãããäœçœ® 2 ã«ã¯äœãããã§ããããã
|
||
* len 㯠6 ãè¿ããŸãããs ã«ã¯ 5 ã€ã®ã«ãŒã³ããå«ãŸããŠããŸããã
|
||
|
||
æåŸã®çµæããèŠãŠããŸããããlen ã¯ã«ãŒã³ã®æ°ã§ã¯ãªããæååå
ã®ãã€ãæ°ãè¿ãããšã¯ãã§ã«è¿°ã¹ãŸãããæååãªãã©ã«ã `s` ã«å²ãåœãŠãŠããããã`s` 㯠UTF-8 æååã§ããäžæ¹ãç¹æ®æåãêã㯠1 ãã€ãã§ãšã³ã³ãŒããããŸããã 2 ãã€ãå¿
èŠã§ãããããã£ãŠã`len(s)` ãåŒã³åºããš 6 ãè¿ãããŸãã
|
||
|
||
åã®äŸã§ã¯ãåã«ãŒã³ãå埩åŠçããŠããªãããšãçè§£ããå¿
èŠããããŸãã代ããã«ãã«ãŒã³ã®åéå§ã€ã³ããã¯ã¹ãå埩åŠçããŸãã
|
||
|
||

|
||
|
||
`s[i]` ãåºåããŠã i çªç®ã®ã«ãŒã³ã¯åºåãããŸãããã€ã³ããã¯ã¹ `i` ã®ãã€ãã® UTF-8 衚çŸãåºåããŸãããããã£ãŠã `hêllo` ã®ä»£ããã« `hÃllo` ãåºåããããŸãã
|
||
|
||
ããŸããŸãªã«ãŒã³æåããã¹ãŠåºåãããå Žåã¯ã `range` æŒç®åã® value èŠçŽ ã䜿çšããããšãã§ããŸãã
|
||
|
||
```go
|
||
s := "hêllo"
|
||
for i, r := range s {
|
||
fmt.Printf("position %d: %c\n", i, r)
|
||
}
|
||
```
|
||
|
||
ãŸãã¯ãæååãã«ãŒã³ã®ã¹ã©ã€ã¹ã«å€æãããããå埩åŠçããããšãã§ããŸãã
|
||
|
||
```go hl_lines="2"
|
||
s := "hêllo"
|
||
runes := []rune(s)
|
||
for i, r := range runes {
|
||
fmt.Printf("position %d: %c\n", i, r)
|
||
}
|
||
```
|
||
|
||
ãã®è§£æ±ºçã§ã¯ã以åã®è§£æ±ºçãšæ¯èŒããŠå®è¡æã®ãªãŒããŒããããçºçããããšã«æ³šæããŠãã ãããå®éãæååãã«ãŒã³ã®ã¹ã©ã€ã¹ã«å€æããã«ã¯ã远å ã®ã¹ã©ã€ã¹ãå²ãåœãŠããã€ããã«ãŒã³ã«å€æããå¿
èŠããããŸããæååã®ãã€ãæ°ã n ãšãããšãæéèšç®é㯠O(n) ã«ãªããŸãããããã£ãŠããã¹ãŠã®ã«ãŒã³ãå埩åŠçããå Žåã¯ãæåã®è§£æ±ºçã䜿çšããã¹ãã§ãã
|
||
|
||
ãã ããæåã®æ¹æ³ã䜿çšããŠæååã® i çªç®ã®ã«ãŒã³ã«ã¢ã¯ã»ã¹ãããå Žåã¯ãã«ãŒã³ã€ã³ããã¯ã¹ã«ã¢ã¯ã»ã¹ã§ããŸããã代ããã«ããã€ãã·ãŒã±ã³ã¹å
ã®ã«ãŒã³ã®éå§ã€ã³ããã¯ã¹ãããããŸãã
|
||
|
||
```go
|
||
s := "hêllo"
|
||
r := []rune(s)[4]
|
||
fmt.Printf("%c\n", r) // o
|
||
```
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/37-string-iteration/main.go)
|
||
|
||
### trim颿°ã®èª€çš (#38)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`strings.TrimRight` ã» `strings.TrimLeft` ã¯ãæå®ãããã»ããã«å«ãŸãããã¹ãŠã®æ«å°Ÿã»å
é ã®ã«ãŒã³ãåé€ããŸããã `strings.TrimSuffix` ã» `strings.TrimPrefix` ã¯ãæå®ãããæ¥å°ŸèŸã»æ¥é èŸã®ãªãæååãè¿ããŸãã
|
||
|
||
ããšãã°
|
||
|
||
```go
|
||
fmt.Println(strings.TrimRight("123oxo", "xo"))
|
||
```
|
||
|
||
㯠123 ãåºåããŸã
|
||
|
||

|
||
|
||
éã«ã `strings.TrimLeft` ã¯ãã»ããã«å«ãŸããå
é ã®ã«ãŒã³ããã¹ãŠåé€ããŸãã
|
||
|
||
äžæ¹ã`strings.TrimSuffix` ã» `strings.TrimPrefix` ã¯ãæå®ãããæ«å°Ÿã®æ¥å°ŸèŸã»æ¥é èŸãé€ããæååãè¿ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/38-trim/main.go)
|
||
|
||
### æé©åãäžååãªæååã®é£çµ (#39)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
æååã®ãªã¹ãã®é£çµã¯ãå埩ããšã«æ°ããæååãå²ãåœãŠãããªãããã«ã`strings.Builder` ã䜿çšããŠè¡ãå¿
èŠããããŸãã
|
||
|
||
`+=` æŒç®åãçšããŠã¹ã©ã€ã¹ã®ãã¹ãŠã®æååèŠçŽ ãé£çµãã `concat` 颿°ãèããŠã¿ãŸãããã
|
||
|
||
```go
|
||
func concat(values []string) string {
|
||
s := ""
|
||
for _, value := range values {
|
||
s += value
|
||
}
|
||
return s
|
||
}
|
||
```
|
||
|
||
åå埩äžã«ã `+=` æŒç®å㯠`s` ãš value æååãé£çµããŸããäžèŠãããšããã®é¢æ°ã¯ééã£ãŠããªãããã«èŠãããããããŸããããããããã®å®è£
ã¯ãæååã®æ žãšãªãç¹æ§ã®1ã€ã§ããäžå€æ§ãå¿ããŠããŸãããããã£ãŠãåå埩ã§ã¯ `s` ã¯æŽæ°ãããŸãããã¡ã¢ãªå
ã«æ°ããæååãåå²ãåœãŠããããããã®é¢æ°ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããŸãã
|
||
|
||
幞ããªããšã«ã `strings.Builder` ãçšããããšã§ããã®åé¡ã«å¯ŸåŠãã解決çããããŸãã
|
||
|
||
```go hl_lines="2 4"
|
||
func concat(values []string) string {
|
||
sb := strings.Builder{}
|
||
for _, value := range values {
|
||
_, _ = sb.WriteString(value)
|
||
}
|
||
return sb.String()
|
||
}
|
||
```
|
||
|
||
åå埩äžã«ãvalue ã®å
容ãå
éšãããã¡ã«è¿œå ãã `WriteString` ã¡ãœãããåŒã³åºããŠçµæã®æååãæ§ç¯ããã¡ã¢ãªã®ã³ããŒãæå°éã«æããããšãã§ããŸããã
|
||
|
||
???+ note "è£è¶³"
|
||
|
||
`WriteString` 㯠2 çªç®ã®åºåãšããŠãšã©ãŒãè¿ããŸãããæå³çã«ç¡èŠããŸããããå®éããã®ã¡ãœãã㯠nil ãšã©ãŒä»¥å€ãè¿ãããšã¯ãããŸãããã§ã¯ããã®ã¡ãœãããã·ã°ããã£ã®äžéšãšããŠãšã©ãŒãè¿ãç®çã¯äœã§ããããã`strings.Builder` 㯠`io.StringWriter` ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããŠãããããã«ã¯ `WriteString(s string) (n int, err error)` ãšãã1ã€ã®ã¡ãœãããå«ãŸããŠããŸãããããã£ãŠããã®ã€ã³ã¿ãã§ãŒã¹ã«æºæ ããã«ã¯ã`WriteString` ã¯ãšã©ãŒãè¿ããªããã°ãªããªãã®ã§ãã
|
||
|
||
å
éšçã«ã¯ã`strings.Builder` ã¯ãã€ãã¹ã©ã€ã¹ãä¿æããŸãã `WriteString` ãåŒã³åºããã³ã«ããã®ã¹ã©ã€ã¹ã«è¿œå ããåŒã³åºããè¡ãããŸããããã«ã¯2ã€ã®åœ±é¿ããããŸãããŸãã `append` ã®åŒã³åºããè¡çªç¶æ
ãåŒãèµ·ããå¯èœæ§ãããããããã®æ§é äœã¯åæã«äœ¿çšãããã¹ãã§ã¯ãããŸããã2çªç®ã®åœ±é¿ã¯ã [éå¹çãªã¹ã©ã€ã¹ã®åæå (#21)](#éå¹çãªã¹ã©ã€ã¹ã®åæå-21) ã§èŠããã®ã§ããã¹ã©ã€ã¹ã®å°æ¥ã®é·ãããã§ã«ããã£ãŠããå Žåã¯ããããäºåã«å²ãåœãŠãå¿
èŠããããŸãããã®ããã«ã`strings.Builder` ã¯å¥ã® `n` ãã€ãã®ããã®ã¹ããŒã¹ãä¿èšŒããã¡ãœãã `Grow(n int)` ãæã£ãŠããŸãã
|
||
|
||
```go
|
||
func concat(values []string) string {
|
||
total := 0
|
||
for i := 0; i < len(values); i++ {
|
||
total += len(values[i])
|
||
}
|
||
|
||
sb := strings.Builder{}
|
||
sb.Grow(total) (2)
|
||
for _, value := range values {
|
||
_, _ = sb.WriteString(value)
|
||
}
|
||
return sb.String()
|
||
}
|
||
```
|
||
|
||
ãã³ãããŒã¯ãå®è¡ããŠ3ã€ã®ããŒãžã§ã³ïŒ`+=`ã䜿çšãã V1 ãäºåå²ãåœãŠãªãã§ `strings.Builder{}` ã䜿çšãã V2 ãäºåå²ãåœãŠããã® `strings.Builder{}` ã䜿çšãã V3 ïŒãæ¯èŒããŠã¿ãŸããããå
¥åã¹ã©ã€ã¹ã«ã¯ 1,000 åã®æååãå«ãŸããŠãããåæååã«ã¯ 1,000 ãã€ããå«ãŸããŠããŸãã
|
||
|
||
```
|
||
BenchmarkConcatV1-4 16 72291485 ns/op
|
||
BenchmarkConcatV2-4 1188 878962 ns/op
|
||
BenchmarkConcatV3-4 5922 190340 ns/op
|
||
```
|
||
|
||
ã芧ã®ãšãããææ°ããŒãžã§ã³ãæãå¹ççã§ãV1 ãã 99% ãV2 ãã 78% é«éã§ãã
|
||
|
||
`strings.Builder` ã¯ãæååã®ãªã¹ããé£çµããããã®è§£æ±ºçãšããŠæšå¥šãããŸããéåžžãããã¯ã«ãŒãå
ã§äœ¿çšããå¿
èŠããããŸããããã€ãã®æåå ïŒååãšå§ãªã©ïŒãé£çµããã ãã®å Žåã `strings.Builder` ã®äœ¿çšã¯ã `+=` æŒç®åã `fmt.Sprintf` ãšæ¯ã¹ãŠå¯èªæ§ãäœããªãããã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/39-string-concat/)
|
||
|
||
### ç¡é§ãªæåå倿 (#40)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`bytes` ããã±ãŒãžã¯ `strings` ããã±ãŒãžãšåãæäœãæäŸããŠãããããšãèŠããŠãããšãäœåãªãã€ãã»æåå倿ãé¿ããããšãã§ããŸãã
|
||
|
||
æååãŸã㯠`[]byte` ãæ±ãããšãéžæããå Žåãã»ãšãã©ã®ããã°ã©ããŒã¯å©äŸ¿æ§ã®ããã«æååã奜ãåŸåããããŸããããããã»ãšãã©ã® I/O ã¯å®éã«ã¯ `[]byte` ã§è¡ãããŸããããšãã°ã`io.Reader`ã`io.Writer`ãããã³ `io.ReadAll` ã¯æååã§ã¯ãªã `[]byte` ãåŠçããŸãã
|
||
|
||
æååãš `[]byte` ã®ã©ã¡ããæ±ãã¹ããè¿·ã£ããšãã`[]byte` ãæ±ãæ¹ãå¿
ãããé¢åã ãšããããã§ã¯ãªãããšãæãåºããŠãã ãããstrings ããã±ãŒãžãããšã¯ã¹ããŒãããããã¹ãŠã®é¢æ°ã«ã¯ã`bytes` ããã±ãŒãžã«ä»£æ¿æ©èœããããŸãã `Split`ã`Count`ã`Contains`ã`Index` ãªã©ã§ãããããã£ãŠãI/O ãå®è¡ããŠãããã©ããã«é¢ä¿ãªããæååã®ä»£ããã«ãã€ãã䜿çšããŠã¯ãŒã¯ãããŒå
šäœãå®è£
ã§ãã远å ã®å€æã®ã³ã¹ããåé¿ã§ãããã©ãããæåã«ç¢ºèªããå¿
èŠããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/40-string-conversion/main.go)
|
||
|
||
### éšåæååãšã¡ã¢ãªãªãŒã¯ (#41)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
éšåæååã®ä»£ããã«ã³ããŒã䜿çšãããšãéšåæååæäœã«ãã£ãŠè¿ãããæååãåããã€ãé
åã«ãã£ãŠãµããŒãããããããã¡ã¢ãªãªãŒã¯ãé²ãããšãã§ããŸãã
|
||
|
||
[ã¹ã©ã€ã¹ãšã¡ã¢ãªãªãŒã¯ (#26)](#ã¹ã©ã€ã¹ãšã¡ã¢ãªãªãŒã¯-26) ã§ã¯ãã¹ã©ã€ã¹ãŸãã¯é
åã®ã¹ã©ã€ã¹ãã¡ã¢ãªãªãŒã¯ã®ç¶æ³ãåŒãèµ·ããå¯èœæ§ãããããšã確èªããŸããããã®ååã¯ãæååããã³éšåæååã®æäœã«ãåœãŠã¯ãŸããŸãã
|
||
|
||
Goèšèªã§éšåæååæäœã䜿çšãããšãã¯ã2 ã€ã®ããšã«çæããå¿
èŠããããŸãããŸããæäŸãããééã¯ã«ãŒã³ã®æ°ã§ã¯ãªãããã€ãæ°ã«åºã¥ããŠããŸããæ¬¡ã«ãçµæã®éšåæååãæåã®æååãšåããããã³ã°é
åãå
±æãããããéšåæååæäœã«ããã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸãããããé²ãæ¹æ³ã¯ãæååã®ã³ããŒãæåã§å®è¡ããããGo 1.18 ããå®è£
ãããŠãã `strings.Clone` ã䜿çšããããšã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/05-strings/41-substring-memory-leak/main.go)
|
||
|
||
## 颿°ãšã¡ãœãã
|
||
|
||
### ã©ã®åã®ã¬ã·ãŒããŒã䜿çšããã°ãããããããªã (#42)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
å€ã¬ã·ãŒããŒãšãã€ã³ã¿ã¬ã·ãŒããŒã®ã©ã¡ãã䜿çšãããã¯ãã©ã®åãªã®ããå€åãããå¿
èŠããããã©ãããã³ããŒã§ããªããã£ãŒã«ããå«ãŸããŠãããã©ããããªããžã§ã¯ãã¯ã©ãããã倧ããã®ãããªã©ã®èŠçŽ ã«åºã¥ããŠæ±ºå®ããå¿
èŠããããŸããåãããªãå Žåã¯ããã€ã³ã¿ã¬ã·ãŒãã䜿çšããŠãã ããã
|
||
|
||
å€ã¬ã·ãŒããŒãšãã€ã³ã¿ã¬ã·ãŒããŒã®ã©ã¡ããéžæãããã¯ãå¿
ãããç°¡åã§ã¯ãããŸãããéžæã«åœ¹ç«ã€ããã€ãã®æ¡ä»¶ã«ã€ããŠèª¬æããŸãããã
|
||
|
||
_ãã€ã³ã¿ã¬ã·ãŒããŒã§ãªããã°ãªããªã_ ãšã
|
||
|
||
* ã¡ãœãããã¬ã·ãŒããŒãå€åãããå¿
èŠãããå Žåããã®ã«ãŒã«ã¯ãåä¿¡åŽãã¹ã©ã€ã¹ã§ãããã¡ãœãããèŠçŽ ã远å ããå¿
èŠãããå Žåã«ãæå¹ã§ãã
|
||
|
||
```go
|
||
type slice []int
|
||
|
||
func (s *slice) add(element int) {
|
||
*s = append(*s, element)
|
||
}
|
||
```
|
||
|
||
* ã¡ãœããã¬ã·ãŒããŒã«ã³ããŒã§ããªããã£ãŒã«ããå«ãŸããŠããå Žåãsync ããã±ãŒãžã®åéšåã¯ãã®äžäŸã«ãªããŸãïŒ [sync åã®ã³ã㌠(#74)](#sync-åã®ã³ããŒ-74) ãåç
§ïŒã
|
||
|
||
_ãã€ã³ã¿ã¬ã·ãŒããŒã§ããã¹ã_ ãšã
|
||
|
||
* ã¬ã·ãŒããŒã倧ããªãªããžã§ã¯ãã®å Žåããã€ã³ã¿ã䜿çšãããšãå€§èŠæš¡ãªã³ããŒã®äœæã鲿¢ããããããåŒã³åºããããå¹ççã«ãªããŸããã©ããããã®å€§ãããªã®ã確蚌ããªãå Žåã¯ããã³ãããŒã¯ã解決çã«ãªãå¯èœæ§ããããŸããå€ãã®èŠå ã«äŸåãããããç¹å®ã®ãµã€ãºãæå®ããããšã¯ã»ãšãã©äžå¯èœã§ãã
|
||
|
||
_å€ã¬ã·ãŒããŒã§ãªããã°ãªããªã_ ãšã
|
||
|
||
* ã¬ã·ãŒããŒã®äžå€æ§ã匷å¶ããå¿
èŠãããå Žåã
|
||
* ã¬ã·ãŒããŒã飿³é
åã颿°ããã£ãã«ã®å Žåããã以å€ã®å Žåã¯ã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
|
||
|
||
_å€ã¬ã·ãŒããŒã§ããã¹ã_ ãšã
|
||
|
||
* ã¬ã·ãŒããŒãå€åãããå¿
èŠã®ãªãã¹ã©ã€ã¹ã®å Žåã
|
||
* ã¬ã·ãŒããŒãã`time.Time` ãªã©ã®å°ããªé
åãŸãã¯æ§é äœã§ãå¯å€ãã£ãŒã«ããæããªãå€åã§ããå Žåã
|
||
* ã¬ã·ãŒããŒã `int`ã`float64`ããŸã㯠`string` ãªã©ã®åºæ¬çãªåã®å Žåã
|
||
|
||
ãã¡ãããç¹æ®ãªã±ãŒã¹ã¯åžžã«ååšããããããã¹ãŠãç¶²çŸ
ããããšã¯äžå¯èœã§ããããã®ã»ã¯ã·ã§ã³ã®ç®æšã¯ãã»ãšãã©ã®ã±ãŒã¹ãã«ããŒããããã®ã¬ã€ãã³ã¹ãæäŸããããšã§ããéåžžã¯ãããããªãæ£åœãªçç±ããªãéããå€ã¬ã·ãŒããŒã䜿çšããŠééããããŸãããåãããªãå Žåã¯ããã€ã³ã¿ã¬ã·ãŒãã䜿çšããå¿
èŠããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/42-receiver/)
|
||
|
||
### ååä»ãçµæãã©ã¡ãŒã¿ããŸã£ãã䜿çšããŠããªã (#43)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ååä»ãçµæãã©ã¡ãŒã¿ãŒã®äœ¿çšã¯ãç¹ã«è€æ°ã®çµæãã©ã¡ãŒã¿ãŒãåãåãæã€å Žåã颿°ã»ã¡ãœããã®èªã¿ããããåäžãããå¹ççãªæ¹æ³ã§ããå Žåã«ãã£ãŠã¯ãååä»ãçµæãã©ã¡ãŒã¿ã¯ãŒãå€ã«åæåãããããããã®æ¹æ³ã䟿å©ã§ããããããšããããŸãããã ãæœåšçãªå¯äœçšã«ã¯æ³šæããŠãã ããã
|
||
|
||
颿°ãŸãã¯ã¡ãœããã§ãã©ã¡ãŒã¿ãè¿ããšãããããã®ãã©ã¡ãŒã¿ã«ååãä»ããŠãéåžžã®å€æ°ãšããŠäœ¿çšã§ããŸããçµæãã©ã¡ãŒã¿ãŒã«ååãä»ãããšã颿°ã»ã¡ãœããã®éå§æã«ãã®ãã©ã¡ãŒã¿ãŒã¯ãŒãå€ã«åæåãããŸããååä»ãçµæãã©ã¡ãŒã¿ã䜿çšãããšã ããåºãã® return æïŒåŒæ°ãªãïŒ ãåŒã³åºãããšãã§ããŸãããã®å Žåãçµæãã©ã¡ãŒã¿ã®çŸåšã®å€ãæ»ãå€ãšããŠäœ¿çšãããŸãã
|
||
|
||
以äžã¯ãååä»ãçµæãã©ã¡ãŒã¿ `b` ãçšããäŸã§ãã
|
||
|
||
```go
|
||
func f(a int) (b int) {
|
||
b = a
|
||
return
|
||
}
|
||
```
|
||
|
||
ãã®äŸã§ã¯ãçµæãã©ã¡ãŒã¿ã«åå `b` ãä»ããŠããŸããåŒæ°ãªãã§ return ãåŒã³åºããšã`b` ã®çŸåšã®å€ãè¿ãããŸãã
|
||
|
||
å Žåã«ãã£ãŠã¯ãååä»ãã®çµæãã©ã¡ãŒã¿ãŒã«ãã£ãŠå¯èªæ§ãåäžããããšããããŸããããšãã°ã2 ã€ã®ãã©ã¡ãŒã¿ãŒãåãåã§ããå Žåãªã©ã§ãããã®ä»ã«ããå©äŸ¿æ§ã®ããã«çšããããšãã§ããŸããããã«ãæç¢ºãªå©ç¹ãããå Žåã¯ãæ
éã«ãªããªãããååä»ãçµæãã©ã¡ãŒã¿ã䜿çšããã¹ãã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/43-named-result-parameters/main.go)
|
||
|
||
### ååä»ãçµæãã©ã¡ãŒã¿ã«ããäºæãã¬å¯äœçš (#44)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
[#43](#ååä»ãçµæãã©ã¡ãŒã¿ããŸã£ãã䜿çšããŠããªã-43) ãåç
§ããŠãã ããã
|
||
|
||
ååä»ãçµæãã©ã¡ãŒã¿ãç¶æ³ã«ãã£ãŠã¯åœ¹ç«ã€çç±ã«ã€ããŠèª¬æããŸããã ãã ãããããã¯ãŒãå€ã«åæåããããããååã«æ³šæããªããšã軜埮ãªãã°ãçºçããå¯èœæ§ããããŸããããšãã°ããã®ã³ãŒãã¯ã©ããééã£ãŠããã§ããããã
|
||
|
||
```go
|
||
func (l loc) getCoordinates(ctx context.Context, address string) (
|
||
lat, lng float32, err error) {
|
||
isValid := l.validateAddress(address) (1)
|
||
if !isValid {
|
||
return 0, 0, errors.New("invalid address")
|
||
}
|
||
|
||
if ctx.Err() != nil { (2)
|
||
return 0, 0, err
|
||
}
|
||
|
||
// 座æšãååŸããŠè¿ã
|
||
}
|
||
```
|
||
|
||
äžç¥ããã ãã§ã¯ãšã©ãŒã¯æããã§ã¯ãªããããããŸããã`if ctx.Err() != nil` ã¹ã³ãŒãã§è¿ããããšã©ãŒã¯ `err` ã§ãããããã`err` 倿°ã«ã¯å€ãå²ãåœãŠãŠããŸããã`error` åã®ãŒãå€ã `nil` ã«å²ãåœãŠããããŸãŸã§ãããããã£ãŠããã®ã³ãŒãã¯åžžã« nil ãšã©ãŒãè¿ããŸãã
|
||
|
||
ååä»ãçµæãã©ã¡ãŒã¿ã䜿çšããå Žåãåãã©ã¡ãŒã¿ã¯ãŒãå€ã«åæåãããããšã«æ³šæããŠãã ããããã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«ãããã«ãããèŠã€ããã®ãå¿
ãããç°¡åã§ã¯ãªã軜埮ãªãã°ãçºçããå¯èœæ§ããããŸããããã«ãæœåšçãªå¯äœçšãé¿ããããã«ãååä»ãçµæãã©ã¡ãŒã¿ãŒã䜿çšãããšãã¯æ³šæããŠãã ããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/44-side-effects-named-result-parameters/main.go)
|
||
|
||
### nil ã¬ã·ãŒããŒãè¿ã (#45)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã€ã³ã¿ãã§ãŒã¹ãè¿ããšãã¯ãnil ãã€ã³ã¿ãè¿ãã®ã§ã¯ãªããæç€ºç㪠nil å€ãè¿ãããã«æ³šæããŠãã ãããããããªããã°ãæå³ããªãçµæãçºçããåŒã³åºãå
ã nil ã§ã¯ãªãå€ãåãåãå¯èœæ§ããããŸãã
|
||
|
||
<!-- TODO -->
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/45-nil-receiver/main.go)
|
||
|
||
### 颿°å
¥åã«ãã¡ã€ã«åã䜿çšããŠãã (#46)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãã¡ã€ã«åã®ä»£ããã« `io.Reader` åãåãåãããã«é¢æ°ãèšèšãããšã颿°ã®åå©çšæ§ãåäžãããã¹ãã容æã«ãªããŸãã
|
||
|
||
ãã¡ã€ã«åããã¡ã€ã«ããèªã¿åãããã®é¢æ°å
¥åãšããŠåãå
¥ããããšã¯ãã»ãšãã©ã®å Žåããã³ãŒãã®èãããšã¿ãªããã¹ãã§ãïŒ `os.Open` ãªã©ã®ç¹å®ã®é¢æ°ãé€ãïŒãå®éãè€æ°ã®ãã¡ã€ã«ãäœæããå¿
èŠããããããããªãã®ã§ãåäœãã¹ããããè€éã«ãªããŸãããŸãã颿°ã®åå©çšæ§ãäœäžããŸã ïŒãã ãããã¹ãŠã®é¢æ°ãåå©çšãããããã§ã¯ãããŸããïŒã `io.Reader` ã€ã³ã¿ãã§ãŒã¹ã䜿çšãããšãããŒã¿ãœãŒã¹ãæœè±¡åãããŸããå
¥åããã¡ã€ã«ãæååãHTTP ãªã¯ãšã¹ããgRPC ãªã¯ãšã¹ãã®ãããã§ãããã«é¢ä¿ãªããå®è£
ã¯åå©çšã§ããç°¡åã«ãã¹ãã§ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/46-function-input/)
|
||
|
||
### `defer` åŒæ°ãšã¬ã·ãŒããŒãã©ã®ããã«è©äŸ¡ãããããç¥ããªãïŒåŒæ°ã®è©äŸ¡ããã€ã³ã¿ãŒãããã³å€ã¬ã·ãŒããŒïŒ (#47)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãã€ã³ã¿ã `defer` 颿°ã«æž¡ãããšãšãåŒã³åºããã¯ããŒãžã£å
ã«ã©ããããããšããåŒæ°ãšã¬ã·ãŒããŒã®å³æè©äŸ¡ãå
æããããã«å®çŸå¯èœãªè§£æ±ºçã§ãã
|
||
|
||
`defer` 颿°ã§ã¯ãåŒæ°ã¯ãäžäœãããã¯ã®é¢æ°ãæ»ã£ãŠããã§ã¯ãªããããã«è©äŸ¡ãããŸããããšãã°ããã®ã³ãŒãã§ã¯ãåžžã«åãã¹ããŒã¿ã¹ââç©ºã®æååââã§ `notify` ãš `incrementCounter` ãåŒã³åºããŸãã
|
||
|
||
```go
|
||
const (
|
||
StatusSuccess = "success"
|
||
StatusErrorFoo = "error_foo"
|
||
StatusErrorBar = "error_bar"
|
||
)
|
||
|
||
func f() error {
|
||
var status string
|
||
defer notify(status)
|
||
defer incrementCounter(status)
|
||
|
||
if err := foo(); err != nil {
|
||
status = StatusErrorFoo
|
||
return err
|
||
}
|
||
|
||
if err := bar(); err != nil {
|
||
status = StatusErrorBar
|
||
return err
|
||
}
|
||
|
||
status = StatusSuccess <5>
|
||
return nil
|
||
}
|
||
```
|
||
|
||
ãããã«ã`notify(status)` ãš `incrementCounter(status)` ã `defer` 颿°ãšããŠåŒã³åºããŠããŸãããããã£ãŠãGoèšèªã¯ãdefer ã䜿çšããæ®µéã§ `f` ãã¹ããŒã¿ã¹ã®çŸåšã®å€ãè¿ããšããããã®åŒã³åºãã®å®è¡ãé
ãããç©ºã®æååãæž¡ããŸãã
|
||
|
||
`defer` ã䜿ãç¶ãããå Žåã®äž»ãªæ¹æ³ã¯ 2 ã€ãããŸãã
|
||
|
||
æåã®è§£æ±ºçã¯æååãã€ã³ã¿ãæž¡ãããšã§ãã
|
||
|
||
```go hl_lines="3 4"
|
||
func f() error {
|
||
var status string
|
||
defer notify(&status)
|
||
defer incrementCounter(&status)
|
||
|
||
// 颿°ã®ãã以å€ã®éšåã¯å€æŽãªã
|
||
}
|
||
```
|
||
|
||
`defer` ã䜿çšãããšãåŒæ°ïŒããã§ã¯ã¹ããŒã¿ã¹ã®ã¢ãã¬ã¹ïŒãããã«è©äŸ¡ãããŸããã¹ããŒã¿ã¹èªäœã¯é¢æ°å
šäœã§å€æŽãããŸããããã®ã¢ãã¬ã¹ã¯å²ãåœãŠã«é¢ä¿ãªãäžå®ã®ãŸãŸã§ãããã£ãŠã`notify` ãŸã㯠`incrementCounter` ãæååãã€ã³ã¿ã«ãã£ãŠåç
§ãããå€ã䜿çšããå ŽåãæåŸ
ã©ããã«åäœããŸãããã ãããã®è§£æ±ºçã§ã¯ 2 ã€ã®é¢æ°ã®ã·ã°ããã£ã倿Žããå¿
èŠãããããããåžžã«å¯èœã§ãããšã¯éããŸããã
|
||
|
||
å¥ã®è§£æ±ºçããããŸãââã¯ããŒãžã£ïŒæ¬äœã®å€éšãã倿°ãåç
§ããå¿å颿°å€ïŒã `defer` æãšããŠåŒã³åºãããšã§ãã
|
||
|
||
```go hl_lines="3 4 5 6"
|
||
func f() error {
|
||
var status string
|
||
defer func() {
|
||
notify(status)
|
||
incrementCounter(status)
|
||
}()
|
||
|
||
// 颿°ã®ãã以å€ã®éšåã¯å€æŽãªã
|
||
}
|
||
```
|
||
|
||
ããã§ã¯ã`notify` ãš `incrementCounter` ã®äž¡æ¹ã®åŒã³åºããã¯ããŒãžã£å
ã«ã©ããããŸãããã®ã¯ããŒãžã£ã¯ãæ¬äœã®å€éšããã¹ããŒã¿ã¹å€æ°ãåç
§ããŸããããã«ã`status` ã¯ã`defer` ãåŒã³åºãããšãã§ã¯ãªããã¯ããŒãžã£ãå®è¡ããããšãã«è©äŸ¡ãããŸãããã®è§£æ±ºçã¯æ£ããæ©èœããäžã«ãã·ã°ããã£ã倿Žããããã« `notify` ã `incrementCounter` ãå¿
èŠãšããŸããã
|
||
|
||
ãã®åäœã¯ã¡ãœããã¬ã·ãŒããŒã«ãé©çšãããããšã«ã泚æããŠãã ãããã¬ã·ãŒããŒã¯ããã«è©äŸ¡ãããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/06-functions-methods/47-defer-evaluation/)
|
||
|
||
## ãšã©ãŒåŠç
|
||
|
||
### ããã㯠(#48)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`panic` ã®äœ¿çšã¯ãGoèšèªã§ãšã©ãŒã«å¯ŸåŠããããã®ææ®µã§ãããã ããããã¯å埩äžèœãªç¶æ³ã§ã®ã¿äœ¿çšããããã«ããŠãã ãããããšãã°ããã¥ãŒãã³ãšã©ãŒãéç¥ããå Žåããå¿
é ã®äŸåé¢ä¿ã®èªã¿èŸŒã¿ã«å€±æããå Žåãªã©ã§ãã
|
||
|
||
Goèšèªã§ã¯ãpanic ã¯éåžžã®æµãã忢ããçµã¿èŸŒã¿é¢æ°ã§ãã
|
||
|
||
```go
|
||
func main() {
|
||
fmt.Println("a")
|
||
panic("foo")
|
||
fmt.Println("b")
|
||
}
|
||
```
|
||
|
||
ãã®ã³ãŒã㯠a ãåºåããb ãåºåããåã«åæ¢ããŸãã
|
||
|
||
```
|
||
a
|
||
panic: foo
|
||
|
||
goroutine 1 [running]:
|
||
main.main()
|
||
main.go:7 +0xb3
|
||
```
|
||
|
||
panic ã®äœ¿çšã¯æ
éã«ãã¹ãã§ãã代衚çãªã±ãŒã¹ã 2 ã€ããã1 ã€ã¯ãã¥ãŒãã³ãšã©ãŒãéç¥ããå ŽåïŒäŸ: [`sql.Register`](https://cs.opensource.google/go/go/+/refs/tags/go1.20.7:src/database/sql/sql.go;l=44)ãã©ã€ããŒã `nil` ãŸãã¯æ¢ã«ç»é²ãããŠããå Žåã« panic ãèµ·ãããŸãïŒããã 1 ã€ã¯ã¢ããªã±ãŒã·ã§ã³ãå¿
é ã®äŸåé¢ä¿ã®äœæã«å€±æããå Žåã§ããçµæãšããŠãäŸå€çã«ã¢ããªã±ãŒã·ã§ã³ã忢ããŸãããã以å€ã®ã»ãšãã©ã®å Žåã«ãããŠã¯ããšã©ãŒåŠçã¯ãæåŸã®æ»ãåŒæ°ãšããŠé©åãªãšã©ãŒåãè¿ã颿°ãéããŠè¡ãã¹ãã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/48-panic/main.go)
|
||
|
||
### ãšã©ãŒãã©ãããã¹ããšããç¥ããªã (#49)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãšã©ãŒãã©ãããããšããšã©ãŒãããŒã¯ãããã远å ã®ã³ã³ããã¹ããæäŸãããã§ããŸãããã ãããšã©ãŒã©ããã³ã°ã«ãããåŒã³åºãå
ããœãŒã¹ãšã©ãŒãå©çšã§ããããã«ãªããããæœåšçãªçµåãçºçããŸãããããé¿ãããå Žåã¯ããšã©ãŒã©ããã³ã°ã䜿çšããªãã§ãã ããã
|
||
|
||
Go 1.13 以éã%w ãã£ã¬ã¯ãã£ãã䜿çšããã°ç°¡åã«ãšã©ãŒãã©ããã§ããããã«ãªããŸããããšã©ãŒã©ããã³ã°ãšã¯ããœãŒã¹ãšã©ãŒã䜿çšã§ããããã«ããã©ãããŒã³ã³ããå
ã§ãšã©ãŒãã©ãããŸãã¯ããã¯ããããšã§ããäžè¬ã«ããšã©ãŒã©ããã³ã°ã®äž»ãªäœ¿çšäŸã¯æ¬¡ã® 2 ã€ã§ãã
|
||
|
||
* ãšã©ãŒã«ããã«ã³ã³ããã¹ããå ãã
|
||
* ãšã©ãŒãç¹å®ã®ãšã©ãŒãšããŠããŒã¯ãã
|
||
|
||
ãšã©ãŒãåŠçãããšãããšã©ãŒãã©ãããããã©ãããæ±ºå®ã§ããŸããã©ããã³ã°ãšã¯ããšã©ãŒã«ããã«ã³ã³ããã¹ãã远å ãããããšã©ãŒãç¹å®ã®ã¿ã€ããšããŠããŒã¯ãããããããšã§ãããšã©ãŒãããŒã¯ããå¿
èŠãããå Žåã¯ãç¬èªã®ãšã©ãŒåãäœæããå¿
èŠããããŸããã§ãããæ°ãã«ã³ã³ããã¹ããå ãããã ãã®å Žåã¯ãæ°ãããšã©ãŒåãäœæããå¿
èŠããªãããã%w ãã£ã¬ã¯ãã£ããæå®ã㊠fmt.Errorf ã䜿çšããŸãããããã ãããšã©ãŒã©ããã³ã°ã«ãããåŒã³åºãå
ããœãŒã¹ãšã©ãŒãå©çšã§ããããã«ãªããããæœåšçãªçµåãçããŸãããããé¿ãããå Žåã¯ããšã©ãŒã®ã©ããã³ã°ã§ã¯ãªãããšã©ãŒã®å€æã䜿çšããå¿
èŠããããŸããããšãã°ã%v ãã£ã¬ã¯ãã£ããæå®ãã fmt.Errorf ã䜿çšããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/49-error-wrapping/main.go)
|
||
|
||
### ãšã©ãŒåã®äžæ£ç¢ºãªæ¯èŒ (#50)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Go 1.13 ã®ãšã©ãŒã©ããã³ã°ã `%w` ãã£ã¬ã¯ãã£ããš `fmt.Errorf` ã§äœ¿çšããå Žåãåã«å¯Ÿãããšã©ãŒã®æ¯èŒã¯ `errors.As` ãéããŠè¡ãå¿
èŠããããŸããããã§ãªããã°ãè¿ããããšã©ãŒãã©ãããããŠããå Žåãè©äŸ¡ã«å€±æããŸãã
|
||
|
||
<!-- TODO -->
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/50-compare-error-type/main.go)
|
||
|
||
### ãšã©ãŒå€ã®äžæ£ç¢ºãªæ¯èŒ (#51)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Go 1.13 ã®ãšã©ãŒã©ããã³ã°ã `%w` ãã£ã¬ã¯ãã£ããš `fmt.Errorf` ã§äœ¿çšããå Žåããšã©ãŒãšå€ã®æ¯èŒã¯ `errors.As` ãéããŠè¡ãå¿
èŠããããŸããããã§ãªããã°ãè¿ããããšã©ãŒãã©ãããããŠããå Žåãè©äŸ¡ã«å€±æããŸãã
|
||
|
||
ã»ã³ããã«ãšã©ãŒã¯ã°ããŒãã«å€æ°ãšããŠå®çŸ©ããããšã©ãŒã®ããšã§ãã
|
||
|
||
```go
|
||
import "errors"
|
||
|
||
var ErrFoo = errors.New("foo")
|
||
```
|
||
äžè¬ã«ãæ
£äŸãšã㊠`Err` ã§å§ãããã®åŸã«ãšã©ãŒåãç¶ããŸããããã§ã¯ `ErrFoo` ã§ããã»ã³ããã«ãšã©ãŒã¯ã_äºæããã_ ãšã©ãŒãã€ãŸãã¯ã©ã€ã¢ã³ãã確èªããããšãæåŸ
ãããšã©ãŒãäŒããŸããäžè¬çãªã¬ã€ãã©ã€ã³ãšããŠ
|
||
|
||
* äºæããããšã©ãŒã¯ãšã©ãŒå€ïŒã»ã³ããã«ãšã©ãŒïŒãšããŠèšèšããå¿
èŠããããŸãïŒ `var ErrFoo =errors.New("foo")`ã
|
||
* äºæããªããšã©ãŒã¯ãšã©ãŒåãšããŠèšèšããå¿
èŠããããŸãïŒ `BarError` 㯠`error` ã€ã³ã¿ãã§ãŒã¹ãå®è£
ããäžã§ `type BarError struct { ... }`ã
|
||
|
||
ã¢ããªã±ãŒã·ã§ã³ã§ `%w` ãã£ã¬ã¯ãã£ããš `fmt.Errorf` ã䜿çšããŠãšã©ãŒã©ããã䜿çšããå Žåãç¹å®ã®å€ã«å¯Ÿãããšã©ãŒã®ãã§ãã¯ã¯ `==` ã®ä»£ããã« `errors.Is` ã䜿çšããŠè¡ããŸããããããã«ãã£ãŠãã»ã³ããã«ãšã©ãŒãã©ãããããŠããå Žåã§ãã`errors.Is` ã¯ãããååž°çã«ã¢ã³ã©ãããããã§ãŒã³å
ã®åãšã©ãŒãæäŸãããå€ãšæ¯èŒã§ããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/51-comparing-error-value/main.go)
|
||
|
||
### ãšã©ãŒã® 2 ååŠç (#52)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ã»ãšãã©ã®å Žåããšã©ãŒã¯ 1 åã§åŠçãããã¹ãã§ãããšã©ãŒããã°ã«èšé²ããããšã¯ããšã©ãŒãåŠçããããšã§ããããªãã¡ããã°ã«èšé²ããããšã©ãŒãè¿ãããéžæããå¿
èŠããããŸããå€ãã®å Žåããšã©ãŒã©ããã³ã°ã¯ããšã©ãŒã«è¿œå ã®ã³ã³ããã¹ããæäŸãããœãŒã¹ãšã©ãŒãè¿ãããšãã§ããããã解決çã«ãªããŸãã
|
||
|
||
ãšã©ãŒãè€æ°ååŠçããããšã¯ãç¹ã«Goèšèªã«éãããéçºè
ãé »ç¹ã«ãã£ãŠããŸããã¹ã§ããããã«ãããåããšã©ãŒãè€æ°åãã°ã«èšé²ããããããã°ãå°é£ã«ãªãç¶æ³ãçºçããå¯èœæ§ããããŸãã
|
||
|
||
ãšã©ãŒåŠç㯠1 åºŠã§æžãŸãã¹ãã ãšããããšãèŠããŠãããŸãããããšã©ãŒããã°ã«èšé²ããããšã¯ããšã©ãŒãåŠçããããšã§ããã€ãŸããè¡ãã¹ãã¯ããã°ã«èšé²ãããããšã©ãŒãè¿ããã®ã©ã¡ããã ãšããããšã§ããããã«ãããã³ãŒããç°¡çŽ åããããšã©ãŒã®ç¶æ³ã«ã€ããŠããé©åãªæŽå¯ãåŸãããŸãããšã©ãŒã©ããã³ã°ã¯ããœãŒã¹ãšã©ãŒãäŒãããšã©ãŒã«ã³ã³ããã¹ãã远å ã§ãããããæã䜿ãåæã®è¯ãææ®µã«ãªããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/52-handling-error-twice/main.go)
|
||
|
||
### ãšã©ãŒåŠçãããªã (#53)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
颿°åŒã³åºãäžã§ãã£ãŠãã`defer` 颿°å
ã§ãã£ãŠãããšã©ãŒãç¡èŠãããšãã¯ããã©ã³ã¯èå¥åã䜿çšããŠæç¢ºã«è¡ãã¹ãã§ããããããªããšãå°æ¥ã®èªã¿æããããæå³çã ã£ãã®ãããããšããã¹ã ã£ãã®ãå°æããå¯èœæ§ããããŸãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/53-not-handling-error/main.go)
|
||
|
||
### `defer` ãšã©ãŒãåŠçããªã (#54)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
å€ãã®å Žåã`defer` 颿°ã«ãã£ãŠè¿ããããšã©ãŒãç¡èŠãã¹ãã§ã¯ãããŸãããç¶æ³ã«å¿ããŠãçŽæ¥åŠçããããåŒã³åºãå
ã«äŒããŸãããããããç¡èŠããå Žåã¯ããã©ã³ã¯èå¥åã䜿çšããŠãã ããã
|
||
|
||
次ã®ã³ãŒããèããŠã¿ãŸãããã
|
||
|
||
```go
|
||
func f() {
|
||
// ...
|
||
notify() // ãšã©ãŒåŠçã¯çç¥ãããŠããŸã
|
||
}
|
||
|
||
func notify() error {
|
||
// ...
|
||
}
|
||
```
|
||
|
||
ä¿å®æ§ã®èгç¹ããããã®ã³ãŒãã¯ããã€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãããã人ããããèªãããšãèããŠã¿ãŸããèªã¿æã¯ãnotify ããšã©ãŒãè¿ãã«ããããããããã®ãšã©ãŒãèŠªé¢æ°ã«ãã£ãŠåŠçãããªãããšã«æ°ã¥ããŸãããšã©ãŒåŠçãæå³çã§ãããã©ãããæãããŠæšæž¬ã§ããã§ããããã以åã®éçºè
ããããåŠçããã®ãå¿ããã®ãããããšãæå³çã«åŠçããã®ããç¥ãããšãã§ããã§ããããã
|
||
|
||
ãããã®çç±ã«ããããšã©ãŒãç¡èŠãããå Žåããã©ã³ã¯èå¥åïŒ `_` ïŒã䜿ãã»ããããŸããã
|
||
|
||
```go
|
||
_ = notify
|
||
```
|
||
|
||
ã³ã³ãã€ã«ãšå®è¡æéã®ç¹ã§ã¯ããã®æ¹æ³ã¯æåã®ã³ãŒãéšåãšæ¯ã¹ãŠäœãå€ãããŸããããããããã®æ°ããããŒãžã§ã³ã§ã¯ãç§ãã¡ããšã©ãŒã«é¢å¿ããªãããšãæããã«ããŠããŸãããŸãããšã©ãŒãç¡èŠãããçç±ã瀺ãã³ã¡ã³ãã远å ããããšãã§ããŸãã
|
||
|
||
```go
|
||
// æå€§ã§ã 1 åã®äŒé
|
||
// ããããããšã©ãŒãçºçããå Žåã«ãããã®äžéšã倱ãããããšã¯èš±å®¹ãããŸãã
|
||
_ = notify()
|
||
```
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/07-error-management/54-defer-errors/main.go)
|
||
|
||
## 䞊è¡åŠçïŒåºç€
|
||
|
||
### 䞊è¡åŠçãšäžŠååŠçã®æ··å (#55)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
䞊è¡åŠçãšäžŠååŠçã®åºæ¬çãªéããçè§£ããããšã¯ã Go éçºè
ã«ãšã£ãŠå¿
é ã§ãã䞊è¡åŠçã¯æ§é ã«é¢ãããã®ã§ããã䞊ååŠçã¯å®è¡ã«é¢ãããã®ã§ãã
|
||
|
||
䞊è¡åŠçãšäžŠååŠçã¯åãã§ã¯ãããŸããã
|
||
|
||
* 䞊è¡åŠçã¯æ§é ã«é¢ãããã®ã§ããå¥ã
ã®äžŠè¡ãŽã«ãŒãã³ãåãçµãããšãã§ããããŸããŸãªæ®µéãå°å
¥ããããšã§ã鿬¡åŠçã䞊è¡åŠçã«å€æŽã§ããŸãã
|
||
* 䞊ååŠçã¯å®è¡ã«é¢ãããã®ã§ãã䞊åãŽã«ãŒãã³ãããã«è¿œå ããããšã§ã段éã¬ãã«ã§äžŠååŠçã䜿çšã§ããŸãã
|
||
|
||
ãŸãšãããšã䞊è¡åŠçã¯ã䞊ååã§ããéšåããã€åé¡ã解決ããããã®æ§é ãæäŸããŸããããªãã¡ã_䞊è¡åŠçã«ãã䞊ååŠçãå¯èœã«ãªããŸã_ ã
|
||
|
||
<!-- TODO Include Rob Pike's talk link-->
|
||
|
||
### 䞊è¡åŠçã®ã»ããåžžã«æ©ããšèããŠãã (#56)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
çç·Žããéçºè
ã«ãªãã«ã¯ã䞊è¡åŠçãå¿
ãããé«éã§ãããšã¯éããªãããšãèªèããå¿
èŠããããŸããæå°éã®ã¯ãŒã¯ããŒãã®äžŠååŠçã䌎ã解決çã¯ãå¿
ããã鿬¡åŠçããé«éã§ãããšã¯éããŸããã鿬¡åŠçãšäžŠè¡åŠçã®ãã³ãããŒã¯ã¯ãä»®å®ãæ€èšŒããæ¹æ³ã§ããã¹ãã§ãã
|
||
|
||
ã»ã¯ã·ã§ã³å
šæã¯[ãã¡ã](56-concurrency-faster.md).
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/08-concurrency-foundations/56-faster/)
|
||
|
||
### ãã£ãã«ãŸãã¯ãã¥ãŒããã¯ã¹ããã€äœ¿çšããã¹ããã«ã€ããŠæžæã£ãŠãã (#57)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãŽã«ãŒãã³ã®çžäºäœçšãèªèããŠããããšã¯ããã£ãã«ãšãã¥ãŒããã¯ã¹ã®ã©ã¡ããéžæããããæ±ºå®ãããšãã«ã圹ç«ã¡ãŸããäžè¬ã«ã䞊åãŽã«ãŒãã³ã«ã¯åæãå¿
èŠã§ããããããã£ãŠãã¥ãŒããã¯ã¹ãå¿
èŠã§ããå察ã«ã䞊è¡ãŽã«ãŒãã³ã¯éåžžã調æŽãšãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãã€ãŸããã£ãã«ãå¿
èŠãšããŸãã
|
||
|
||
䞊è¡åŠçã®åé¡ãèæ
®ãããšããã£ãã«ãŸãã¯ãã¥ãŒããã¯ã¹ã䜿çšãã解決çãå®è£
ã§ãããã©ãããå¿
ãããæç¢ºã§ã¯ãªãå¯èœæ§ããããŸããGoèšèªã¯éä¿¡ã«ããã¡ã¢ãªã®å
±æãä¿é²ãããããèµ·ããããééãã®ãã¡ã®äžã€ã¯ããŠãŒã¹ã±ãŒã¹ã«ãããããããã£ãã«ã®äœ¿çšãåžžã«åŒ·å¶ããããšã§ããããããªããã2 ã€ã®æ¹æ³ã¯è£å®çãªãã®ã§ãããšèŠãªãã¹ãã§ãã
|
||
|
||
ãã£ãã«ãŸãã¯ãã¥ãŒããã¯ã¹ã¯ã©ã®ãããªå Žåã«äœ¿çšããå¿
èŠãããã®ã§ãããããæ¬¡ã®å³ã®äŸãããã¯ããŒã³ãšããŠäœ¿çšããŸãããã®äŸã«ã¯ãç¹å®ã®é¢ä¿ãæã€ 3 ã€ã®ç°ãªããŽã«ãŒãã³ããããŸãã
|
||
|
||
* G1 ãš G2 ã¯äžŠåãŽã«ãŒãã³ã§ãããã£ãã«ããã¡ãã»ãŒãžãåä¿¡ãç¶ããåã颿°ãå®è¡ãã 2 ã€ã®ãŽã«ãŒãã³ããããã¯åã HTTP ãã³ãã©ãŒãåæã«å®è¡ãã 2 ã€ã®ãŽã«ãŒãã³ãããããŸããã
|
||
* G1 ãš G3 ã¯äžŠè¡ãŽã«ãŒãã³ã§ãããG2 ãš G3 ãåæ§ã§ãããã¹ãŠã®ãŽã«ãŒãã³ã¯å
šäœã®äžŠè¡æ§é ã®äžéšã§ãããG1 ãš G2 ãæåã®ã¹ããããå®è¡ããG3 ãæ¬¡ã®ã¹ããããå®è¡ããŸãã
|
||
|
||
<!-- TODO Include figure-->
|
||
|
||
ååãšããŠã䞊åãŽã«ãŒãã³ã¯ãã¹ã©ã€ã¹ãªã©ã®å
±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããã倿Žãããããå¿
èŠãããå Žåãªã©ã«ã_åæ_ããå¿
èŠããããŸããåæã¯ãã¥ãŒããã¯ã¹ã§ã¯åŒ·å¶ãããŸãããã©ã®ãã£ãã«åã§ã匷å¶ãããŸããïŒãããã¡ãããã£ãã«ãé€ãïŒããããã£ãŠãäžè¬ã«ã䞊åãŽã«ãŒãã³éã®åæã¯ãã¥ãŒããã¯ã¹ãä»ããŠéæãããå¿
èŠããããŸãã
|
||
|
||
äžæ¹ãäžè¬ã«ã䞊è¡ãŽã«ãŒãã³ã¯ _調æŽããã³ãªãŒã±ã¹ãã¬ãŒã·ã§ã³_ ãããå¿
èŠããããŸããããšãã°ãG3 ã G1 ãš G2 ã®äž¡æ¹ããã®çµæãéçŽããå¿
èŠãããå ŽåãG1 ãš G2 ã¯æ°ããäžéçµæãå©çšå¯èœã§ããããšã G3 ã«éç¥ããå¿
èŠããããŸãããã®èª¿æŽã¯ã³ãã¥ãã±ãŒã·ã§ã³ã®ç¯å²ãã€ãŸããã£ãã«ã«è©²åœããŸãã
|
||
|
||
䞊è¡ãŽã«ãŒãã³ã«é¢ããŠã¯ããªãœãŒã¹ã®æææš©ãããã¹ãããïŒG1 ããã³ G2ïŒããå¥ã®ã¹ãããïŒG3ïŒã«ç§»ç®¡ãããå ŽåããããŸããããšãã°ãG1 ãš G2 ã«ãã£ãŠå
±æãªãœãŒã¹ãè±ãã«ãªã£ãŠããå Žåãããæç¹ã§ãã®ãžã§ãã¯å®äºãããšèŠãªãããŸããããã§ã¯ããã£ãã«ã䜿çšããŠãç¹å®ã®ãªãœãŒã¹ã®æºåãã§ããŠããããšãéç¥ããæææš©ã®ç§»è»¢ãåŠçããå¿
èŠããããŸãã
|
||
|
||
ãã¥ãŒããã¯ã¹ãšãã£ãã«ã«ã¯ç°ãªãã»ãã³ãã£ã¯ã¹ããããŸããç¶æ
ãå
±æããããšãããŸãã¯å
±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããããšãã¯ããã¥ãŒããã¯ã¹ã«ãã£ãŠãã®ãªãœãŒã¹ãžã®æä»çã¢ã¯ã»ã¹ãä¿èšŒãããŸããå察ã«ããã£ãã«ã¯ããŒã¿ã®æç¡ïŒ`chan struct{}` ã®æç¡ïŒã«é¢ä¿ãªãã·ã°ããªã³ã°ãè¡ãä»çµã¿ã§ãã調æŽãæææš©ã®ç§»è»¢ã¯ãã£ãã«ãéããŠè¡ãå¿
èŠããããŸãããŽã«ãŒãã³ã䞊åã䞊è¡ããç¥ãããšãéèŠã§ããäžè¬ã«ã䞊åãŽã«ãŒãã³ã«ã¯ãã¥ãŒããã¯ã¹ãå¿
èŠã§ã䞊è¡ãŽã«ãŒãã³ã«ã¯ãã£ãã«ãå¿
èŠã§ãã
|
||
|
||
### ç«¶ååé¡ãçè§£ããŠããªãïŒããŒã¿ç«¶åãšç«¶åç¶æ
ããããŠGoèšèªã®ã¡ã¢ãªã¢ãã«ïŒ (#58)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
䞊è¡åŠçã«çéãããšããããšã¯ãããŒã¿ç«¶åãšç«¶åç¶æ
ãç°ãªãæŠå¿µã§ããããšãçè§£ããããšãæå³ããŸããããŒã¿ç«¶åã¯ãè€æ°ã®ãŽã«ãŒãã³ãåãã¡ã¢ãªäœçœ®ã«åæã«ã¢ã¯ã»ã¹ãããã®ãã¡ã®å°ãªããšã 1 ã€ãæžã蟌ã¿ãè¡ã£ãŠããå Žåã«çºçããŸããäžæ¹ãããŒã¿ç«¶åããªãããšãå¿
ãããæ±ºå®çå®è¡ãæå³ããããã§ã¯ãããŸãããåäœãå¶åŸ¡ã§ããªãã€ãã³ãã®é åºãã¿ã€ãã³ã°ã«äŸåããŠããå Žåãããã¯ç«¶åç¶æ
ã§ãã
|
||
|
||
ç«¶ååé¡ã¯ãããã°ã©ããŒãçŽé¢ããå¯èœæ§ã®ãããã°ã®äžã§æãå°é£ãã€æãæœäŒæ§ã®é«ããã°ã® 1 ã€ãšãªããŸããGo éçºè
ãšããŠãç§ãã¡ã¯ããŒã¿ç«¶åãšç«¶åç¶æ
ãããããåãŒããã圱é¿ãããã³ããããåé¿ããæ¹æ³ãªã©ã®éèŠãªåŽé¢ãçè§£ããå¿
èŠããããŸãã
|
||
|
||
#### ããŒã¿ç«¶å
|
||
|
||
ããŒã¿ç«¶åã¯ã2 ã€ä»¥äžã®ãŽã«ãŒãã³ãåãã¡ã¢ãªäœçœ®ã«åæã«ã¢ã¯ã»ã¹ããå°ãªããšã 1 ã€ãæžã蟌ã¿ãè¡ã£ãŠããå Žåã«çºçããŸãããã®å Žåãå±éºãªçµæãçããå¯èœæ§ããããŸããããã«æªãããšã«ãç¶æ³ã«ãã£ãŠã¯ãã¡ã¢ãªäœçœ®ã«ç¡æå³ãªãããã®çµã¿åãããå«ãå€ãä¿æãããŠããŸãå¯èœæ§ããããŸãã
|
||
|
||
ããŸããŸãªææ³ãé§äœ¿ããŠãããŒã¿ç«¶åã®çºçãé²ãããšãã§ããŸããããšãã°
|
||
|
||
* `sync/atomic` ããã±ãŒãžã䜿çšãã
|
||
* 2 ã€ã®ãŽã«ãŒãã³ãåæããéã«ãã¥ãŒããã¯ã¹ã®ãããªç¹å®ã®ç®çã®ããã®ããŒã¿æ§é ãå©çšãã
|
||
* ãã£ãã«ã䜿çšã㊠2 ã€ã®ãŽã«ãŒãã³ãéä¿¡ãã倿°ãäžåºŠã« 1 ã€ã®ãŽã«ãŒãã³ã ãã«ãã£ãп޿°ãããããã«ãã
|
||
|
||
#### ç«¶åç¶æ
|
||
|
||
å®è¡ãããæäœã«å¿ããŠãããŒã¿ç«¶åã®ãªãã¢ããªã±ãŒã·ã§ã³ãå¿
ãããæ±ºå®çãªçµæãæå³ããã§ããããããããšã¯ãããŸããã
|
||
|
||
ç«¶åç¶æ
ã¯ãåäœãå¶åŸ¡ã§ããªãã€ãã³ãã®ã·ãŒã±ã³ã¹ãŸãã¯ã¿ã€ãã³ã°ã«äŸåããå Žåã«çºçããŸããããã§ã¯ãã€ãã³ãã®ã¿ã€ãã³ã°ããŽã«ãŒãã³ã®å®è¡é åºã§ãã
|
||
|
||
ãŸãšãããšã䞊è¡åŠçã®ã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããå ŽåãããŒã¿ç«¶åã¯ç«¶åç¶æ
ãšã¯ç°ãªãããšãçè§£ããããšãäžå¯æ¬ ã§ããããŒã¿ç«¶åã¯ãè€æ°ã®ãŽã«ãŒãã³ãåãã¡ã¢ãªäœçœ®ã«åæã«ã¢ã¯ã»ã¹ãããã®ãã¡ã®å°ãªããšã 1 ã€ãæžã蟌ã¿ãè¡ã£ãŠããå Žåã«çºçããŸããããŒã¿ç«¶åãšã¯ãäºæããªãåäœãæå³ããŸãããã ããããŒã¿ç«¶åã®ãªãã¢ããªã±ãŒã·ã§ã³ãå¿
ãããæ±ºå®çãªçµæãæå³ããããã§ã¯ãããŸãããããŒã¿ç«¶åããªããŠããã¢ããªã±ãŒã·ã§ã³ã¯å¶åŸ¡ãããŠããªãã€ãã³ãïŒãŽã«ãŒãã³ã®å®è¡ããã£ãã«ãžã®ã¡ãã»ãŒãžã®çºä¿¡é床ãããŒã¿ããŒã¹ãžã®åŒã³åºãã®ç¶ç¶æéãªã©ïŒã«äŸåããæåãæã€ããšããããŸãããã®å Žåã¯ç«¶åç¶æ
ã§ãã䞊è¡åŠçã®ã¢ããªã±ãŒã·ã§ã³ã®èšèšã«çç·Žããã«ã¯ãäž¡æ¹ã®æŠå¿µãçè§£ããããšãèèŠã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/08-concurrency-foundations/58-races/)
|
||
|
||
### ã¯ãŒã¯ããŒãã¿ã€ãããšã®äžŠè¡åŠçã®åœ±é¿ãçè§£ããŠããªã (#59)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
äžå®æ°ã®ãŽã«ãŒãã³ãäœæãããšãã¯ãã¯ãŒã¯ããŒãã®ã¿ã€ããèæ
®ããŠãã ãããCPU ããŠã³ãã®ãŽã«ãŒãã³ãäœæãããšããããšã¯ããã®æ°ã `GOMAXPROCS` 倿°ïŒããã©ã«ãã§ã¯ãã¹ãäžã® CPU ã³ã¢ã®æ°ã«åºã¥ãïŒã«è¿ã¥ããããšãæå³ããŸãã I/O ããŠã³ãã®ãŽã«ãŒãã³ã®äœæã¯ãå€éšã·ã¹ãã ãªã©ã®ä»ã®èŠå ã«äŸåããŸãã
|
||
|
||
ããã°ã©ãã³ã°ã§ã¯ãã¯ãŒã¯ããŒãã®å®è¡æéã¯æ¬¡ã®ããããã«ãã£ãŠå¶éãããŸãã
|
||
|
||
* CPU ã®é床 - ããšãã°ãããŒãžãœãŒãã¢ã«ãŽãªãºã ã®å®è¡ãããã«ããããŸãããã®ã¯ãŒã¯ããŒã㯠CPU ããŠã³ããšåŒã°ããŸãã
|
||
* I/O ã®é床 - ããšãã°ãREST åŒã³åºããããŒã¿ããŒã¹ã¯ãšãªã®å®è¡ãããã«ããããŸãããã®ã¯ãŒã¯ããŒã㯠I/O ããŠã³ããšåŒã°ããŸãã
|
||
* å©çšå¯èœãªã¡ã¢ãªã®é - ãã®ã¯ãŒã¯ããŒãã¯ã¡ã¢ãªããŠã³ããšåŒã°ããŸãã
|
||
|
||
???+ note "è£è¶³"
|
||
|
||
ããæ°å幎ã§ã¡ã¢ãªãéåžžã«å®äŸ¡ã«ãªã£ãããšãèæ
®ãããšãåŸè
ã¯çŸåšã§ã¯æããŸãã§ãããããã£ãŠããã®ã»ã¯ã·ã§ã³ã§ã¯ãæåã® 2 ã€ã®ã¯ãŒã¯ããŒãã¿ã€ããCPU ããŠã³ããš I/O ããŠã³ãã«çŠç¹ãåœãŠãŸãã
|
||
|
||
ã¯ãŒã«ãŒã«ãã£ãŠå®è¡ãããã¯ãŒã¯ããŒãã I/O ããŠã³ãã§ããå Žåãå€ã¯äž»ã«å€éšã·ã¹ãã ã«äŸåããŸããéã«ãã¯ãŒã¯ããŒãã CPU ã«äŸåããŠããå ŽåããŽã«ãŒãã³ã®æé©ãªæ°ã¯å©çšå¯èœãª CPU ã³ã¢ã®æ°ã«è¿ããªããŸãïŒãã¹ããã©ã¯ãã£ã¹ã¯ `runtime.GOMAXPROCS` ã䜿çšããããšã§ãïŒã䞊è¡åŠçã®ã¢ããªã±ãŒã·ã§ã³ãèšèšããå Žåãã¯ãŒã¯ããŒãã®ã¿ã€ãïŒ I/O ããã㯠CPU ïŒãç¥ãããšãéèŠã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/08-concurrency-foundations/59-workload-type/main.go)
|
||
|
||
### Go Context ã«å¯Ÿãã誀解 (#60)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Go Context ã¯ãGoèšèªã®äžŠè¡åŠçã®åºç€ã®äžéšã§ããããŸãã Context ã䜿çšãããšããããã©ã€ã³ãããŒãšå€ã®ãªã¹ããä¿æã§ããŸãã
|
||
|
||
!!! quote "https://pkg.go.dev/context"
|
||
|
||
Context ã¯ããããã©ã€ã³ããã£ã³ã»ã«ã·ã°ãã«ããã®ä»ã®å€ã API ã®å¢çãè¶ããŠäŒéããŸãã
|
||
|
||
#### ãããã©ã€ã³
|
||
|
||
ãããã©ã€ã³ãšã¯ã次ã®ããããã§æ±ºå®ãããç¹å®ã®æç¹ãæããŸãã
|
||
|
||
* çŸåšããã® `time.Duration` ïŒäŸïŒ250 msïŒ
|
||
* `time.Time` ïŒäŸïŒ2023-02-07 00:00:00 UTCïŒ
|
||
|
||
ãããã©ã€ã³ã®ã»ãã³ãã£ã¯ã¹ã¯ããããéããå Žåã¯é²è¡äžã®ã¢ã¯ãã£ããã£ã忢ããå¿
èŠãããããšãäŒããŸããã¢ã¯ãã£ããã£ãšã¯ãããšãã°ããã£ãã«ããã®ã¡ãã»ãŒãžã®åä¿¡ãåŸ
æ©ããŠãã I/O ãªã¯ãšã¹ãããŽã«ãŒãã³ã§ãã
|
||
|
||
#### ãã£ã³ã»ã«ã·ã°ãã«
|
||
|
||
Go Context ã®ãã 1 ã€ã®äœ¿çšäŸã¯ããã£ã³ã»ã«ã·ã°ãã«ãäŒéããããšã§ããå¥ã®ãŽã«ãŒãã³å
ã§ `CreateFileWatcher(ctx context.Context, filename string)` ãåŒã³åºãã¢ããªã±ãŒã·ã§ã³ãäœæããããšãæ³åããŠã¿ãŸãããããã®é¢æ°ã¯ããã¡ã€ã«ããèªã¿åããç¶ããŠæŽæ°ããã£ããããç¹å®ã®ãã¡ã€ã«ãŠã©ããã£ãŒãäœæããŸããæäŸããã Context ãæéåãã«ãªãããã£ã³ã»ã«ããããšããã®é¢æ°ã¯ãããåŠçããŠãã¡ã€ã«èšè¿°åãéããŸãã
|
||
|
||
#### ã³ã³ããã¹ãå€
|
||
|
||
Go Context ã®æåŸã®äœ¿çšäŸã¯ãããŒãšå€ã®ãªã¹ããéã¶ããšã§ãã Context ã«ããŒãšå€ã®ãªã¹ããå«ããæå³ã¯äœã§ãããããGo Context ã¯æ±çšçã§ããããã䜿çšäŸã¯ç¡éã«ãããŸãã
|
||
|
||
ããšãã°ããã¬ãŒã¹ã䜿çšããå Žåãç°ãªã坿¬¡æ©èœéã§åãçžé¢ ID ãå
±æãããããšããããããããŸãããäžéšã®éçºè
ã¯ããã® ID ã颿°ã·ã°ããã£ã®äžéšã«ããã«ã¯ããŸãã«äŸµç¥çã ãšèãããããããŸããããã®ç¹ã«é¢ããŠãäžãããã Context ã®äžéšãšããŠãããå«ããããšã決å®ããããšãã§ããŸãã
|
||
|
||
#### Context ã®ãã£ã³ã»ã«ããã£ãããã
|
||
|
||
`context.Context` ã¿ã€ãã¯ãåä¿¡å°çšã®éç¥ãã£ãã« `<-chan struct{}` ãè¿ã `Done` ã¡ãœããããšã¯ã¹ããŒãããŸãããã®ãã£ãã«ã¯ã Context ã«é¢é£ä»ããããäœæ¥ããã£ã³ã»ã«ããå¿
èŠãããå Žåã«éããããŸããããšãã°
|
||
|
||
* `context.WithCancel`ã§äœæããã Context ã«é¢é£ããDoneãã£ãã«ã¯ãcancel颿°ãåŒã³åºããããšéããããŸãã
|
||
* `context.WithDeadline`ã§äœæãã Context ã«é¢é£ããDoneãã£ãã«ã¯ãdeadline ãéãããšéããããŸãã
|
||
|
||
泚æãã¹ãç¹ã® 1 ã€ã¯ãå
éšãã£ãã«ã¯ãç¹å®ã®å€ãåãåã£ããšãã§ã¯ãªãã Context ããã£ã³ã»ã«ããããšãããŸãã¯ãããã©ã€ã³ã«éãããšãã«éããå¿
èŠããããšããããšã§ãããã£ãã«ã®ã¯ããŒãºã¯ããã¹ãŠã®æ¶è²»è
ãŽã«ãŒãã³ãåãåãå¯äžã®ãã£ãã«ã¢ã¯ã·ã§ã³ã§ããããã§ãããã®ããã«ããŠã Context ããã£ã³ã»ã«ããããããããã©ã€ã³ã«éãããšããã¹ãŠã®æ¶è²»è
ã«éç¥ãå±ããŸãã
|
||
|
||
ãŸãšãããšãçç·Žãã Go éçºè
ã«ãªãã«ã¯ã Context ãšãã®äœ¿ç𿹿³ã«ã€ããŠçè§£ããå¿
èŠããããŸããååãšããŠããŠãŒã¶ãŒãåŸ
æ©ããããã颿°ã¯ Context ãååŸããã¹ãã§ããããã«ãããäžæµã®åŒã³åºãå
ããã®é¢æ°ããã€åŒã³åºãããæ±ºå®ã§ããããã«ãªãããã§ãã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/08-concurrency-foundations/60-contexts/main.go)
|
||
|
||
|
||
### `sync` åã®ã³ã㌠(#74)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
`sync` åã¯ã³ããŒãããã¹ãã§ã¯ãããŸããã
|
||
|
||
[ãœãŒã¹ã³ãŒã :simple-github:](https://github.com/teivah/100-go-mistakes/tree/master/src/09-concurrency-practice/74-copying-sync/main.go)
|
||
|
||
|
||
### ã€ã³ã©ã€ã³å±éãããŠããªã (#97)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãã¡ã¹ããã¹ã®ã€ã³ã©ã€ã³åææ³ã䜿çšããŠã颿°ã®åŒã³åºãã«ãããååŽæéãå¹ççã«åæžããŸãã
|
||
|
||
### Goèšèªã®èšºæããŒã«ãå©çšããŠããªã (#98)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
ãããã¡ã€ãªã³ã°ãšå®è¡ãã¬ãŒãµãå©çšããŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšæé©åãã¹ãéšåã«ã€ããŠçè§£ããŸãããã
|
||
|
||
ã»ã¯ã·ã§ã³å
šæã¯[ãã¡ã](98-profiling-execution-tracing.md)ã
|
||
|
||
### GC ã®ä»çµã¿ãçè§£ããŠããªã (#99)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
GC ã®èª¿æŽæ¹æ³ãçè§£ãããšãçªç¶ã®è² è·ã®å¢å ãããå¹ççã«åŠçã§ãããªã©ãããŸããŸãªæ©æµãåŸãããŸãã
|
||
|
||
### Docker ãš Kubernetes äžã§Goèšèªãå®è¡ããããšã®åœ±é¿ãçè§£ããŠããªã (#100)
|
||
|
||
???+ info "èŠçŽ"
|
||
|
||
Docker ãš Kubernetes ã«ãããã€ããéã®CPUã¹ããããªã³ã°ãåé¿ããã«ã¯ãGoèšèªãCFS察å¿ã§ã¯ãªãããšã«çæããŠãã ããã |