Goの基本型・プリミティブ型の使い方と注意点まとめ
記事の内容
Goの基本型(プリミティブ型)の使い方と注意点をまとめます。
対象読者
- Goに入門した方
- Goに興味がある方
- Goでプログラミングをしている方
記事の長さ
5分で読めます
様々な型
Booleans (bool型・論理値型)
GoのBooleansは、true
かfalse
のどちらかの値をとります。
YesかNoを表すために使われる型です。
- アカウントが有効かどうかを確認するための値(isActive = false)
- Adminユーザーかどうかを確認するための値(isAdmin = true)
のような使い方をします。
var isActive bool
var isAdmin = true
※変数宣言時に何も指定しない場合、false
がデフォルトでセットされます。(isActiveはfalse
)
Numeric Type (数値型)
次は数字を表すNumeric Typeです。
Goの数値型は12種類に分かれており、それぞれ4つのカテゴリに分類されます。
符合付き整数型 (int)
まずは符合付き整数型(int)です。
int
の後にサイズの数字を付与することで、その変数が取りうる値の範囲を制限できます。
型 | 範囲 |
---|---|
int8 | -128 ~ 127 |
int16 | -32768 ~ 32767 |
int32 | -2147483648 ~ 2147483647 |
int64 | -9223372036854775808 ~ 9223372036854775807 |
package main
import "fmt"
func main() {
var a int8 = 123
fmt.Println(a)
}
-> 123が出力されます。
Overflow(オーバーフロー)
型の範囲外の数値を変数に代入すると、オーバーフロー(桁あふれ)が発生します。
package main
import "fmt"
func main() {
var a int8 = 162
fmt.Println(a)
}
この範囲外のGoのコードをbuildすると、
./prog.go:8:15: cannot use 162 (untyped int constant) as int8 value in variable declaration (overflows)
Go build failed.
というエラー(overflows)が発生します。
符合なし整数型 (uint)
型 | 範囲 |
---|---|
uint8 | 0 ~ 255 |
uint16 | 0 ~ 65535 |
uint32 | 0 ~ 4294967295 |
uint64 | 0 ~ 18446744073709551615 |
符合なし整数型 (uint)です。
マイナスの値を排除して、その分同じサイズでもとりうる値の正の値の範囲が大きくなっています。
package main
import "fmt"
func main() {
var a uint8 = 162
fmt.Println(a)
}
-> 162が出力される
package main
import "fmt"
func main() {
var a uint8 = -1
fmt.Println(a)
}
./prog.go:8:16: cannot use -1 (untyped int constant) as uint8 value in variable declaration (overflows)
Go build failed.
-> uintのため、マイナスの値を代入するとoverflowsが発生する。
エイリアス
GoのInterger型にはエイリアス(代わりに表す表記)が存在します。
型 | エイリアス | 範囲 |
---|---|---|
uint8 | byte | 0 ~ 255 |
int32 | int (32-bit CPU), rune | -2147483648 ~ 2147483647 |
int64 | int (64-bit CPU) | -9223372036854775808 ~ 9223372036854775807 |
※エイリアスのint
は実行環境によってとりうる値が変わります。
つまり、uint8
のエイリアスであるbyte
を使うと、以下のようになります。
package main
import "fmt"
func main() {
var a byte = 2
fmt.Println(a)
}
と
package main
import "fmt"
func main() {
var a uint8 = 2
fmt.Println(a)
}
は、同じ意味になります。
浮動小数点型 (floating point type)
型 | 範囲 |
---|---|
float32(単精度浮動小数点数) | 約 ±3.4E38(±1.4 x 10^38) |
float64(倍精度浮動小数点数) | 約 ±1.8E308(±1.8 x 10^308) |
小数点を表す型がfloat型です。float32はfloat64に比べて精度が低いため、特別な理由がない限りはfloat64を利用します。(型を指定せずに小数の値を変数に代入した場合も、float64が自動で選択されます。)
浮動小数点型の注意点
package main
import "fmt"
func main() {
var a float64 = 0.1
var b float64 = 0.2
fmt.Println(a + b)
}
-> 0.30000000000000004 が出力される。
浮動小数を使うと、上記のような結果が生まれます。
これは、float typeは精度の限界までの範囲しか10進数で値を保持できない特性が原因です。
そのため、厳密な計算を行いたい場合は、固定小数点を使ったり、数値計算用ライブラリを使用する必要があります。
package main
import (
"fmt"
"math"
)
func round(num float64) int {
return int(num + math.Copysign(0.5, num))
}
func roundTo(num float64, decimalPlaces int) float64 {
output := math.Pow(10, float64(decimalPlaces))
return float64(round(num*output)) / output
}
func main() {
fmt.Println(roundTo(0.1+0.2, 2))
}
-> 0.3 が出力される
複素数型 (Complex Type)
Goには複素数を表す型もありますが、この型を利用するケースはほぼありません。(覚えなくていいです)
型 | 範囲 |
---|---|
complex64 | 約 ±3.4E38(±1.4 x 10^38)(実部と虚部) |
complex128 | 約 ±1.8E308(±1.8 x 10^308)(実部と虚部) |
String型 (文字列型)
String型はすごくシンプルで、ダブルクォーテーションに囲まれた文字列を格納する型です。
package main
import "fmt"
func main() {
var a string = "こんにちは"
fmt.Println(a)
}
-> こんにちは
と出力される。
型の注意点
Go言語の基本型の注意点を紹介します
自動変換をしない
package main
import "fmt"
func main() {
var a int8 = 10
var b float64 = 10.5
var c float64 = a + b
fmt.Println(c)
}
こういった記述はNGです。(./prog.go:10:18: invalid operation: a + b (mismatched types int8 and float64)
)
int型のaとfloat型のbを足すことで、自動的にcにfloat型を格納するということはできません。
明示的にint->floatへの変換をする必要があります。
package main
import "fmt"
func main() {
var a int8 = 10
var b float64 = 10.5
var c float64 = float64(a) + b
fmt.Println(c)
}
0や空文字がfalseにならない
javascriptでは、0 == false
や"" == false
がtrue
になります。
javascript
> 0 == false
true
> "" == false
true
このような、0は偽、空文字は偽という扱いをGoではすることができません。
package main
import "fmt"
func main() {
var a string = ""
var b byte = 0
if a {
fmt.Println("a is true")
} else {
fmt.Println("a is false")
}
if b {
fmt.Println("b isgood")
} else {
fmt.Println("b is false")
}
}
./prog.go:11:5: non-boolean condition in if statement
./prog.go:16:5: non-boolean condition in if statement
このように、buildエラーになってしまいます。
型宣言の省略や:= が使える
var a int = 5
var b = 5
c := 5
このように、型の省略や:=
を使うことで、var
の省略が可能です。
まとめ
本記事では、Goの基本型の使い方と注意点をまとめました。
Goでプログラミングを行っていく場合、必ず必要な概念ですので、しっかりマスターしていきたいです。
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion