🐀

Go strconv.Itoa (実際は、formatBits) を読んで気になったところ

2022/02/11に公開

毎月 Sendai.go で、Goの標準ライブラリのコードリーティングをしています。
今月は、strconv パッケージの Itoa を読んだのですが、その中で気になったところをまとめて置こうと思います。

いくつか気になるところはあったのですが、この記事では、その中の1つ smallsString 定数の使い方についてまとめました。

この定数は、2桁の数値を10進数の文字列に変換する際に使用しています。
※一桁だけ文字に変換するときは、 digits を使っています

定義はこうなっています。最初見たときなんだ?この定数と思ったのですが、処理を見てみるとシンプルでよくできている仕組みでした。

const smallsString = "00010203040506070809" +
	"10111213141516171819" +
	"20212223242526272829" +
	"30313233343536373839" +
	"40414243444546474849" +
	"50515253545556575859" +
	"60616263646566676869" +
	"70717273747576777879" +
	"80818283848586878889" +
	"90919293949596979899"

どのように変換するかというと、対象の数値を2倍した位置にある文字と対象の数値を2倍して1足した位置にある文字をそれぞれ、2桁目と1桁目として扱っています。

例えば 51 を文字列に変換するときは、次のようになります。
smallString の 20番目の文字(2桁目)は、"1" で、21番目の文字(1桁目)は、"0" となります。
なお、配列時の番号になるので0番目からの数値になります。

is := 51 * 2 // 102
fmt.Println(smallsString[is+1]) // "5" - 102番目
fmt.Println(smallsString[is+0]) // "1" - 103番目

また 9 を文字列に変換するときは、次のようになります。
smallString の 18 番目の文字(2桁目)は、"0" で、20番目の文字(1桁目)は、"9" となります。

is := 9 * 2 // 18
fmt.Println(smallsString[is+1]) // "0" - 18番目
fmt.Println(smallsString[is+0]) // "9" - 19番目

今回のまとめは、以上になります。
今後もコードリーティングを続けますので、気になったところやためになったコードがあれば記事にまとめたいと思います。

Discussion