🤖

Goの基本型・プリミティブ型の使い方と注意点まとめ

2023/11/08に公開

記事の内容

Goの基本型(プリミティブ型)の使い方と注意点をまとめます。

対象読者

  • Goに入門した方
  • Goに興味がある方
  • Goでプログラミングをしている方

記事の長さ

5分で読めます

様々な型

Booleans (bool型・論理値型)

GoのBooleansは、truefalseのどちらかの値をとります。
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"" == falsetrueになります。
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で配信しています。

https://note.com/ring_belle/membership

Discussion