Golangにおける型変換(型キャスト)の具体的な使い方を解説

Golang

プログラミングではあるデータ型を別のデータ型に変換しなければいけない場合があります。

そこで、本記事では、プログラミング言語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における型変換(型キャスト)のデメリット

型変換は、元のデータ型を変更するのに最適な方法です。

しかし、残念ながら場合によってはデータ型の精度が落ちてしまうことがあるので、乱用するのは控えるべきでしょう。

型変換を使う時と場合に注意しながら、使うことをおすすめします。

タイトルとURLをコピーしました