0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Golang】Udemy教材でTodoアプリをつくったときにハマった・勉強になったこと

Last updated at Posted at 2023-08-25

はじめに

自分のように同じように躓く人が少なからずいると思ったので、アウトプットも兼ねて記事にしました。

学習時のバージョンは v1.20.7 です。

$ go version
go version go1.20.7 darwin/amd64

Go言語を学習しようと思った理由

お盆になって時間ができたので、前から気になっていた Go 言語の勉強をしてみました。

学習する意図としては、これまでバックエンドは Scala しか使ったことがないので、「他のバックエンド言語を知ることで多角的な視点を持つことができるのでは?」と思ったのと、なぜこれほどまでに Go 言語の人気が急上昇しているのか、実際に使いやすさを体験してみたかったからです。

なので、簡単な Todo アプリ開発を通して、言語の特徴や作成背景に興味を持つきっかけになればと思っています。

🚨 ハマりポイント

TODOアプリの config 設定

クッソハマった。

  • import するときは go.mod ファイルの module 名を一致させないといけない。
go.mod
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
)
sample.go
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 で関数を作成したとしても、レシーバとして定義されているかどうかで、呼び方が異なる。

関数:関数は特定の型に紐づかない。

function.go
func Add(a, b int) int {
    return a + b
}

メソッド:メソッドは特定の型に関連付けられる。この型をレシーバと呼ぶ。

methods.go
type Circle struct {
    Radius float64
}

func (c Circle) Area() float64 {
    return 3.14 * c.Radius * c.Radius
}

GitHub で見る時のインデント補正

Go言語は基本的にタブでインデントを行うと思いますが、GitHub 上だとタブのスペースはインデント深すぎてめちゃくちゃみづらいんですよね。。。
そこで、みやすくなる方法を調べたところ、 .editorconfigindent_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 の場合

Sample.scala
package model.api.test

Go の場合

sample.go
package model

Go 言語自体が簡潔な package 名にすることを推奨しているようです。

さいごに

だいぶ駆け足でしたが、実際に手を動かしてみることによって Go の概要をなんとなく把握することができました。
Scala とおなじ静的型付け言語だからか、そこまで抵抗なく開発を進めることができました。

まだ、並行処理など分野には手を出せていないので、Go の学習が必要になったタイミングで、改めて復習していきたいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?