はじめに
自分のように同じように躓く人が少なからずいると思ったので、アウトプットも兼ねて記事にしました。
学習時のバージョンは v1.20.7
です。
$ go version
go version go1.20.7 darwin/amd64
Go言語を学習しようと思った理由
お盆になって時間ができたので、前から気になっていた Go 言語の勉強をしてみました。
学習する意図としては、これまでバックエンドは Scala しか使ったことがないので、「他のバックエンド言語を知ることで多角的な視点を持つことができるのでは?」と思ったのと、なぜこれほどまでに Go 言語の人気が急上昇しているのか、実際に使いやすさを体験してみたかったからです。
なので、簡単な Todo アプリ開発を通して、言語の特徴や作成背景に興味を持つきっかけになればと思っています。
🚨 ハマりポイント
TODOアプリの config 設定
クッソハマった。
- import するときは go.mod ファイルの module 名を一致させないといけない。
module todo_app_mod
go 1.20
require gopkg.in/ini.v1 v1.67.0
require (
github.com/google/uuid v1.3.0 // indirect
github.com/mattn/go-sqlite3 v1.14.17 // indirect
github.com/stretchr/testify v1.8.4 // indirect
)
package main
import (
"todo_app_mod/app/user"
)
- ini ファイルを利用するのにパッケージの import が必要
インストールが必要だったもの
インストールに関しては、Udemy の教材を順番に取り組んでいけば問題なかったのですが、私の場合、すぐに Todo アプリの開発に取り掛かったため、下記の点でつまづくことがありました。
1. uuid
ランダムな一意の文字列を生成するときに使う。
どの言語でもお馴染みの uuid だが、今回の Todo アプリの開発では ユーザーのセッション情報を管理するために利用した。
$ go get github.com/google/uuid
2. go-sqlite3
sql コマンドを利用できるようにする。
ローカルで sql を確認したい時に利用した。
$ go install github.com/mattn/go-sqlite3
✏️ 勉強になったこと
関数とメソッドの違い
同じ func
で関数を作成したとしても、レシーバとして定義されているかどうかで、呼び方が異なる。
関数:関数は特定の型に紐づかない。
func Add(a, b int) int {
return a + b
}
メソッド:メソッドは特定の型に関連付けられる。この型をレシーバと呼ぶ。
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
GitHub で見る時のインデント補正
Go言語は基本的にタブでインデントを行うと思いますが、GitHub 上だとタブのスペースはインデント深すぎてめちゃくちゃみづらいんですよね。。。
そこで、みやすくなる方法を調べたところ、 .editorconfig
の indent_size
を設定すると、インデント幅を設定できるようです。
# indicate this is the root of the project
root = true
[*]
charset = utf-8
end_of_line = LF
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2
package の指定方法
Scala では、ディレクトリ階層を package で表現していたが、Go では1つの package 名しか指定しない。
例えば、、、下記のようなイメージ。
Scala の場合
package model.api.test
Go の場合
package model
Go 言語自体が簡潔な package 名にすることを推奨しているようです。
さいごに
だいぶ駆け足でしたが、実際に手を動かしてみることによって Go の概要をなんとなく把握することができました。
Scala とおなじ静的型付け言語だからか、そこまで抵抗なく開発を進めることができました。
まだ、並行処理など分野には手を出せていないので、Go の学習が必要になったタイミングで、改めて復習していきたいと思います。