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

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

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

Ryuji Iwata

September 08, 2018
Tweet

More Decks by Ryuji Iwata

Other Decks in Technology

Transcript

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

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

    単語を一つ表示します。 golang 2. 単語を入力します。 input : golang 3. 表示した単語と入力した単語が一致なら◦ を、不一致なら× を表示します。 ◦ 5
  3. 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
  4. スライス (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
  5. スライス (2/3) 取得したい要素の位置を0 ~要素数-1 で指定して取得。 // 連続 値 fmt.Println(example[0:2]) //

    指定 位置以降 以前 [:2] fmt.Println(example[2:]) 実行結果 [Golang hands-on] [in kagawa] 12
  6. 課題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
  7. 解答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
  8. 繰り返し文 (2/4) 無限ループ // := 記述 変数i 宣言 初期化 値

    推測 int型 i := 1 for { fmt.Print(i) i++ } 実行結果 123456789101112131415 略 18
  9. 繰り返し文 (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
  10. 課題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
  11. 解答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
  12. 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
  13. if 文 条件式の前に式を記述できる if v := "GoLang"; v == "golang"

    { fmt.Println("◦") } else if v == "GOLANG" { fmt.Println("△") } else { fmt.Println("×") } // 変数v if文内 外 // fmt.Println(v) 26
  14. 課題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
  15. 解答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
  16. 標準入力 fmt.Print("入力 > ") var ans string fmt.Scanln(&ans) // 変数名

    & 値 書 変 // fmt.Scanln(ans) fmt.Printf("入力 %s \n", ans) 関数の引数は「値を渡す」(引数の値をコピーする)方式になっている。 実変数の変数名の先頭に& をつけると、その変数の参照(ポインター)となる。 Scanln() 関数は、引数に入力された値を設定するので「参照を渡し」ている。 32
  17. 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
  18. 課題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
  19. 解答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
  20. 解答4 (04_stdio.go) 実行結果 golang input : golang ◦ hands-on input

    : hands-on ◦ in input : in ◦ kagawa input : okayama × 39
  21. 実行バイナリーを作成 初期状態 $ 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
  22. 完成!q@w@p $ ./typing golang input : golang ◦ hands-on input

    : hands-on ◦ in input : in ◦ kagawa input : kagawa ◦ 41