数値 #
整数を10進数・2進数・8進数・16進数で表す #
整数リテラルには10進数・2進数・8進数・16進数で表せる。
10進数はそのまま表記する。
2進数は 0[bB]
を接頭辞とする。
8進数は 0[oO]
を接頭辞とする。
16進数は 0[xX]
を接頭辞とする。
どの表記でも読みやすくするために数字と数字の間に区切り文字として _
を挿入することができる。
package main
import (
"fmt"
)
func main() {
// 10進数
fmt.Println(42)
fmt.Println(100_000) // == 100000
// 2進数
fmt.Println(0b0001) // == 1
fmt.Println(0B0010) // == 2
fmt.Println(0b_1111_1111) // == 255
// 8進数
fmt.Println(0o10) // == 8
fmt.Println(0O11) // == 9
// 16進数
fmt.Println(0x10) // == 16
fmt.Println(0X_Cafe_BABE) // == 3405691582
}
浮動小数点数を10進数・16進数・指数表記で表す #
浮動小数点数リテラルには10進数・16進数・指数表記で表せる。
10進数はそのまま表記する。
16進数は 0[xX]
を接頭辞とする。
10進数の指数表記は 仮数部[eE](+-)?指数部
と表記する。
16進数の指数表記は 0[xX]仮数部[pP](+-)?指数部
と表記する。
どの表記でも読みやすくするために数字と数字の間に区切り文字として _
を挿入することができる。
package main
import (
"fmt"
)
func main() {
// 10進数
fmt.Println(123.456)
fmt.Println(0.123_456) // == 0.123456
fmt.Println(042.0) // == 42
// 整数部分か小数部分は省略できる
fmt.Println(123.) // == 123
fmt.Println(.123) // == 0.123
// 10進数の指数表記
fmt.Println(.345e2) // == 34.5
fmt.Println(1e2) // == 100
fmt.Println(.678e+1) // == 6.78
fmt.Println(.678e-1) // == 0.0678
// 16進数表記指数表記
fmt.Println(0x1p-2) // == 0.25
fmt.Println(0X2.P10) // == 2048.0
}
最大値と最小値 #
package main
import (
"fmt"
"math"
)
func main() {
// int8
fmt.Println(math.MaxInt8) // == 127
fmt.Println(math.MinInt8) // == -128
// int16
fmt.Println(math.MaxInt16) // == 32767
fmt.Println(math.MinInt16) // == -32768
// int32
fmt.Println(math.MaxInt32) // == 2147483647
fmt.Println(math.MinInt32) // == -2147483648
// int64
fmt.Println(math.MaxInt64) // == 9223372036854775807
fmt.Println(math.MinInt64) // == -9223372036854775808
// uint8
fmt.Println(math.MaxUint8) // == 255
// uint16
fmt.Println(math.MaxUint16) // == 65535
// uint32
fmt.Println(math.MaxUint32) // == 4294967295
// uint64
// math.MaxUint64 をそのまま実行すると int として扱おうとしてエラーになるために型を指定している
fmt.Println(uint64(math.MaxUint64)) // == 18446744073709551615
// float32
fmt.Println(math.MaxFloat32) // == 3.4028234663852886e+38
fmt.Println(math.SmallestNonzeroFloat32) // == 1.401298464324817e-45
// float64
fmt.Println(math.MaxFloat64) // == 1.7976931348623157e+308
fmt.Println(math.SmallestNonzeroFloat64) // == 5e-324
}
参考ドキュメント: math
四則演算をする #
package main
import (
"fmt"
)
func main() {
// 四則演算
fmt.Println(1 + 2) // == 3
fmt.Println(1 - 2) // == -1
fmt.Println(1 * 2) // == 2
fmt.Println(4 / 2) // == 2
// 剰余
fmt.Println(42 % 4) // == 2
// 整数の割り算では小数点以下は切り捨て
fmt.Println(1 / 2) // == 0
// 型が違うと計算できないのでキャストする
i := 100
f := .1
fmt.Println(float64(i) + f)
// 0 で割ると panic
z := 0
fmt.Println(100 / z)
}
小数点以下の切り上げ・切り捨て・四捨五入をする #
package main
import (
"fmt"
"math"
)
func main() {
f1 := 1.18
f2 := 2.51
// 切り上げ
fmt.Println(math.Ceil(f1)) // == 2.0
fmt.Println(math.Ceil(f2)) // == 3.0
// 切り捨て
fmt.Println(math.Floor(f1)) // == 1.0
fmt.Println(math.Floor(f2)) // == 2.0
// 四捨五入
fmt.Println(math.Floor(f1 + 0.5)) // == 1.0
fmt.Println(math.Floor(f2 + 0.5)) // == 3.0
}
参考ドキュメント: math
型変換 #
package main
import (
"fmt"
"math"
)
func main() {
// `型名(値)` で型変換をする
var i8 int8 = 1
var i16 int16 = int16(i8)
fmt.Println(i16)
// 整数から浮動小数点数への変換
var f64 float64 = float64(i8)
fmt.Println(f64)
// 容量が小さい型から大きい型への変換は安全
var i8m int8 = math.MaxInt8
var i32 int32 = int32(i8m)
fmt.Println(i32)
// 容量が大きい型から小さい型への変換は意図しない値になることがある
i32 = math.MaxInt32
i8 = int8(i32)
fmt.Println(i8) // == -1
// 符号付整数から符号なし整数への変換は意図しない値になることがある
var i int64 = -1
var ui uint64 = uint64(i)
fmt.Println(ui) // == 18446744073709551615
}
整数を整形して表示する #
package main
import (
"fmt"
)
func main() {
i := 42
// `%d` で10進数で表示
fmt.Printf("%d\n", i) // => 42
// `%{数字}d` で文字幅の指定
fmt.Printf("%10d\n", i) // => " 42"
// `%{0数字}d` で文字幅の指定(0パディング)
fmt.Printf("%010d\n", i) // => "0000000042"
// `%b` で2進数で表示
fmt.Printf("%b\n", i) // => 101010
// `%o` か `%O` で8進数で表示
// `%O` なら接頭辞に `0o` を付与する
fmt.Printf("%o, %O\n", i, i) // => "52, 0o52"
// `%x` か `%X` で16進数で表示
// `%x` なら 10-15 に a-f を使い `%X` なら A-F を使う
fmt.Printf("%x, %X\n", i, i) // => "2a, 2A"
// `%c` で整数を Unicode のコードポイントとして評価して文字を表示する
fmt.Printf("%c\n", i) // => "*"
// `%q` で `%c` の文字をシングルクォートで囲む
fmt.Printf("%q\n", i) // => "'*'"
// `%U` で整数を Unicode のコードポイントとして評価して `U+NNNN` というフォーマットで表示する
fmt.Printf("%U\n", i) // => "U+002A"
}
参考ドキュメント: fmt
浮動小数点数を整形して表示する #
package main
import (
"fmt"
)
func main() {
f := 123.456
// `%f` で10進数で表示
fmt.Printf("%f\n", f) // => 123.456000
// `%{.数値}f` で小数部分の有効桁数を指定
fmt.Printf("%.0f\n", f) // => 123
fmt.Printf("%.1f\n", f) // => 123.5
fmt.Printf("%.10f\n", f) // => 123.4560000000
// `%{数値.}f` で表示幅を指定
fmt.Printf("%10.1f\n", f) // => " 123.5"
fmt.Printf("%20.2f\n", f) // => " 123.46"
// `%{0数値.}f` で表示幅を指定(0パディング)
fmt.Printf("%010.1f\n", f) // => "00000123.5"
fmt.Printf("%020.2f\n", f) // => "00000000000000123.46"
// `%b` で2進数で表示
fmt.Printf("%b\n", f) // => 8687443681197687p-46
// `%e` で指数を使った表記 `%E` は大文字バージョン
fmt.Printf("%e\n", f) // => 1.234560e+02
fmt.Printf("%E\n", f) // => 1.234560E+02
// `%x` は16進数で表示. `%X` は大文字バージョン
fmt.Printf("%x\n", f) // => 0x1.edd2f1a9fbe77p+06
fmt.Printf("%X\n", f) // => 0X1.EDD2F1A9FBE77P+06
// `%g` は小さい数なら `%f` と同様で、大きくなると `%e` になる
fmt.Printf("%g\n", f) // => 123.456
fmt.Printf("%g\n", 1234567.89) // => 1.23456789e+06
// `%G` は `%g` の大文字バージョン
fmt.Printf("%G\n", f) // => 123.456
fmt.Printf("%G\n", 1234567.89) // => 1.23456789E+06
}
参考ドキュメント: fmt
乱数 #
package main
import (
cryptorand "crypto/rand"
"fmt"
mathrand "math/rand"
"time"
)
func main() {
// math/rand による擬似乱数の生成
// rand.Seed でシード値を指定して rand.Intn で 0 から n-1 までの中からランダムに数字を抽選します
// ある程度ばらけた数字を高速に生成できますが、パスワードなどセキュリティ要求の高い用途には向いていません
mathrand.Seed(time.Now().UnixNano())
fmt.Println(mathrand.Intn(100)) // == 0
// crypto/rand による乱数の生成
// math/rand に比べて低速だがセキュリティ要件の高い用途にも利用できる
b := make([]byte, 10)
_, err := cryptorand.Read(b)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", b) // == [27 66 7 91 131 110 66 201 67 204] (これは実行ごとにランダムになる)
}
参考ドキュメント: math/rand , crypto/rand
累乗・絶対値・最大値・最小値を計算する #
package main
import (
"fmt"
"math"
)
func main() {
// 累乗
fmt.Println(math.Pow(2, 3)) // == 8
fmt.Println(math.Pow(10, 4)) // == 10000
// 絶対値
fmt.Println(math.Abs(100)) // == 100
fmt.Println(math.Abs(-100)) // == 100
// 最大値
fmt.Println(math.Max(1, 2)) // == 2
// 最小値
fmt.Println(math.Min(1, 2)) // == 1
}
参考ドキュメント: math
ビット演算 #
package main
import (
"fmt"
)
func main() {
a := 0b1111_0000
b := 0b0011_1100
// AND
fmt.Printf("%b\n", a&b) // == 110000
// OR
fmt.Printf("%b\n", a|b) // == 11111100
// XOR
fmt.Printf("%b\n", a^b) // == 11001100
// AND NOT
fmt.Printf("%b\n", a&^b) // == 11000000
// 左シフト
fmt.Printf("%b\n", b<<1) // == 1111000
// 右シフト
fmt.Printf("%b\n", b>>1) // == 11110
}