最終更新日: 2026-07-25
TOP(About this memo)) > 一覧(Go) > 基本型
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 のエイリアス
rune // int32 のエイリアス
// Unicode のコードポイントを表す
float32 float64
complex64 complex128 //複素数?
func main() {
var a []any
//a = []string{"a", "b", "c"} // error
//a = [6]int{2, 3, 5, 7, 11, 13} // error
var b any
b = "1"
var c map[int]int = map[int]int{1:1}
//f(c) // error
var d map[any]any = map[any]any{}
for k, v := range c {// named typeはanyへ代入可能
d[k] = v
}
f(d)
}
func f(a map[any]any) {
}
type T1 int
type T2 int
func (t T1) M(){}
func main() {
var t1 T1
var x = T2(t1) // OK
var st1 []T1
var sx = ([]T2)(st1) // NOT OK
}
println("\u0061")//a
println("\u3042")//あ
println("\x61")// a
println("\xe3\x81\x82")// あ(※「あ」はUTF-8では「E3 81 82」の3バイトで符号化される)
println("\xe3\x81")// UTF-8として無効なバイト列のため文字化けする。
import (
"fmt"
"strconv"
)
func main() {
s := "1"
si, _ := strconv.Atoi(s)
fmt.Println(si)
i := 2
is := strconv.Itoa(i)
fmt.Println(is)
}
// 文字 -> unicode
fmt.Printf("%U\n", []rune("ああ\n\r")) // [U+3042 U+3042 U+000A U+000A]
fmt.Printf("%U\n", []rune(`ああ\n`))// [U+3042 U+3042 U+005C U+006E U+005C U+0072] // \nは改行ではないことに注意。
fmt.Printf("%U\n", []rune("\u0000\u0001\u0002\u0003\u0004\b\t\n\f\r\u0019あ"))// [U+0000 U+0001 U+0002 U+0003 U+0004 U+0008 U+0009 U+000A U+000C U+000D U+0019 U+3042]
// unicode -> 文字
println(string([]rune{0x3042, 0x3044, 0x3046, 0x3048, 0x304A})) // あいうえお
println("\u3042\u3044\u3046\u3048\u304A") //あいうえお
println("あ\u0000あ") //ああ(\u0000は NUL)
// バイト列 -> 文字
println("\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a")
println(string([]byte{0xe3, 0x81, 0x82, 0xe3, 0x81, 0x84, 0xe3, 0x81, 0x86, 0xe3, 0x81, 0x88, 0xe3, 0x81, 0x8a}))
println("あ\x00あ") //ああ(\x00は NUL)
println(`\xe3\x81\x82` + "\xe3\x81\x82")//\xe3\x81\x82あ
func TestUnicode(t *testing.T) {
t.Run("assert_utf8_valid", func(t *testing.T) {
assert.Exactly(t, utf8.ValidString("aaaa"), true)
assert.Exactly(t, utf8.ValidString("\x00"), true) // NUL
assert.Exactly(t, utf8.ValidString("\xe3"), false)
assert.Exactly(t, utf8.ValidString("\"\ufffd\u0000\u0001\u0002\u0003\u0004\b\t\n\f\r\u0019あ"), true)
assert.Exactly(t, utf8.ValidString(string([]rune{0x3042})), true) // 「あ」
assert.Exactly(t, utf8.ValidString(string([]byte{0xe3, 0x81, 0x82})), true) // 「あ」
assert.Exactly(t, utf8.ValidString(string([]byte{0xe3, 0x81})), false) // これは文字化けする。
})
}
escaped_char = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .
func stringContainsCTLByte(s string) bool {
for i := 0; i < len(s); i++ {
b := s[i]
if b < ' ' || b == 0x7f {// ' 'は、0x20。0x7fはDEL。(?) なぜこの範囲なのかは分からない。
return true
}
}
return false
}
type a string // Type definitions: これはstringとは別の型
type b = string // Alias declarations: これはstringの別名(C言語のtypedefに相当する)
type any = interface{}として定義されているpackage main
import (
"fmt"
)
type a string
type b a
func (s a) r1() string {
return string(s)
}
type c struct{ a }
type d struct{ i1 }
type i1 interface {
r1() string
}
func main() {
fmt.Println(a("test").r1())
// typeだとレシーバーは引き継がれない。
fmt.Println(b("test"))
//fmt.Println(b("test").r1()) //compile error
//fmt.Println(interface{}(b("test")).(i1)) // panic: main.b is not main.i1: missing method r1
// 埋め込みの場合は(継承ではないが)使えるし、実装したことになる。
fmt.Println(c{"test"}.r1())
fmt.Println(c{"test"}.a)
_, ok := interface{}(c{"test"}).(i1)
fmt.Println(ok) // true
// interfaceも埋め込みによって実装したことになる。ただし中身はnil
fmt.Printf("%#v\n", d{}) // main.d{i1:main.i1(nil)}
//fmt.Println(d{}.r1()) // 実装はしているが、中身はnilなのでpanicになる。
fmt.Println(d{}.i1) // <nil>
_, ok = interface{}(d{}).(i1)
fmt.Println(ok) // true
}
package main
import "fmt"
type MyValue int
// var a = iota // error: constにのみ利用可能
const (
MyValueA MyValue = iota
MyValueB
)
// print用にfmt.Stringerを実装したもの
func (m MyValue) String() string {
switch m {
case MyValueA:
return "MyValueA"
case MyValueB:
return "MyValueB"
case 5:// 定義した以外の値も分岐可能
return "This is 5!!"
default:
return "not defined"
}
}
func main() {
a := MyValueA
fmt.Println(a) // MyValueA
a = MyValueB
fmt.Println(a) // MyValueB
a = 10 // 定義した以外の値を代入可能
fmt.Println(a) // not defined
}