『100 Go Mistakes and How to Avoid Them』を読む
**この本は永遠に未完です。筆者の認識がアップデートされる度に加筆・修正されます** この本のモチベーションは、 - アウトプットを通して筆者自身のGoへの理解を深めることです - 『100 Go Mistakes and How to Avoid Them』を布教して日本のGoコミュニティに寄与することです この本には、 - 『100 Go Mistakes and How to Avoid Them』の感想が書かれています - 『100 Go Mistakes and How to Avoid Them』の翻訳・要約は書かれていません(翻訳権・翻案権に配慮しています) この本を読むことで、 - 『100 Go Mistakes and How to Avoid Them』でどのようなトピックスが扱われているかを知ることができます - 『100 Go Mistakes and How to Avoid Them』を読まずにはいられなくなります ===== 『100 Go Mistakes and How to Avoid Them』は、GoogleのシニアソフトウェアエンジニアであるTeiva Harsanyi氏が著し、Manning Publicationsから出版された技術書です。Go言語でよくあるエラーや落とし穴を回避し、生産性を向上させる方法が100個紹介されています。 現在、日本のエンジニアリング業界ではGoエンジニアの需要に対して供給が足りず、Goによる開発実務経験のあるエンジニアの採用にどの会社も苦労していると聞きます。そのため、他言語で経験を積んだエンジニアを採用し、Goエンジニアに再教育するというのが、各社の現実解となっているのではないでしょうか。 当該書籍は、Goエンジニアの教育・成長にとても役に立つはずです。そこで紹介されている”Go Mistakes”ひとつひとつについて私の感想を記していきますので、もし興味をお持ちになりましたら、ぜひAmazonなどで買って読んでみてください。
#1: Unintended variable shadowing を読む
#2: Unnecessary nested code を読む
#3: Misusing init functions を読む
#4: Overusing getters and setters を読む
#5: Interface pollution を読む
#6: Interface on the producer side を読む
#7: Returning interfaces を読む
#8: any says nothing を読む
#9: Being confused about when to use generics を読む
#10: Not being aware of the possible problems with type embedding を読む
#11: Not using the functional options pattern を読む
#12: Project misorganization を読む
#13: Creating utility packages を読む
#14: Ignoring package name collisions を読む
#15: Missing code documentation を読む
#16: Not using linters を読む
#17: Creating confusion with octal literals を読む
#18: Neglecting integer overflows を読む
#19: Not understanding floating points を読む
#20: Not understanding slice length and capacity を読む
#21: Inefficient slice initialization を読む
#22: Being confused about nil vs. empty slices を読む
#23: Not properly checking if a slice is empty を読む
#24: Not making slice copies correctly を読む
#25: Unexpected side effects using slice append を読む
#26: Slices and memory leaks を読む
#27: Inefficient map initialization を読む
#28: Maps and memory leaks を読む
#29: Comparing values incorrectly を読む
#30: Ignoring the fact that elements are copied in range loops を読む
#31: Ignoring how arguments are evaluated in range loops を読む
#32: Ignoring the impact of using pointer elements in range loops を読む
#33: Making wrong assumptions during map iterations を読む
#34: Ignoring how the break statement works を読む
#35: Using defer inside a loop を読む
#36: Not understanding the concept of a rune を読む
#37: Inaccurate string iteration を読む
#38: Misusing trim functions を読む
#39: Under-optimized string concatenation を読む
#40: Useless string conversions を読む
#41: Substrings and memory leaks を読む
#42: Not knowing which type of receiver to use を読む
#43: Never using named result parameters を読む
#44: Unintended side effects with named result parameters を読む
#45: Returning a nil receiver を読む
#46: Using a filename as a function input を読む
#47: Ignoring how defer arguments and receivers are evaluated を読む
#48: Panicking を読む
#49: Ignoring when to wrap an error を読む
#50: Checking an error type inaccurately を読む
#51: Checking an error value inaccurately を読む
#52: Handling an error twice を読む
#53: Not handling an error を読む
#54: Not handling defer errors を読む
#55: Mixing up concurrency and parallelism を読む
#56: Thinking concurrency is always faster を読む
#57: Being puzzled about when to use channels or mutexes を読む
#58: Not understanding race problems を読む
#59: Not understanding the concurrency impacts of a workload type を読む
#60: Misunderstanding Go contexts を読む
#61: Propagating an inappropriate context を読む
#62: Starting a goroutine without knowing when to stop it を読む
#63: Not being careful with goroutines and loop variables を読む
#64: Expecting deterministic behavior using select and channels を読む
#65: Not using notification channels を読む
#66: Not using nil channels を読む
#67: Being puzzled about channel size を読む
#68: Forgetting about possible side effects with string formatting を読む
#69 Creating data races with append を読む
#70 Using mutexes inaccurately with slices and maps を読む
#71 Misusing sync.WaitGroup を読む
#72 Forgetting about sync.Cond を読む
#73 Not using errgroup を読む
#74 Copying a sync type を読む
#75 Providing a wrong time duration を読む
#76 time.After and memory leaks を読む
#77 JSON handling common mistakes を読む
#78 Common SQL mistakes を読む
#79 Not closing transient resources を読む
#80 Forgetting the return statement after replying to an HTTP request
#81 Using the default HTTP client and server を読む
#82 Not categorizing tests を読む
#83 Not enabling the race flag を読む
#84 Not using test execution modes を読む
#85 Not using table-driven tests を読む
#86 Sleeping in unit tests を読む
#87 Not dealing with the time API efficiently を読む
#88 Not using testing utility packages を読む
#89 Writing inaccurate benchmarks を読む
#90 Not exploring all the Go testing features を読む
#91 Not understanding CPU caches を読む
#92 Writing concurrent code that leads to false sharing を読む
#93 Not taking into account instruction-level parallelism を読む
#94 Not being aware of data alignment を読む
#95 Not understanding stack vs. heap を読む
#96 Not knowing how to reduce allocations を読む
#97 Not relying on inlining を読む
#98 Not using Go diagnostics tooling を読む
#99 Not understanding how the GC works を読む
#100 Not understanding the impacts of running Go in Docker and Kuberne
Software engineer at ZOZO, Inc. Tokyo, Japan. Medium: medium.com/@yuki.bobier Connpass: connpass.com/user/YukiBobier/