プログラミングではあるデータ型を別のデータ型に変換しなければいけない場合があります。
そこで、本記事では、プログラミング言語Goの型キャスト(型変換)について詳しく説明します。
Golangにおけるデータ型
Goには数値、浮動小数点、真偽値、文字列などの多くのデータ型があります。
- 数値:int、int32、int64、uint32、uint64 など
- 浮動小数点数:float32, float64, complex64, complex128
- 真偽値:boolean
- 文字列: string
型変換(型キャスト)とは
型変換とは、あるデータ型を別のデータ型に変換することです。
どのような型も別の型に変換することができますが、値がそのままである、もしくはは実際に保存されることを保証するものではありません。
なぜ型変換が重要なのか?
一般的なプログラミングにおいて、型変換は重要な概念です。
ある型を別の型に変換することで、式に別の型が必要になる場合等に、役に立ちます。
基本的な型変換の書き方は以下のとおりです。
変換後の値 := 変換したい型の名前(型変換する前の値)
例えばfloat型の値をint型に変換したい場合は、次のように書きます。
i := int(54.926)
暗黙的な型変換
他の言語と違って、Golangは暗黙の型変換をサポートしていません。
しかし、割り算をする時だけは、場面によって暗黙的な型変換が行われます。
そのため、どこでどの型を使うかは十分注意する必要がありますね。
基本的な型変換の方法
変数の型を変更する必要がある場合は、基本的に必ず型変換が必要となります。
けれども前に説明したように、型変換は直接的でない場合もあります。
以下では、直接的な型変換を行う場合のコード例を示してます。
package main
import (
"fmt"
)
func main() {
var i int = 98
f := float64(i)
fmt.Println(f) // 98
}
string型とint型を変換する
Golangにはstrconvというパッケージがあり、これを使うとstring型の値とint型の値を相互に変換することができます。
以下は、strconvを使用してデータ型を変換しているコード例です。
package main
import (
"fmt"
"strconv"
)
func main() {
var s1 string = "98"
i1, _ := strconv.Atoi(s1) // 文字列を数値に変換する
fmt.Println(i1) // 98
fmt.Printf("%T\n", i1) // int
var i2 int = 25
s2 := strconv.Itoa(i2) // 数値を文字列に変換する
fmt.Println(s2) // 25
fmt.Printf("%T\n", s2) // string
}
int型とfloat型を変換する
int型とfloat型の変換を行うと、数値の精度が落ちることがあります。
以下はintとfloatの間で型変換を行っているコード例です。
package main
import (
"fmt"
)
func main() {
f1 := 123.4567
i1 := int(f1)
fmt.Println(i1) // 123
fmt.Printf("%T\n", i1) // int
i2 := 98
f2 := float64(i2)
fmt.Println(f2) // 98
fmt.Printf("%T\n", f2) // float64
}
上記のコードでも分かるように、floatからintへの変換は常に精度を失います。
string型とbyte型を変換する
文字列はbyte(バイト)のスライスです。なので、どちらにおいてもすごくシンプルに型変換することが可能です。
以下は、string型とbyte型の値を変換しているコード例です。
package main
import (
"fmt"
)
func main() {
var s1 string = "Hello, World"
var b1 []byte = []byte(s1) // byte型に変換
fmt.Println(b1) // [72 101 108 108 111 44 32 87 111 114 108 100]
s2 := string(b1) // 文字列型に変換
fmt.Println(s2) // Hello, World
}
割り算の時の型変換
除算(割り算)をする際、型は暗黙のうちに変換されます。
以下はまさに、そのコード例です。
package main
import (
"fmt"
)
func main() {
i := 9 / 2 // 両方ともint型の場合はint型になる
f := 5.2 / 7 // 片方がfloat型であれば、float型になる
fmt.Println(i) // 4
fmt.Println(f) // 0.7428571428571429
}
Golangにおける型変換(型キャスト)のデメリット
型変換は、元のデータ型を変更するのに最適な方法です。
しかし、残念ながら場合によってはデータ型の精度が落ちてしまうことがあるので、乱用するのは控えるべきでしょう。
型変換を使う時と場合に注意しながら、使うことをおすすめします。