updated on 2020-10-25
型
動的型付け言語
静的型付け言語
実行前に型の不一致を検出できる
曖昧なものはエラーになる
型推論がある
明示的に型を書く必要がない場合が多い
整数 | int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, byte, rune |
浮動小数点数 | float32, float64 |
複素数 | complex64, complex128 |
文字列 | string |
真偽値 | bool |
エラー | error |
型名 | 説明 | 範囲 |
---|---|---|
uint8 | 8ビット符号なし整数 | 0 ~ 255 |
uint16 | 16ビット符号なし整数 | 0 ~ 65535 |
uint32 | 32ビット符号なし整数 | 0 ~ 4294967295 |
uint64 | 64ビット符号なし整数 | 0 ~ 18446744073709551615 |
uint | 32ビットまたは64ビットの符号なし整数 (環境依存) | 0 ~ 18446744073709551615 or 0 ~ 4294967295 |
uintptr | ポインタの値 | (環境依存) |
byte | uint8のエイリアス | 0 ~ 255 |
型名 | 説明 | 範囲 |
---|---|---|
int8 | 8ビット符号付き整数 | -128 ~ 127 |
int16 | 16ビット符号付き整数 | -32768 ~ 32767 |
int32 | 32ビット符号付き整数 | -2147483648 ~ 2147483647 |
int64 | 64ビット符号付き整数 | -9223372036854775808 ~ 9223372036854775807 |
int | 32ビットまたは64ビットの符号付き整数 (環境依存) | -2147483648 ~ 2147483647 or -9223372036854775808 ~ 9223372036854775807 |
rune | int32のエイリアス | -2147483648 ~ 2147483647 |
*int型はあるが、float型というのはない
型名 | 説明 |
---|---|
float32 | 32ビット浮動小数点 |
float64 | 64ビット浮動小数点 |
型名 | 説明 |
---|---|
complex64 | 実数部・虚数部をfloat32で表現する複素数 |
complex128 | 実数部・虚数部をfloat64で表現する複素数 |
uint8
0 ~ 255 の整数を値に保存
Go 言語では暗黙的な型変換は許されていないため、下記のような異なる型の変数への代入はコンパイルエラーになる
var i int = 100
var f float64 = i // cannot use i (type int) as type float64
このようなケースでは、下記のように明示的な型キャストを行う
var i int = 100
var f float64 = float64(i) // OK
キャスト例
intに変換
・int(値)
var i float64 = 100 var f int = int(i) // OK
var i float64 =
66.6var f int = int(i) // 小数点は切り捨てられて、66になるので注意
var i float32 =
66.6var f int = int(i) // 小数点は切り捨てられて、66になるので注意
int32に変換
・int32(値)
var a uint8 = 100
var b uint32 = uint32(a) // OK
int8に変換
・int8(値)
var a uint32 = 1234567890
var b uint8 = uint8(a)
fmt.Println(b) // 210(情報が欠落する) 0~255の場合しかuint8には正しくキャストできない
[]byteに変換
・[]byte(値)
var s string = "ABC"
var arr []byte = []byte(s)
fmt.Println(arr) // [65 66 67]
stringに変換
・string(値)
arr := []byte{65, 66, 67}
s := string(arr)
fmt.Println(s) // "ABC"
型名 | 説明 |
---|---|
bool | 真(true) または 偽(false) |
package main func main() { var a, b, c bool if a && b || !c { println("true") } else { println("false") } }
上記コードでは、真偽の判定は以下のようになる
a | b | c | a && b | !c | a && b || !c |
F | F | F | F | T | T |
F | F | T | F | F | F |
F | T | F | F | T | T |
F | T | T | F | F | F |
T | F | F | F | T | T |
T | F | T | F | F | F |
T | T | F | T | T | T |
T | T | T | T | F | T |
複数のデータ型が集まって1つのデータ型になっている
型の種類 | 説明 |
構造体 | 型の異なるデータ型を集めたデータ型 |
配列 | 同じ型のデータを集めて並べたデータ型 |
スライス | 配列の一部を切り出したデータ型 |
マップ | キーと値をマッピングさせたデータ型 |
型 | ゼロ値 |
構造体 | フィールドがすべてゼロ値 |
配列 | 要素がすべてゼロ値 |
スライス | nil |
マップ | nil |
リテラル = 識別子(名前)が付与されてないもの
型を表すには名前をつけた型または型リテラル(名前のない型)で記述します。
名前をつけた型の例
type IntArray [16]int type ( Point struct{ x, y float64 } Polar Point ) type TreeNode struct { left, right *TreeNode value *Comparable } type Block interface { BlockSize() int Encrypt(src, dst []byte) Decrypt(src, dst []byte) }
型リテラルの例
// 配列型
[10]int
// 構造体型
struct {
// フィールドリスト
}
// ポインタ型
*int
// 関数型
func(s string) int
// インタフェース型
interface {
// メソッドリスト
}
// スライス型
[]int
// マップ型
map[string]int
// チャネル型
chan bool
var p struct { name string age int }
フィールドを指定して初期化(構造体リテラル)
構造体リテラルの例
package main import "fmt" ) func main() { p := struct { name string age int }{ name: "Gopher", age: 10, } fmt.Println(p) }
(コンソール出力)
{Gopher 10}
名前をつけた構造体の例
package main import "fmt" func main() { type MyStrut struct { name string age int } var p = MyStrut{name: "Gopher", age: 10} // もしくはこっちでも良い // p := MyStrut{name: "Gopher", age: 10} fmt.Println(p) }
(コンソール出力)
{Gopher 10}
package main import "fmt" func main() { p := struct { name string age int }{ name: "Gopher", age: 10, } p.age++ // p.age = p.age + 1と同じ fmt.Println(p.name, p.age) }
(コンソール出力)
{Gopher 11}