Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

何を作るの? 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

基本仕様 表示する単語をスライス(配列)で用意します。 [ "golang", "hands-on", "in", "kagawa" ] 以下、スライスの要素の数だけ、添字の順番に繰り返します。 1. 単語を一つ表示します。 golang 2. 単語を入力します。 input : golang 3. 表示した単語と入力した単語が一致なら○ を、不一致なら× を表示します。 ○ 5

Slide 6

Slide 6 text

書き方を学ぼう! 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

hello.go ファイル拡張子は.go で、BOM なしのUTF-8 で記述。 インデントはタブが推奨。 外部から呼び出せる関数名は大文字で始まる。 // fmt Println()関数 名前 大文字 始 呼 出 fmt.Println(msg1, msg2) 8

Slide 9

Slide 9 text

コードの実行 初期状態 $ ls hello.go go run ファイル名 $ go run hello.go Hello world 9

Slide 10

Slide 10 text

スライス 10

Slide 11

Slide 11 text

スライス (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

Slide 12

Slide 12 text

スライス (2/3) 取得したい要素の位置を0 ~要素数-1 で指定して取得。 // 連続 値 fmt.Println(example[0:2]) // 指定 位置以降 以前 [:2] fmt.Println(example[2:]) 実行結果 [Golang hands-on] [in kagawa] 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

課題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

Slide 15

Slide 15 text

解答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

Slide 16

Slide 16 text

繰り返し 16

Slide 17

Slide 17 text

繰り返し文 (1/4) for 文のみ(while 文などなし!シンプル!) for i := 0; i < 4; i++ { fmt.Print(i) } 実行結果 0123 17

Slide 18

Slide 18 text

繰り返し文 (2/4) 無限ループ // := 記述 変数i 宣言 初期化 値 推測 int型 i := 1 for { fmt.Print(i) i++ } 実行結果 123456789101112131415 略 18

Slide 19

Slide 19 text

繰り返し文 (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

Slide 20

Slide 20 text

繰り返し文 (4/4) 実行結果 0 a 1 b 2 c a b c 0 1 2 20

Slide 21

Slide 21 text

課題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

Slide 22

Slide 22 text

解答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

Slide 23

Slide 23 text

解答2 (02_for.go) 実行結果 $ go run 02_for.go golang hands-on in kagawa 23

Slide 24

Slide 24 text

if 文 24

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

if 文 実行結果(fmt.Println(v) を無効時) × 実行結果(fmt.Println(v) を有効時) # command-line-arguments ./main.go:17:17: undefined: v 27

Slide 28

Slide 28 text

課題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

Slide 29

Slide 29 text

解答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

Slide 30

Slide 30 text

解答3 (03_if.go) 実行結果 golang × hands-on × in ○ kagawa × 30

Slide 31

Slide 31 text

標準入出力 31

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

標準入力 実行結果(fmt.Scanln() 関数の変数名に& あり) 入力 > Go 入力 Go 実行結果(fmt.Scanln() 関数の変数名に& なし) 入力 > 入力 33

Slide 34

Slide 34 text

fmt パッケージ 標準出力、標準入力、標準エラーの関数が集約されている。 golang.org/pkg/fmt/ (https://golang.org/pkg/fmt/)

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

fmt パッケージ 出力結果(上記全て) golang 2018 Scan 系は標準入力で、Print 系と同じような命名規則。 標準エラーは、Errorf() 関数や一部のPrint 系で対応。 fmt パッケージはGo のパッケージについて学び始めるのに最適かと!q@w@p 36

Slide 37

Slide 37 text

課題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

Slide 38

Slide 38 text

解答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

Slide 39

Slide 39 text

解答4 (04_stdio.go) 実行結果 golang input : golang ○ hands-on input : hands-on ○ in input : in ○ kagawa input : okayama × 39

Slide 40

Slide 40 text

実行バイナリーを作成 初期状態 $ 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

Slide 41

Slide 41 text

完成!q@w@p $ ./typing golang input : golang ○ hands-on input : hands-on ○ in input : in ○ kagawa input : kagawa ○ 41

Slide 42

Slide 42 text

Thank you Ryuji Iwata Okayama, Japan @qt_luigi (http://twitter.com/qt_luigi)