Goを書き始める前に調べたあれこれまとめ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310353/7cced110-ef50-944a-db52-b149e37bf941.png)

#はじめに
Goを書き始める前に、そもそも何で作られたの？何がすごいの？といった疑問に思ったことを調べたので簡単にまとめてみた。

#目次
- Goとは
- Gopherとは
- Goの歴史
- Goの特徴
- Goのトレンド
- Go採用プロダクト
- Goを学ぶには？
- 参考文献

#Goとは

<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/2/23/Go_Logo_Aqua.svg/1200px-Go_Logo_Aqua.svg.png" width=30%> 

「Go」は、<b>Googleによって開発されたプログラミング言語</b>のことです。

2009年に、Googleの社員である「C言語開発者：Ken Thompson氏」、「UTF-8開発者：Rob Pike氏」、「memcached開発者：Brad Fitzpatrick氏」といった、スーパーエンジニアらによってC言語を参考に開発されました。

よく、「Golang」や「Go言語」という呼称が使用されていますが、正式名称は「Go」です。
Goには、「速さ」と「軽量」の意味が込められているんだとか。

#Gopherとは

<img src="https://qiita-image-store.s3.amazonaws.com/0/310353/ee35873d-5ebd-81de-e60e-4c78d93a0ca3.png" width=30%> 

「Gopher（ゴーファー）」は、<b>Goのマスコットキャラクターの名前</b>のことです。

Go愛好家のことも、「Gopher」と呼ぶそうです。
デザインは、ホリネズミという日本ではあまり馴染みのない動物をモチーフにしたんだとか。
ちなみに名前の由来も、ホリネズミの英語名「Gopher」なので、見た目も名前もそのまんまですね。

「Gopher」についてもっと知りたいという方は、是非[「Gopherくん入門」](https://write.kogus.org/articles/S78LHt)をご覧下さい。

#Goの歴史
そもそも、なぜGoが開発されたのか？
Goの歴史（＝誕生の背景）について、簡単に触れます。

グーグルのソフトウェアエンジニアである鵜飼文敏氏の[インタビュー記事](https://tech.nikkeibp.co.jp/it/article/Interview/20100526/348493/)によると、<b>コンパイルが速くて、スクリプト言語的な書き方ができる言語が欲しくてGoが誕生した</b>とのこと。

>Googleの中には検索エンジンや「Google App Engine」など、様々なサーバーがたくさんあるのですが、その中でスピードを要求する部分ではC++を使っています。ただ、C++は実行速度は速いのですが、ビルドに非常に時間がかかります。社内では分散コンパイル環境を作っていますが、仮に検索エンジンのサーバーを1台のマシンでビルドしようとすると、1日くらいの単位で時間を見ておかなければなりません。CPUなどが速くなっているのにコンパイルが遅いというのは何かを考え直した方が良いのではないか、という議論があり、プログラミング言語を変えればそういう問題はなくなると考えました。

「Rob Pike氏」によるドキュメント[「Go at Google」](https://golang.org/doc/faq#creating_a_new_language)では、<b>Google社内における大規模ソフトウェア開発の生産性やスケーラビリティのためだ</b>と書かれています。

>The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable. The language was designed by and for people who write—and read and debug and maintain—large software systems.

>Go's purpose is therefore not to do research into programming language design; it is to improve the working environment for its designers and their coworkers. Go is more about software engineering than programming language research. Or to rephrase, it is about language design in the service of software engineering.

また、Goの[公式FAQ](https://golang.org/doc/faq)を一部抜すると、<b>Googleで行っていた作業に対する既存の言語や環境への不満から生また</b>という趣旨の回答が書かれています。

>Go was born out of frustration with existing languages and environments for the work we were doing at Google. 

<b>つまるところ、Go誕生の背景は「Google内の課題解決のため」</b>ということが分かります。

#Goの特徴
で、Goって結局何がイケてるの？結論から言うと、<b>「Simplicity（単純さ）」</b>に尽きるそう。

2014年に、日本でGo言語のカンファレンス「Go Conference（GoCon）」が開催されました。
その時にRob Pike氏も来日し、カンファレンスで[そう仰っていた](http://gihyo.jp/news/report/01/GoCon2014Autumn/0001
)ようです。

また、Goの特徴を一言で表すと、<b>Cの高速性とスクリプト言語の手軽さ</b>と言われているようです。


- <b>シングルバイナリ、クロスコンパイル</b>

Goは、Windows、macOS、Linuxといった環境への[クロスコンパイル](https://books.google.co.jp/books?id=BOVSAgAAQBAJ&pg=PA120&lpg=PA120&dq=%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB+%E5%9B%B3%E8%A7%A3&source=bl&ots=CdGHZ-4jvs&sig=ACfU3U0kO5Wj9y_K5VcVm9b-N74AznFqlA&hl=ja&sa=X&ved=2ahUKEwi6pef7rpzhAhULjLwKHaChDM0Q6AEwCXoECAgQAQ#v=onepage&q=%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%20%E5%9B%B3%E8%A7%A3&f=false)ができることと、実行できる[シングルバイナリ](https://www23.atwiki.jp/sevenlives/pages/2688.html)を配布するだけで[ランタイム](http://e-words.jp/w/%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0.html)へ依存しなくて済むという点があります。

要するに、環境を気にせずプログラムの開発/実行が出来るということだと思います。

-　<b>並行プログラミング</b>

Goは並行処理を前提とした言語設計になっています。

並行処理の何が嬉しいかというと、起床して①顔を洗う。②歯を磨く。③髭を剃るのような合計で1分かかってしまう処理があったとします。これを順番に処理（順次処理））していくと、各処理は20秒ずつかかってしまいます。しかし、並列処理はこれを同時に処理するので、最大20秒で終わる処理に変わりますよねというものです。

要するに、処理が速いということです。

- <b>シンプルな言語設計、文法</b>

一般論として、Goは可読性を重視しているので、読みやすいコードが特徴的とされています。
とはいえ、これは個人差もあると思いますし、筆者は他の言語との比較できるほどの熟練者でも無いので、この点に関しては追って検証して行きたいポイントです。

総じて、「Simplicity」を追求していることが伺えるかと思います。

#Goのトレンド
プログラミング言語はたくさんありますが、Goはどれくらい人気があるのか、簡単にその立ち位置を見てみましょう。

アメリカのRedMonkという調査会社の調査結果（19年3月発表）によると、Goは15位に付けているそうです。（全部で何言語あるんでしょうね）


<img src="http://sogrady-media.redmonk.com/sogrady/files/2017/06/lang.rank_.617.wm_-1024x918.png" width=80%>

RedMonkのランキングは、GitHubにおけるプルリクエストの数と、開発者向けの知識共有サイトStack Overflowでタグ付けされた言語の概数に基づいています。

ちなみに、2014年のデータを見るとGoは今ほど人気はなかったことがわかります。(赤枠は無視して下さい)

<img src="https://qiita-image-store.s3.amazonaws.com/0/310353/71353fce-51c2-3e58-f04b-e9cb4d1e8001.png" width=80%>

Goの人気は上昇しており、成長性のある言語ということが言えるかと思います。


#Go採用プロダクト
Goを採用しているIT企業を少しだけ紹介します。勢いのある有名なIT企業で採用されていることが分かります。

- Docker

コンテナ型の仮想化環境を提供するオープンソースソフトウェアである、Dockerのソースコードは、90%以上がGoを使っているそうです。

<img src="https://harasou.jp/2018/02/10/one-execusion-file-in-docker-image/horizontal.png" width=50%>

- メルカリ

設立5年で評価額10億ドル以上のユニコーン企業に成長した、メルカリの主要開発言語もGoだそうです。
<img src="https://lh3.googleusercontent.com/rhevmCJG49m8PjNkt_Ago2mg2JgH_KrVbVETL5tNsMJfNVYzzWR9JK6YKRLiZz-5P54" width=20%>

#Goを学ぶには？

おすすめのリンクをいくつかピックアップして紹介します。

- [The Go Programming Language](https://golang.org/) 
Goの公式サイト。全てはここに網羅されている。

- [A Tour of Go](https://go-tour-jp.appspot.com/welcome/1)
Goのチュートリアル。基本を一通り学べます。

- [Go言語関連書籍のまとめ](https://qiita.com/yoskeoka/items/d07b60f755e8a9b30ccf)
Go言語の関連書籍まとめ。学習者のレベルに応じたおすすめの書籍が紹介されています。

- [他言語プログラマがgolangの基本を押さえる為のまとめ]
(https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)
基本文法などが網羅されている記事。

ちなみに、Go言語有識者である、メルカリの上田氏は[Go Fan向けのイベント](https://flxy.jp/article/3706)で、Goの課題について以下のようにコメントしています。

>課題はプログラミング初学者に対する敷居の高さですかね。現在Goが広く使われている状況を見ると、基本から始められるようなチュートリアルの仕組みがあってもいいのではと思いますね。現在のチュートリアルは基本的にすでに他の言語をやってきた人向けなので。 

残念ながら、プログラミング初学者がいきなりGoを始めるには、多言語に比べ学習環境面でのハードルが高いというのが実態のようです。ご参考まで。

#最後に

少し古いですが、詳しいことは[ここ](http://golang.jp/go_faq
)に書いてある。

#参考文献
- [Go入門 - Slide share](https://www.slideshare.net/takuyaueda967/2016-go) 
- [他言語プログラマがgolangの基本を押さえる為のまとめ](https://qiita.com/tfrcm/items/e2a3d7ce7ab8868e37f7)
- [なぜGo言語は成功を収めることができたのか - Googleの人が語る（翻訳）
](https://qiita.com/HiromuMasuda0228/items/39785017ce1e748f38a0)
- [「Go言語らしさ」とは何か？　Simplicityの哲学を理解し、Go Wayに沿った開発を進めることの良さ](https://employment.en-japan.com/engineerhub/entry/2018/06/19/110000)
- [コンパイルが速くて、スクリプト言語的に書ける言語が欲しかった
](https://tech.nikkeibp.co.jp/it/article/Interview/20100526/348493/)