Closed21
3年分のgoプラクティスまとめ
思いついた項目だけ先にまとめておいて、あとから記事化する際に索引として使う
基本
- A Tour of Go: https://go.dev/tour/welcome/
- 基本的な文法とプログラミング課題
- Go by Example: https://gobyexample.com/
- 例とか
- Effective Go: https://go.dev/doc/effective_go
- Go Review Comments: https://go.dev/wiki/CodeReviewComments
Spec
言語仕様は短いので目を通しておくとよい。
Std
standard libraryのインターフェイスとDocコメントは全部読んでおくほうが良い。
(と言いつつ筆者は全部読めていない。記事化までに読む。)
外部リソース(未読)
- https://tour.ardanlabs.com/tour/eng/list
- 100 Go Mistakes and How to Avoid Them
Book by Teiva Harsanyi
公式にexample repositoryがあるのに気づいた
マルチスレッド制御
- sync: https://pkg.go.dev/sync
- sub repositoryのsync: https://pkg.go.dev/golang.org/x/sync
使い方とかを書く
テスト関連
- Fuzzについて
- ユーティリティー
- gotest.tools/v3/assert
- Fuzz時にはメモリ使用量に気を付ける
- fuzzテスト時にはworker=cpu個数で同時多数にテストが走るので普段よりもメモリーを使う
gotchas系
- typed nil
- sliceは値
- mapはポインター
- iterator variableのキャプチャー(Let's Encryptのミス)(Go1.22.0以降では起きない)
defer, go statementで関数を呼び出すときの引数は記述順で評価される
例えば(以下、例となるスニペット追記)
関数の実行後の値を取りたい場合はポインターで渡すか、deferで呼び出すのを無名関数にして変数をキャプチャする
HTTP Server framework
- stdで十分な機能があることに触れる
- go 1.22で追加されたルーティングに触れながら
- echo, chi, ginあたりについて説明する
- 筆者はechoしか使ったことがないと断りをいれる
- gRPCの一通りの使い方に触れる
- OpenAPIに付いて説明し、基本的な書き方とコードジェネレータについて説明する
- 筆者はoapi-codegenしかつかったことがない
- github.com/atombender/go-jsonschema による型の生成とバリデーション
- OpenAPI v3.0.xではjsonschemaのサブセットの拡張版であることに触れる
code generator
- text/templateの紹介
- github.com/dave/jennifer
- go/astによるコードの解析
logging
- slog
- zap
最近はslogだけでいいんじゃないかという気がする
Filesytem abstraction
- afero: https://github.com/spf13/afero
- hackpadfs: https://github.com/hack-pad/hackpadfs
- go-billy: https://github.com/go-git/go-billy
Cli application
- stdのflagを使うシンプルなアプリ
-
https://github.com/spf13/cobra + https://github.com/spf13/viper を使ったアプリ
- docker, docker compose, kubernetesなどで使われている。
Enum
は存在しないが、似たようなことはiotaとtypeでてきる
type Foo string
const (
FooVariantA = "a"
FooVariantB = "b"
)
体感上、変数はtype名でprefixしておくのが吉
どうまとめよう?
io.Readerを実装する
io.Readerを実装してみたりする
ReaderFromとかWriterToについて触れる
fmt.Formatterを実装する
カスタムエラータイプ周りの話題で
よく使うライブラリ
- samber/lo
- clockwork
- mapstructure / copystructure
レシピとか
- sync.OnceFunc
大体記事のスタブにコピーしたので消す
環境変数のはなし
time.Timerの類はStopしないとGCに回収されない(go 1.23以降はされる)
for-range(Go1.23以降のかきかた)
os.Stdout/ os.Stderrはunbuffered
このスクラップは5ヶ月前にクローズされました