Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go入門ハンズオン [01:基礎編]

4c1b23cfd0fa24bdd7e3cc37f8134b07?s=47 Ryuji Iwata
September 08, 2018

Go入門ハンズオン [01:基礎編]

2018年9月8日(土)に香川で開催された「香川Go言語勉強会」でのハンズオン資料「Go入門ハンズオン [01:基礎編]」です。簡単なタイピングゲームを作成しています。オリジナルURL:https://talks.godoc.org/github.com/qt-luigi/talks/2018/go-intro-hands-on-01-basic.slide#1

4c1b23cfd0fa24bdd7e3cc37f8134b07?s=128

Ryuji Iwata

September 08, 2018
Tweet

Transcript

  1. Go 入門ハンズオン [01: 基礎編] 香川Go 言語勉強会 8 September 2018 Ryuji

    Iwata Okayama, Japan
  2. Ryuji IWATA Google+ +RyujiIwata (https://plus.google.com/+RyujiIwata) Twitter @qt_luigi (http://twitter.com/qt_luigi/) 2

  3. 何を作るの? 3

  4. 成果物 タイピングゲームを作ろう!q@w@p $ ./typing golang input : golang ◦ hands-on

    input : hand-on × in input : in ◦ kagawa input : okayama × 4
  5. 基本仕様 表示する単語をスライス(配列)で用意します。 [ "golang", "hands-on", "in", "kagawa" ] 以下、スライスの要素の数だけ、添字の順番に繰り返します。 1.

    単語を一つ表示します。 golang 2. 単語を入力します。 input : golang 3. 表示した単語と入力した単語が一致なら◦ を、不一致なら× を表示します。 ◦ 5
  6. 書き方を学ぼう! 6

  7. hello.go // 実行 main 指定 package main // 外部 指定

    import ( "fmt" ) // 同一 内 使用 変数 定義 var ( // 変数msg1 宣言 初期化 値 推測 string型 msg1 = "Hello" // 変数msg2 明示的 string型 宣言 msg2 string ) // main()関数 func main() { msg2 = "world" // Println()関数 引数 複数 半角空白文字 区切 標準出力 表示 fmt.Println(msg1, msg2) } 7
  8. hello.go ファイル拡張子は.go で、BOM なしのUTF-8 で記述。 インデントはタブが推奨。 外部から呼び出せる関数名は大文字で始まる。 // fmt Println()関数

    名前 大文字 始 呼 出 fmt.Println(msg1, msg2) 8
  9. コードの実行 初期状態 $ ls hello.go go run ファイル名 $ go

    run hello.go Hello world 9
  10. スライス 10

  11. スライス (1/3) 配列への参照(ポインター)を有する型で、要素を変更できる。 // 変数example 文字型 宣言 var example []string

    fmt.Println("初期値 ", example) // 値 代入 } 前 要素 最後 要素 必要 example = []string{ "Golang", "hands-on", } fmt.Println("2番目 値 ", example[1]) // 値 追加 append()関数 使用 example = append(example, "in", "kagawa") fmt.Println("追加結果 ", example) 実行結果 初期値 [] 2番目 値 hands-on 追加結果 [Golang hands-on in kagawa] 11
  12. スライス (2/3) 取得したい要素の位置を0 ~要素数-1 で指定して取得。 // 連続 値 fmt.Println(example[0:2]) //

    指定 位置以降 以前 [:2] fmt.Println(example[2:]) 実行結果 [Golang hands-on] [in kagawa] 12
  13. スライス (3/3) 変更したい要素の位置に値を代入。 // 4番目 値 変更 example[3] = "okayama"

    fmt.Println(example) 実行結果 [Golang hands-on in okayama] 13
  14. 課題1 (01_slice.go) 1− 1: hello.go をコピーして01_slice.go を作成してください。 以降は01_slice.go を編集してください。 1−

    2: var 文のmsg1 とmsg2 を消した後、次の変数を定義してください。 変数名:example 型:string 型のスライス 値:"golang", "hands-on", "in", "kagawa" 1− 3: main() 関数のmsg2 を削した後、example を標準出力してください。 14
  15. 解答1 (01_slice.go) package main import ( "fmt" ) var (

    // 値 代入 } 前 要素 最後 要素 不要 example = []string{"golang", "hands-on", "in", "kagawa"} ) func main() { fmt.Println(example) } 実行結果 $ go run 01_slice.go [golang hands-on in kagawa] 15
  16. 繰り返し 16

  17. 繰り返し文 (1/4) for 文のみ(while 文などなし!シンプル!) for i := 0; i

    < 4; i++ { fmt.Print(i) } 実行結果 0123 17
  18. 繰り返し文 (2/4) 無限ループ // := 記述 変数i 宣言 初期化 値

    推測 int型 i := 1 for { fmt.Print(i) i++ } 実行結果 123456789101112131415 略 18
  19. 繰り返し文 (3/4) range でスライス型を指定すると添え字と値を取得できる。 // 変数abc string型 宣言 値 設定

    var abc []string abc = []string{"a", "b", "c"} // 第1戻 値変数 添 字 第2戻 値変数 値 取得 for i, v := range abc { fmt.Println(i, v) } // 標準出力 空行 出力 fmt.Println() // 値 取得 場合 第1戻 値変数 _ 第2戻 値変数 指定 for _, v := range abc { fmt.Println(v) } fmt.Println() // 添 字 取得 場合 第1戻 値変数 指定 i, _ 良 for i := range abc { fmt.Println(i) } 19
  20. 繰り返し文 (4/4) 実行結果 0 a 1 b 2 c a

    b c 0 1 2 20
  21. 課題2 (02_typing.go) 2− 1: 01_slice.go をコピーして02_for.go を作成してください。 以降は02_for.go を編集してください。 2−

    2: main() 関数内を、以降に書き換えてください。 1.次の変数を宣言してください。 変数名:datas 型:string 型のスライス 2.変数datas にexample を設定(代入)してください。 3.for 文とrange を使用してdatas の値だけを順番に標準出力に表示してください。 21
  22. 解答2 (02_typing.go) package main // 例 1行1 書 方 import

    "fmt" var ( example = []string{"golang", "hands-on", "in", "kagawa"} ) func main() { var datas []string datas = example for _, v := range datas { fmt.Println(v) } } 22
  23. 解答2 (02_for.go) 実行結果 $ go run 02_for.go golang hands-on in

    kagawa 23
  24. if 文 24

  25. if 文 三項演算子はない!シンプル! 判定文としては、switch 文もある。 v := "GoLang" if v

    == "golang" { fmt.Println("◦") } else if v == "GOLANG" { fmt.Println("△") } else { fmt.Println("×") } // 変数v if文 内外 fmt.Println(v) 実行結果 × GoLang 25
  26. if 文 条件式の前に式を記述できる if v := "GoLang"; v == "golang"

    { fmt.Println("◦") } else if v == "GOLANG" { fmt.Println("△") } else { fmt.Println("×") } // 変数v if文内 外 // fmt.Println(v) 26
  27. if 文 実行結果(fmt.Println(v) を無効時) × 実行結果(fmt.Println(v) を有効時) # command-line-arguments ./main.go:17:17:

    undefined: v 27
  28. 課題3 (03_if.go) 3− 1: 02_for.go をコピーして03_if.go を作成してください。 以降は03_if.go を編集してください。 3−

    2: main() 関数のfor 文内を、以降に書き換えてください。 1.fmt.Println(v) の後に、ループの値変数v の値が"in" なら"◦" を、それ以外なら"×" を標準出 力に表示するif 文を追加してください。 28
  29. 解答3 (03_if.go) package main import "fmt" var ( example =

    []string{"golang", "hands-on", "in", "kagawa"} ) func main() { var datas []string datas = example for _, v := range datas { fmt.Println(v) if v == "in" { fmt.Println("◦") } else { fmt.Println("×") } } } 29
  30. 解答3 (03_if.go) 実行結果 golang × hands-on × in ◦ kagawa

    × 30
  31. 標準入出力 31

  32. 標準入力 fmt.Print("入力 > ") var ans string fmt.Scanln(&ans) // 変数名

    & 値 書 変 // fmt.Scanln(ans) fmt.Printf("入力 %s \n", ans) 関数の引数は「値を渡す」(引数の値をコピーする)方式になっている。 実変数の変数名の先頭に& をつけると、その変数の参照(ポインター)となる。 Scanln() 関数は、引数に入力された値を設定するので「参照を渡し」ている。 32
  33. 標準入力 実行結果(fmt.Scanln() 関数の変数名に& あり) 入力 > Go 入力 Go 実行結果(fmt.Scanln()

    関数の変数名に& なし) 入力 > 入力 33
  34. fmt パッケージ 標準出力、標準入力、標準エラーの関数が集約されている。 golang.org/pkg/fmt/ (https://golang.org/pkg/fmt/)

  35. fmt パッケージ Print 系は主に標準出力 // 改行 場合 改行 含 fmt.Print("golang

    ") fmt.Print("2018\n") // 最後 f付 形式 fmt.Printf("%s %d\n", "golang", 2018) // 最後 ln付 文末 改行 付 fmt.Println("golang", "2018") // 最初 F付 第1引数 出力先 指定 標準 fmt.Fprintln(os.Stderr, "golang", "2018") // 最初 S付 文字列 返 s := fmt.Sprintf("%s %d\n", "golang", 2018) fmt.Println(s) 35
  36. fmt パッケージ 出力結果(上記全て) golang 2018 Scan 系は標準入力で、Print 系と同じような命名規則。 標準エラーは、Errorf() 関数や一部のPrint

    系で対応。 fmt パッケージはGo のパッケージについて学び始めるのに最適かと!q@w@p 36
  37. 課題4 (04_stdio.go) 4− 1: 03_if.go をコピーして04_stdio.go を作成してください。 以降は04_stdio.go を編集してください。 4−

    2: main() 関数のfor 文内のfmt.Println(v) の後に、次の要件を満たす処理を追加してください。 1.入力プロンプトとして"input : " を標準出力に表示する。 2.標準入力を受け取る変数はstring 型で変数名はans とする。 3.ループの値変数v の値が標準入力された値なら"◦" を、それ以外なら"×" を標準出力に表示 する。 37
  38. 解答4 (04_stdio.go) package main import "fmt" // 例 1行1変数定義 書

    方 var example = []string{"golang", "hands-on", "in", "kagawa"} func main() { var datas []string datas = example for _, v := range datas { fmt.Println(v) fmt.Print("input : ") var ans string fmt.Scanln(&ans) if v == ans { fmt.Println("◦") } else { fmt.Println("×") } } } 38
  39. 解答4 (04_stdio.go) 実行結果 golang input : golang ◦ hands-on input

    : hands-on ◦ in input : in ◦ kagawa input : okayama × 39
  40. 実行バイナリーを作成 初期状態 $ ls 01_slice.go 02_for.go 03_if.go 04_stdio.go hello.go go

    build ファイル名 $ go build 04_stdio.go $ ls 01_slice.go 02_for.go 03_if.go 04_stdio 04_stdio.go hello.go ファイル名と同名の実行バイナリー「04_stdio 」が生成される。 go build -o 実行バイナリー名 ファイル名 $ go build -o typing 04_stdio.go $ ls 01_slice.go 02_for.go 03_if.go 04_stdio 04_stdio.go hello.go typing 指定した名前の実行バイナリー「typing 」が生成される。 40
  41. 完成!q@w@p $ ./typing golang input : golang ◦ hands-on input

    : hands-on ◦ in input : in ◦ kagawa input : kagawa ◦ 41
  42. Thank you Ryuji Iwata Okayama, Japan @qt_luigi (http://twitter.com/qt_luigi)