Go 言語におけるデータ型の変換について、今回は完全かつ包括的な記事をお届けします。Go は型安全な言語であり、変数や定数は特定のデータ型に関連付けられています。そのため、型の変換は非常に重要な概念です。この変換は、異なる型の間でデータをやり取りしたり、演算を行ったりする際に頻繁に必要となります。
1. 型変換の基本
Go 言語では、型変換には明示的なキャストを使用します。型の変換は、変数が持つデータ型を変更する手段として利用されます。以下に基本的な型変換の方法を示します。

型変換の基本構文
gonewVariable := typeName(variable)
ここで、typeName
は変換先のデータ型、variable
は変換元の変数です。この構文を用いることで、指定したデータ型に変換できます。
例えば、int
型の変数を float64
型に変換する場合は次のようになります。
govar intVar int = 42
var floatVar float64 = float64(intVar)
fmt.Println(floatVar) // 出力: 42.0
2. 数値型の変換
Go では、整数型 (int
, int8
, int16
, int32
, int64
) と浮動小数点型 (float32
, float64
) の間で変換を行うことができます。これにより、必要に応じて型の互換性を持たせることが可能です。
整数型から浮動小数点型への変換
govar integer int = 10
var float float64 = float64(integer)
fmt.Println(float) // 出力: 10.0
浮動小数点型から整数型への変換
浮動小数点型から整数型への変換を行う際、切り捨てが発生する点に注意が必要です。
govar decimal float64 = 10.7
var integer int = int(decimal)
fmt.Println(integer) // 出力: 10
3. 型変換と互換性
Go では、異なる型の間で直接的な変換を行うことができますが、型が互換性を持っていない場合は変換できません。たとえば、string
型と int
型は互換性がないため、直接変換することはできません。
文字列と数値の変換
数値型を文字列型に変換する場合、strconv
パッケージの Itoa
や Format
関数を使用します。
goimport "strconv"
var number int = 123
var str string = strconv.Itoa(number)
fmt.Println(str) // 出力: "123"
逆に、文字列から数値に変換する場合、strconv
パッケージの Atoi
関数や Parse
関数を使います。
goimport "strconv"
var str string = "123"
var number, err = strconv.Atoi(str)
if err != nil {
fmt.Println("エラー:", err)
} else {
fmt.Println(number) // 出力: 123
}
4. 配列やスライスの型変換
Go では、配列やスライスの型変換も可能ですが、注意が必要です。例えば、[]int
型のスライスを []float64
型に変換することはできません。ただし、同じ型のスライス間では変換できます。
govar intSlice = []int{1, 2, 3}
var floatSlice = []float64{}
for _, v := range intSlice {
floatSlice = append(floatSlice, float64(v))
}
fmt.Println(floatSlice) // 出力: [1.0 2.0 3.0]
5. インターフェース型の変換
Go では、インターフェース型も変換できます。具体的には、型アサーションや型スイッチを使用してインターフェース型の値を具体的な型に変換します。
型アサーション
型アサーションを使うことで、インターフェース型を具体的な型に変換できます。
govar x interface{} = 42
var y int = x.(int)
fmt.Println(y) // 出力: 42
型アサーションに失敗した場合は、ランタイムエラーが発生します。そのため、エラーハンドリングを加えるとより安全に使用できます。
govar x interface{} = "Hello"
if y, ok := x.(int); ok {
fmt.Println(y)
} else {
fmt.Println("型変換失敗")
}
6. 構造体の型変換
Go では、構造体間での型変換も可能ですが、構造体のフィールドが完全に一致していないと変換できません。フィールド名や型が一致していれば、ポインタを使って変換を行うことができます。
gotype Person struct {
Name string
Age int
}
type Employee struct {
Name string
Age int
Job string
}
var p Person = Person{Name: "John", Age: 30}
var e Employee = Employee(p) // 構造体の型変換
fmt.Println(e) // 出力: {John 30 }
7. まとめ
Go 言語では、型変換は非常に重要な操作であり、数値型、文字列型、インターフェース型、構造体型の変換方法について理解しておくことが求められます。特に、Go は型安全な言語であるため、適切な型変換を行うことでコードの信頼性や可読性が向上します。型変換を適切に活用することで、柔軟で堅牢なプログラムを書くことができるようになります。