Open18

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

New関数

パッケージ内でメインとなる関心事を表すstructがあり、それのフィールドがexportされない場合は初期化のためのNew関数を定義する

Must関数、Must prefix

ある関数がエラーしうるとき、(あとは追記)

ngicksngicks

プロジェクトの歩き方

git cloneなりしてきたgo projectの歩き方

cmdディレクトリ

慣習的にmainパッケージがこれ以下のサブフォルダとかに含まれる。

ライブラリとして使われるつもりがあまりないプロジェクトはトップディレクトリがmainパッケージになってることが多い(見た限り)

func mainで検索

main関数

go:generateで検索する

Makefileとかを使わず全部go:genrateで作業スクリプトが実行されてることがある(かも)

ngicksngicks

どうまとめよう?

io.Readerを実装する

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

ReaderFromとかWriterToについて触れる

fmt.Formatterを実装する

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

ngicksngicks

よく使うライブラリ

  • samber/lo
  • clockwork

レシピとか

  • sync.OnceFunc