目次
【Go言語】基本型
「Go言語マスターへの道」 第2章 として前回の変数宣言に続いて、今回はGo言語における基本型について解説します。
(前回の記事)
Go言語にも、他のプログラミング言語と同様、整数型、浮動小数点数型、文字列型、論理型といったデータの種類を表す基本型が存在しています。
以降、Goでのそれぞれの型について説明します。
整数型
複数種類のint型
Goでの整数型はint型で定義します。
var i int = 1
int型で値を代入しない場合のゼロ値(初期値のこと)は0となります。
var i int
基本的には上記のようにintと型指定しますが、
int型には扱う数値の範囲によって複数種類用意されており、数値の大きさと符号を扱うかによってその種類を使い分けることができます。
int(符号あり)
uint(符号なし)
複数存在するint型の各種類は以下です。(扱える数値の範囲)
int8 (-128 ~ 127)
int16 (-32768 ~ 32767)
int32 (-2147483648 ~ 2147483647)
int64 (-9223372036854775808 ~ 9223372036854775807)
uint8 (0 ~ 255)
uint16 (0 ~ 65535)
uint32 (0 ~ 4294967295)
uint64 (0 ~ 18446744073709551615)
int,uintいずれも後ろに数値をつけず定義した場合は※環境依存となり、
int32(unint32)またはint64(unint64)と同じ大きさとなります。
※ 32ビットOSか64ビットOS
その他の整数型
int, uint以外ではその他に以下の整数型が存在します。
byte
uint8のエイリアス(別名)
rune
int32のエイリアスで、Unicodeのコードポイントを表す際に用意されている
uintptr
ポインタを扱うための符号なし整数型
浮動小数点数型
Goの浮動小数点数型には float32 と float64 が存在しています。
それぞれ扱えるデータ幅が32ビット、64ビットとなっており、ほとんどの場合、精度の高い方のfloat64の使用が推奨されています。
func main() {
var f0 float64
var f1 float64 = 1.00000001
var f2 float32 = 1.00000001
fmt.Println(f0)
fmt.Println(f1)
fmt.Println(f2)
}
(出力結果)
0
1.00000001
1
変数を代入しない場合のゼロ値はint型と同様0となります。
文字列型
Goでの文字列型(テキスト)は string のみとなります。
変数の値はダブルクォーテーションで囲む必要があり、シングルクォーテーションは使用することができません。
ただし、数値型の箇所で説明したrune型として1文字を代入する場合はシングルクオーテーションを使用します。
stringのゼロ値は空文字列となります。
func main() {
var s string
var s1 string = "Golang"
s2 := "Python"
var s3 rune = 'G'
fmt.Println(s)
fmt.Println(s1)
fmt.Println(s2)
fmt.Println(s3)
}
(出力結果)
Golang
Python
71
論理型
Goで真偽値を扱う論理型は bool で定義します。
bool型で定義した変数は true と false の2つの値しかなく、0や1などを代入することはできません。
代入しない場合のゼロ値は false となります。
func main() {
var b1 bool
var b2 bool = true
var b3 = false
fmt.Println(b1)
fmt.Println(b2)
fmt.Println(b3)
}
(出力結果)
false
true
false
Goでの型変換(キャスト)
Go言語の基本型について、ある型で定義された値を異なる型に変換する型変換(キャスト)について解説します。
数値型同士の型変換
数値型同士の変換の場合、型名(型変換する値)と表記すれば変換を行うことができます。
intとfloatの型変換
以下のサンプルはint型の変数 iをfloat64型に変換して変数 fとして再定義し、fmtパッケージのPrintf関数で変数 fの情報を出力しています。
func main() {
var i int = 1
f := float64(i)
fmt.Printf("%T\n", f)
fmt.Printf("%v\n", f)
fmt.Printf("%f\n", f)
}
(出力結果)
float64
1
1.000000
Printf関数についての詳細は以下記事を参考にしてください。
浮動小数点数型同士の変換
異なる精度の浮動小数点数型、float64とfloat32も相互変換可能です。
func main() {
var f64 float64 = 1.00000001
f32 := float32(f64)
fmt.Printf("%T\n", f32)
fmt.Printf("%v\n", f32)
fmt.Printf("%f\n", f32)
}
(出力結果)
float32
1
1.000000
文字列型と数値型の型変換
数値型と文字列型の変換はPHPなど他の言語では比較的簡単にできますが、Goで同じことを行う場合は、
strconvというパッケージに存在する関数を利用する必要があります。
int から string
数値型から文字列型へ変換する場合はstrconvパッケージのItoa関数(Integer to ascii)を使用します。
package main
import (
"fmt"
"strconv"
)
func main() {
var i int = 1
s := strconv.Itoa(i)
fmt.Printf("%T\n", s)
fmt.Printf("%v\n", s)
fmt.Printf("%s\n", s)
}
プログラムの先頭でstrconvパッケージをインポートし、strconv.Itoaとして関数を呼び出します。
引数に数値型で宣言した変数を指定して、文字列に変換します。
Printfで指定している「%s」は文字列値を出力するフォーマットとなります。
(出力結果)
string
1
1
string から int
文字列型から数値型に変換する場合には同じくstrconvのAtoi関数(Ascii to integer)を使用します。
package main
import (
"fmt"
"strconv"
)
func main() {
var s string = "100"
i, err := strconv.Atoi(s)
if err != nil {
fmt.Println("Error")
return
}
fmt.Printf("%T\n", i)
fmt.Printf("%v\n", i)
fmt.Printf("%d\n", i)
}
Atoi関数はエラーがある場合に、0とエラーの2つを返す仕様となっていますので、
関数を呼び出す際に変換後の値とエラー(err)の2つを変数として受け取るようにする必要があります。
エラー判定を記述しない場合、以下のようにerrを_(アンダースコア)に置き換えて記述することもできます。
i, _ := strconv.Atoi(s)
(出力結果)
Printfの「%d」で整数値(10進数)の形式を出力
int
100
100