対応PRはこちら: Use staticcheck instead of golint / Remove deprecated ioutil pkg by toshimaru · Pull Request #130 · toshimaru/nyan

Deprecation of io/ioutil - go.dev

まずは Go v1.16 から io/ioutil package が deprecated になった。

具体的には下記のように変更になった。

  • Discard => io.Discard
  • NopCloser => io.NopCloser
  • ReadAll => io.ReadAll
  • ReadDir => os.ReadDir (note: returns a slice of os.DirEntry rather than a slice of fs.FileInfo)
  • ReadFile => os.ReadFile
  • TempDir => os.MkdirTemp
  • TempFile => os.CreateTemp
  • WriteFile => os.WriteFile

Go1.16で追加されたio#ReadAll関数から読むストリーミング中のバッファ拡張の仕方 - My External Storage

中でも io.ReadAll の関数がテクニカルでよい。

func ReadAll(r Reader) ([]byte, error) {
  b := make([]byte, 0, 512)
  for {
    if len(b) == cap(b) {
      // Add more capacity (let append pick how much).
      b = append(b, 0)[:len(b)]
    }
    n, err := r.Read(b[len(b):cap(b)])
    b = b[:len(b)+n]
    if err != nil {
      if err == EOF {
        err = nil
      }
      return b, err
    }
  }
}

see also. Go1.16からのio/ioutilパッケージ | フューチャー技術ブログ

Golint → staticcheck

Go公式のlinter、Golintが非推奨になった

staticcheckはProposalのIssueでも度々名前が上がっていたlinterです。GoogleやGoがスポンサーになっており、Golintのリポジトリにも代替として名前が上がっています。

ということで Golint をやめて staticcheck に移行することにした。

ReviewdogのGitHub ActionsでGoのlintをかけてPRに表示する - sambaiz-net

staticcheck はreviewdog/action-staticcheckを使うのが便利だった。

name: reviewdog
on: [pull_request]
jobs:
  staticcheck:
    name: runner / staticcheck
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: reviewdog/action-staticcheck@v1
        with:
          filter_mode: diff_context
          fail_on_error: true

ReviewdogのGitHub ActionsでGoのlintをかけてPRに表示する - sambaiz-net