🐈

RubyistのGolang入門記 - A Tour of Go編

2023/12/12に公開

はじめに

本記事はプロもくチャット Advent Calendar 2023の12日目です。

https://qiita.com/advent-calendar/2023/puromoku

未経験からWebエンジニアになって約2年半、バックエンドはずっとRailsを使ってやってきたのですが、副業でGolangの案件に参画することになりました。

準備期間がかなり短い(1週間弱)こともあって慌ててキャッチアップをしているのですが、ほぼ1から新しい言語に触れるのも久しぶりなので、やったことを記事に残すことにしました。

やること

まず何をやればいいのかChatGPTに聞いてみました。

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