基本型 - Go

最終更新日: 2026-07-25

TOP(About this memo)) > 一覧(Go) > 基本型

Types

Assignability

組み込み型(Predeclared types)

bool
string
int  int8  int16  int32  int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 のエイリアス
rune // int32 のエイリアス
    // Unicode のコードポイントを表す
float32 float64
complex64 complex128 //複素数?

複合型(Composite types)の制約

Can I convert a []T to an []interface{}?

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) {

}

Can I convert []T1 to []T2 if T1 and T2 have the same underlying type?

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
}

Goの用語で「オブジェクト化」「インスタンス化」は何にあたる?

文字列

Goの文字列はbyteのsliceのような形式。

切り出し

stringとintの相互変換

import (
	"fmt"
	"strconv"
)

func main() {
	s := "1"
	si, _ := strconv.Atoi(s)
	fmt.Println(si)

	i := 2
	is := strconv.Itoa(i)
	fmt.Println(is)
}

サンプルコード: UTF-8(rune), バイト, 文字

// 文字 -> 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)      // これは文字化けする。
	})
}

Goのエスケープシーケンス

escaped_char = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .

参考(url.Parseに出てくる関数)

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
}

stringの文字数上限

type

type a string // Type definitions:  これはstringとは別の型
type b = string // Alias declarations: これはstringの別名(C言語のtypedefに相当する)

Type definitionsでは、レシーバーは継承されない。

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
}

enum

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
}