🐀
Go strconv.Itoa (実際は、formatBits) を読んで気になったところ
毎月 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