型変換は型に厳しいGo言語では基本だけでも押さえておこう!

Go言語
この記事は約9分で読めます。
Go初学者
Go初学者

変数宣言した値を、違う型に変更することはできるの?

この記事ではGo言語の基本的な型変換について理解できます!
  • 新たに変数を宣言して型変換する方法
  • ちょっとだけ難しいstring型からint型、int型からstring型への型変換の方法

Go言語は静的型付け言語で、には厳しいプログラミング言語です。

一度、変数宣言した値を違う型に変更したい場合は型変換が必要になります。

今回は、Go言語の型変換でこれだけは知っておこう!ということをお伝えしていきます。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

【Go言語の型変換】int型とfloat64型

int型からfloat64型、その逆のfloat64型からint型への型変換のコードを見ていきましょう。

int型からfloat64型への型変換

型変換するための変数 := 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

変数iint型 のままで、新たに変数宣言した 変数flfloat64型 になっていることが確認できます。

float64型からint型への型変換

型変換するための変数 := 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(型変換したい変数)
または
型変換するための変数, err := strconv.Atoi(型変換したい変数)

もりぴ
もりぴ

strconv.Atoiで押さえておくポイントをお伝えしますね。

CHECK POINT
strconv.Atoiは2つの値を返す関数です!
  • 変換したint型の値
  • 型変換できない時のエラーメッセージ

まずはエラーメッセージを破棄する方法での型変換のコードを見てみましょう。

// 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(型変換したい変数)

// 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型への型変換

型変換するための変数 := []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言語の型変換で押さえておくこと!
  • 型変換は 型変換するための変数 := 変換する型(型変換したい変数)で行う
  • string型からint型への型変換は strconv.Atoi関数を使う
  • int型からstring型への型変換は strconv.Itoa関数を使う

今回はGo言語の型変換の基本をお伝えしてきました。

これから先、Go言語でプログラムを書く際に必要になる場面もありますので押さえておきましょう!

comment

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