なぜPythonからgoに移動したの?

3308 ワード

pythonと言って、今なぜgoを選んだのかを話します.実はPythonのほかにもJava、PHP、Lua(openresty)という選択肢がありましたが、結局goを選びました.
JavaもPHPも最高のプログラミング言語(みんなそう争っている)ですが、私はもっと簡単な言語に傾いています.openrestyは、性能は強いですがluaはダイナミック言語で、前に言ったダイナミック言語にもいくつかの問題があります.最後に、元金山許式偉用のgo、前速盤アーキテクチャのネギ頭も使っているgoなので、私たちは自然にgoを選びました.
goは完璧ではなく、私たちがツッコミを入れる価値のある場所です.
  • error、いいでしょう.もし言語の潔癖な学生が本当にgoの文法に耐えられないかもしれません.特に約束の最後の戻り値はerrorです.プロジェクトにはよくこのようなコードがあふれています.
      if _, err := w.Write(data1); err != nil {
          returun err
      }
      if _, err := w.Write(data2); err != nil {
          returun err
      }
    道理で、javaのプログラマーが構成を書いている間に、goプログラマーはほとんどのコードを書いていましたが、javaのプログラマーが書き終わったとき、goプログラマーはerr != nilを書いていました.この点、errors-are-valuesは良い解決策をお勧めします.
  • パッケージ管理.goのパケット管理が弱すぎて、go getが1つしかありません.つまり、外部ライブラリをうっかり更新してしまうと、既存のコードコンパイルができない可能性があります.godepや今出てきたgbなど、オープンソースの案はたくさんありますが、公式ではありません.Googleもvendorメカニズムでサードパーティライブラリを管理しているようです.go 1.5以降のバージョンでこの問題をうまく処理してほしい.
  • GC.JAvaのGCは20年も発展していますが、goはまだこんな時間なので、gc鉄は完璧ではありません.だから私たちは依然として好きなようにコードを書くことができません.そうしないと、大きな要求量の下でgcがサービス全体をカートンさせる可能性があります.だから时には、オブジェクトプールを使うべきで、メモリプールの必ず使うべきで、コードは少し丑いですが、どうやら性能が上がっています.
  • 汎用、goはintefaceがありますが、汎用の欠如は私たちに1つの機能を実現する時に大量の重複コードを書くことができます.例えばint 32とint 64タイプのsortのように、私たちはそれぞれ2つのコードを書かなければなりません.冗長です.go 1.4以降はgo generateのサポートがありますが、このようなものはgoのASTライブラリに基づいて手動で関連parserを書く必要があり、難易度も高いです.オープンソースのgenerateもたくさん実現していますが、結局公式ではありません.

  • もちろんツッコミに値するところはたくさんありますが、一つ一つ挙げませんが、goには依然としてメリットがあります.
  • 静的言語、強いタイプ.静的コンパイルは,goの強いタイプ,さらには暗黙的なタイプ変換をサポートしないまで,大量のエラーを検出するのに役立つ.コードを書くのは違和感がありますが、間違いの可能性を減らしました.
  • gofmt、これは私が知っている最初の公式に統一フォーマットコードツールを提供する言語であるはずです.gofmtがあれば、みんなのコードは同じようになって、括弧を使って最後に置くのか、それとも新しい行を開くのかという卵痛のコードスタイルの議論はありません.みんなのコードスタイルが同じなので、goのコードを見るのは簡単です.
  • の生まれつきの並列サポートは、goroutineとchannelのため、goで分散アプリケーションを書き、同時プログラムを書くのは異常に容易である.卵痛のないcallbackによるコードロジックの割れは,コードロジックが順番である.
  • 性能、goの性能はc、c++およびopenrestyに追いつかないかもしれませんが、本当に強いです.私たちのプロジェクトでは、単機でgoのプロセスを導入し、以前の200 pythonプロセスでやったことに完全に耐えられ、CPUとMEMの占有量がより低くなりました.
  • は次元配置を運営し、直接バイナリにコンパイルし、サーバーの上に投げればいい.pythonがインストールする環境よりずっと簡単だ.もちろん、cgoがあれば、対応するダイナミックライブラリを捨てる必要があります.
  • 開発効率、goは静的言語ですが、個人的には開発効率が本当に高いと感じ、直感的にはpythonに匹敵します.私個人にとって、最高の例はgoで非常に多くのオープンソースコンポーネントを迅速に開発したことです.例えば、ledisdb、go-mysqlなどですが、これらの最初のバージョンは短い時間で完成しました.私たちのプロジェクトにとって、私たちもgoで1ヶ月で最初のバージョンを再構築し、発表しました.

  • 実際のプロジェクトのいくつかのGo Tips
    これまで、私たちのほとんどのサービス側のプロジェクトはgoに転向してきました.もちろん、使用中にもいくつかの問題が発生しました.経験の共有でしょう.
  • godep、私たちはgodepを使用してサードパーティのライブラリ管理を行いますが、godep私が出会った最大の穴はbuild tagの問題で、1つのファイルにbuild tagがあれば、godepはこのファイルを無視する可能性が高いです.
  • IO deadlineは、自分でアプリケーション層で処理できるものはすべて自分で処理すればgoのdeadline内部はtimerで制御されるが、timer内部はarrayで実現されるheapを採用し、グローバルに1つのロックを共用し、大きな同時量でtimer数が多すぎるとtimeoutの変動が頻繁になり、性能の問題を引き起こしやすい.
  • GC、この前にも言いましたが、メモリプール、オブジェクトプールを多用しています.また、オブジェクトのライフサイクルがgoroutineと一致すれば、性能の向上も悪くないことがわかりました.goのグループで質問したこともありますが、goroutineの8 kスタックに割り当てられているオブジェクトもあるので、一緒に回収しても追加GCはないのではないかと推測されています.
  • Go gob、RPCサービスをするならgobは良い選択ではありません.まずpythonのpickleとは通用しません.それから異なるシステムのデータを転送するために、どんなパッケージもタイプの詳細を持っていなければなりません.sizeは大きすぎます.goの中にはまだ公式のRPC案がありませんが、gRPCは上位の可能性があるようです.

  • まとめ
    私は今goを選んだが、これから他の言語を試しないという意味ではない.言葉に良し悪しはなく、問題を解決してくれるのは良い言葉です.しかし、少なくとも長い間、私はgoで開発していました.Let’ go!(転載先http://siddontang.com/2015/05/16/why-python-to-go/)