Closed21

3年分のgoプラクティスまとめ

ngicksngicks

思いついた項目だけ先にまとめておいて、あとから記事化する際に索引として使う

基本

Spec

https://go.dev/ref/spec

言語仕様は短いので目を通しておくとよい。

Std

https://pkg.go.dev/std

standard libraryのインターフェイスとDocコメントは全部読んでおくほうが良い。

特にioio/fsは超重要なので読んでおくとよい。

(と言いつつ筆者は全部読めていない。記事化までに読む。)

外部リソース(未読)

ngicksngicks

テスト関連

  • Fuzzについて
  • ユーティリティー
    • gotest.tools/v3/assert
ngicksngicks
  • Fuzz時にはメモリ使用量に気を付ける
    • fuzzテスト時にはworker=cpu個数で同時多数にテストが走るので普段よりもメモリーを使う
ngicksngicks

gotchas系

  • typed nil
  • sliceは値
  • mapはポインター
  • iterator variableのキャプチャー(Let's Encryptのミス)(Go1.22.0以降では起きない)
ngicksngicks

defer, go statementで関数を呼び出すときの引数は記述順で評価される

例えば(以下、例となるスニペット追記)

関数の実行後の値を取りたい場合はポインターで渡すか、deferで呼び出すのを無名関数にして変数をキャプチャする

ngicksngicks

HTTP Server framework

  • stdで十分な機能があることに触れる
    • go 1.22で追加されたルーティングに触れながら
  • echo, chi, ginあたりについて説明する
    • 筆者はechoしか使ったことがないと断りをいれる
  • gRPCの一通りの使い方に触れる
ngicksngicks
  • OpenAPIに付いて説明し、基本的な書き方とコードジェネレータについて説明する
    • 筆者はoapi-codegenしかつかったことがない
  • github.com/atombender/go-jsonschema による型の生成とバリデーション
    • OpenAPI v3.0.xではjsonschemaのサブセットの拡張版であることに触れる
ngicksngicks

logging

  • slog
  • zap

最近はslogだけでいいんじゃないかという気がする

ngicksngicks

Enum

は存在しないが、似たようなことはiotaとtypeでてきる

type Foo string

const (
  FooVariantA = "a"
  FooVariantB = "b"
)

体感上、変数はtype名でprefixしておくのが吉

ngicksngicks

どうまとめよう?

io.Readerを実装する

io.Readerを実装してみたりする

ReaderFromとかWriterToについて触れる

fmt.Formatterを実装する

カスタムエラータイプ周りの話題で

ngicksngicks

よく使うライブラリ

  • samber/lo
  • clockwork
  • mapstructure / copystructure

レシピとか

  • sync.OnceFunc
このスクラップは5ヶ月前にクローズされました