Go言語の型変換を解説―整数、浮動小数点、文字列への変換方法
Go言語では、異なるデータ型間の変換が頻繁に行われます。
この記事では、整数、浮動小数点、文字列などの基本的な型変換の方法を具体例と共に解説します。
実際の開発現場で役立つ情報を、分かりやすくまとめていますので、ぜひ参考にしてください。
基本的な型変換方法
Go言語では、明示的な型変換で整数、浮動小数点、文字列などを相互に変換することができます。
ここでは、基本的な数値型や文字列に関する変換事例をいくつかご紹介します。
整数型への変換
整数同士の変換事例
ある整数型の変数を別の整数型に変換する場合、明示的に変換したい型を指定する必要があります。
下記のサンプルコードでは、int型の値をint64型に変換し、その結果を出力しています。
package main
import "fmt"
func main() {
    var a int = 10
    // int型からint64型へ明示的に変換
    var b int64 = int64(a)
    fmt.Println("intからint64への変換結果:", b)
}intからint64への変換結果: 10浮動小数点型への変換
Goでは、整数と浮動小数点型の間の変換も明示的に行います。
整数から浮動小数点型へ変換する場合、数値はそのまま変換されますが、逆に浮動小数点型から整数に変換する場合は小数点以下が切り捨てられる点に注意が必要です。
整数と浮動小数点の相互変換
下記のサンプルコードでは、整数からfloat64型への変換と、float64型から整数への変換を行い、変換結果を出力しています。
package main
import "fmt"
func main() {
    var i int = 5
    // 整数から浮動小数点型へ変換
    var f float64 = float64(i)
    fmt.Println("整数から浮動小数点への変換結果:", f)
    var f2 float64 = 5.99
    // 浮動小数点から整数への変換(小数部分は切り捨て)
    var i2 int = int(f2)
    fmt.Println("浮動小数点から整数への変換結果:", i2)
}整数から浮動小数点への変換結果: 5
浮動小数点から整数への変換結果: 5浮動小数点の精度管理
浮動小数点型の場合、表示する桁数や丸め処理に注意する必要があります。
fmt.Printfを利用して表示時に精度を指定することで、数値の丸めた見た目を管理できます。
package main
import "fmt"
func main() {
    var f float64 = 1.23456789
    // 小数点以下4桁までの精度で出力する例
    fmt.Printf("指定した精度での出力: %.4f\n", f)
}指定した精度での出力: 1.2346数値と文字列の相互変換
数値と文字列の相互変換は、特にユーザー入力や外部データとの連携時に必要になります。
Goでは、strconvパッケージを利用することで、簡単に変換することができます。
数値から文字列への変換方法
strconv.Itoaを用いることで、整数を文字列に変換する例です。
package main
import (
    "fmt"
    "strconv"
)
func main() {
    var num int = 123
    // 整数を文字列に変換
    str := strconv.Itoa(num)
    fmt.Println("数値から文字列への変換結果:", str)
}数値から文字列への変換結果: 123文字列から数値への変換とエラー対処
文字列から数値へ変換する場合、変換に失敗する可能性があるため、エラー処理を行うことが推奨されます。
以下のサンプルコードは、strconv.Atoiを使用して変換し、エラーが発生した場合にその内容を出力する方法を示しています。
package main
import (
    "fmt"
    "strconv"
)
func main() {
    var str string = "456"
    // 文字列を整数型に変換
    num, err := strconv.Atoi(str)
    if err != nil {
        fmt.Println("変換エラー:", err)
        return
    }
    fmt.Println("文字列から数値への変換結果:", num)
    // 無効な文字列の場合のエラー対処例
    var invalidStr string = "abc"
    _, err = strconv.Atoi(invalidStr)
    if err != nil {
        fmt.Println("無効な入力の場合のエラー処理例:", err)
    }
}文字列から数値への変換結果: 456
無効な入力の場合のエラー処理例: strconv.Atoi: parsing "abc": invalid syntaxインターフェース型およびカスタム型の変換
Go言語では、インターフェース型の変数に対して型アサーションや型スイッチを利用することで、元の具体的な型に変換できます。
これにより、カスタム型の扱いが柔軟になります。
型アサーションを利用した変換
型アサーションは、インターフェース型の値から特定の型に変換する場合に使用されます。
変換が成功したかどうかを、ブール値でチェックすることも可能です。
型スイッチによる例外処理
型スイッチを利用すると、インターフェース変数の内部の型ごとに処理を分岐できます。
下記のサンプルコードは、インターフェース型の変数を整数型、文字列型、カスタム型(Person型)に振り分け、適切な処理を行う例です。
package main
import "fmt"
// Personはカスタム型の例
type Person struct {
    Name string
    Age  int
}
func main() {
    var x interface{}
    x = 100
    // 型アサーションによる単純な変換
    if num, ok := x.(int); ok {
        fmt.Println("xは整数型で、値は:", num)
    }
    // 型スイッチによる変換と例外処理
    switch v := x.(type) {
    case int:
        fmt.Println("型スイッチ:整数型の値は", v)
    case string:
        fmt.Println("型スイッチ:文字列型の値は", v)
    case Person:
        fmt.Println("型スイッチ:Person型の値は", v)
    default:
        fmt.Println("型スイッチ:未対応の型です")
    }
}xは整数型で、値は: 100
型スイッチ:整数型の値は 100型変換の実用例
型変換は、実用的なシーンでも多く使用されます。
ここでは、ユーザー入力の検証やJSONデータの変換処理における例を紹介します。
ユーザー入力の検証と変換
ユーザーからの入力値を文字列として受け取り、適切な型に変換する例です。
入力値が数値形式かどうかを検証し、エラー処理を行っています。
package main
import (
    "fmt"
    "strconv"
)
func main() {
    // ユーザー入力をシミュレーションする文字列
    inputStr := "789"
    // 文字列を整数に変換
    num, err := strconv.Atoi(inputStr)
    if err != nil {
        fmt.Println("変換エラー発生:", err)
        return
    }
    fmt.Println("ユーザー入力の変換結果:", num)
}ユーザー入力の変換結果: 789JSONデータの変換処理
外部から取得したJSONデータには、数値が文字列形式で含まれている場合があります。
そんな場合、まずは文字列として受け取った後、適切な型へ変換する必要があります。
エンコード・デコード時の変換ポイント
下記のサンプルコードは、JSON文字列から一旦map[string]string型にデコードし、必要な数値型へ変換する例です。
最終的に、変換した値をカスタム構造体Dataに格納して出力しています。
package main
import (
    "encoding/json"
    "fmt"
    "strconv"
)
// Data構造体はJSONのキーに対応したカスタム型
type Data struct {
    ID    int     `json:"id"`
    Score float64 `json:"score"`
}
func main() {
    // 数値が文字列形式で格納されたJSONデータ
    jsonString := `{"id": "123", "score": "98.7"}`
    // まずはmap型にデコードして変換前の文字列データを取得
    var tempData map[string]string
    err := json.Unmarshal([]byte(jsonString), &tempData)
    if err != nil {
        fmt.Println("JSONデコードエラー:", err)
        return
    }
    // 各フィールドを適切な型に変換
    id, err := strconv.Atoi(tempData["id"])
    if err != nil {
        fmt.Println("ID変換エラー:", err)
        return
    }
    score, err := strconv.ParseFloat(tempData["score"], 64)
    if err != nil {
        fmt.Println("Score変換エラー:", err)
        return
    }
    // 変換後の値をData構造体に格納
    data := Data{
        ID:    id,
        Score: score,
    }
    fmt.Printf("変換後のデータ:%+v\n", data)
}変換後のデータ:{ID:123 Score:98.7}型変換利用時の注意点
型変換を実行する際には、変換結果の精度やエラー処理、パフォーマンスへの影響などに注意する必要があります。
精度と丸めの管理
浮動小数点型では、数値の内部表現の性質から、丸め処理が必要になることがあります。
表示時に求める精度を指定して処理を行う例を以下に示します。
package main
import "fmt"
func main() {
    var f float64 = 3.1415926535
    // 小数点以下4桁に丸めて表示
    fmt.Printf("丸め後の値(小数点以下4桁):%.4f\n", f)
}丸め後の値(小数点以下4桁):3.1416変換時のエラー処理
型変換では、特に文字列から数値へ変換する際に、数値形式でない文字列が入力されるとエラーが発生します。
エラー発生時には、適切なエラーメッセージを出すことで、プログラムの信頼性を高めることができます。
package main
import (
    "fmt"
    "strconv"
)
func main() {
    str := "not a number"
    num, err := strconv.Atoi(str)
    if err != nil {
        fmt.Println("変換時のエラー処理:無効な数値形式です")
        return
    }
    fmt.Println("変換結果:", num)
}変換時のエラー処理:無効な数値形式ですパフォーマンスへの影響
大量のデータを変換する際、型変換がパフォーマンスにどの程度影響するかを確認することが大切です。
以下は、1,000,000回のループで整数から浮動小数点型への変換処理を行い、処理時間を計測する例です。
package main
import (
    "fmt"
    "time"
)
func main() {
    start := time.Now()
    sum := 0.0
    // 大量の型変換処理をシミュレーション
    for i := 0; i < 1000000; i++ {
        // int型からfloat64型への変換
        f := float64(i)
        sum += f
    }
    duration := time.Since(start)
    fmt.Println("大量変換処理の合計値:", sum)
    fmt.Println("処理時間:", duration)
}大量変換処理の合計値: 4.999995000000000E+11
処理時間: 15.4321msまとめ
この記事では、Go言語の型変換方法(整数、浮動小数点、文字列、インターフェース・カスタム型)の手法と実用例、ならびに注意点について丁寧に解説しました。
各節で示したサンプルコードを通して、具体的な変換操作とエラー処理の方法が把握できる内容となっています。
ぜひ、実際にコードを書いて型変換の実践に挑戦してみてください。