Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix beginner handson #3

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 96 additions & 2 deletions go-handson.slide
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
Go hands-on for Go beginners
28 Feb 2017
12 Oct 2021

Yusuke Kato
i.can.feel.gravity@gmail.com

Hiroto Funakoshi
hiroto.funakoshi.hiroto@gmail.com

* License and Materials

This presentation is a Japanese translation of [[https://dave.cheney.net][davecheney]]'s presentation, and the licensed under the [[https://creativecommons.org/licenses/by-sa/4.0/][Creative Commons Attribution-ShareAlike 4.0 International]] licence.
Expand Down Expand Up @@ -115,6 +118,19 @@ Go言語は非常に厳格な言語です
- 独自定義の関数の宣言方法
- パッケージとimportの挙動など

* 名前

Goの関数、変数、定数、型、文のラベル、パッケージ名は _文字_、あるいは _アンダースコア_ で始まる必要があります

また、Goはfor、ifなどの _25個_ の予約語が含まれており、それらは名前として利用できません


break default func interface select
case defer go map struct
shan else goto package switch
const fallthrough if range type
continue for import return var

* 定数

定数は変更される事の無い値です
Expand Down Expand Up @@ -630,6 +646,14 @@ _note_: このスライドを[[https://go-talks.golang.org/][gotalks.golang.org]
- パッケージと `import` ステートメントがどのように機能するか


* ハンズオン

Goの基礎的な文法について見てきました。ここまでの文法を使ってGoプログラムを書いてみましょう。

* お題1: Fizz Buzz1

* お題2: Int型の変数x,yを演算するadd, sub関数を実装

* Advanced Syntax

* Advanced Syntax
Expand Down Expand Up @@ -788,6 +812,26 @@ RubyやPythonのような言語に慣れている人は、より簡潔に書く
- [[https://play.golang.org/p/3Vl75w72JO][リンク]] へ行き *Run* ボタンを押して実行してみてください
- そして短縮宣言をつかって `var` を `:=` に書き換えてみてください

* 配列

次に学ぶべき型は _配列_ です

配列は _単一_ の型の順序付けられた値の集合です

Goにおける配列は固定長なので配列のサイズを動的に変更できません
動的に変更したい場合は後述する _スライス_ を利用してくだい

string型のデータを保持する配列を宣言する例をみてみましょう

// 1. 配列宣言
var v1 = [3]string{}

// 2. 配列宣言
v2 := [3]string{}

// 3. 配列宣言(初期値あり)
v3 := [3]string{"Sun", "Mon", "Tue"}

* スライス

次に学ぶべき型は _スライス_ です
Expand All @@ -806,7 +850,7 @@ RubyやPythonのような言語に慣れている人は、より簡潔に書く

SliceはGo言語に於いて大変重要な要素の一つなので、少し詳しく見ていきましょう

_note_ : スライスは配列とは異なるデータ型です、Go言語では配列もサポートしていますが、一般的に多用されるのはスライスのため、現時点では配列の話は説明しません
_note_ : スライスは配列とは異なるデータ型です、一般的に多用されるのはスライスです

* スライスの大きさ

Expand Down Expand Up @@ -950,6 +994,47 @@ Go言語では、スライスを宣言すると同時に、初期化を行う方
- *Run* ボタンを押して結果を確認してみてください
- `fmt.Println(primes[-1])` をコメントアウトし、何が起こるか見て下さい。

* 配列

次に学ぶべき型は _配列_ です

配列は _単一_ の型の順序付けられた値の集合です

Goにおける配列は固定長なので配列のサイズを動的に変更できません
動的に変更したい場合は後述する _スライス_ を利用してくだい

string型のデータを保持する配列を宣言する例をみてみましょう

// 1. 配列宣言
var v1 = [2]string{}

// 2. 配列宣言
v2 := [2]string{}

// 3. 配列宣言(初期値あり)
v3 := [2]string{"vdaas", "vald"}

* 配列 (続き)

配列からスライスに変換することができます

// 1. 配列宣言
v1 := [2]string{"vdaas", "vald"}
// 2. スライスに変換
v2 := v1[:]

スライスへ変換したものの要素を変更してみましょう

// 1. 配列宣言
v2[0] = "vald"

// 2. 要素を確認
fmt.Println(v1) // [vald vald]
fmt.Println(v2) // [vald vald]


スライスは配列への参照を持つデータ構造ということがわかります

* 複数の代入

Goは、1つの命令文での複数の代入と宣言を許可しています。
Expand Down Expand Up @@ -1291,6 +1376,15 @@ PythonやCのような言語に慣れているなら、おそらく _フォー
- 並行処理
- `fmt` パッケージの仕組み

* ハンズオン

Goの応用文法について見てきました。ここまでの文法を使ってGoプログラムを書いてみましょう。

* お題1: Fizz Buzz2

* お題2: Nameメソッドを持つAccount構造体を実装

* お題3: ToDoリストアプリの開発

* 開発環境とツール

Expand Down
8 changes: 8 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module github.com/vdaas/go-handson

go 1.16
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

古い


require (
github.com/gorilla/mux v1.8.0
golang.org/x/tools v0.1.7 // indirect
)
29 changes: 29 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/yuin/goldmark v1.4.0 h1:OtISOGfH6sOWa1/qXqqAiOIAO6Z5J3AEAE18WAq6BiQ=
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e h1:WUoyKPm6nCo1BnNUvPGnFG3T5DUVem42yDJZZ4CNxMA=
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.7 h1:6j8CgantCy3yc8JGBqkDLMKWqZ0RDU2g1HVgacojGWQ=
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12 changes: 12 additions & 0 deletions handson/addsub/add/answer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package main

import "fmt"

func add(x, y int) int {
return x + y
}

func main() {
n := add(10, 20)
fmt.Println(n)
}
8 changes: 8 additions & 0 deletions handson/addsub/add/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package main

// Add
// Int型変数x,yを引数とし、足した結果を返すadd関数を実装
func main() {
// n := add(10, 20)
// fmt.Println(n)
}
12 changes: 12 additions & 0 deletions handson/addsub/sub/answer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package main

import "fmt"

func sub(x, y int) int {
return x - y
}

func main() {
n := sub(20, 10)
fmt.Println(n)
}
8 changes: 8 additions & 0 deletions handson/addsub/sub/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package main

// Sub
// Int型変数x,yを引数とし、引いた結果を返すsub関数を実装
func main() {
// n := sub(20, 10)
// fmt.Println(n)
}
25 changes: 25 additions & 0 deletions handson/fizzbuzz/fizzbuzz1/answer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package main

import "fmt"

// FizzBuzz
// 1以上、100未満の整数Nのうち
// ケース1: Nが3で割り切れて かつ 5で割り切れないときは "Fizz"
// ケース2: Nが5で割り切れて かつ 3で割り切れないときは "Buzz"
// ケース3: Nが3と5の両方で割り切れるときは "FizzBuzz"
// ケース4: Nが3と5のそのどちらでも割り切れない場合は N
// を標準出力に出力してください
func main() {
for i := 1; i < 100; i++ {
switch {
case i%15 == 0:
fmt.Println("FizzBuzz")
case i%5 == 0:
fmt.Println("Buzz")
case i%3 == 0:
fmt.Println("Fizz")
default:
fmt.Println(i)
}
}
}
23 changes: 23 additions & 0 deletions handson/fizzbuzz/fizzbuzz1/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package main

import "fmt"

// FizzBuzz
// 1以上、100未満の整数Nのうち
// ケース1: Nが3で割り切れて かつ 5で割り切れないときは "Fizz"
// ケース2: Nが5で割り切れて かつ 3で割り切れないときは "Buzz"
// ケース3: Nが3と5の両方で割り切れるときは "FizzBuzz"
// ケース4: Nが3と5のそのどちらでも割り切れない場合は N
// を標準出力に出力してください
func main() {
for i := 1; ; /* 継続条件式 */ /* 再初期化式 */ {
switch {
// ケース1の場合
// ケース2の場合
// ケース3の場合
// ケース4の場合
default:
fmt.Println(i) // ヒント: fmt.Println を使用すると標準出力に文字を表示できます
}
}
}
24 changes: 24 additions & 0 deletions handson/fizzbuzz/fizzbuzz2/answer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package main

import "fmt"

func main() {
counter := make(map[string]int)

for i := 1; i < 100; i++ {
switch {
case i%15 == 0:
counter["FizzBuzz"]++
case i%5 == 0:
counter["Buzz"]++
case i%3 == 0:
counter["Fizz"]++
default:
counter["others"]++
}
}

for k, v := range counter {
fmt.Printf("%s %d\n", k, v)
}
}
30 changes: 30 additions & 0 deletions handson/fizzbuzz/fizzbuzz2/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package main

// FizzBuzzを実行する中で、"Fizz", "Buzz", "FizzBuzz", それ以外の数値 がそれぞれ何回出力されたか
// カウントし、出力してください、ただし、それ以外の数値は "others" としてカウントします
// 例: 1以上16未満のFizzBuzzの場合
//
// Fizz 4
// Buzz 2
// FizzBuzz 1
// others 8
//
// という結果になります。
func main() {
// TODO 数値をカウントするためのmapを 宣言 & 初期化 (ヒント: make を使用)
// counter := ...

for i := 1; i < 100; i++ {
switch {
case i%15 == 0:
// TODO counterの"FizzBuzz"をカウントアップ
case i%5 == 0:
// TODO counterの"Buzz"をカウントアップ
case i%3 == 0:
// TODO counterの"Fizz"をカウントアップ
default:
// TODO counterの"others"をカウントアップ
}
}
// TODO counterのすべての要素を表示
}
Loading