概要
以下自分用のメモです。よく忘れるのでここにメモメモ。。。
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.
逆に、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
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。