Go 入門

Go言語入門⑧ ~range・switch文・defer~

[box class="blue_box" title="☑本記事の内容"]

  • range
  • switch文
  • defer

[/box]
参考資料:現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
[box class="glay_box" title="Contents"]

  1. range
  2. switch文
  3. defer

[/box]

range

[box class="yellow_box" title="✔rangeの目次"]

[/box]

基本的なこと

[box class="glay_box"]

  • forと似た動き
  • スライスなどの中身を取ってきてくれる

[/box]

package main

import (
	"fmt"
)

func main() {
	l := []string{"python", "go", "java"}

	for i := 0; i < len(l); i++ {
		fmt.Println(i, l[i])
	}

	fmt.Println("==========")

	for i, v := range l {
		fmt.Println(i, v)
	}
}

(結果)
0 python
1 go
2 java
==========
0 python
1 go
2 java

インデックス番号の省略

[box class="glay_box"]

  • インデックス番号(i)はアンダースコア(_)にすることで省略できる

[/box]

package main

import (
	"fmt"
)

func main() {
	l := []string{"python", "go", "java"}

	for _, v := range l {
		fmt.Println(v)
	}
}

(結果)
python
go
java

mapでのrange使用

[box class="glay_box"]

  • mapでも同じようにrangeを使用できる
  • keyのみ出力、valueのみ出力もできる

[/box]

package main

import (
	"fmt"
)

func main() {
	m := map[string]int{"apple": 100, "banana": 200}

	for k, v := range m {
		fmt.Println(k, v)
	}

	for k := range m {
		fmt.Println(k)
	}

	for _, v := range m {
		fmt.Println(v)
	}
}
(結果)
apple 100
banana 200
apple
banana
100
200

switch文

[box class="yellow_box" title="✔switch文の目次"]

[/box]

基本的なこと

[box class="glay_box"]

  • 条件式として判定する
  • if文と使い方は似た感じ
  • if文でのelseがswitch文ではdefault
  • defaultは書かなくても問題は起きない

[/box]

package main

import (
	"fmt"
)

func main() {
	os := "mac"
	switch os {
	case "mac":
		fmt.Println("Mac!!")
	case "windows":
		fmt.Println("Windows!!")
	default:
		fmt.Println("Default!!")
	}
}
(結果)
Mac!!

[box class="glay_box"]

  • if文と同じように関数で値を持ってくることが出来る
  • 1行で書くことも可能
  • 1行で書いたときはswitch文の中でしかその変数は使用できないので注意

[/box]

package main

import (
	"fmt"
)

func getOsName() string {
	return "dafdafad"
}

func main() {
	switch os := getOsName(); os {
	case "mac":
		fmt.Println("Mac!!")
	case "windows":
		fmt.Println("Windows!!")
	default:
		fmt.Println("Default!!", os)
	}
}
(結果)
Default!! dafdafad

条件式の省略

[box class="glay_box"]

  • 条件式は省略することが出来る
  • caseのところにメソッドを使用することで省略可能(メソッドに関しては別途説明)

[/box]

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.Now()
	fmt.Println(t.Hour())
	switch {
	case t.Hour() < 12:
		fmt.Println("Morning")
	case t.Hour() < 17:
		fmt.Println("Afternoon")
	}
}
(結果)
7
Morning

defer

[box class="yellow_box" title="✔deferの目次"]

[/box]

基本的なこと

[box class="glay_box"]

  • deferは遅延実行の事
  • 関数の最後に実行される

[/box]

package main

import (
	"fmt"
)

func foo() {
	defer fmt.Println("world foo")
	fmt.Println("hello foo")
}

func main() {
	defer fmt.Println("world")
	foo()
	fmt.Println("hello")
}
(結果)
hello foo
world foo
hello
world

deferの実行順序

[box class="glay_box"]

  • deferは先に書いてあるものが後に実行される

[/box]

package main

import (
	"fmt"
)

func main() {
	fmt.Println("run")
	defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	fmt.Println("success")
}
(結果)
run
success
3
2
1

deferを使用する時

[box class="glay_box"]

  • 主にファイルの読み込みの時に使用される
  • ファイルを読み込んだら必ずcloseする必要がある
  • closeを先に書くことで忘れないようにする

[/box]

package main

import (
	"fmt"
	"os"
)

func main() {
	file, _ := os.Open("./lesson.go")
	defer file.Close()
	data := make([]byte, 50)
	file.Read(data)
	fmt.Println(string(data))
}
(結果)
package main

import (
	"fmt"
	"os"
)

func

Go言語入門⑨へ ≫

≪ Go言語入門⑦へ

目次

-Go, 入門