Golangを勉強していく
Golangに入門する
Goの公式チュートリアル[1]をやってみた。
Goのモジュールを作成する。
cd # example
mkdir hello
cd hello
go mod init example/hello # モジュールを初期化
カレントディレクトリにhello.go
を作成する。
package main
import "fmt"
import "rsc.io/quote"
func main() {
fmt.Println(quote.Go())
}
hello.goを実行する。
go mod tidy # 外部モジュールを追加
go run . # Don't communicate by sharing memory ...
Effective Go
Gin
例外処理ないらしいぞ。エラーがnil
かどうか判断する。
type error interface {
Error() string
}
panic()
は継続不可能なエラー。あまり使わないらしい。
error interfaceをチェックするのが一般的。
err
は関数の最後の返り値に与える。その後の処理ではerr
を最初に処理する。
hoged, err := hoge()
if err == nil {
...
}
実用Go言語
1章
命名はできる限りシンプルに。
error
ではなくerr
、http.HTTPServer
ではなくhttp.Server
。
名前の後ろに型名をつけるとその型に束縛されますが、つけなければ「定数」のままで、型がありません。
定数をvarに割り当てたり、関数の引数として渡すこともできます。このときに型が指定されていなければ、それぞれの定数のデフォルトとなる型(int、float64、bool、string)が設定されます。
識別子
識別子(変数、関数、クラスなどの名前)
固定長の配列より可変長のスライスを使うことが多い。
スライスの裏では配列が割り当てられており、一定の長さを超えると裏の配列がサイズの大きい配列にコピーされる。これはパフォーマンスの低下につながる恐れがある。そのため、スライスの最小長がわかっている場合にはmake()
を使って事前に必要な長さを確保しておくと良い。
実際に配列を使うことはあるのか?
defer
便利らしい。for
文の中で使わないように注意。
1.9 文字列の結合方法
文字列はイミュータブルなので、+
演算子で結合すると新たな文字列が生成されてしまう。strings.Builder
を使うと良い。
1.10 日時の取り扱い
日時形式の指定はJan 2 15:04:05 2006 MST
のように行う。
また既存のフォーマットが定義されており、JavaScriptとの互換性を考えるとtime.RFC3339Nano
などが使える。
2章
A Tour of Go
Basics
Packages, variables, and functions.
Named return values
返り値に名前を付けられる。また、名前を付けると返り値を省略できる(naked return)。
ただし、可読性の点から短い関数でのみ使うべきである。
func split(sum int) (x, y int) { // x, y
x = sum * 4 / 9
y = sum - x
return // naked return
}
Zero values
宣言時に値を代入しなくても初期値(初期化子)が入る。
なお、初期値を与えた場合は型を省略できる。
var i int
fmt.Print(i) // 0
ディレクトリ構成