こんにちは、フロントエンドエンジニアのザワです。
Goと聞いて何を連想しますか? ヒロミゴウですか?
今回はもちろんGo言語について書いていくんですけども、私はこれまでGo言語に触れたことがありませんでした。
フロントエンドエンジニアが業務の中で主に扱う言語といえば、JavaScriptだと思います。
ただし、Webアプリケーション開発となると、場合によってはバックエンドのソースコードを見ることがあります。そのとき、言語特有の書き方を目の当たりにして、何かしらの拒絶反応が出てデスクを意味なく掃除したりします(私の場合)。
そんなことで拒絶反応が出ていたら仕事になりませんし、自分の成長にも繋がらずもったいないので、Go言語を読める体に鍛えていく所存です。
というわけで、Go言語を読むステージに立つまでに、フロントエンドエンジニアの私が行なったことを記していきます。
Here we Go (Goをかけてみました……鳥肌モンですね)!
目標設定
まずGoの人となりを知るために、Goとは何かをざっくり把握したいと思います。
今回はコードを「書く」のではなく、「読む」に焦点を絞ります。そして、スラスラ読めるレベルを目指すのではなく、ソースコードを見ても拒絶反応が出ないレベルを目指します。
特に初見で辛かった部分をピックアップして克服していきます。
目標
- Goの特徴を知る
- 読めなかった構文を調べる
Goの特徴を知る
私は何かについて知る最初の一歩として動画を見ることが多いです。みんな大好きYouTubeですね。
「Go 入門」なんて入力すればたくさん出てくるので、寝る前やご飯中などに眺めます。動画は隙間時間でインプットできて良いですよね。
どんな入門記事や動画を見ていても出てくるGo言語の特徴といえば、「処理速度が速い」ですよね。なんで処理速度が速いかについてはこの記事では触れません。そしてまだ私も知りません。
読めなかった構文を調べる
普段JavaScriptをメインで触っている私が、初見で受け付けなかった上位の構文を取り上げます。
彼らのことを理解することができれば、Go言語と少しでも近づいて今後より深い部分を知ることができそうな気がするので、今回は彼らを知ることが目標です。
- :=
- ポインタ
- struct
:=
パッと見、顔文字だと思いますよね。
ソースコードを読んでいて、始めに目に飛び込んできたのがこれでした。そこら中に見慣れない記号があるのでゲシュタルト崩壊を起こしそうですごくプレッシャーを感じました。
:=は、変数の宣言と初期化を一行で実現するためのショートカットらしいです。詳しくはこちら。
まず、Goで変数宣言するときはどうするのかを見てみます。
varを使って変数を宣言し、値を代入します。
var hoge string
hoge = "hogehoge"
初期化する場合はこう書きます。また、初期化する場合は型を省略できます。
var hoge = "hogehoge"
:=を使うとこうなります。varも要らず、型も要らず、シンプルになりました。
hoge := "hogehoge"
完全に理解しました。
struct
次はstructです。structはフィールドの集合体で、フィールドにはドットでアクセスできます。
type Hoge struct {
id int
}
func main() {
hoge := Hoge{1}
fmt.Println(hoge.id) //1
}
複数のフィールドを指定するとこうなります。
type Hoge struct {
id int
greet string
}
func main() {
hoge := Hoge{1, "hello"}
fmt.Println(hoge.id, hoge.greet) // 1 hello
}
なんか見覚えがあります。JavaScriptでclassをインスタンス化するときに似てませんか?
違う言語なのでJavaScriptに置き換えるのはナンセンスかもしれませんが、どこか面影があってセンチメンタルな気持ちになります。
ポインタ
最後にポインタです。ポインタは学習後の今だからこそポインタという言葉を使っているのですが、学習前にソースコードを見たときは、何て呼ぶのかもわかりませんでした。
とにかく下記のように関数に見慣れないアスタリスクがあり、気になって夜もいつもより5分ほど寝つきが悪かったです。
func (hoge *Hoge) add(x int) {
hoge.x = hoge.x + x
}
ちなみに、funcと関数名との間に引数らしきかっこがあるのがまた気になるポイントですが、これはポインタレシーバというものらしいです。
私の頭がパンクしてボヘミアンラプソディが流れ始めるので今回は取り上げませんが、気になる型はポインタレシーバで調べてみてください。
さて、本題のポインタですが、調べるとアンパサンド(&)とアスタリスク(*)が登場します。そもそもポインタは、メモリ上のアドレス(住所)のことです。簡単な例で段階的に説明していきます。
まず普通に値を代入します。aには数値1を代入していますから、出力される値は1です。
func main() {
a := 1
fmt.Println(a) // 1
}
次に変数bに&aを代入します。
するとどうでしょう。bを出力すると16進数の何かしらが表示されています。これはaのメモリ上のアドレスです。
ということは、&は値ではなくメモリアドレスを渡す役割を持っていることがわかりました。
func main() {
a := 1
b := &a
fmt.Println(a, b) //1 0xc000018030
}
では、bに代入したaの値を出力するにはどうしたらいいでしょう?
そこでアスタリスクが登場します。
func main() {
a := 1
b := &a
fmt.Println(a, *b) //1 1
}
bはaを参照しているので、aの値を変えたらbの値も変わるはずです。試してみます。
func main() {
a := 1
b := &a
fmt.Println(a, *b) //1 1
a = 2
fmt.Println(a, *b) //2 2
}
はい、期待した通りにbの値も変わっていることが確認できました。
学習する前とは違い、アンパサンドとアスタリスクを受け入れてみようという気持ちが私の中で湧いてきました。
終わりに
Go言語のtutorialをググると、A Tour of Goというブラウザ上で説明が見れる&コードが書けるサイトがあります。
少しやってみたのですが、わからないことが多く、ブログにするとすごーくながーくなりそうだったので、今回は特に初見で辛かったものに絞ってみました。一から細かく勉強したいタイプの人は挑戦してみるといいかもです。
LIGでも過去にGo言語について書いてる記事があるので、興味があれば読んでみてください。
今後実際にGo言語を書く機会があったり、問題にぶつかったりした場合はブログにしていきたいと思っています。
それでは良いコーディングライフを!
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。