$30 off During Our Annual Pro Sale. View Details »

あなたの知らない go listコマンド - tenntenn.go#4

あなたの知らない go listコマンド - tenntenn.go#4

この資料はtenntenn.go#4で登壇を行った際に用いた資料です。

■ tenntenn.goとは
tenntenn.goはtenntennが主催し、そしてすべてのセッションがtenntennによる登壇のGoに関する勉強会です。

イベントページ:https://tenntenn.connpass.com/event/240858/
ハッシュタグ:#tenngo
資料(Googleスライド):https://tenn.in/golist
動画:https://tenn.in/golist-video

■ 登壇者&主催者

・名前:tenntenn / 上田拓也
・HP:https://tenntenn.dev
・Twitter:https://twitter.com/tenntenn

メルカリ/メルペイ所属。バックエンドエンジニアとして日々Goを書いている。Google Developer Expert (Go)。一般社団法人Gophers Japan代表。Go Conference主催者。大学時代にGoに出会い、それ以来のめり込む。人類をGopherにしたいと考え、Goの普及に取り組んでいる。複数社でGoに関する技術アドバイザーをしている。マスコットのGopherの絵を描くのも好き。

■ お仕事の依頼について

副業にて技術顧問やアドバイザーなどを行っています。過去の実績や問い合わせフォームは以下のURLからご確認ください。
https://tenntenn.dev/ja/job/

#golang #tenntenn #tenngo #Go言語

tenntenn - Takuya Ueda
PRO

March 05, 2022
Tweet

More Decks by tenntenn - Takuya Ueda

Other Decks in Programming

Transcript

  1. The Go gopher was designed by Renée French. The gopher

    stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. あなたの知らない go listコマンド 2022年03月05日(土) 資料:https://tenn.in/golist
  2. 上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert

    (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team
  3. go listコマンド ▪ Goのパッケージ情報などを表示するコマンド • https://pkg.go.dev/cmd/go#hdr-List_packages_or_modules • -fでテンプレートを変更できる(表示する情報を変更できる) ◦ text/template形式

    • -mでモジュールの情報を表示 • -jsonでJSON形式で出力 • 詳細は go help list コマンドで確認できる 3 go list [-f format] [-json] [-m] [list flags] [build flags] [packages]
  4. 標準パッケージ一覧 ▪ パッケージにstdを指定する • vendorディレクトリも含む • go help packagesコマンドでパッケージの指定の仕方が分かる $

    go list std | head -10 archive/tar archive/zip bufio bytes compress/bzip2 compress/flate compress/gzip compress/lzw compress/zlib container/heap
  5. fmtパッケージを構成するGoファイル ▪ フォーマットを指定する • .GoFilesでビルド対象になる.goファイルが取得される $ go list -f '{{range

    .GoFiles}}{{.}} {{end}}' fmt doc.go errors.go format.go print.go scan.go
  6. パッケージ情報 ▪ テンプレートに渡されるデフォルトのデータ • -fオプションで指定したテンプレートで利用できる • コマンドライン引数のパスを省略すると現在のパッケージ type Package struct

    { Dir string ImportPath string // (略) Module *Module // (略) GoFiles []string CgoFiles []string CompiledGoFiles []string IgnoredGoFiles []string // (略) EmbedPatterns []string EmbedFiles []string }
  7. モジュール情報 ▪ -mオプションを指定すると得られる • 標準パッケージには使えない • パスを省略すると現在のモジュール $ go list

    -m -f '{{.GoVersion}}' 1.17 type Module struct { Path string Version string Versions []string Replace *Module Time *time.Time Update *Module Main bool Indirect bool Dir string GoMod string GoVersion string Retracted string Error *ModuleError }
  8. 利用できるテンプレート関数 ▪ join • 文字列結合を行う ▪ context • ビルドコンテキストを取得 ▪

    module • 指定したパスのモジュール情報を取得 type Context struct { GOARCH string GOOS string GOROOT string GOPATH string CgoEnabled bool UseAllFiles bool Compiler string BuildTags []string ToolTags []string ReleaseTags []string InstallSuffix string } $ go list -f '{{join .GoFiles " "}}' fmt doc.go errors.go format.go print.go scan.go $ go list -f '{{(context).GOOS}}' fmt darwin $ go list -f '{{module "github.com/tenntenn/connpass"}}' fmt github.com/tenntenn/connpass
  9. ビルドタグの指定 ▪ -tagsオプションで指定する • GOFLAGS環境変数を設定してもOK $ go list -tags appengine

    -f "{{(context).BuildTags}}" fmt [appengine] $ GOFLAGS="-tags=appengine" go list -f "{{(context).BuildTags}}" fmt [appengine]
  10. バージョンアップ可能なモジュール ▪ -uオプションを使用する • go list -m -u all •

    -jsonオプションでJSONで取得できる ◦ スクリプトなどから利用しやすい $ go list -m -u all github.com/gostaticanalysis/skeleton github.com/pkg/errors v0.8.1 [v0.9.1] github.com/yuin/goldmark v1.1.32 [v1.4.7] golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 [v0.0.0-20220214200702-86341886e292] golang.org/x/mod v0.3.0 [v0.5.1] golang.org/x/net v0.0.0-20200625001655-4c5254603344 [v0.0.0-20220225172249-27dd8689420f] golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 [v0.0.0-20210220032951-036812b2e83c] golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd [v0.0.0-20220227234510-4e6760a101f9] golang.org/x/text v0.3.0 [v0.3.7] golang.org/x/tools v0.0.0-20200709181711-e327e1019dfe [v0.1.9] golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 [v0.0.0-20200804184101-5ec99f83aff1]
  11. デモ

  12. 自作ツール:knife(ナイフ) ▪ go listのように型情報を表示できるツール • https://github.com/gostaticanalysis/knife • アーミーナイフのようにマルチに使えるツール • 指定したパッケージ(Goファイル)に対し静的解析を行う

    • 型情報をテンプレートをもとに出力する • 下の例ではfmtパッケージの関数を表示している ◦ grepコマンドでさらにPrintで始まる関数だけ絞っている $ knife -f "{{names .Funcs}}" fmt | grep "^Print" Print Printf Println 参考:http://bit.ly/golangknife 12
  13. まとめ ▪ go listは便利! • 色々情報が取れる • JSONにできるので再利用しやすい