PythonからGoへの道-ヒントとリソースの共有





翻訳者から: PythonからGoへの移行に関するIlad Leevの記事が翻訳されています この記事は、初心者のプログラマーだけでなく、何らかの方法でGoに興味があるすべての人にとっても有用です。



私はPythonが好きです。 この言語は、過去5年間私のお気に入りでした。 彼はフレンドリーで、効率的で、習得しやすいです。 ほぼすべてに使用:単純なスクリプトの作成やWeb開発からデータの視覚化と機械学習まで



Goの漸進的な「成熟」、広範なコミュニティ、およびテストが成功した後にますます多くの企業がこの言語を採用しているという事実により、それに注意を向けて文献を掘り下げました。 しかし、この投稿はどちらが良いかについてではありません-PythonまたはGo :ネット上で多くの比較があります。 私の意見では、すべてはアプリケーションに依存します。 Goを選んだ理由についてお話します。トピックに興味のあるすべての人に役立つリソースへのヒントとリンクを提供します。



Skillboxの推奨事項: ゼロからの 実践的な Python開発者



「Habr」の読者には、「Habr」プロモーションコードを使用してSkillboxコースに登録すると10,000ルーブルの割引があります。









観察



旅の始めに最初にしたことは、優れた公式のTour Of Goチュートリアルを勉強することでした。 言語の構文の理解を提供します。



知識を向上させるために、「 Go for Python Programmers 」という本も読んで、次の段階である試行錯誤に進むことができました。



Pythonで使用した通常の関数(JSONのシリアル化またはHTTP呼び出しの操作)を使用して、Goでそれらを記述しようとしました。 このような視覚的な比較のおかげで、言語間の主な違いを特定することができました。



プロジェクトのレイアウト



まず、Pythonでは特定のディレクトリ階層は必要ありませんが、Goでは必要です。



Goは「標準」レイアウトを使用しますが、これはもう少し複雑で、より多くの作業が必要です。 その一方で、結果として、モジュール構造を使用した、適切に構造化されたコードベースが得られ、プロジェクトを展開するときに、コードは厳密に順序付けされたままになります。



公式の「 Goコードの書き方 」チュートリアルでは、作業を整理する方法について説明しています。



静的な強い型付け



Goは静的に型付けされており、PythonやRubyのような動的に型付けされた言語に慣れている人にとっては困惑するでしょう。



動的言語はエラーを起こしやすいことは間違いありません;開発者は入力データをチェックするのにより多くの努力が必要です。 例は、2つの整数の合計を計算する関数です。 文字列を関数に渡すと(それほどまれではありません)、TypeErrorエラーが発生します。



これはGoでは発生しません。ここでは、各変数と関数の型と、関数が返す変数の型を宣言する必要があるためです。



最初は面倒でした。このGo機能が遅くなっているように思えましたが、実際には、すべてを宣言すると時間を節約し、エラーの可能性を減らすことがわかりました。



ネイティブ並行性



Goには、ルーチンとパイプを使用したネイティブの並行処理のサポートがあります-これは便利です。



チャンネルの概念は、最初は少しわかりにくいようです。 しかし、時間が経つにつれて、それはより理解しやすくなり、あなたは新しい機会を楽しみ始め、それらと積極的に協力します。



ここに、 イヴァン・ダニリュクが言ったすべての視覚化があります。

package main func main() { // create new channel of type int ch := make(chan int) // start new anonymous goroutine go func() { // send 42 to channel ch <- 42 }() // read from channel <-ch }
      
      









その他の例はこちらこちら



JSONを使用する



まあ、json.loads()はもうありません。 Pythonでは、すべてが単純です。json.loadsを使用しており、問題はありません。



しかし、静的に型付けされた言語であるGoでは、この操作はより複雑になります。



ここで、JSONを使用する場合、すべてが事前定義されています。 指定された構造に収まらないフィールドは無視されますが、それは良いことです。 これは、2者間の事前に合意されたプロトコルと考えることができます。 JSONで受け取ったデータは予期されている必要があり、フィールドとJSONタイプは両当事者によって「合意」されています。

 { “first”: “Elad”, “last”: “Leev”, “location”:”IL”, “id”: “93” }
      
      





 type AccountData struct { First string `json:"first"` Last string `json:"last"` Location string `json:"location"` ID string `json:"id"` }
      
      





もちろん、構造なしでJSONを逆シリアル化することもできますが、可能な限りこれを避け、言語の静的な性質を考慮する必要があります。



GOでのJSONデコードについては、この投稿またはここで 説明してい ます



JSONをgo-structureに変換するのが面倒ですか? 問題ありません、 このツールはあなたのためにすべてを行います



きれいなコード



Goコンパイラは、常にコードをクリーンに保ちます。 未使用の変数はコンパイルエラーと見なされます。 Goは、システムがほとんどのフォーマットの問題を解決できるユニークなアプローチを使用します。 したがって、Goは保存またはコンパイル時にgofmtプログラムを実行し、フォーマットを個別に修正します。



変数を気にしますか? わかった _(アンダースコア)を使用して、空のIDに割り当てます。



この言語での作業のこの部分のmastridチュートリアルは、「 Effective Go 」からの情報です。



適切なライブラリとフレームワークを見つける



Flask、Jinja2、Requests、さらにはKazoo with PythonなどのPythonでフレームワークとライブラリを使用したため、Goに適したものが見つからないのではないかと心配しました。



しかし、コミュニティはすでにこれらの問題を解決しています。言語には独自のライブラリがあり、以前使用したものを完全に忘れることができます。



これが私のお気に入りです。



Pythonリクエスト=> net / http



net / httpは、HTTPクライアントおよびサーバーの便利で使いやすい実装を提供します。



フラスコ+ Jinja2 =>ジン



Ginは、パスパラメーター、ダウンロード可能なファイル、グループルーティング(/ api / v1、/ api / v2)、静的ファイルを提供するカスタムログ形式、HTMLレンダリング、非常に強力なカスタムミドルウェアなど、非常にシンプルなAPIを備えたHTTP Webフレームワークです。

このベンチマークを評価てください。



CLI作成=>コブラ



Cobraは、強力なCLIアプリケーションを作成するためのライブラリであり、アプリケーションとバッチファイルを生成するためのプログラムです。

Cobraは、Kubernetes、etcd、OpenShiftなど、多くの大規模なGoプロジェクトで使用されています。



以下に、私が強くお勧めするライブラリをいくつか示します。Viper、Gonfig、この素晴らしいリストはAwesome-Goです。



その他の有用なリソース



[1] Francesc Campoy-このYouTubeチャンネルGitHubプロファイルを評価する必要があります



[2] GopherCon-ビデオ



[3] Go Webの例



[4] Golang WeeklyGopher AcademyGolang News -Twitterアカウント。



まとめると



5年間のPythonユーザーとして、Goに行くのは苦痛になるのではないかと心配していました。



しかし、いいえ:Goコミュニティの基盤があり、言語の機能を拡張および補完するだけでなく、移行に役立つさまざまな有用なリソースもあります。



Goは急速に成長しており、Googleがそれをクラウドアプリケーションとインフラストラクチャを作成するための主要言語にできることを願っています。



今すぐ参加しよう!







Skillboxの推奨事項:






All Articles