ビュヌティゎヌ



ゎヌファヌ -ゎヌマスコット







少し前に、サヌドパヌティのプロゞェクトでGoを䜿甚する可胜性の研究を開始し、このプログラミング蚀語の矎しさに単玔に驚きたした。







その開発者は、通垞、動的型付けを行うむンタヌプリタ型蚀語に固有の䜿いやすさず、静的型付けを備えたコンパむル蚀語に兞型的なセキュリティ型安党性、メモリ䜿甚量安党性を組み合わせたパフォヌマンスのバランスをずるこずができたず思いたす。







この蚀語には、最新のシステムの開発に最適な2぀の機胜がありたす。 蚘事の「Strengths」ずいうセクションで、それらに぀いお詳しく説明したす。







それらの1぀は、 ファヌストクラスの同時実行性サポヌトですゎルヌチンずチャネルを䜿甚したす。以䞋で説明したす。 定矩により、競争力により、プロセッサのコアが1぀しかなくおも、CPUの利甚可胜なすべおの電力をより効率的に䜿甚できたす。 Goでは、同じマシン䞊で数十䞇のゎルヌチン軜量スレッドを同時に実行できたす。 チャネルずゎルチンは、サプラむダ-コンシュヌマプロデュヌサ-コンシュヌマメッセヌゞングパラダむムの抂念のフレヌムワヌク内でメッセヌゞの送信に関連するメカニズムを抜象化するため、分散システムの構築においお非垞に重芁です。







Goに戻っお、私はむンタヌフェヌスが本圓に奜きです。 むンタヌフェむスを䜿甚するず、疎結合たたは完党に無関係なコンポヌネントに基づいおシステムを䜜成できたす。 したがっお、コヌドはむンタヌフェむスの皮類に䟝存するこずができ、このむンタヌフェむスを誰がどのように実装するかを実際に心配する必芁はありたせん。 コントロヌラヌは、このコヌドに、すべおの機胜を実装するむンタヌフェヌスに察応する䟝存関係を提䟛したす。 これにより、ナニットテスト甚の優れたアヌキテクチャを䜜成できたす䟝存性泚入を䜿甚。 コントロヌラヌは、必芁なむンタヌフェむスコヌドの実装を挿入暡倣できたす。これにより、その動䜜の正確性をテストできたす。







これらすべおの機胜を考えるず、特にクラりドWebサヌバヌ、CDN、キャッシュなどおよび分散システム、マむクロサヌビスなどの開発に関しおは、Goは玠晎らしい蚀語であるず蚀えるず思いたす。次のプロゞェクトで䜿甚する蚀語を遞択するこずを考えるず、Goを真剣に怜蚎するこずをお勧めしたす。







この蚘事では、蚀語の次の偎面に぀いおお話しする予定です。









はじめに



Goは、Robert Griesemer、Rob Pike、およびKen ThompsonによっおGoogleで䜜成されたオヌプン゜ヌス蚀語です。 この堎合のオヌプン゜ヌスコヌドは、誰もが蚀語の開発に参加し、新しい機胜の開発、バグの修正などを提案できるこずを意味したす。蚀語コヌドはGitHubで入手できたす 。 開発ぞの参加に関するドキュメントは、 ここにありたす 。







なぜ行く



著者らは、新しい蚀語を䜜成する䞻な理由は、゜フトりェア開発に関連しおGoogleで発生する問題を解決したいずいうこずだず蚀いたす。 たた、GoはC ++の代替ずしお開発されたこずにも蚀及しおいたす。







Goのミッションに぀いおRob Pikeが蚀っおいるこずは次のずおりです。







「Goの目暙は、プログラミング蚀語の蚭蚈を研究するこずではありたせん。 開発者ず同僚の䜜業環境を改善するこずにありたす。 Goは、プログラミング蚀語の研究よりも゜フトりェア開発に重点を眮いおいたす。 たたは、蚀い換えるず、Goは䞻に開発目暙に圹立぀ように蚭蚈されおいたす。







Goの䜜成を促したGoogleの問題  https://talks.golang.org/2012/splash.articleから取埗









Goが成功するには、これらの問題を解決する必芁がありたす  https://talks.golang.org/2012/splash.articleから取埗。









察象読者



Goはシステムを構築するための蚀語です。 クラりド゜リュヌションWebサヌバヌ、キャッシュ、マむクロサヌビス、および分散システム競争力サポヌトのために最適です。







匷み



静的型付け







Goは静的な型付き蚀語です。 ぀たり、すでにコンパむル段階で、すべおの倉数、関数の匕数、および戻り倀の型を宣蚀する必芁がありたす。 このアプロヌチは䞍䟿に思えるかもしれたせんが、これはコンパむル時に倚くの゚ラヌが芋぀かるため、実際には利点です。 この芁玠の重芁性は、コマンドのサむズずずもに倧きくなりたす。型宣蚀により、ラむブラリず関数が読みやすくなり、理解しやすくなるためです。







コンパむル速床







Goで蚘述されたコヌドは非垞に高速にコンパむルされるため、コンパむルが完了するたで埅぀必芁はありたせん:)実際、 go run



コマンドはプログラムを非垞に高速に起動するため、最初はむンタプリタ蚀語で䜜業しおいるかのようにコンパむルがたったくないようにさえ思えたす。







実行速床







Goのコヌドは、䜿甚されるOSLinux / Windows / Macず、コンパむルが実行されるマシンのCPUのアヌキテクチャx86、x86–64、ARMなどに䟝存するマシンコヌドに盎接コンパむルされたす。 したがっお、Goプログラムは非垞に高速に動䜜したす。







移怍性







プログラムはマシンコヌドに盎接コンパむルされるため、バむナリファむルは同じオペレヌティングシステムずアヌキテクチャ内で移怍可胜です。







この可胜性は、Goバむナリが静的にリンクされおいるずいう事実、぀たり、プログラムに必芁なすべおの共有ラむブラリがコンパむル段階でバむナリファむルに含たれおいるために発生したす。 動的に、プログラムの実行䞭はリンクしたせん。

これは、デヌタセンタヌの倚数のマシンにプログラムを展開するずきに䟿利です。 バむナリは、たずえばscp



を䜿甚しお任意の数のマシンに単玔にコピヌできたす。ただし、もちろん、OSずタヌゲットシステムのアヌキテクチャ甚にコンパむルされおいる必芁がありたす。 Linuxのむンストヌルされたバヌゞョンに぀いお心配したり、䟝存関係を管理したりする必芁はありたせん。 プログラムはただ起動しお動䜜したす:)







競争力







Goは非垞に競争力のあるサポヌトを提䟛したす。これは、このプログラミング蚀語の最も重芁な利点の1぀です。 Goの競争力メカニズムは、Tony Hoareの「Communicating Sequential Processes」に基づいおいたす。







Goランタむムを䜿甚するず、数十䞇の競合ゎルヌチンを1台のマシンで実行できたす。 Gorutinは軜量の実行スレッドです。 Goは、OSスレッドでゎルヌチンを倚重化できたす。 ぀たり、いく぀かのゎルヌチンは、オペレヌティングシステムの同じスレッドで競合できたす。 Goランタむムは、goroutineの実行を制埡するタスクを持぀特別なスケゞュヌラヌを提䟛したす。







このアプロヌチには2぀の利点がありたす。







  1. 初期化時に、gorutinはスタック䞊で4 KBのみを占有したす。 これは、たずえばオペレヌティングシステムのスレッドに通垞割り圓おられる1メガバむトず比范するず、ごくわずかです。 この数は、1台のマシンで数十䞇の異なるゎルヌチンを競争的に実行する必芁がある堎合に重芁になりたす。 OSストリヌムがこれらの目的に䜿甚される堎合、RAMは非垞に早く終了する可胜性がありたす。







  2. Goは、オペレヌティングシステムのスレッドを䜿甚するJavaのような他の蚀語ず同じように進むこずができたす。 ただし、この堎合、OSスレッド間でコンテキストを切り替えるコストは、異なるゎルヌチン間でコンテキストを切り替えるコストに比べおはるかに高くなりたす。


この蚘事で「競争力」に぀いお繰り返し蚀及しおいるので、Rob Pikeが競争ず䞊行性は2぀の異なるものであるず蚀っおいるビデオを芋るこずをお勧めしたす。 プログラミングにおいお、競合性ずは、䞊列性が独立した蚈算および/たたは䟝存した蚈算の同時実行である堎合に、独立しお実行する䞀連のプロセスを意味するず理解されおいたす。 1぀のコアでは、単䜍時間あたり1぀の操䜜しか実行できないため、同時実行性は利甚できたせん。 ただし、この堎合でも競争は可胜です。 オペレヌティングシステムスケゞュヌラは、さたざたなタむムスラむスでさたざたなプロセス実際には、各プロセスに少なくずもメむンスレッドがあるため、スレッドを開始したす。 したがっお、単䜍時間内に、プロセッサは1぀のスレッドのみによっお占有されたす。 操䜜が高速であるため、耇数のプログラムが同時に実行されおいるようです。 しかし、実際には、すべおが1぀になりたす。







競争力により、䞀床に耇数のこずを凊理し、同時実行性-同時にいく぀かのこずを行うこずができたす。







むンタヌフェヌス







むンタヌフェむスを䜿甚するず、疎結合システムを䜜成できたす。 Goでは、むンタヌフェむスタむプを䞀連の関数ずしお定矩できたす。 そしおそれだけです。 これらの関数を実装する型は、暗黙的にむンタヌフェヌスを実装したす。぀たり、型が特定のむンタヌフェヌスを実装するこずを瀺す必芁はありたせん。 コンパむラはコンパむル時にこれを行いたす。







したがっお、コヌドはむンタヌフェむスの皮類に䟝存するこずができ、このむンタヌフェむスを誰がどのように実装するかを実際に心配する必芁はありたせん。 コントロヌラヌは、このコヌドに、すべおの機胜を実装するむンタヌフェヌスに察応する䟝存関係を提䟛したす。 これにより、ナニットテスト甚の優れたアヌキテクチャを䜜成できたす䟝存性泚入を䜿甚。 コントロヌラヌは、コヌドで必芁なむンタヌフェむスの実装を挿入暡倣できたす。これにより、操䜜の正確性をテストできたす。







マむクロサヌビスアヌキテクチャの面でも利点がありたす。 アプリケヌションが1぀のサヌバヌプロゞェクトの最初にある堎合、その機胜がさたざたなマむクロサヌビスによっお実行されるように蚭蚈したす。各マむクロサヌビスは独自のむンタヌフェむスを実装したす。 したがっお、他のサヌビス/コントロヌラは、内郚的に実装される方法を心配するこずなく、むンタヌフェむスメ゜ッドを呌び出したす。







ガベヌゞコレクション







Cずは異なり、Goは動的に割り圓おられたメモリを解攟する必芁がなく、ダングリングポむンタヌを心配する必芁はありたせん。 ガベヌゞコレクタヌがそれらを凊理したす。







䟋倖なし







自分で゚ラヌを凊理しおください。 Goは、他の倚くの蚀語ずは異なり、䟋倖を凊理するための暙準的なメカニズムがないこずを非垞に嬉しく思いたす。 ここの開発者は、「ファむルを開くこずができたせんでした」などの゚ラヌを自分で凊理する必芁がありたすtry catch



コヌドをラップする方法はありたせん。 ぀たり、プログラマはこれらの゚ラヌを正しく凊理する方法に぀いお考えるこずをお勧めしたす。







玠晎らしいツヌルボックス







Goの最も楜しい偎面の1぀は、そのツヌルです。









これらのツヌルおよびその他のツヌルは、 ここで芋぀けるこずができたす 。







優れた組み蟌みラむブラリ







Goには、珟代の開発者の䜜業を楜にするために蚭蚈された次の組み蟌みラむブラリがありたす。









あらゆる皮類のナヌスケヌスのラむブラリずフレヌムワヌクは、 ここにありたす 。







匱点



ゞェネリック医薬品の䞍足







ゞェネリックを䜿甚するず、埌で指定される型を䜿甚しおアルゎリズムを䜜成できたす。 敎数を゜ヌトする関数を䜜成する必芁があるずしたす。 次に、文字列のリストを゜ヌトする関数が必芁でした。 この時点で、これらの関数のコヌドはほが同じであるこずを理解しおいたすが、敎数のリストを匕数ずしお受け取り、文字列のリストを受け取るこずを拒吊するため、最初の関数は䜿甚できたせん。 䜕もする必芁はありたせん。コヌドを耇補する必芁がありたす。 Goがゞェネリックである堎合、T型の芁玠のリストを゜ヌトする関数を䜜成し、敎数、文字列、および順序付け関数が存圚する他の型に察しお同じ関数を呌び出すこずができたす。 ぀たり、コンパむラはこの型の倀を比范できる必芁がありたす。







Goには、空のむンタヌフェむスむンタヌフェむス{}を䜿甚しおゞェネリックに䌌た機胜を実行する機胜がありたす。 しかし、この゜リュヌションには欠陥がないわけではありたせん。







ゞェネリックは非垞に物議を醞すトピックです。 他の人がゞェネリックをコンパむル時間ずプログラム実行時間の間の劥協を衚すので、蚀語にゞェネリックを含めたくないずきに圌らのために祈るプログラマヌがいたす。







Goの䜜成者は、Goでの䞀般的なメカニズムの実装に関する察話を受け入れおいるず蚀いたす。 しかし、ゞェネリックだけではありたせん。 それらは、他のコンポヌネントず適切に盞互䜜甚する堎合にのみ、蚀語で実装できたす。 Go 2を埅っお、この問題の解決策があるかどうかを確認したしょう。







䟝存関係管理の欠劂







「Go 1 promise」を䜿甚するず、Go 1ずGo 1.9の䞡方でGo蚀語ずそのラむブラリがAPIを倉曎しないこずを確認できたす。コヌドはGo 1.5ずGo 1.9の䞡方でコンパむルする必芁がありたす。 ほずんどのサヌドパヌティラむブラリはこの玄束に埓いたす。 go get github.com/vendor/library



を䜿甚しおgo get



を䜿甚しおGitHubからサヌドパヌティのラむブラリをダりンロヌドするため、masterブランチの最新コヌドのAPIに倉曎がないこずのみを期埅できたす。 たれなサヌドパヌティのプロゞェクトの堎合、ほずんどのラむブラリは圌らの蚀葉を保持しおいるため、これはそれほど悪くはありたせんが、本番ではオプションは最良ではありたせん。







理想的には、䟝存関係をバヌゞョン管理する䜕らかの方法が必芁です。この方法では、䟝存関係ファむルでサヌドパヌティラむブラリのバヌゞョン番号を指定できたす。 この堎合、䜿甚しおいるバヌゞョンには圱響しないため、APIの倉曎に぀いお心配する必芁はありたせん。 埌で違いを調べ、新しいバヌゞョンぞの移行を決定し、必芁に応じおコヌドに適切な倉曎を加え、䟝存ファむルで新しいバヌゞョン番号を瀺すこずができたす。







Goはdepず呌ばれる公匏の実隓を行っおいたすが、これがこの問題を解決するこずを願っおいたす。 おそらくこれはGo 2ですでに発生しおいるでしょう:)







Go 2ぞの移行



Goの䟋で芋た蚀語を䜜成するためのオヌプン゜ヌスのアプロヌチが本圓に奜きです。 Go 2で実装する必芁がある機胜が必芁な堎合は、次の内容のドキュメントを䜜成したす。









著者は提案を怜蚎し、評決を䞋したす。 これらの問題に関する議論は、メヌリングリストず問題远跡システムで公開されおいたす。







私の意芋では、Goの2぀の最も深刻な問題はゞェネリックず䟝存関係の管理です。 䟝存関係管理ずは、リリヌスたたはツヌルキットを操䜜するこずです。 depがこの問題の公匏゜リュヌションになるこずを願っおいたす。 著者がゞェネリックに察する自分の立堎のオヌプン性に぀いお話しおいるずいう事実を考えるず、ゞェネリックは必然的にコンパむル時間たたはランタむムのいずれかを増加させるため、それらをどのように実装するのか非垞に興味がありたす。







囲Philの哲孊



ここで、 Simplicity is Complicatedず呌ばれるRob Pikeのプレれンテヌションから最も蚘憶に残る匕甚を䞎えたい。









可読性は信頌性も意味したす。 蚀語の耇雑さが高い堎合は、デバッグや修正など、コヌドを読み取っお䜜業するためにより倚くの知識ず劎力が必芁です。 たた、新芏参入者は、蚀語の理解をコヌドベヌスの開発に貢献し始めるこずができるレベルたで高めるためにより倚くの時間を費やす必芁があるこずを意味したす。









https://blog.digitalocean.com/get-your-development-team-started-with-go/から取埗







どこから始めるか



Goの配垃ずむンストヌルの手順はこちらにありたす 。







これが公匏の入門ガむドです。 䟋ではGoもお勧めしたす。







本が必芁な堎合は、 Goプログラミング蚀語が最適なオプションです。 Alan AA DonovanずBrian W. Kernighanによっお䜜成された䌝説のCプログラミング蚀語ず同じ粟神で曞かれおいたす。







コミュニティメンバヌず通信したい堎合は、 Gophers Slack Channelに参加できたす。







goを䜿甚するナヌザヌ



倚くの䌁業が Goぞの投資を開始したした。 最も有名なもののいく぀かを次に瀺したす。









プログラムに行く



お時間をいただきありがずうございたす。 この蚘事が気に入ったら、Twitter / Facebookで友達ずリンクを共有しおくれおずおも感謝しおいたす。 Twitterで私を芋぀けるこずができたす https : //twitter.com/kanishkdudeja







参照







  1. オリゞナル Goの矎しさ 。



All Articles