
変数宣言した値を、違う型に変更することはできるの?
Go言語は静的型付け言語で、型には厳しいプログラミング言語です。
一度、変数宣言した値を違う型に変更したい場合は型変換が必要になります。
今回は、Go言語の型変換でこれだけは知っておこう!ということをお伝えしていきます。
【Go言語の型変換】int型とfloat64型
int型からfloat64型、その逆のfloat64型からint型への型変換のコードを見ていきましょう。
int型からfloat64型への型変換

型変換の時はvarを省略した形の変数宣言でいいと思います。
// int型からfloat64型への型変換
package main
import "fmt"
func main() {
// int型で変数宣言
var i int = 1
// int型からfloat64型へ変換
fl := float64(i)
fmt.Println(fl)
// 型を確認
fmt.Printf("i = %T\n", i)
fmt.Printf("fl = %T\n", fl)
}
// 出力結果
$ go run main.go
1
i = int
fl = float64
変数i
は int型
のままで、新たに変数宣言した 変数fl
が float64型
になっていることが確認できます。
float64型からint型への型変換
// float64型からint型への型変換
package main
import "fmt"
func main() {
var fl2 float64 = 10.5
i2 := int(fl2)
// 型を確認
fmt.Printf("i = %T\n", fl2)
fmt.Printf("fl = %T\n", i2)
// float64型からint型へ変換すると小数点以下は切り捨てられる
// 出力結果は10
fmt.Println(i2)
}
// 出力結果
$ go run main.go
i = float64
fl = int
10
float64型からint型への型変換で注意したいことは、値が小数点以下は切り捨てられることです。

四捨五入では無いので注意しましょう。
【Go言語の型変換】string型とint型
string型とint型の型変換は、float64型とint型の型変換の方法ではエラーになります。
package main
import "fmt"
func main() {
// "100"をstring型で宣言
var s string = "100"
// 間違った型変換
i3 := int(s)
fmt.Println(i3)
}
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:11:11: cannot convert s (type string) to type int
変数sをコンバートできません…というエラーになります。
エラーを出さずにstring型とint型の型変換を行ってみましょう。
string型からint型への型変換
string型からint型への型変換する関数 strconv.Atoi を使用します。

strconv.Atoiで押さえておくポイントをお伝えしますね。
まずはエラーメッセージを破棄する方法での型変換のコードを見てみましょう。
// strconv.Atoiでstring型からint型へ型変換
package main
import (
"fmt"
"strconv" // パッケージをインポート
)
func main() {
// "100"をstring型で宣言
var s string = "100"
// strconvパッケージのAtoi関数はstring型からint型へ変換する
i3, _ := strconv.Atoi(s)
fmt.Println(i3)
fmt.Printf("i3 = %T\n", i3)
}
// 出力結果
$ go run main.go
100
i3 = int // int型に型変換された
strconv.Atoiは2つの値を返しますが、エラーメッセージを破棄するために _ を使っています。
通常であれば2つの値を受け取る変数を用意する必要がありますが、Go言語では変数は必ず使用しなければいけないルールがあります。
エラーメッセージが要らない場合は、変数を宣言せずに _ に置き換えることで値を破棄することができます。

では、エラーメッセージを受け取る時はどうしたら良いでしょうか?
// strconv.Atoiでstring型からint型へ型変換
package main
import (
"fmt"
"strconv"
)
func main() {
// "100"をstring型で宣言
var s string = "100"
// strconvパッケージのAtoi関数はstring型からint型へ変換する
i4, err := strconv.Atoi(s)
// エラーハンドリングが必要
// nilは何もなければ
if err != nil {
fmt.Println(err)
}
fmt.Println(i4)
fmt.Printf("i = %T\n", i4)
}
// 出力結果
$ go run main.go
100
i3 = int // int型に型変換された
ここで注目したいのは変数を2つ宣言していることと、エラーの有り無しを条件分岐(if文)する必要(エラーハンドリング)があります。
上記のコードでは、 int型にきちんと変換されたためエラーメッセージが無いので次の処理が実行されています。
では、エラーがある場合のコードを見てみましょう。
// strconv.Atoiでstring型からint型へ型変換
package main
import (
"fmt"
"strconv"
)
func main() {
// strconvパッケージのAtoi関数はstring型からint型へ変換する
// "ABC"をint型に変換する(できないのでエラーになる)
i4, err := strconv.Atoi("ABC")
// エラーハンドリングが必要
// nilは何もなければ
if err != nil {
fmt.Println(err)
}
fmt.Println(i4)
fmt.Printf("i4 = %T\n", i4)
}
// 出力結果
$ go run main.go
strconv.Atoi: parsing "ABC": invalid syntax
0
i4 = int
出力結果に「”ABC”を解析したら無効な構文です。」というエラーが表示されています。
それでも、変数 i4
はint型になり "ABC"
をint型の数値に変換できなかったため、int型の初期値 0
が代入されています。
strconv.Atoi関数を使用した型変換は2つの方法があるので、適時、使い分けていきましょう。
int型からstring型への型変換
int型からstring型への型変換は、strconv.Itoa関数を使用します。
strconv.Itoa関数は、strconv.Atoi関数と違い返す値は1つです。
// strconv.Itoa関数でint型をstring型に型変換
package main
import (
"fmt"
"strconv"
)
func main() {
// int型からstring型へ変換
var i5 int = 200
str := strconv.Itoa(i5)
fmt.Println(str)
fmt.Printf("str = %T\n", str)
}
// 出力結果
$ go run main.go
200
str = string
【Go言語の型変換】string型とbyte型
string型はbyte型の配列ですので、型変換することができます。
string型からbyte型への型変換
では、コードを確認していきましょう。
//string型からbyte型への型変換
package main
import "fmt"
func main() {
// string型からbyte型へ変換
var str2 string = "Hello Golang"
var b []byte
b = []byte(str2)
fmt.Println(b)
// byte型からstring型へ変換
str3 := string(b)
fmt.Println(str3)
}
// 出力結果
$ go run main.go
[72 101 108 108 111 32 71 111 108 97 110 103]
Hello Golang
"Hello Golang"
がアスキーコードの配列として出力されているのが確認できます。
byte型からstring型へ変換は、変数 := string(byte型の変数)
で型変換できます。
【まとめ】Go言語の型変換の基本的なこと
では、Go言語の型変換についてまとめてみましょう。
今回はGo言語の型変換の基本をお伝えしてきました。
これから先、Go言語でプログラムを書く際に必要になる場面もありますので押さえておきましょう!
comment