いろいろ備忘録日記

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

Goメモ-192 (strconvパッケージ Tips)(ParseInt の第2引数 base について)

概要

以下自分用のメモです。よく忘れるのでここにメモメモ。。。

strconvパッケージに、 ParseInt という関数がありまして、多分大抵の人が利用したことがあると思います。

この ParseInt 関数さん、引数が3つとなっていて、一つ目が対象となる文字列、2つ目が進数、3つ目がビットサイズとなっていいます。

んで、この第2引数の base の指定なんですが、2 とか 8 とか 16 を指定してもいいのですが、実はここに 0 も指定できます。

0を指定すると 対象文字列 の prefix を見て進数を自動で判別してくれます。関数のドキュメントにも以下のように書かれています。

If the base argument is 0, the true base is implied by the string's prefix following the sign (if present): 2 for "0b", 8 for "0" or "0o", 16 for "0x", and 10 otherwise. Also, for argument base 0 only, underscore characters are permitted as defined by the Go syntax for integer literals.

pkg.go.dev

逆に、base に 0 以外を明示的に指定する場合は、prefix が付いているとエラーとなります。(ff はOK。 0xff はエラー)

また、base に 0 を指定する場合、 prefix が付いていないとエラーとなります。(ff はエラー。0xff はOK)

うまく使い分けましょう。

サンプル

package strconvs

import (
    "strconv"

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

// ParseIntTipsBaseValue -- strconv.ParseInt() の第2引数 base を指定する際のTipsです。
//
// REFERENCES
//  - https://pkg.go.dev/strconv@latest#ParseInt
func ParseIntTipsBaseValue() error {
    //
    // strconv.ParseInt() の 第2引数 base には
    // 通常、元の文字列の進数を設定する。(2, 8, 10, 16 など)
    // この場合、0xff のように prefix を付けているとエラーとなる。
    //
    // しかし、base に 0 を指定した場合は prefix を付けていてもエラーにならない。
    // 2進数の場合は 0b 、8進数の場合は 0o 、16進数の場合は 0x となる。
    // この場合は逆に prefix が付いていないとエラーとなる。
    //
    // さらに、 parseint_tips_bitsize.go にあるように 第3引数の bitSize にも
    // 0 を指定することができる。
    //

    var (
        values = []string{
            "0b11111111",
            "0o377",
            "0xff",
        }
    )

    for _, v := range values {
        var (
            parsed int64
            err    error
        )

        parsed, err = strconv.ParseInt(v, 0, 0)
        if err != nil {
            return err
        }

        output.Stdoutl("[original]", v)
        output.Stdoutl("[parsed  ]", parsed)
        output.StdoutHr()
    }

    return nil
}

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

gitpod /workspace/try-golang (master) $ make run
go run -race main.go -onetime -example ""

ENTER EXAMPLE NAME: strconvs_parseint_tips_base

[Name] "strconvs_parseint_tips_base"
[original]           0b11111111
[parsed  ]           255
-------------------------------------------------- 
[original]           0o377
[parsed  ]           255
-------------------------------------------------- 
[original]           0xff
[parsed  ]           255
-------------------------------------------------- 


[Elapsed] 327.608µs

参考情報

https://pkg.go.dev/strconv@go1.18#ParseInt

https://go.dev/tour/basics/11


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

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