@@+世間の求人募集を見ての所感ですが、web業界のバックエンドはスクリプト言語はRuby、コンパイラ言語はGoがブームですね。node.jsなどのスクリプト言語ばかりに手をつけていた私も、最近ようやくGoを勉強してみようかなと思い始めました。++今回はGoの特徴と基本文法をまとめました。+これからGo触ってみようかなーといった方の参考になれば幸いです。:pray:++記載内容に誤りやツッコミどころがありましたら、マサカリ飛ばさずに優しくコメント頂ければ幸いです。Goの概要+Goは2009年頃にGoogleの内部プロジェクトとして開発がスタートした静的型付け言語です。+開発の発端はGoogleですが、オープンソースプロジェクトです。C++)の良いところ取りをした言語を作るという試みで始まったようです。+構想の主なポイントは下記です([wikiより](https://ja.wikipedia.org/wiki/Go_\(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))。IDEが必須ではない。ネットワークおよびマルチプロセッシングをサポートする++超絶ざっくりまとめると、+`静的型付けだけど動的型付けみたいに読み書きがしやすい言語`+を目指した言語です。Dockerなどの有名なプロジェクトで採用されている実績がある++余談ですが、体感としては`Go`より`Golang`の方がググラビリティが良いです(特に英語の記事)。パッケージのスコープ+Goのスコープの単位は大きい単位順に、`パッケージ`、`ファイル`、`関数`、`ブロック`、`制御構造文`がある。+パッケージに定義されている定数、変数、関数などが、他のパッケージから参照可能かどうかは、`識別子の一文字目`によって決まる。+一文字目が大文字の場合には他のパッケージから参照可能であり、一文字目が小文字の場合には他のパッケージから参照不可能である。...+}+```++あるパッケージから別のパッケージの変数や処理を参照する場合には`import`を使う。+例えば、mainパッケージから上記のfruitパッケージを参照したい場合には下記のように記載する。変数+明示的に宣言する場合には`var`を使う。+基本的には`var`宣言しなくても型推論で記載できるので、可読性の観点からも型推論で書く方が良さそう。定数+`const`を用いて定義する。"piyo"+)+```++GoにはJavaの列挙型(enum)のような機能は無いが、識別子`iota`と定数宣言を用いることで列挙型に近い表現ができる。文字列型+文字列はstring型として定義する。+文字列は`""`で囲む。論理値型+論理値はbool型として定義する。+trueまたはfalseの値を持つ。数値型+数値はint型として定義する。+実装依存を防ぐためにint64やint32と明確に定義することも可能である。1+```++数値の型変換をする場合には、明示的に変換後の型で定義する必要がある。浮動小数点+サイズの異なる2つの浮動小数点である`float32`と`float64`がある。+float32はJavaでいうところのfloatであり、float64はdoubleである。配列型+配列型を定義する場合には、配列内部に入っている値の型を宣言する必要がある。+明示的に初期値を与えない場合のデフォルトは、文字列は`""`、整数値は`0`、真偽値は`false`となる。変数作成時に初期値を指定する必要はない+```++また、配列内の要素数を明示的に記載しない方法もある。+その場合、初期値で与えられた要素数が、配列の要素数となる。make+参照型の生成には、組み込み関数のmakeを使う(使わなくても定義できる)。スライス+いわゆる可変長配列のことである。+スライスは生成時に配列に格納する値の要素数と容量を確保する。++生成時に確保した要素数よりも大きい容量が確保されていると、スライスの要素数を拡張して行く際にメモリ上に新しい領域の確保が不要になる。+その一方で、元の容量よりも大きい数の要素数を入れると、Goは元のスライスが格納していたデータを丸ごと、新しいより大きなメモリ領域へコピーする。++メモリ上の別領域へデータをコピーする処理はコストが高いため、スライスを生成する際にあらかじめ格納される要素数に合わせて容量を確保する方が良い。マップ+いわゆる連想配列のことである。+生成は`map[キーの型]要素の型`で定義する。チャネル+チャネルはキューの性質を備えるデータ構造である。+チャネルにはキューを格納する領域であるバッファを持っている。+チャネルはキューの性質を使い、複数のゴールーチン間で安全にデータを共有するための仕組みである。[データ型]`で定義する。+`<-chan`を使用すると、そのチャネルは`受信専用`チャネルを意味する。+`chan<-`を使用すると、そのチャネルは`送信専用`チャネルを意味する。+指定がない場合には、受信も送信も可能なチャネルとなる。チャネルから整数値を受信+```++具体的なお話については、下記の方々の記事が参考になると思います。+戻り値を持つ場合には、戻り値を返す場所で`return`をつける。y+}+```++複数の戻り値を返すこともできる。r)+}+```++戻り値を破棄する場合には`_`を使う。+上記の関数divの例を使うとこん感じで書ける。戻り値の2つ目は破棄される+```++エラーハンドリングは下記のようにするのが一般的っぽい。if+他言語とほぼ同じであるが、`{}`は省略不可である。for+条件なしのforは無限ループとなる。defer+関数の終了時に実行される式を登録できる。+一つの関数内での登録は幾つでもできるが、`実行される順番はあとで登録されたものから順番`に実行される。panic/recover+Goのランタイムを強制的に停止させる機能を持つ。+panicはプログラムにおいて、これ以上処理を継続できない状態を意味するので、他言語で言う所の例外処理と同じように多用すべきではない。panic)が発生し、実行中の関数は中断される。errorによるプログラム中断を回復するのがrecoverである。+panicが発生した際にrecoverを実行するためには、recoverをdeferと一緒に使う。+recoverはinterface{}型を戻り値とし、その値がnilではない場合にpanicが実行されたと判断する。go+並行処理を司る機能である。+ゴールーチン(goroutine)と呼ばれる、スレッドよりも小さい処理単位で並行して動作する。+deferと同様に、関数呼び出し形式の式を受け取る。構造体とインターフェース+Goにはクラスという概念はなく、代わりに構造体(struct)とインターフェース(interface)を用いる。ポインタ+GoにはC言語でも使われているポインタの概念がある。+ポインタとは、あるデータ構造のメモリ上のアドレスと型の情報である。++ポインタ型は`*int`のように、ポインタ(`*`)を操作・参照する対象の型の前に置くことで定義する。++演算子`&(アドレス演算子)`を用いて、任意の型からそのポインタ型を生成することができる。"*int"+```++ポインタからの変数から値を参照するには、演算子`*`をポインタ型の変数の前に置くことで、ポインタ型が指し示すデータのデリファレンス(ポインタ型が保持するメモリ上のアドレスを経由して、データ本体を参照する)することが可能である。10+```++ポインタについては、こちらの方々の記事がわかりやすいと思います。構造体+オブジェクト指向言語で言う所のクラスに相当し、複数の任意の型の値を一つにまとめたものである。{フィールド}`として宣言できる。構造体とポインタ+構造体は値型であるため、関数の引数に構造体を渡した場合には構造体のコピーが生成される。そのため元の構造体に対して影響を与えることができない。2+}+```++元の構造体に対して影響を与えるためには(参照渡しで処理を実行するためには)、呼び出す関数側の引数を構造体型へのポインタを受け取るようにする必要がある。1+}+```++指定した型のポインタ型を生成するには関数`new`がある。メソッド+Goのメソッドは、任意の型に特化した関数を定義することで実現できる。+メソッドの定義の際、`func`の直後にレシーバーの型とその変数名が必要になる。+定義したメソッドは`レシーバー.メソッド`で呼び出すことができる。インターフェース+インターフェースは型の一つであり、`任意の型がどのようなメソッドを実装すべきかを定義するもの`である。interface{}`と記述する。++インターフェースを用いることで、異なる型に対して共通の性質を付与することができる。+これにより、汎用性の高い関数やメソッドを定義することができる。まとめ(所感)+Goは静的型付け言語を扱った経験が乏しいエンジニア(私)にも優しい文法になっていて、学習コストが低そうだなという印象です。+速くて書きやすいという点で、さすがGoogleのエンジニアが生みの親なだけはあるなという感じ。+その一方で、Go特有の概念(ポインタ、panicなど)はちゃんと抑えないとね。