いろいろ備忘録日記

主に .NET とか Go とか Python絡みのメモを公開しています。

Goメモ-110 (フォーマット書式の %*s について)

概要

忘れそうなのでメモメモ。

書籍「プログラミング言語Go」を見てたら、以下のようなフォーマット書式が記載されていました。

fmt.Printf("%*s<%s>\n", depth*2, "", .n.Data)

説明の部分には以下のように記載されていました。以下 P.152 の文章を引用

%*s内のアドヴァーブ * は文字列の前に可変個の空白を付加します。その幅と文字列は、引数depth*2と "" で提供されています。

一瞬、???ってなってましたが、よく見たらこれ

devlights.hatenablog.com

をメモしていたときに出てきていました。ポジション指定を省略している形ってことですね。

なので、ポジション指定をちゃんと書くと

fmt.Printf("%[1]*[2]s<%[3]s>\n", depth*2, "", .n.Data)

ってことになってて、例えば depth*2 の値が 8 だったとすると

fmt.Printf("%8s<%s>\n", "", .n.Data)

として評価されるってことでした。

ってことは、0埋めする必要があって、かつ、埋める桁数が可変の場合は

fmt.Printf("%0*s%s\n", length, "", data)

ってすればいいってことですね。上にポジション指定をつけると以下と同じことになります。

fmt.Printf("%0[1]*[2]s%[3]s\n", length, data)

サンプル

package formatting

import (
    "fmt"

    "github.com/devlights/gomy/output"
)

// AdverbAsterisk -- フォーマッティングの %*s についてのサンプルです
//
// フォーマット書式に出てくる * は、Explicit argument indexes の仕様の一つ。
// 詳細は、同ディレクトリにある formatting_adverb_explicit_argument_indexes のサンプル参照。
//
// %*s というのは、パラメータのポジション指定を省略している状態。
// なので、「%*s」というのは「%[1]*[2]s」と同じことになる。
//
// REFERENCES:
//   - 書籍 「プログラミング言語Go」 P.152
//   - https://golang.org/pkg/fmt/
func AdverbAsterisk() error {
    levels := []int{1, 2, 4, 8}

    for _, v := range levels {
        // %*s というのは、パラメータのポジション指定を省略している状態。
        // なので、「%*s」というのは「%[1]*[2]s」と同じことになる。
        //
        // 以下と同じことになる
        //   - %1s%s
        //   - %2s%s
        //   - %4s%s
        //   - %8s%s
        fmt.Printf("%*s%s\n", v, "", "message")
    }

    // 上記と同じ内容をポジション指定を付与すると以下となる
    output.StdoutHr()
    for _, v := range levels {
        // 一つ目のパラメータの値は * が付与されているので、そのまま値として書式に利用される
        // 2つ目と3つ目のパラメータの値は * が付与されていないので通常通り利用される
        fmt.Printf("%[1]*[2]s%[3]s\n", v, "", "message")
    }

    // なので、ゼロ埋めしたい場合は以下のようにすれば出来る
    output.StdoutHr()
    for _, v := range levels {
        fmt.Printf("%0*s%s\n", v, "", "message")
        // 以下と同じ
        // fmt.Printf("%0[1]*[2]s%[3]s\n", v, "", "message")
    }

    return nil
}

try-golang/formatting_adverb_asterisk.go at master · devlights/try-golang · GitHub

実行すると以下のようになります。

$ make run
go run github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: formatting_adverb_asterisk
[Name] "formatting_adverb_asterisk"
 message
  message
    message
        message
-------------------------------------------------- 
 message
  message
    message
        message
-------------------------------------------------- 
0message
00message
0000message
00000000message


[Elapsed] 127.908µs

参考情報

golang.org

おすすめ書籍

自分が読んだGo関連の本で、いい本って感じたものです。

Go言語による並行処理

Go言語による並行処理

スターティングGo言語 (CodeZine BOOKS)

スターティングGo言語 (CodeZine BOOKS)

  • 作者:松尾 愛賀
  • 発売日: 2016/04/15
  • メディア: 単行本(ソフトカバー)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)

プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com