Go言語の型変換(キャスト)の基本!int・floatなど型を安全に変換する方法
生徒
「Go言語って、数字の型を変えることはできますか?」
先生
「はい、Go言語では型変換(キャスト)を使って、例えば整数(int)を小数(float)に変えたりできます。」
生徒
「どうやって変換するんですか?難しくないですか?」
先生
「とても簡単です!では、基本から一緒に学んでみましょう!」
1. 型変換(キャスト)とは?
Go言語の型変換(キャスト)は、ある型の値(たとえば整数型int)を別の型(たとえば浮動小数点型float64)として扱えるようにする操作です。見た目は同じ「数字」でも、コンピューター内部では保存形式や表現できる範囲が異なるため、そのまま混ぜて計算はできません。
Go言語では暗黙的な変換は行われません。つまり、intとfloat64を直接足し算しようとするとエラーになります。安全性と分かりやすさを守るため、変換先の型名を明示して「この値をこの型として扱ってね」と指示するのが基本ルールです。
書式はシンプルで、変換先の型名(値)の形で指定します。計算の意図がコードから読み取れるようになり、桁落ちや精度の勘違いを防ぐ助けにもなります。まずは小さな例で、どのように使うのか感覚をつかみましょう。
ミニサンプル:混在する数値を明示して足し算
package main
import "fmt"
func main() {
var a int = 10
var b float64 = 3.5
// aはintなので、float64に明示的に変換してから加算する
sum := float64(a) + b
// 逆方向の変換:小数は切り捨てられてintになる
c := int(b) // 3 になる
fmt.Println(sum) // 13.5
fmt.Println(c) // 3
}
ポイントは次の三つです。①intとfloat64は自動では混ざらない、②必要に応じてfloat64(a)のように変換して計算する、③intに変換すると小数部は切り捨てられる――この基本を押さえておけば、以降の具体例でも迷いにくくなります。
2. int から float64 に変換する方法
整数を小数として計算したいとき(平均値の計算や割合の算出など)は、intをfloat64に変換します。見た目が同じ「10」でも、型が違うと計算結果や扱い方が変わるため、必要な場面で明示的に変換しておくと安心です。
基本:そのまま小数として扱う
var i int = 10
var f float64 = float64(i) // int → float64 に明示的に変換
fmt.Println(f) // 10(小数として扱える)
float64(i)のように、変換先の型名(値)と書くだけです。以後は小数の演算や表示ができ、桁数を保ったままの計算が可能になります。
よくあるつまずき:平均値で整数同士を足して割る
整数同士の割り算は小数点以下が切り捨てられます。平均や割合を正確に出したいときは、割る前にどちらかをfloat64へ変換しましょう。
sum := 7 // int
n := 2 // int
avgWrong := sum / n // 3 になる(小数が消える)
avg := float64(sum) / float64(n) // 3.5(意図した小数の平均)
fmt.Println(avgWrong) // 3
fmt.Println(avg) // 3.5
ポイントは「演算の前に変換する」こと。あとから結果だけ変換しても、小数が失われていたら元に戻りません。
小さなコツ:どちらを変換すべき?
- 割合や平均など小数が必要な計算は、少なくとも片方を
float64へ。 - 定数の
10.0のような小数リテラルと計算する場合は、整数側をfloat64に寄せると読みやすい。 - 一時変数を作ると意図が伝わりやすく、後から読む人にも親切。
3. float64 から int に変換する方法
今度は、浮動小数点(小数)を整数に変換してみましょう。
var f float64 = 12.8
var i int = int(f)
fmt.Println(i)
このとき、小数点以下は切り捨てられます。つまり、12.8 は整数に変えると 12 になります。四捨五入されるわけではないので注意しましょう。
12
4. string型から数値への変換
文字列(string)から数値に変換したいときは、少しだけ特別な方法を使います。Go言語では、strconv(ストリング・コンバージョン)というパッケージを使って変換します。
import "strconv"
str := "123"
i, err := strconv.Atoi(str)
if err != nil {
fmt.Println("変換できませんでした")
} else {
fmt.Println(i)
}
Atoiというのは「ASCII to Integer(文字を整数に)」の略です。
数字として書かれた文字列を、正しいint型に変換できます。
123
5. 型変換で注意すること
型変換では、安全に変換できるかどうかがとても大切です。
- 小数から整数に変えると、小数点以下は切り捨てられる
- 文字列から数値に変えるときは、
strconvを使い、エラー処理を忘れない - 変換できないデータは、そのままではプログラムが止まってしまうこともある
ですので、型変換を使うときは「このデータ、本当に変換していいのか?」と考えることが大切です。
まとめ
今回はGo言語でとても大切な概念である型変換(キャスト)について、できるだけ専門用語を少なくしながら丁寧に整理しました。じつは、プログラミングの世界では、ただの数字に見えても「整数なのか小数なのか」「文字なのか数値なのか」という違いで計算結果が変わったり、エラーに変わったりします。そこで、安全に扱うために、型をそろえてから計算するという考え方がとても重要になります。この考え方を理解しておくと、後々データ処理やAPIから受け取った値の計算などで混乱せず、落ち着いてコードを書くことができます。
型変換をするときの考え方
まず、Go言語では暗黙的な型変換をしないという決まりがあります。「勝手に変換してくれたら楽なのに」と思うかもしれませんが、逆に勝手に変わってしまうと、思っていない数字になってしまったり、小数が消えてしまったりといったトラブルが起きます。そのため、float64(値)やint(値)のように、人間が意図をはっきり書くようになっています。読み返したときにも「なぜこの値を小数にしたいのか」「なぜ整数に変えたのか」がすぐ理解できるので、あとから見た人にも親切なコードになります。
整数と小数を変換する意味
整数と小数は似ているように見えて、計算の扱い方が少し違います。たとえば、平均値や割合を出すとき、整数同士を割り算すると小数が消えます。これは数学的に正しい答えを得たい場面では困ります。そこで、計算の前にfloat64へ変換することで、小数点のまま計算できます。逆に、商品個数やページ数など小数が不要な場面では、そのままint()で切り捨てるほうが自然です。つまり、用途に合わせて型を選ぶことで、より実用的で理解しやすいプログラムになるということです。
文字列を数値に変換する理由
画面入力や外部ファイルでは、数字が文字列として送られてくることがとても多いです。しかし、文字列のままでは計算できないので、strconvを使って数値に変換します。その際、入力が正しい数字でなければエラーになります。だからこそ、エラー処理が大切で、「もし変換できなかったらどうするか」を考えて書くことで、プログラムが途中で止まらないようにできます。仕事で使われるプログラムは、予期しない入力にも対応できる必要があるため、この考え方はとても重要です。
型変換の総まとめサンプル
ここまで学んだ内容を小さなサンプルで振り返ってみます。整数を小数で割ったり、小数を整数に変換したり、文字列を数値に変換したりといった基本的な処理を一つにまとめた例です。
package main
import (
"fmt"
"strconv"
)
func main() {
a := 7
b := 2
avg := float64(a) / float64(b)
fmt.Println(avg)
price := 12.8
fmt.Println(int(price))
str := "100"
num, err := strconv.Atoi(str)
if err != nil {
fmt.Println("変換できませんでした")
return
}
fmt.Println(num)
}
この短いプログラムだけでも、Go言語の型変換がどれほど大切なのかがよくわかります。特に、整数の割り算で小数が消えたり、文字列がそのままでは計算できなかったりする部分は、初心者がつまずきやすい点です。ゆっくり復習しながら、実際に自分の手で書いて動かしてみると理解が深まります。
生徒
「最初は型変換って難しい印象でしたが、意外とシンプルなんですね。」
先生
「そうです。複雑に見えても、目的は『正しく扱える型にそろえる』だけです。数字のまま計算したいのか、整数で切り捨てたいのか、文字列から数値にしたいのかを考えれば迷いません。」
生徒
「これなら、平均の計算で小数が消えちゃう理由もわかります。先にfloat64に変えればよかったんですね。」
先生
「その通りです。意図をはっきり書くことで、読みやすいコードにもなります。次からは、計算する前に『どの型で扱うのが正しいのか』を意識してみましょう。」
生徒
「はい!今度は文字列を数値に変換する処理ももっと練習してみます。」