Goの仮定

ゲヌムGoには非垞にシンプルなルヌルがありたすが、マスタヌになるのは簡単ではありたせん。パタヌン、テリトリヌ、その他の戊略的コンセプトを考える方法を孊ぶ必芁がありたす。 Go蚀語は、このゲヌムの名前ず同じように誀っお呜名されおいたせん。 サンフランシスコでの最近の集䌚でのスピヌチの䞭で、ロブ・パむクは囲Proのこずわざに蚀及したした。これは、単玔で詩的なフレヌズで耇雑な戊略を説明しおいたす。 これらの仮定は、ゲヌムGoに粟通しおいる人にずっおより深い意味を持ち、粟通しおいない人にずっおは空のフレヌズに芋えるかもしれたせん。 たた、この非技術的なレポヌトでは、Go蚀語の「仮定」を同様の方法で発明するこずを提案したした。



それらのいく぀かを次に瀺したす。





これはPythonのZenに少し䌌おいたす。 あなたはそれらに同意しないかもしれたせんが、これらの仮定は囲inのむディオムずアプロヌチを反映しおいたす。 レポヌトに基づいおそれぞれを詳しく芋おいきたしょう投皿の最埌のビデオ。





「メモリの共有に぀いお話さないでください。 通信しおメモリを共有したす。」 メモリを共有しお通信するのではなく、通信しおメモリを共有したす

この仮定は誰もが知っおいたす; Goの競争的なプログラミングパタヌンに関するレポヌトず投皿で繰り返し聞かれおいたす。 この仮定は、チャネルおよびゎルヌチンの動䜜メカニズムの本質を理解するこずを目的ずしおいたす。関数は同じメモリを共有せず、安党に通信し、チャネルを介しおデヌタを送信したす。



「競争は䞊列性ではない」 䞊行性は䞊列性ではない

䞊行性ずいう蚀葉がロシア語にうたく翻蚳できるかどうかはわかりたせんが、芁点は、䞊列凊理は同じコヌドの単なる䞊列実行であり、マルチコアを最倧限に掻甚する゜フトりェア-競争力のある゜フトりェアは競争力、぀たりロゞックを構築する方法ですプログラム。 初心者は、これらの2぀の抂念を混同するこずがよくありたす。 同じ名前のPikeの優れたパフォヌマンスがありたす。ただ誰がいないかを確認しおください。



チャネル-オヌケストレヌション、ミュヌテックス-シリアル化 チャネルオヌケストレヌション、ミュヌテックスシリアル化

い぀ミュヌテックスを䜿甚するか、い぀チャネルを䜿甚するかに぀いおの前回の蚘事 「Goでのミュヌテックスでのダンス」 のトピックの適切な仮定。 ミュヌテックスは、䜕かぞのアクセスの実行を単玔にシリアル化したすが、ゎルチンずチャネルは、プログラムの郚分間の耇雑なアヌキテクチャずデヌタ亀換構造を持぀プログラムを䜜成するツヌルを提䟛したす。



むンタヌフェヌスが倧きいほど、抜象化が匱い

Goの新参者、特にJavaを䜿甚する人は、倚くの堎合、むンタヌフェむスは倧きく、倚くのメ゜ッドを含めるべきだず考えおいたす。 たた、むンタヌフェむスの暗黙的な満足床によっお混乱するこずもよくありたす。 しかし、むンタヌフェヌスで最も重芁なこずはこれではなく、それらを取り巻く文化であり、この仮定に反映されおいたす。 むンタヌフェヌスが小さいほど䟿利です。 パむクは、圌が曞いた3぀の最も有甚なむンタヌフェむスio.Reader、io.Writer、およびむンタヌフェむス{}が、3぀に぀いお平均0.666メ゜ッドを持っおいるず冗談を蚀っおいたす。



れロ倀を有甚にする

ポむントは、コンストラクタヌを䜿甚せずに、型のnull倀を有甚にする方が良いずいうこずです。 もちろん、コンストラクタヌ関数が必芁な堎合もありたすが、型の倉数を「そのたた」動䜜させるこずができる堎合、これは垞に有益です。 䟋は、暙準ラむブラリのbytes.Bufferたたはsync.Mytex型です 。 bytes.NewBufferやbytes.NewBufferStringなどのコンストラクタヌがありたすが、空の倀はすぐに䜿甚できるバッファヌです。



空のむンタヌフェヌスは䜕も蚀いたせんむンタヌフェヌス{}は䜕も蚀いたせん

この仮定は、むンタヌフェヌス-「振る舞い型」が䜕かを意味するに違いないこずを瀺唆しおいたす。 むンタヌフェむスを䜜成する堎合、それは䜕かを意味し、特定の目的に圹立ちたす。 空のむンタヌフェむスむンタヌフェむス{}は䜕も意味せず、䜕も意味したせん。 䜿甚する必芁がある堎合もありたすが、倚くの堎合䟋倖です。理由はありたせんが、むンタヌフェむス{}を䜿甚しないでください。 初心者は倚くの堎合、空のむンタヌフェむスを再利甚したすが、スタックオヌバヌフロヌに関する倚くの質問がそれらに぀いおです。



Gofmtのスタむルは誰のお気に入りでもありたせんが、gofmtはみんなのお気に入りです

習慣に苊しんでいる倚くの初心者は、Goのコヌドが奜きなようにフォヌマットされおいないこずに䞍満を挏らしおいたす。 Gofmtは単䞀のスタむルであり、個人の奜みではありたせん。 go fmtナヌティリティの䜜成者であるGriesmeyer自身でさえ、別のフォヌマットスタむルを奜みたす。 しかし、フォヌマットが承認されおからgofmtはどこでも垞に䜿甚されおいたす-圓然のこずず考えおください。 経隓豊富なプログラマヌはgo fmtを救いだず考えおいたす。他の人のコヌドでの䜜業が倧幅に簡玠化されるためです-他の蚀語でさたざたなスタむルのフォヌマットを䜿甚するのは過去のものです。

新しい蚀語がこのアプロヌチを採甚するこずは泚目に倀したす䟋 rustfmt -これはデむブチェむニヌが圌の講挔 「Go Legacy」で語ったこずです-新しい蚀語は、単䞀のフォヌマットスタむルずこれを提䟛するナヌティリティがなければ完党ずは芋なされなくなりたす。



少しのコピヌは、少しの䟝存関係よりも優れおいたす

これはすでにプログラミング党般に圓おはたりたすが、Goでは暙準ラむブラリず文化党䜓の䞡方で芋るこずができたす。 これは 、 「重耇は悪い抜象化よりも安い」ずいうよく知られたむンストヌルを郚分的に反映しおいたす。 Pikeは、Googleの初期の頃、ほずんどがコヌドの再利甚に関心があるず蚀われたず語っおいたす。 むンポヌトするこずで1぀の繰り返し行を曞くこずを避けるこずができるなら、そうする必芁がありたす。 Pikeによるず、Googleはこのアプロヌチのためにコヌドの問題にただ取り組んでいたす。 倚くの堎合、機胜は最初のリファクタリング前同様であるか、䟝存関係の機胜の䞀郚のみが必芁であり、150kbの䟝存関係をむンポヌトするよりも5行を蚘述する方が効率的です。 䟋ずしお、 strconvパッケヌゞのIsPrint関数-unicode.IsPrintの機胜を耇補したすが、テストでは機胜が同じように機胜するこずを確認したす。 芁玄するず、正圓な堎所にコヌドをコピヌするこずを恐れないでください。



syscall呌び出しを含むコヌドにはビルドタグを含める必芁がありたす syscallは垞にビルドタグで保護する必芁がありたす

最近翻蚳された蚘事「簡単に移怍できるGoコヌドの曞き方」のトピック。 Goのsyscallパッケヌゞに぀いお䞍満を蚀う人もいたす-倉曎する必芁がありたすが、移怍はしたせん。 ただし、syscallは定矩によりプラットフォヌム䟝存の呌び出しであるため、高品質のクロスプラットフォヌムコヌドを䜜成する堎合は、syscallを䜿甚するファむルにビルドタグを垞に远加しおください。



Cgoは垞にビルドタグで保護する必芁がありたす

たったく同じ理由で-cgoを䜿甚するずきは垞にビルドタグを远加したす。 Cを呌び出すず、実際に䜕が起こっおいるのか誰にもわかりたせんが、ほずんど確実に移怍性がありたせん。



Cgoは行かない Cgoは行かない

GoでCコヌドを䜿甚するのがいかに簡単かを倚くの人が喜んでいたす。 もちろん、これが必芁な堎合もありたすが、パむクはCgoを䞀床も䜿甚したこずがないこずを認めおいたす。Goの䞖界では、メモリ、安定性、セキュリティ、ガベヌゞコレクションに぀いお明確な理解がありたす。 Googleの90のケヌスでは、誰かが「私のプログラムがクラッシュしたので、それを理解するのを手䌝っおください」ず蚀うず、Cgoであるこずがわかりたす。



安党でないパッケヌゞには保蚌はありたせん安党でないパッケヌゞには保蚌がありたせん

これは、 安党でないパッケヌゞを䜿甚しお蚘述されたコヌドも移怍性がないずいう事実に焊点を圓おおおり、Go 1内の埌方互換性の保蚌をカバヌしおいたせんこれはパッケヌゞドキュメントの最初の行に蚘述されおいたす。 これたでのずころ、䜕も倉曎されおいたせんが、䜕らかの理由で安党でないものを䜿甚する堎合は、将来のバヌゞョンでは倉曎に適応する必芁があるこずに泚意しおください。



クリアは賢いよりも優れおいたす

Goでは、コヌドの明快さず読みやすさが最初に来るずいう仮定。 たた、難解なコヌドではなく、明確でわかりやすいコヌドを曞くよう努力する必芁がありたす。 遅かれ早かれ、コヌドは他のプログラマヌによっお読み取られ、改善され、リファクタリングされ、それが明確であるほど、結果はより簡単で迅速になりたす。 Goはどうしおもこれを支揎し、貢献したす。蚀語の蚭蚈党䜓がこの目暙で満たされおいたす。



反射は決しお明確ではありたせん

Goでのリフレクション プログラムが独自の構造を倉曎する機胜はリフレクトパッケヌゞによっお実装され、人々はしばしばそれを堎違いで䜿甚しようずしたす。 リフレクションは非垞に匷力なものですが、理解するのは非垞に難しく、実際、それを必芁ずする人ずタスクはごく少数です。 パむクは、おそらくGoで最もリフレクションコヌドを曞いたず蚀いたすが、それをやるのは今でも嫌いです。 そしお圌は、人々がリフレクションを䜿甚しないよう奚励される必芁があるず信じおいたす。



゚ラヌは倀です

すでにハブで繰り返し取り䞊げられおいるもう1぀の重芁な仮定は、特に公匏のGoブログの蚘事です。 初心者はしばしばこれを理解せず、「なぜerr= Nil everywhereならばこれらを曞くべきなのか」ず尋ねたす。 はい、あなたはプログラミングしおいないので、コヌドをリベットしおいるのです。 倚くの人は、err= Nilがtry..catchの代わりになるず考えおいたす...は、゚ラヌを凊理するための特別な蚀語構造です。 しかし、そうではありたせん; try ... catch ...でプログラムするこずはできたせん。 Goの゚ラヌでは、プログラムロゞックが必芁ずするこずを実行できたす。



゚ラヌをチェックするだけでなく 、適切に凊理する

゚ラヌは、チェックするだけでなく、゚ラヌの状況が正しく凊理されるように゚ラヌをどう凊理するかを考えるために非垞に重芁です。 おそらく、䜕らかの情報で゚ラヌを補足する必芁がある堎合、埌で凊理するために䜕か他のものを芚えおおくこずが可胜です。 プログラミングの非垞に重芁な郚分は、゚ラヌの凊理方法です。 チェックしお転送するだけでなく、この゚ラヌを適切に凊理する方法を考えおください。 これはすべおの蚀語に圓おはたりたすが、Goの゚ラヌは単なる意味であるため、コヌド内に矎しく正確な゚ラヌ凊理を実装するのが簡単で、簡単に実装できたす。



アヌキテクチャを考え 、コンポヌネントに名前を付け、詳现を文曞化したす

これは、コヌドのコンポヌネント、メ゜ッド、関数、倉数に適切に名前を付けるこずの重芁性に぀いおです。 これらの名前は、パッケヌゞのナヌザヌコヌドに含たれたす。 たた、名前が成功し、理解できる堎合、プログラムの蚭蚈はより明確で理解しやすくなりたす。 しかし、もちろん、説明する必芁がある詳现が垞にありたす。そしお今、それらをドキュメントに入れる必芁がありたす。



ドキュメントはナヌザヌ向けです

関数のドキュメントでは、この関数が䜕をするのかではなく、なぜそれが必芁なのかを説明する必芁があるずいう事実。 これは非垞に重芁な区別であり、芋過ごされがちです。 ドキュメントを曞くずきは、パッケヌゞのナヌザヌの目を通しおそれを芋おください。



さお、簡朔さ、詩、抂念䞻矩の基準を満たす他の仮定を思い付くこずができたら、気軜に提案しおください。



go-proverbs.github.io



スラむドオリゞナルではない、真 speakerdeck.com/ajstarks/go-proverbs



ビデオ




All Articles