💡

fmtに変わるGoのデバッグを楽にするdebugツールを使ってみた

2025/01/24に公開

概要

普段Goで開発を行う上でやログ出力などprintデバッグで使う、Goの標準ライブラリでfmtがあります。

皆さんも使われてると思いますが、fmt パッケージだと深くネストされた配列やスライスが値ではなくメモリを表示してしまうので、デバッグが大変という問題がありました。

今回はjsで言うところのconsole.logのようなネストされた値も出力できるようなツールをGoでないか探して使ってみたという内容になります。

pp

個人的に今回一番オススメなのがこちらのpp(pretty printer)になります。

基本的な使い方

コード例

package main
import 	"github.com/k0kubun/pp"

type Person struct {
	Name    string
	Age     int
	Address struct {
		Street string
		City   string
		Zip    string
	}
}

pp.Println(Person{
    Name: "John Doe",
    Age:  30,
    Address: struct {
        Street string
        City   string
        Zip    string
            }{
                Street: "123 Main St",
                City:   "Anytown",
                Zip:    "12345",
            },
        })

使いやすい点

  1. fmt同様簡単に呼び出せてprintデバッグを行うことができます。何よりも強いのが、出力されたjsonが色付きで出力される且つ整形されて出力されるため非常に見やすいです。
  2. fmtと同じような使い方のため馴染が深く書きやすい
  3. 2025年1月現在で最終コミットが3month agoなのでメンテナンスもされている
  4. Goのコードでcolorのconfig設定ができる

出力例

不便な点

  1. 特に今回困った部分としては値が多きなstructなどを読み込む際に出力に時間がかかった点が挙げられます。
  2. 特定の条件の場合にネストされた値がメモリを出力することがある

Github

https://github.com/k0kubun/pp

制作者さんの記事

https://qiita.com/k0kubun/items/5150fcb5d0740309d1eb

go-spew

続いて使ってみたものとしてgo-spewを紹介します

基本的な使い方

コード例

package main
import "github.com/davecgh/go-spew/spew"

// ...struct省略
pp.Println(Person{
    Name: "John Doe",
    Age:  30,
    Address: struct {
        Street string
        City   string
        Zip    string
            }{
                Street: "123 Main St",
                City:   "Anytown",
                Zip:    "12345",
            },
        })

使いやすい点

  1. Dumpデータとしてきれいに整形されたデータを吐き出してくれる
  2. 構造体のフィールドの型情報やlen、メモリアドレスなど詳細な情報がprintデバッグされる

出力例

不便な点

  1. 2025年1月現在で最終コミットが7years agoとかなり昔で止まっていてメンテナススされていない?今後Goなどに破壊的変更があった場合に対応できるか不安
  2. ppでcolor付きになれると白文字が見にくく感じてしまう

ドキュメント

https://chromium.googlesource.com/external/github.com/davecgh/go-spew/+/2d30de540ad068d20bcbfb68ad0fc75485411f18/README.md

Github

https://github.com/davecgh/go-spew

まとめ

いかがだったでしょうか?fmtが使いにくいと感じたらこれらのツールでprintデバッグするのも良いかと思います。
printログは開発効率を上げる中で重要な要素になるのでご参考になれば幸いです。

Discussion