[box class="blue_box" title="☑本記事の内容"]
- range
- switch文
- defer
[/box]
参考資料:現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発
[box class="glay_box" title="Contents"]
[/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