いろいろ備忘録日記

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

Goメモ-102 (Explicit argument indexes, Printfで同じパラメータを使い回す)

概要

知らなかったので、忘れないうちにメモメモ。

Go で、fmt.Printf とかするときに

x := 1
fmt.Printf("%d(%T)\n", x, x)

という様に同じパラメータを複数回使いたいときに、今まで上のようにやってたんですが

golang.org

をみてたら、Explicit argument indexes ってのがありました。

以下のように指定できたんですね

x := 1
fmt.Printf("%d(%[1]T)\n", x)

PythonとかC#だと、もう少しいい感じに

>>> x = 1
>>> print(f"{x}({type(x)})")
1(<class 'int'>
using System;

namespace cstest
{
    class Program
    {   
        static void Main(string[] args)
        {   
            var x = 1;
            Console.WriteLine($"{x}({x.GetType()})");
        }   
    }   
}

のように出来るのですが、Goでも似たようなことが出来るのを知って良かった。

サンプル

package formatting

import "fmt"

// AdverbExplicitArgumentIndexes -- フォーマッティングの Explicit argument indexes についてのサンプルです。
//
// REFERENCES:
//   - https://golang.org/pkg/fmt/
func AdverbExplicitArgumentIndexes() error {
    // ------------------------------------------------------------
    // Go のフォーマット仕様には
    //   Explicit argument indexes
    // という仕様がある。
    //
    // フォーマット文字列内に以下が指定できる
    //   - [1]とすると、添字内のパラメータの値を指定できる
    //     中の数字は、フォーマット文字列の後のパラメータの位置
    //     (最初のパラメータが 1 )
    //   - [1]* のようにアスタリスクをつけると、そのパラメータの
    //     値を指示子の値として利用できる
    // ------------------------------------------------------------

    // 以下の2つは同じ結果となる
    i := 10
    fmt.Printf("%d(%T)\n", i, i)
    fmt.Printf("%d(%[1]T)\n", i)

    // 以下の2つは同じ結果となる
    f := 32.8
    fmt.Printf("%3.2f\n", f)
    fmt.Printf("%[3]*.[2]*[1]f\n", f, 2, 3)

    // 複雑になるので、あまり意味はないが、以下の様にも出来る
    var (
        numberLength = 10
        totalLength  = numberLength + 5
    )

    fmt.Printf("% [2]*[1]s\n", fmt.Sprintf("%0[2]*[1]d\n", i, numberLength), totalLength)

    return nil
}

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

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

$ make run
ENTER EXAMPLE NAME: formatting_adverb_explicit_argument_indexes
[Name] "formatting_adverb_explicit_argument_indexes"
10(int)
10(int)
32.80
32.80
    0000000010



[Elapsed] 517.416µs

おすすめ書籍

自分が読んだ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