メインコンテンツへスキップ

Goプログラマーなら絶対ハマる100の落とし穴とその回避術、全部教えます!

·2 分
2025/04 Go プログラミング エラー 開発 書籍

Goプログラマーなら絶対ハマる100の落とし穴とその回避術、全部教えます!

引用元:https://news.ycombinator.com/item?id=43647880

mtlynch 2025-04-10T23:25:16

レビューのやり方を説明したんだけど、PRベースでのやり方を試してくれなかったんだよねー。もっとスムーズなコラボがしたかったのにさ。Manningのコピーエディターが、Goのことも知らないのにgit使えてるのが謎すぎる。しかも、Googleドキュメント以外にAsciiDocも受け付けてるみたいだし。
>私がレビューのやり方を説明したんだけど、PRベースでのやり方を試してくれなかったんだよねー。“もっとスムーズなコラボがしたかったのにさ”

thi2 2025-04-11T11:06:26

めっちゃ引き込まれる文章だね!ついついサイト見に行っちゃったよ。ところで、E-Readerでの表示は試した?サンプル見た感じ、画像とか色分けが多いからKindleだとちょっと厳しいかもねー。

mtlynch 2025-04-11T12:53:41

ありがとー!最初はWebに特化してて、E-Readerは考えてなかったんだよね。でも、正式に本が出ることになったから、PDF版を優先して、rm2でテストするよ。

Cthulhu_ 2025-04-11T07:35:22

それ、マジでびっくり。オンラインレビューツールじゃなくて、直接asciidoc編集させられるとか古すぎじゃない?コードレビューみたいなソフトがもっと前からあると思ってたわ。Wordとかのコメント機能みたいなのが普通じゃない?

Groxx 2025-04-11T02:24:00

もし見てたらだけど、sync.Poolで固定サイズじゃないオブジェクト使うのはマジで問題の元だよ!Goのstdlibのsync.Poolの使い方見ると、固定サイズの tiered poolがいっぱいあるし、大きいサイズは捨ててるし。
>sync.Poolで固定サイズじゃないオブジェクト使うのはマジで問題の元だよ!“Goのstdlibのsync.Poolの使い方見ると、固定サイズの tiered poolがいっぱいあるし、大きいサイズは捨ててるし”

lenkite 2025-04-11T04:19:53

Goにメモリアリーナがあればよかったのにね。poolのユースケースはアリーナで綺麗に解決できたのに。

dilyevsky 2025-04-11T04:54:08

Goは1.22から実験的なアリーナAPIがあったよ。

9rx 2025-04-11T05:30:41

でも、その実験は失敗したんだよね。もう終わった。

jensneuse 2025-04-11T05:31:04

アリーナ、また削除されたみたい。

a-french-anon 2025-04-11T08:37:56

多分だけど、この記事ってGoのGCが generationalじゃないから、ほとんど(全部じゃないけど)存在してるんじゃないかな。

Groxx 2025-04-11T16:16:53

まあ、そうかもね。でも、世代別GCでも病的なくらいGCの挙動が悪くなることはよくあるよ。Poolとか手動でのメモリ管理は、常にそれなりに使い道があると思うな。

ryanbigg 2025-04-10T23:44:58

コピー編集の話だけど、2010年にManningのためにDocBookで本を書いたんだ。DocBookはXMLだから、開始/終了タグを別々の行にして、コンテンツを真ん中に書いたんだよね。HTMLドキュメントみたいにさ。コピー編集後、全部一行にされて返ってきた時はマジでブチ切れてプロジェクト放棄しかけたわ。全然変わってないみたいだね。今はセルフパブリッシングにしてる。詳しくはここ→https://ryanbigg.com/2015/08/my-self-publishing-success-stor…

ahtihn 2025-04-11T07:32:58

もしかして勘違いしてる?XMLを手でフォーマットしたってこと?誰かがツールにロードして変更して保存しただけで、XMLなんて見てないんじゃない?XMLの見栄えなんて気にする人いる?

fc417fc802 2025-04-11T09:16:17

気にしなくていいってのが、そういう構文の大きな利点の一つだと思うけどね。もし何か理由があって気にするなら、フォーマットツールがあるじゃん。

Cthulhu_ 2025-04-11T11:39:33

だってこのケースでは、人間と機械の両方にとって読みやすいことが重要だったのに、レビュー担当者は前者を無視したんだもん。それならWordで書けばいいじゃん。

onionisafruit 2025-04-10T21:55:10

この本の形式は、ブッククラブにすごく向いてるね。経験者も初心者も交じってやってるけど、この本の間違いは良い議論のきっかけになるんだ。ベテランは自分が同じ間違いをした時の話とか、どうやって避けてきたかを話してくれるし、初心者は他の言語との比較をしてるよ。“fuzzingを使ってない”とか“errgroupを使ってない”とか、Goの紹介になってるミスもあるよね。

relistan 2025-04-11T07:56:40

O’Reillyの著者だけど、著者は本の売り込みでつまずいたみたいだね。メールから始めるのが確実だと思うよ。私達も最初はメールだけだったし。後で詳細な提案書を提出したけど、そんなに大変じゃなかったよ。O’Reillyのツールも素晴らしいよ。git commitから本のフルバージョンを生成できるし。本の執筆は全部vimでやったよ。

alp1n3_eth 2025-04-11T18:12:01

良い例となるリポジトリはありますか?

relistan 2025-04-12T08:51:12

彼らは自分たちのリポジトリをホストしていて、ビルドは彼らのシステムで行われるけど、レイアウトはすごくシンプルだよ。番号が振られたファイルがasciidocとかmarkdownとか、好きな形式で置かれてるだけ。

JeremyMorgan 2025-04-10T21:48:13

Manningの著者さん、こんにちは!この本はマジで最高だよ。数年前に読んだけど、すごく役に立ったし、良い情報を少しずつ得られるから、また読み返せるよね。今度またGoのプロジェクトを始めるから、また見直すつもりだよ。この本の良いところは、全部“実世界”の話って感じがするところ。著者がGoでたくさん開発してきて、どこに落とし穴があるか教えてくれるから、時間を節約できるんだよね!

もっとコメントを表示(1)
Cthulhu_ 2025-04-11T12:03:48

この記事の著者はGoでたくさん開発してるんだなってわかるね!
>著者は当時Goであんまり開発してなかったんだって。でも、それって別にその分野に詳しくなったり、本を書いたりするのに必須じゃないってことの証明だよね。

Suppafly 2025-04-11T16:54:29

そういうプログラミング本って結構あるよね。しかも、だいたいバレる。

adeon 2025-04-10T22:06:02

例のgoroutineのやつ(#63)について質問!コピペできないけど画像なんだよね。
なんでよくある間違いがgoroutine限定なの?もしgoroutineを使わずにfunction closuresを作ったら、全部同じ’i’変数を参照するのかな?(たぶん、この間違いがgoroutineとセットになりやすいからだよね)。
著者が真剣に本に向き合ってるのが伝わるから、マジ尊敬する。Goを学ぶためじゃなくて、良い本を作るってどういうことかを知るために興味が出てきた。

teivah 2025-04-10T22:09:10

詳細はこちら:https://100go.co/#not-being-careful-with-goroutines-and-loop…だよ。
僕の例はたぶんひどいと思う。Goの最近のアップデートのおかげで、もう当てはまらない3つの間違いのうちの1つだから。
コメントありがとう!めっちゃ嬉しい。

adeon 2025-04-10T23:09:27

本を書くだけじゃなくて、読者が新しい情報で混乱しないように、オンラインコンテンツも最新に保ってるの?しかも「もう当てはまらない間違いの一つ」って即答できるの?マジすごい。
技術的な文章の例としてブックマークしたよ。教育とか教えるのってマジで難しいよね。何度も書き直して短くしたり、わかりやすくしたり…それって作品への愛だよね。完璧主義はほどほどにしないとね!

Cthulhu_ 2025-04-11T12:05:17

もし続編を書くとしたら、単純に「間違い」を削除して「86個のGoの間違いとその回避方法」にする?それとも、もっと見つける?

ljm 2025-04-10T22:15:27

#633はタイプミスか説明が下手なだけだと思うよ。
「このコードは順番に関係なく123を出力すると予想されるかもしれない」じゃなくて「正確に」か「順番に」と言うべき。
非同期実行でFIFOを想定するのって、初めて並行処理に出会う人が最初にやるミスだよね。

amarshall 2025-04-10T22:28:40

問題は順番がバラバラになる“かもしれない”ことじゃなくて、共有メモリアクセスのタイミングで値が欠落したり重複したりすること。
Go 1.22で挙動が変わったんだよね。
[1]: https://go.dev/blog/loopvar-preview

adeon 2025-04-10T22:47:17

質問の核心はそこ!リンク先(https://go.dev/blog/loopvar-preview)にも書いてあるけど。
つまり、Goではforループの’i’変数は毎回同じ’i’を参照するってこと?closureが全部同じ’i’を参照するって気づかないミスだよね。
それとも、goroutine自体に変なルールがあるの?Goをほとんど書かないから気になったんだ。Go 1.22の変更は良いと思う。自分も同じミスをしそう。

ljm 2025-04-10T23:36:59

それってJSのclosureとscopeの問題と同じじゃん。
値そのものじゃなくて、値への参照を扱ってるってこと。

kbolino 2025-04-11T13:04:25

100個のGoのミス、間違いなく1つ目だね。goroutineを使わなくても問題を示す方法はあったよ。ループ内でクロージャのリストを作って、ループが終わった後に同期的に呼び出すとかさ。そうすれば、全部同じ(この場合は最後の)iの値になるんだ。

teivah 2025-04-10T22:26:10

#63は、適切な同期なしに複数のgoroutineを実行したときの実行保証の欠如についての話じゃないんだ。ループ変数とgoroutineに関するものなんだよね。

goostavos 2025-04-10T21:30:26

素敵な記事だね。特に付け加えることはないんだけど、ただupvoteボタンをクリックするだけじゃ足りない気がして。

teivah 2025-04-10T21:46:28

自分の投稿がHNに載ってることに気づいた!どうもありがとう😊

4ndrewl 2025-04-10T21:31:11

全く同じことを書こうと思ってここに来た!

teivah 2025-04-10T21:46:41

ありがとうございます!

re-lre-l 2025-04-11T10:15:24

>スイスで仕事をしてて、C++のレガシーコードベースをリファクタリングしてたんだ…
すごく良い職場だよね。“Aを完全に新しいスタックで実装しよう”って決めて、しばらくしてから“あ…これは難しすぎる、まずい決断だった。別のを試そう”って言えるんだから。

tmtvl 2025-04-11T08:31:21

Sensei’s Libraryに、Goで作られたミスのコレクションがあるよ:<https://senseis.xmp.net/?Mistakes>

leeuw01 2025-04-11T13:22:33

これって、言語じゃなくてボードゲームの話?

turtleyacht 2025-04-10T21:43:21

著者に言わせると、この本が「100 _ Mistakes and How to Avoid Them」シリーズの始まりなんだって。それがプログラミング言語をベースにした本の新しい道を開いたんだね。

もっとコメントを表示(2)
m1keil 2025-04-11T03:34:40

DEからマジで色々学んだわー。ブログで10年くらい書いてたけど、ネットの記事って直接的じゃないと読んでもらえないじゃん?でも本は違う。読者はわざわざ買ってくれてるんだから、価値のある場所に連れて行くのがこっちの仕事。時間がかかってもいいわけ。

でも、本って無駄なpaddingが多い気がするんだよねー。28語を120語にする例とかマジそれ。最初の段落とか意味なくね?「100 Go Mistakes」って本読んでる時点で、そのミスがよくあるってわかるじゃん。価値上がった?

コードの説明も不要だと思う。コードtrivialだし。コードの横にも説明あるし。やっと本題って感じ。

出版社はページ数稼がないと本の値段に見合わないって思ってるんだろうけど、マジ勘弁。

teivah 2025-04-11T08:17:26

それはあなたの意見だよね、別にいいんだけどさー。ちょっと考え変わるか試させて。

>最初の段落とか意味なくね?「100 Go Mistakes」って本読んでる時点で、そのミスがよくあるってわかるじゃん。価値上がった?
頻出ミスのレベルも色々あるからねー。これは多くの開発者が一度はやるミスだと思うよ。だから頻出だって強調するのはアリだと思うな。”

>コードの説明も不要だと思う。コードtrivialだし。
コードの意図は常に説明するって決めてるんだよね。5行でも、何を伝えたいか理解しやすくなるじゃん?”

>コードの横にも説明あるし。
横の説明は本のサイズに関係ないから、そのargumentは成り立たないね。読者がどこに注目すべきかhighlightするためにやってるんだ。”

本の値段を正当化するためじゃないよー。読者を導いて、期待値を明確にして、説明についてきてもらうため。そう捉えるのは自由だけど、それが理由じゃないよ。少なくとも俺の本はね。

m1keil 2025-04-11T10:28:57

>これは読者を導いて、期待値を明確にして、説明についてきてもらうため。
それってブログでも同じじゃない?

誤解しないでね、The Little Schemerみたいなのが良いって言ってるわけじゃないし、ブログ版が最高だとも思ってないよ。でも、本のpaddingって存在するよね?

ちなみに、O’Reilly Learningであなたの本読んだけど、良い本だと思うよ。だからdisってるわけじゃないんだ。出版社disだよ。

teivah 2025-04-11T11:02:54

気にしないで。あなたの意見は理解してるよ。契約で最低ページ数があるんだよね。でも個人的には、ページ数増やせってプレッシャーは感じなかったな。

むしろDEに、「just-in-case teachingよりjust-in-time teachingを優先しろ」って何度も言われたよ。章に役立たないセクションは削られた。「役立つかもしれない」程度じゃダメなんだって。

誰と仕事するか、どの出版社かってのもあると思う。Manningはフェアだったよ。

pier25 2025-04-11T01:09:45

ソースコードにコメント追加するの、編集チームと仕事するなら、バージョン管理のないPDFとかWordファイルより全然マシ。

methods21 2025-04-11T22:00:58

「でも、Timのレビューは他のレビュー全部合わせたのと同じくらい価値があったかも」…なのに、レビューについて何も教えてくれないのは残念。他のinputのscreenshotとか詳細さからするとね。

あと、copyeditorの件はマジで共感。

teivah 2025-04-11T22:54:34

彼のレビューは300ページ以上の本にannotatedされたコメントなんだよ。彼のレビューをdeep divingしても、このセクションが良くなるとは思えない。

musicale 2025-04-12T01:57:34

Goのミスで一番気になるのは、gc pausesとか、first-class named and default argumentsがないとか、exceptionsがないとか、subrange typesがないとか。

だからGo使わないようにしてる。もしくは、missing features(generics)が追加されるまで待つ。

teivah 2025-04-12T13:31:19

Genericsもうあるよ。

musicale 2025-04-12T23:42:23

マジで。Go 1.0から1.18まで、10年も待ったけどね。

meling 2025-04-10T21:54:38

2年くらい前に読んだけど、マジでおすすめだよ。Josh BlochのEffective Javaみたいな雰囲気があるんだよね。

tyho 2025-04-11T12:22:33

ここで挙げられてる例は間違ってるよ。Go 1.22からループ変数はイテレーションごとにスコープを持つから、この”壊れた”コードは決定的で正しいんだ。
>https://go.dev/blog/loopvar-preview

teivah 2025-04-11T12:36:55

時代遅れって言いたいんだよね。ここに書いたんだけど。
>https://100go.co/#not-being-careful-with-goroutines-and-loop…
でも、君の言う通り修正されたんだよね(100個の間違いのうち2つと一緒に)。

yndoendo 2025-04-11T13:27:56

まだWindows 7をサポートしなきゃいけない業界にいるんだよね。最後にサポートされたバージョンは1.20だよ。時代遅れかどうかは相対的なんだよね。

tyho 2025-04-11T12:50:20

今日コード書いたんだけど、新しい挙動に頼っちゃった。ちょっと後ろめたい気持ちになった。

josefx 2025-04-11T17:37:10

それって2023年の問題なの?C#は2012年に似たようなの直した気がするけど。Goはまだ車輪の再発明を誇らしげにしてるの?しかも木製でシロアリだらけの?

lexoj 2025-04-11T09:29:22

audibleでこの本を買ったんだけど(PDF版もあるって書いてあったから)、PDF版にはコードが少ししかなくて、本全体が入ってなかった。audibleの仕様だったらごめん。本のせいじゃないかもだし。聴くの楽しみにしてるよ。

codazoda 2025-04-11T00:55:16

もし本を出版することに興味があったら、連絡して何が障害になってるか教えてほしいな。メールアドレスはプロフィールにあるよ。何も売るつもりはないから、君が直面してる問題を理解したいんだ。

kickbribe 2025-04-11T02:13:45

Goを学ぶことに興味がある身としては、これは素晴らしいね、ありがとう!

revskill 2025-04-11T05:15:09

良い言語は、間違いの余地を残すべきじゃない。

もっとコメントを表示(3)
9rx 2025-04-11T05:37:23

でもさー、良い言語って実用的じゃなきゃダメじゃん?で、実用的なものって絶対ミスする余地があるんだよね。なんか矛盾してない?

adamors 2025-04-11T06:47:42

最高のアプリケーションってバグがないことだよね。で、バグをなくすにはコードを一切書かないことしかない、マジレス。

stpedgwdgfhgdd 2025-04-11T07:53:52

ミスする余地がない言語なんて、人間には使えないっしょ。

revskill 2025-04-11T12:24:39

それ、LLM agentに必要じゃん。

Cthulhu_ 2025-04-11T13:19:14

それって“良い”のほんの一面じゃん?どの言語にも落とし穴はあるし、多い少ないはあるよね。Goにも落とし穴はあるけど、元々置き換えるはずだった(C/C++)よりは少ないでしょ。ミスする余地がない言語には、読みやすさとか生産性とかの問題が出てくるし。Rustはそういう意味でより“ガチガチ”な気がする。

pessimizer 2025-04-11T18:10:46

マジそれな。存在する言語ってクソなのばっかで悲しいわ。

begueradj 2025-04-11T05:31:09

>正直言うと、俺も結構インスピレーションの源だったんだよね!
自分で自分を褒めるのは正直じゃないよね。誰か他の人に「彼はインスピレーションの源だ」って言うのが正直ってもんでしょ。

esrch 2025-04-11T07:58:47

この場合は適切だと思うよ。だって彼はミスのインスピレーションの源だったんだから、自分を褒めてるわけじゃないじゃん。

teivah 2025-04-11T10:55:51

本の中のミスのインスピレーションの源は自分だって言ったんだよ。言い換えると、俺自身がたくさんミスをして、それが本のセクションになったってこと。

stpedgwdgfhgdd 2025-04-11T07:49:38

ぶっちゃけ、彼が言いたいことわかってるか怪しいわ。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。