
この質問を見たとき、一瞬ぼんやりしてしまいました。Goでできて、.NETではできないこと、あるいはC#ではダメなことってあるのでしょうか?
では、細かく分解して、Goが勝っているかもしれないポイントを一つずつ分析してみましょう。
1. クロスコンパイル
Windowsプラットフォーム上でLinuxやMac向けのプログラムをコンパイルする場合、Goはもちろん可能ですが、C#もpublishの仕組みを使えば同じように実現できます。
2. オブジェクト指向
おそらく「Goは.NET並みのレベルに到達できるのか?」という議論だと思います。
Goのinterfaceとstructを使えば「実装と宣言」を分離できますが、C#のinterfaceも同様に可能です。ただしGoほど完全に分離されているわけではなく、これがC#の「弱点」と言えるかもしれません。
その一方で、C#の厳密なInterface/Implementの仕組みは、大規模プロジェクトの安全性を確保し、Goのプログラムでinterfaceが乱用されるような状況を防いでくれます。
また、個人的にはC#のクラス機構のほうが自分のプログラミング思考に合っています。少し古いプログラマーは皆、同じような経歴をたどっており、C→C++、そしてJavaへと、ずっとクラスに守られてきました。
長年クラスを書いてきた身としては、たとえGoを使っていても、それはクラスの魂です。
お笑いになるかもしれませんが、私はたいていstructを定義してからメソッドを定義し始めます。こんな感じです:
type Person {
Name string
Age int
}
// 以下、C++モード開始
func (p Person) CalSome(){
}
func (p *Person) IncSome(){
}
// 呼び出し開始
p := Person{
Name:"ttt",
age:45
}
p.IncSome()
よく考えてみると、これとC#の違いはどれほど大きいのでしょうか。個人的には大差ないと思います。
プログラムの「美しさ」という点では、むしろC#のほうが美しいです!
3. 逆コンパイル
以前であれば、確かにGoでWindowsプラットフォーム上でコンパイルしてExeファイルにした後、そのソースコードを逆コンパイルするのはほぼ不可能でした。
一方、C#では非常に簡単です。これが.NETコードだと分かっていれば、ILDASM、dotPeek、ILSPYなど、多くのツールを使って逆コンパイルできます。
もちろんJavaにもjdなどの逆コンパイルツールがあります。
現在.NETがAOTオプションを提供したことで、逆コンパイルの難易度は大幅に向上しました。AOTコンパイルされたコードはすべてネイティブコードになるため、逆コンパイルはGoと同じくらい難しくなります。
「分久必合、合久必分」、言語間の機能も互いに「参考」し合っているのです。
4. Dockerイメージサイズ
これはGoが勝っている分野でしょう。
Alpineをベースイメージとして使用し、先日あるイメージを作成したところ、docker imagesで13MBと表示されました。
「scratch」イメージをベースにすれば、さらに小さくなるはずです。
一方、.NETのAspNetCoreは明らかに大きく、30MB以上になります。
多くのDockerイメージをk8sで実行する必要がある場合、間違いなくGoイメージの方が占有量が低くなります。
5. 親(Father)
最後に、親を比べてみましょう。何しろ、金持ちの子供はローマに生まれ、普通の人の人生の目標はローマそのものなのですから。
Goの親はGoogle。
.NETの親はマイクロソフト。
一方はやや古い「新時代の覇者」、もう一方は「昔の姿を新しく変えた」オールド・マネー。
比較すると、Googleの方が優勢かもしれません。
この点において、Goが僅かに勝ち、.NETが僅かに負けています。
もちろん、親の影響も大きく、.NETは誕生当初からあまり好かれず、Javaからの圧力を受けていました。
この点は、パンダ国(中国)では特に顕著です。
現在、パンダ国の大企業では、テンセントが主力言語をC/C++から全面的にGoに移行しています。バイトダンスではGoがデフォルトの第一選択言語であり、特別なニーズがなければ通常Goで開発し、RustでさえGoの後ろに位置しています。七牛の許志偉氏は一貫してGoの熱狂的な支持者であり、Go+という言語(Goの改良版)まで開発しています。
今のところ、アリババがJava陣営を堅持している以外は、Goは中国の大企業で非常に普及しています。それに対して.NETはビジネス的に厳しく、産業制御、MES、IoT、HISなどの分野でなんとか生き延びており、給与も楽観視できません。
パンダ国では、人気の面でGoが明らかに.NETに勝っています。
まとめ
構文や機能の観点から言えば、Goでできることは.NETでもでき、さらにより優れている場合もあります。
サイズの観点では、Goはより軽量です。何しろ.NETは長年の蓄積があり、容易には変えられません。
人気の観点では、特にインターネット分野においてGoの使用率が.NETを圧倒しています。一方、工場などの非インターネット分野では.NETの方がより普及しています。
新進気鋭の藺相如(りんしょうじょ)、老練な廉頗(れんぱ)。彼らは将棋を打って和解できるのでしょうか?
私は明月(ミンユエ)。
インターネットの語り部です!