【Go】strconv.Itoa()とstring()の違い
はじめに
Goで数値を文字列に変換するためには、strconv.Itoa()を使います。
一方、string()で型変換することも可能です。
この辺りがごちゃいついていたので調べたことを、備忘録的に書いていきます!
この記事でわかること
-
strconv.Itoa()とstring()の違い - それぞれの用途
strconv.Itoa()について
strconv.Itoa()は「整数値そのものを文字列化」するメソッドです。
package main
import (
"fmt"
"reflect"
"strconv"
)
func main() {
i := 65
fmt.Println("i - Type: ", reflect.TypeOf(i))
str := strconv.Itoa(i)
fmt.Println("str: ", str)
fmt.Println("str - Type: ", reflect.TypeOf(str))
}
これを実行すると、以下のように出力されます。
# go run main.go
i - Type: int
str: 65
str - Type: string
このように、元々int型だったiの値が、strconv.Itoa()を使ったことによってstring型のstrに変換されました。改めて、strconv.Itoa()は「整数の数値そのものを文字列化」するメソッドとなります。
string()について
同じ要領で、string()による型変換も行ってみましょう。
package main
import (
"fmt"
"reflect"
"strconv"
)
func main() {
i := 65
fmt.Println("i - Type: ", reflect.TypeOf(i))
str := string(i)
fmt.Println("str: ", str)
fmt.Println("str - Type: ", reflect.TypeOf(str))
}
これを実行すると、以下のように出力されます。
# go run main.go
i - Type: int
str: A
str - Type: string
元々int型だったiには「65」という数値が入っていましたが、string()を使ったことにより「A」と変換されました。これは何を意味しているのでしょうか?
Unicodeコードポイントとして解釈
実は、string()は、整数をUnicodeコードポイントとして解釈し、その文字(rune)を文字列に変換しているのです。
Unicodeコードポイントをざっくり説明すると、世界中のすべての文字に割り当てられた番号のことを指します。
今回の例では「65」という10進数の整数を使いましたが、実はUnicodeコードポイントでは「A」という文字が割り当てられています。
string()はそれを読み取って、runeに変換しているというわけです。
(rune自体、int32のエイリアスで、「Unicodeコードポイントを表す型」として使われます)
string()の使い道
ただこのように、明示的に整数を与えた上でUnicodeコードポイントとして解釈されることは稀だと思います。
実際の使い道としては、ファイルの読み書きや外部サービスのレスポンスボディの読み取り時などに発生するバイトスライスを文字列にすることが多いと思います。
package main
import (
"fmt"
)
func main() {
// UTF-8でエンコードされたバイト列
b := []byte{72, 101, 108, 108, 111}
s := string(b)
fmt.Println("s:", s)
// 日本語の例(UTF-8)
b2 := []byte{227, 129, 147, 227, 130, 147, 227, 129, 171, 227, 129, 161, 227, 129, 175}
s2 := string(b2)
fmt.Println("s2:", s2)
}
これを実行すると、以下のように出力されます。
# go run main.go
s: Hello
s2: こんにちは
まとめ
今回はstrconv.Itoa()とstring()の違いを見てきました。
-
strconv.Itoa():整数の数値そのものを文字列化 -
string():整数をUnicodeコードポイントとして解釈し文字列に変換
string()はバイトスライスを読み取ってデータを文字列に変換する際に主に使用されます。
Discussion