RubyistのGolang入門記 - A Tour of Go編
はじめに
本記事はプロもくチャット Advent Calendar 2023の12日目です。
未経験からWebエンジニアになって約2年半、バックエンドはずっとRailsを使ってやってきたのですが、副業でGolangの案件に参画することになりました。
準備期間がかなり短い(1週間弱)こともあって慌ててキャッチアップをしているのですが、ほぼ1から新しい言語に触れるのも久しぶりなので、やったことを記事に残すことにしました。
やること
まず何をやればいいのかChatGPTに聞いてみました。
A Tour of Go!聞いたことあるやつだ!
とりあえず手始めにこれをやるのが良さそうです。
以前にUdemyの講座も何個か買ったのですが、この辺はもう少し時間のある時に進めていくことにしました。
現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)
Echo/Go + Reactで始めるモダンWebアプリケーション開発
A Tour of Go
入門教材として真っ先に名前が上がるだけあって、Golangの基礎が短く網羅的にまとまっていて良かったです。
2,3日ほどで急いで完走したので正直あんまり深く理解できていないところもありますが、章立てと所感は以下のような感じです。
Basics - Packages, variables, and functions.
パッケージ、関数の基本的な書き方、変数宣言、組み込み型などについての説明。
この辺は特に難しいこともないので、書いていけば慣れるでしょう。
Basics - Flow control statements: for, it, else, switch and defer
タイトル通り制御文について。
これも他言語の知識があれば難しいことはないですが、if文などの条件式で変数への代入を行い、その変数の値で条件分岐を行うのは馴染みのない記法でした。
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim { // ←これ
return v
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
More types: structs, slices, and maps.
ポインタ、struct(構造体)、配列、slice、Mapなどの型について。
ポインタは学生時代のC言語実習で散々苦しめられた概念ですね…。
今はメモリやアドレスの知識があるので、当時よりは理解できました。
RubyにもStructクラスがあるので、こちらはすぐ理解できると思います。
配列はRubyやJS, TSとは違って固定長であることにカルチャーショックを受けました。
これらの言語で言うところの配列は、Golangではsliceの方が近いかと思います。
mapはRubyで言うところのHashのような感じ。
Methods and interfaces
メソッド
Rubyでのメソッドはclassやmoduleの中で定義しますが、Golangでは違います(オブジェクト指向言語ではないので当然ですが)。
関数と記法が似ていますが、
type Hoge struct {
X float64
}
func (h Hoge) Fuga() {
fmt.Println("piyo")
}
のように書くことで、Hoge
型にFuga
メソッドを定義します。
インターフェース
インターフェースは第一の躓きポイントでした。
interface(インタフェース)型は、メソッドのシグニチャの集まりで定義します。
そのメソッドの集まりを実装した値を、interface型の変数へ持たせることができます。
(A Tour of Goより)
具体例を見た方が早いですが、
type Abser interface {
Abs() float64
}
のようなAbser
というinterface型があるとします。
このAbser
型で定義されたメソッドを全て実装している型はAbser
interfaceを実装しているということになります。
つまり、以下のような場合、MyFloat
型はAbser
interfaceを実装しています。
type MyFloat float64
func (f MyFloat) Abs() float64 {
if f < 0 {
return float64(-f)
}
return float64(f)
}
Concurrency
goroutineを使った並列処理についての内容です。
goroutineはGolangのランタイムにより管理される、非常に軽量な実行単位のこと。
マルチスレッド処理と似た概念ではあるが、OSスレッドよりもメモリ消費がはるかに少ないようです。
channelという経路を使って、goroutine同士で値をやりとりすることができます。
goroutinはGolangの重要な特徴の一つですが、如何せんRubyistの僕には馴染みの薄い技術のため難しかったです。
時間がなかったのでサクッと読み進めてしまいましたが、要復習。
A Tour of Goはこれで終了です。
冒頭のChatGPTの回答の通り、echoも学習したので、それはまた次回としたいと思います。
Discussion