Go 2ぞの途䞭

GopherCon 2017からのRuss Coxのブログ投皿ずレポヌトの翻蚳。Go2の議論ず蚈画を支揎するためにGoコミュニティ党䜓に電話をかけたす。ビデオレポヌトは公開埌すぐに远加されたす。



2007幎9月25日、Rob Pike、Robert Griesmeyer、Ken Thompsonが新しい蚀語を䜜成するアむデアに぀いお数日間議論した埌、Robは「Go」ずいう名前を提案したした。



翌幎、Ian Lance Taylorず私はチヌムに加わり、5人で2009幎11月10日に公開された2぀のコンパむラず暙準ラむブラリを䜜成したした。



次の2幎間で、新しいオヌプン゜ヌスゎヌファヌコミュニティの助けを借りお、さたざたなアむデアを実隓および詊行し、Goを改善し、2011幎10月5 日に提案されたGo 1の蚈画的なリリヌスに導きたした。



Goコミュニティのさらに積極的な支揎を受けお、この蚈画をレビュヌおよび実装し、最終的に2012幎3月28 日にGo 1をリリヌスしたした 。



Go 1のリリヌスは、ほが5幎間の創造的で必死の努力の集倧成であり、名前の遞択ずアむデアの議論から安定した既補の蚀語ぞず導きたした。 圌はたた、倉化ずボラティリティから安定性ぞの明確な移行を瀺したした。


Go 1に至るたで、私たちは他の人のGoプログラムを壊す蚀語をほが毎週倉曎したした。 これにより、Goが本番環境で䜿甚されなくなり、蚀語の倉曎に同期しお、誰も毎週プログラムを曞き盎さないこずがわかりたした。 Go 1の発衚でブログ投皿に曞かれたように、蚀語の䞻な動機は、信頌できる補品、プロゞェクト、出版物ブログ、チュヌトリアル、レポヌト、曞籍を䜜成するための安定した基盀を提䟛するこずでした。長幎経っおも


Go 1がリリヌスされた埌、Goが䜜成された実皌働環境で実際にGoを䜿甚するのに時間がかかるこずがわかりたした。 蚀語の倉曎からプロゞェクトでのGoの䜿甚ず実装の改善に明確に移行したしたGoを倚くの新しいシステムに移怍し、パフォヌマンスクリティカルな郚分をほがすべお曞き盎しお、Goをさらに効率化し、 競合怜出噚などの䞻芁ツヌルを远加したした。


珟圚、Goを䜿甚しお巚倧で高品質の生産システムを䜜成した5幎の実際の経隓がありたす。 䜕が機胜しお䜕が機胜しないかの感芚を䞎えおくれたした。 そしお今こそ、Goの進化ず開発の新しい段階を開始するずきです。 今日、Go開発者コミュニティの皆さん、GopherConルヌムに今ここにいるか、Goブログでビデオを芋るか、これを読むか、Go 2の蚈画ず実装にご協力ください。


次に、Go 2が盎面する課題に぀いお説明したす。 私たちの制限ず障害; プロセス党䜓。 Goでの経隓を説明するこずの重芁性。特に、解決しようずする問題に関連する堎合。 可胜な解決策; Go 2の実装方法ず、これをどのように支揎できるか。


タスク


今日のGoの課題は、2007幎ずたったく同じです。 システムのスケヌラビリティ、特にクラりドのサヌバヌずしお広く衚珟されおいる他の倚くのサヌバヌず察話するマルチスレッド同時システムのスケヌラビリティ、および開発のスケヌラビリティ、特に倚くのプログラマが䜜業する倧芏暡なコヌドベヌスのスケヌラビリティの管理においおプログラマをより効率的にしたい、倚くの堎合リモヌト-最新のオヌプン゜ヌス開発モデルなど。


これらの皮類の拡匵性は、あらゆる芏暡の䌁業に今日存圚しおいたす。 5人のスタヌトアップでも、他瀟が提䟛する倧芏暡なクラりドAPIサヌビスを䜿甚し、自分で䜜成した゜フトりェアよりも倚くのオヌプン゜ヌス゜フトりェアを䜿甚できたす。 システムのスケヌラビリティず開発のスケヌラビリティは、Googleだけでなく、スタヌトアップにも関連しおいたす。


Go 2の目暙は、スケヌラビリティを劚げる䞻芁なGoの問題を修正するこずです。


これらのタスクの詳现に぀いおは、Rob Pikeの2012幎の蚘事「 Go at GoogleLanguage Design in Service of Software Engineering 」およびGopherCon 2015レポヌト「 Go、Open Source、Community 」を参照しおください 。


障害物


Goの前のタスクは倉曎されおいたせんが、障害は倉曎されおいたす。 䞻なものは、Goの既存の䜿甚です。 掚定によるず、珟圚䞖界には少なくずも50䞇人のGoプログラマヌがいたす。぀たり、Goの゜ヌスコヌドず少なくずも10億行のGoコヌドを含む玄100䞇のファむルです。 これらのプログラマずこの゜ヌスコヌドはGoの成功を衚しおいたすが、同時にGo 2の䞻な障害でもありたす。


Go 2は、これらすべおの開発者に貢献するはずです。 私たちは圌らに叀い習慣を忘れお、それの利益が本圓に䟡倀がある堎合にのみ新しい習慣を孊ぶように頌たなければなりたせん。 たずえば、Go 1の前は、むンタヌフェむスタむプerrorメ゜ッドはStringず呌ばれおいたした。 Go 1では、 Error名前を、 Errorの型を、フォヌマットされた文字列衚珟を持぀単玔な他の型ず区別するために名前を倉曎したした。 errorむンタヌフェむスを満たす型を実装したら、考えずにError代わりにStringメ゜ッドを呌び出したしたが、もちろんコンパむルされたせんでした。 5幎経っおも、私はただ叀いやり方を完党に忘れおいたせん。 この明確な名前倉曎の䟋は、Go 1にずっお重芁か぀有甚な倉曎でしたが、実際には非垞に適切な理由がなければGo 2にずっお砎壊的すぎるでしょう。


Go 2は、既存のGo 1コヌドず仲良くなるはずです。 Go゚コシステムを分割しおはいけたせん。 パッケヌゞがGo 2で䜜成され、Go 1でパッケヌゞがむンポヌトされる、たたはその逆の混合プログラムは、数幎の移行期間䞭にスムヌズに動䜜するはずです。 これを達成する方法はただわかっおいたせん。 ここでは、自動修正やgo fixなどの静的分析のためのツヌルが確実に圹割を果たしたす。


壊滅的な圱響を枛らすには、各倉曎に非垞に慎重な思考ず蚈画、およびツヌルが必芁になりたす。その結果、実行できる倉曎の数も制限されたす。 おそらく2〜3回行うこずができたすが、確かに5回たでです。


ただし、おそらく、より自然な蚀語での識別子の解決や、バむナリ圢匏の数倀のリテラルの远加など、小さな補助的な倉曎は考慮したせん。 このような小さな倉曎も重芁ですが、正しく行う方がはるかに簡単です。 今日は、゚ラヌ凊理の远加サポヌト、䞍倉たたは読み取り専甚の倀の远加、ゞェネリックの䜕らかの圢匏、たたはただ衚明されおいないその他の重芁なトピックの远加など、考えられる倧きな倉曎に焊点を圓おたす。 これらの倧きな倉曎のほんの䞀郚を行うこずができたす。 そしお、それらを非垞に慎重に遞択する必芁がありたす。


プロセス


これは重芁な問題を提起したす。 Goの党䜓的な開発プロセスずは䜕ですか


Goの初期の頃、私たちが5人しかいなかったずき、私たちはガラスの壁で区切られた2぀の隣接するオフィスで働いおいたした。 å…šå“¡ã‚’1぀の郚屋に集め、問題に぀いお話し合い、それぞれの堎所に戻っおすぐに゜リュヌションを実装するのは非垞に簡単でした。 実装䞭に䜕らかの困難が生じた堎合は、簡単に集たっお再床話し合うこずができたした。 ロブずロバヌトのオフィスには小さな゜ファずホワむトボヌドがあり、通垞は私たちの䞀人が入っお黒板に䟋を曞き始めたした。 原則ずしお、この䟋が䜜成されるたでに、他の党員が珟圚のタスクを䞀時停止する瞬間を芋぀け、座っおコヌドに぀いお議論する準備ができおいたした。 もちろん、このような非公匏のアプロヌチは、今日のGoコミュニティの芏暡に合わせお拡匵するこずはできたせん。


Goがオヌプン゜ヌスでリリヌスされた埌の私たちの仕事の䞀郚は、この非公匏のプロセスを50䞇人のナヌザヌ向けのより正匏なメヌリングリストずタスクトラッカヌの䞖界に移怍するこずでしたが、プロセス党䜓がどのように機胜するかを明瀺的に䌝えたこずはないようです。 おそらく、私たちはそれに぀いお完党に意識的に考えたこずすらなかったでしょう。 ただし、振り返っおみるず、Goが開始されおからのプロセスの基本蚈画は次のようになっおいるず思いたす。



最初のステップは、Goを䜿甚しお経隓を積むこずです。


2番目のステップは、Goで問題を特定し、おそらく解決策を必芁ずし、それを衚珟し、他の人に説明し、曞面で提瀺するこずです。


3番目のステップは、問題の解決策を提案し、他の人ず議論し、この議論に基づいお解決策を怜蚎するこずです。


4番目のステップは、怜蚌の結果に基づいお、゜リュヌションを実装し、テストし、改善するこずです。


最埌に、5番目のステップは、蚀語たたは暙準ラむブラリ、たたは人々が毎日䜿甚するツヌルのセットに゜リュヌションを远加するこずにより、゜リュヌションを実装するこずです。


同じ人がこれらのすべおのステップを自分で行う必芁はありたせん。 実際、通垞、すべおの段階で倚くの異なる人々が関䞎しおおり、同じ問題に察しお倚くの解決策を提案できたす。 たた、各段階で、さらに先に進たないで、1぀前に戻るこずを決定できたす。


そしお、私たちはこのプロセス党䜓に぀いお話したこずはないず思いたすが、郚分的に説明したした。 2012幎にGo 1をリリヌスし、Goの䜿甚を開始しお倉曎を停止するずきだず蚀ったずき、最初のステップを説明したした。 2015幎にGoの提案プロセスの倉曎を導入したずき、ステップ3、4、および5を説明したしたが、2番目のステップを詳现に説明したこずはないので、今からやりたいず思いたす。


Go 1の開発ず蚀語倉曎の停止の詳现に぀いおは、2012幎のOSCONのRob PathずAndrew Gerrandの「 The Path to Go 1 」を参照しおください。提案プロセスの詳现に぀いおは、2015幎のGopherConのAndrew Gerrandを参照しおください「 Goの䜜成方法 」およびプロセス自䜓のドキュメント 


問題の説明



問題の説明は2぀の郚分で構成されおいたす。 最初の郚分-簡単な郚分-は、単に問題が実際に䜕であるかを衚明するこずです。 私たち開発者は、䞀般に、これが非垞に埗意です。 最終的に、私たちが曞くすべおのテストは、解決する必芁がある問題の声明であり、さらに、コンピュヌタヌでさえ理解できるような正確な蚀語で曞かれおいたす。 2番目の郚分-難しい郚分-は、問題の重芁性を十分に説明するこずで、他のすべおの人が問題の解決ずサポヌトに時間を費やすべき理由を理解できるようにするこずです。 問題の正確な定匏化ずは異なり、私たちはそれらの重芁性を頻繁に説明せず、あたり埗意ではありたせん。 コンピュヌタヌは、「このケヌスがテストにずっお重芁なのはなぜですか」 これがたさにあなたが解決しなければならない問題であるず確信しおいたすか この問題の解決策は、あなたが察凊すべき最も重芁な仕事ですか」 おそらくい぀かはそうなるでしょうが、確かに今日はそうではありたせん。


2011幎の叀い䟋を芋おみたしょうerror.Valueを蚈画したずきにos.Errorからerror.Valueに名前を倉曎したこずに぀いお曞きたした。


error.Value
rsc䜎レベルラむブラリにある問題は、すべおがos.Errorのために「os」に䟝存しおいるため、osパッケヌゞ自䜓が䜿甚できるこずを実行するのが難しいこずです時間の䟋ずしお。Nano 。 os.Errorでない堎合、osパッケヌゞに䟝存する他のパッケヌゞはそれほど倚くありたせん。 たずえば、hash / *やstrconv、文字列やバむトなどの玔粋な蚈算パッケヌゞでは、これがなくおもかたいたせん。 このAPIのようなもので゚ラヌパッケヌゞを定矩するためにただ䜕も提䟛せずに調査する予定です。

パッケヌゞ゚ラヌ
タむプ倀むンタヌフェむス{Stringstring}
func News string倀

問題の簡単な1行のステヌトメントから始たりたす。䜎レベルのラむブラリでは、すべおがos.Errorために「os」をむンポヌトしたす。 次は、問題の重芁性を説明する5行です。「os」が䜿甚するパッケヌゞはAPIで゚ラヌタむプを䜿甚できたせん。他のパッケヌゞは、オペレヌティングシステムの動䜜に関係しない理由でosに䟝存したす。


これらの5行は、問題に泚意を払う䟡倀があるず玍埗させたすか それは、私が省略したコンテキストをどれだけうたく埋めるこずができるかによっお決たりたす。理解するには、他の人が知っおいるこずを予枬できる必芁がありたす。 圓時の聎衆-このドキュメントを読んでいるGoで䜜業しおいるGoogleチヌムの他の10人-は、これらの50語で十分でした。 昚秋のGothamGoカンファレンスで同じ問題を聎衆に提瀺するには、より倚様な経隓を持぀聎衆に-より倚くのコンテキストを提䟛する必芁があり、既に200の単語に加えお、実際のコヌド䟋ず図を䜿甚したした。 そしお、問題の重芁性を説明しようずしおいる珟代の囲communityコミュニティは、コンテキストを远加する必芁があるこずは事実です。さらに、たずえば同僚ずの䌚話で陀倖される可胜性のある特定の䟋によっお瀺されたす。


問題が本圓に重芁であるこずを他の人に玍埗させるこずが重芁なステップです。 問題がそれほど重芁ではないず思われる堎合、ほずんどの゜リュヌションは高すぎるように芋えたす。 しかし、非垞に重芁な問題に぀いおは、ほずんどの堎合、それほど高䟡ではない゜リュヌションがいく぀かありたす。 決定を䞋すかどうかに぀いお意芋が䞀臎しない堎合、これは通垞、解決する問題の重芁性に぀いお意芋が䞀臎しないこずを意味したす。 これは非垞に重芁なポむントであるため、少なくずも振り返っおみるず、最近の䟋を2぀瀺しお、それをうたく説明したいず思いたす。


䟋うるう秒


最初の䟋は時間に関連しおいたす。


むベントにかかる時間を枬定したいず想像しおください。 最初に開始時間を蚘憶し、むベントを発生させ、終了時間を蚘録しおから、終了時間から開始時間を枛算したす。 むベントに10ミリ秒かかった堎合、枛算操䜜は正確に10ミリ秒を返し、堎合によっおはわずかな枬定誀差をプラスたたはマむナスしたす。


  start := time.Now() // 3:04:05.000 event() end := time.Now() // 3:04:05.010 elapsed := end.Sub(start) // 10 ms 

この明らかな手順は、「 うるう秒 」の間は機胜しない堎合がありたす。 時蚈が地球の昌間の回転ず完党に同期しおいない堎合、特別なうるう秒-正匏には23:59ず60秒-が真倜䞭の盎前に挿入されたす。 うるう幎ずは異なり、うるう秒には簡単に予枬できるパタヌンがないため、プログラムやAPIでの䌚蚈凊理を自動化するこずは困難です。 特別な61秒を導入する代わりに、オペレヌティングシステムは通垞、真倜䞭の盎前に時蚈を1秒戻すこずでうるう秒を実装し、2359が2回発生するようにしたす。 このようなクロックシフトはクロックを戻すように芋え、10ミリ秒のむベントの枬定倀が990ミリ秒の負の倀になるこずがわかりたした。


  start := time.Now() // 11:59:59.995 event() end := time.Now() // 11:59:59.005 (really 11:59:60.005) elapsed := end.Sub(start) // –990 ms 

通垞の時蚈はそのような時間シフト䞭のむベントの継続時間を枬定するのに䞍正確であるため、オペレヌティングシステムは2番目のタむプのクロックを提䟛したす。単調なクロックは単に秒をカりントし、倉曎たたはシフトしたせん。


この非暙準のクロックシフトによっおのみ、モノトヌン時蚈は、モノトヌンずは異なり珟圚の時刻を衚瀺できる通垞の時蚈よりも特に優れおいるわけではありたせん。 したがっお、簡単にするために、Go 1のGoパッケヌゞtime APIは、通垞のコンピュヌタヌクロックにのみアクセスできたす。


2015幎10月に、特にうるう秒の堎合、Goプログラムがそのようなクロックシフト䞭にむベントの期間を誀っお返すずいうバグレポヌトが登堎したした。 提案された゜リュヌションは、レポヌトのタむトルでもありたした「単調な時蚈にアクセスするための新しいAPIを远加する」。 それから私は、その問題はそのための新しいAPIを䜜成するほど重芁ではないず䞻匵したした。 数か月前、2015幎半ばのうるう秒で、アカマむ、アマゟン、およびGoogleは、この䜙分な秒が終日「スミア」され、時蚈を戻す必芁がないように時蚈の速床を萜ずすこずを孊びたした。 この「スミア・セカンド」アプロヌチの広範な䜿甚により、䞀般に時蚈を取り陀くこずが可胜になり、問題が自然に消えるずいう事実にすべおが行き着きたした 。 察照的に、Goに新しいAPIを远加するず、2぀の新しい問題が远加されたす。これら2぀のタむプのりォッチに぀いお説明し、どちらを䜿甚するかをナヌザヌに教育し、倚くの既存のコヌドを倉換する必芁がありたす。これは、非垞にたれで、すべおのうち、それは完党に消えたす。


私たちは、問題の解決策が明らかでないずきにい぀ものようにやった-埅ち始めた。 埅機するこずで、より倚くの経隓を積んで問題の理解を深めるこずができ、さらに適切な解決策を芋぀ける時間も長くなりたす。 この堎合、埅機により、Cloudflareの誀動䜜ずいう圢で問題の重倧床の理解が远加されたした。 2016幎末のうるう秒䞭にDNSク゚リの期間を枬定するGoコヌドは、䞊蚘の-990ミリ秒の䟋ず同様に負の倀を返し、これにより、サヌバヌでパニックが発生し、問題のピヌク時にすべおのク゚リの玄0.2が䞭断されたした。


Cloudflareは、たさにGoが䜜成されたクラりドシステムのタむプであり、Goが時間を正確に枬定できなかったために、運甚に倱敗したした。 さらに、これがここでの重芁なポむントである、Cloudflareは圌らの経隓に぀いお曞きたした-John Graham-Cummingはブログ投皿「How and Why Leap Second Affected Cloudflare DNS」を公開したした。 むンシデントの具䜓的な詳现ず詳现、およびGoでの経隓を䌝えた埌、JohnずCloudflareは、うるう秒䞭の䞍正確な枬定の問題が未解決のたたにするには重芁すぎるこずを理解するのに圹立ちたした。 この蚘事の公開から2か月埌、 Go 1.9に登堎する゜リュヌションを開発および実装したしたずころで、 新しいAPIを远加せずにこれを行いたした 。


䟋゚むリアス


2番目の䟋は、Goで゚むリアスをサポヌトするこずです。


過去数幎間、Googleは、C ++、Go、Java、Pythonなどで蚘述された数癟䞇の゜ヌスコヌドファむルず数十億行のコヌドで構成される 、 コヌドベヌス党䜓のAPI移行やバグ修正など、コヌドの倧芏暡な倉曎に焊点を圓おたチヌムを線成したした蚀語。 圌らの仕事から孊んだこずの1぀は、APIの叀い名前を新しい名前に眮き換えるずき、䞀床にすべおではなく、段階的に倉曎を加えるこずができるこずが重芁であるずいうこずです。 これを行うには、叀い名前が新しいこずを意味するこずを宣蚀できる必芁がありたす。 C ++には#defineがあり、typedefず宣蚀の䜿甚によりこれが可胜ですが、Goにはそのようなメカニズムはありたせんでした。 たた、Goの䞻なタスクの1぀は倧芏暡なコヌドベヌスを拡匵できるこずであるため、リファクタリング䞭に叀い名前から新しい名前ぞの䜕らかの移行メカニズムが必芁であり、他の䌁業もコヌドベヌスの拡倧に䌎っおこの問題に遭遇するこずは明らかでした。 Goのベヌス。


2016幎3月に、Robert GriesmeyerずRob PikeずGoがマルチステップコヌドベヌスリファクタリングをどのように凊理できるかに぀いお議論を始め、゚むリアス宣蚀のアむデアを思い぀きたした。 その瞬間、Goがどのように開発されたかにずおも満足しおいたした。 Goの初期の゚むリアスのアむデアに぀いお議論したした-実際、Go仕様の最初のドラフトにぱむリアスを䜿甚した䟋が含たれおいたす -しかし、゚むリアスに぀いお議論するたびに、そしお少し埌にタむプ゚むリアスに぀いおは、なぜそれらが重芁なのかよくわかりたせんでした。アむデアを先送りしたした。 さお、゚むリアスを蚀語に远加するこずを提案したしたが、それは単なる゚レガントな抂念ではなく、非垞に深刻な実甚的な問題を解決し、Goが開発のスケヌラビリティのタスクをよりよく解決するのを助けたからです これがGoの将来の倉曎の良いモデルになるこずを心から願っおいたす。


その春の埌半、ロバヌトずロブは提案を曞き、ロバヌトはGopherCon 2016で短いプレれンテヌションラむトニングトヌクでそれを発衚したした。 次の数か月はかなりあいたいで、Goで倉曎を加える方法の䟋ずしおは圹に立たないでしょう。 その埌孊んだ倚くの教蚓の䞀぀は、問題の重芁性を説明するこずの重芁性でした。


少し前に、問題の本質に぀いお説明し、この問題が発生する方法ず理由に぀いお最小限の情報を提䟛したしたが、この問題があなたに圱響を䞎えるかどうかを特定する方法の具䜓䟋を挙げたせん。 この提案ずレポヌトは、パッケヌゞC、L、L1、C1..Cnを含む抜象的な䟋に基づいお動䜜したしたが、プログラマヌが問題を関連付けるこずができる具䜓的なものはありたせんでした。 その結果、コミュニティの察応の倧郚分は、゚むリアスがGoogleの問題を解決するずいう考えに基づいおおり、それは他の問題ずは関係ありたせん。


Googleで最初にうるう秒を正しく凊理するこずの重芁性を理解しおいなかったように、倧芏暡なリファクタリング䞭のコヌドベヌスの段階的な移行ず修正に察凊する必芁性ず重芁性をGoコミュニティに効果的に䌝えたせんでした。


秋に再び始めたした。 レポヌトを䜜成し、問題を詳现に説明する蚘事を䜜成したした。実際のオヌプン゜ヌスプロゞェクトの倚くの具䜓䟋を䜿甚しお 、この問題はGoogleだけでなくすべおの人に関連しおいるこずを瀺しおいたす。 より倚くの人々が問題を理解し、その重芁性を認識できるようになったので、どの゜リュヌションが最適かに぀いお生産的な議論を開始するこずができたした。 この結果、 タむプ゚むリアスがGo 1.9に含たれ、Goがより倧きなコヌドベヌスでより適切にスケヌリングできるようになりたす。


ストヌリヌを䜿甚する


ここでの教蚓の1぀は難しいこずですが、異なる環境や条件で働いおいる他の人が理解できるように、問題の重芁性を理解可胜な方法で説明するこずが非垞に重芁です。 コミュニティでのGoの䞻芁な倉曎を議論するには、解決しようずする各問題の重芁性を詳述するこのプロセスに特に泚意を払う必芁がありたす。 これを行う最善の方法は、 Cloudflareブログ投皿たたは私のリファクタリング蚘事のように、問題が実際のプログラムたたは実際のシステムにどのように圱響するかを瀺すこずです。


問題を抜象から具䜓に倉換する䜿甚経隓に関するこのようなストヌリヌは、その重芁性を理解するこずを可胜にしたす。 : .


, (generics), , Go . , — , generic-, , (receiver). , , .


, , error , Go , , Go . , .


私は長い間続けるこずができたす。 Go , , Go - . , Go, , , .


Go 2, , Go. , , . Medium , Github Gist ( .md Markdown), Google doc , . , , Wiki: https://golang.org/wiki/ExperienceReports


解決策



, , , , , , , .


, , , , , , Go . 2013 , (“comma-ok”) . , x y , , uint32 , lo, hi = x * y 32 , 32 . , , . .


, Go 1.9 math/bits, :


  package bits // import "math/bits" func LeadingZeros32(x uint32) int func Len32(x uint32) int func OnesCount32(x uint32) int func Reverse32(x uint32) uint32 func ReverseBytes32(x uint32) uint32 func RotateLeft32(x uint32, k int) uint32 func TrailingZeros32(x uint32) int ... 

, , . math/bits , , , , , , math/bits . , .


, Go 1 , (shared) (races) Go , . , , , - , , , . , Go . , — , (race detector) Go. runtime , .


, , .


Go 2



, Go 2?


, - Go 2 , , Go 1. . -, Go 1, , . -, Go 1 Go 2. -, Go 1 Go 2, . -, , . -, , -.


, - Go 1, , , - , Go 1.12 . .


- , Go 1.20, - Go 2. , - , , Go 1.20 Go 2. , Go 1.X Go 2.X, Go 1.X .


, , , Go 1 , , , Go 1 , .




Go 2 , , . , .


. , , Go , , , . , , . - . , , , Go , Go.


ありがずう


Russ Cox, 13 2017



Source: https://habr.com/ru/post/J333346/


All Articles