💡

Go基本構文の備忘録

2025/02/12に公開

概要

普段はPythonを使ってAPI開発等を行っています。
プライベートでGoを触ってみているのですが、「mapってどうやって書くんだっけ?」みたいなことが多発したので、備忘録としてざっくりまとめます。
(解説は行っておりません)

変数

var i int
var c, python, java bool
var (
	ToBe   bool       = false
	MaxInt uint64     = 1<<64 - 1
	z      complex128 = cmplx.Sqrt(-5 + 12i)
)
var c, python, java = true, false, "no!"
k := 3

定数

const Pi = 3.14

配列

var a [2]string
a[0] = "Hello"
a[1] = "World"
primes := [6]int{2, 3, 5, 7, 11, 13}

スライス

var s []int
make([]int, 5)  // len(a)=5
make([]int, 0, 5) // len(b)=0, cap(b)=5
[]int{2, 3, 5, 7, 11, 13}
board := [][]string{
	[]string{"_", "_", "_"},
	[]string{"_", "_", "_"},
	[]string{"_", "_", "_"},
}

board[0][0] = "X"
s := []int{2, 3, 5, 7, 11, 13}
s = s[1:4]
fmt.Println(s) // [3 5 7]

s = s[:2]
fmt.Println(s) // [3 5]

s = s[1:]
fmt.Println(s) // [5]
s = append(s, 2, 3, 4)

マップ

var m map[string]int
make(map[string]int)
var m = map[string]int{
	"Bell Labs": 40,
	"Google":    37,
}
m["Answer"] = 42
delete(m, "Answer")
v, ok := m["Answer"]

構造体

new(struct{})
type Vertex struct {
	X int
	Y int
}
v := Vertex{1, 2}
v.X = 4
fmt.Println(v.X) // 4
v1 = Vertex{1, 2}  // {1 2}
v2 = Vertex{X: 1}  // {1 0}
v3 = Vertex{}      // {0 0}
p  = &Vertex{1, 2} // &{1 2}

ポインタ

var p *int
new(int)
i := 42
p = &i
fmt.Println(*p) // 42
*p = 21
fmt.Println(i) // 21

関数

func add(x int, y int) int {
	return x + y
}
func add(x, y int) int {
	return x + y
}
func swap(x, y string) (string, string) {
	return y, x
}
func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}
hypot := func(x, y float64) float64 {
	return math.Sqrt(x*x + y*y)
}

メソッド

type Vertex struct {
	X, Y float64
}

func (v *Vertex) Scale(f float64) {
	v.X = v.X * f
	v.Y = v.Y * f
}

func main() {
	v := Vertex{3, 4}
	v.Scale(10)

インタフェース

type I interface {
	M()
}

type T struct {
	S string
}

func (t *T) M() {
	fmt.Println(t.S)
}

type F float64

func (f F) M() {
	fmt.Println(f)
}

func describe(i I) {
	fmt.Printf("(%v, %T)\n", i, i)
}

var i I

i = &T{"Hello"}
describe(i)
i.M()

i = F(math.Pi)
describe(i)
i.M()

ゴルーチン

go say("world")
ch := make(chan int)
ch := make(chan int, 2)
ch <- v
v := <-ch 
close(c)
v, ok := <-ch
select {
case <-tick:
	fmt.Println("tick.")
case <-boom:
	fmt.Println("BOOM!")
	return
default:
	fmt.Println("    .")
	time.Sleep(50 * time.Millisecond)
}
var mu sync.Mutex
mu.Lock()
defer c.mu.Unlock()
const++
func done(wd *sync.WaitGroup) {
	wg.Done()
}

var wg sync.WaitGroup
wg.Add(3)
go done(&wg)
go done(&wg)
go done(&wg)
wg.Wait()

ループ

for i := 0; i < 10; i++ {
	sum += i
}
sum := 1
for sum < 1000 {
	sum += sum
}
for {
}
for i, v := range pow {
	fmt.Printf("2**%d = %d\n", i, v)
}

条件分岐

if x < 0 {
	return sqrt(-x) + "i"
}
if v := math.Pow(x, n); v < lim {
	return v
}
switch os := runtime.GOOS; os {
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		fmt.Printf("%s.\n", os)
}
switch {
	case t.Hour() < 12:
		fmt.Println("Good morning!")
	case t.Hour() < 17:
		fmt.Println("Good afternoon.")
	default:
		fmt.Println("Good evening.")
}

Discussion