Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Tech Do - Go言語 初心者向けハンズオン #2/Go Handson2
Search
kent-hamaguchi
November 27, 2018
Programming
4
2k
Tech Do - Go言語 初心者向けハンズオン #2/Go Handson2
これからプログラミング言語 Go を始めたい方におすすめの、基礎的な講座をハンズオン形式で開催します(第2回)。
kent-hamaguchi
November 27, 2018
Tweet
Share
More Decks by kent-hamaguchi
See All by kent-hamaguchi
メディアドゥ Go Conference 2021 スポンサーセッション/gocon-2021-mediado
kenthamaguchi
1
11k
メディアドゥ Amazon Personalize in AWS メディアセミナー Q1/mediado-amazon-personalize-aws-media
kenthamaguchi
0
1.4k
MediaDo DynamoDB活用事例/mediado-dynamodb-usecase
kenthamaguchi
0
1.2k
MediaDo.go #2 Clean Architectureとの付き合い方/mediado-go-2-clean-architecture
kenthamaguchi
2
1.7k
Infra Study Meetup #5 メディアドゥスポンサーセッション/infra-study-meetup-5-mediado
kenthamaguchi
0
780
JAWS DAYS 2020 メディアドゥスポンサーセッション/jaws-days-2020-mediado
kenthamaguchi
1
1.8k
OOC 2020 メディアドゥ スポンサーセッション/ooc_2020_mediado
kenthamaguchi
0
540
MediaDo.go #1 レガシーに立ち向かう / mediado-go-1-vs-legacy
kenthamaguchi
0
1.2k
MediaDo.go #1 GopherCon 2019 参加レポート / mediado-go-1-gophercon-2019
kenthamaguchi
1
1.2k
Other Decks in Programming
See All in Programming
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
770
【re:Growth 2024】 Aurora DSQL をちゃんと話します!
maroon1st
0
770
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
0
110
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
900
命名をリントする
chiroruxx
1
390
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
460
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
CSC509 Lecture 14
javiergs
PRO
0
140
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
130
Mermaid x AST x 生成AI = コードとドキュメントの完全同期への道
shibuyamizuho
0
160
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
180
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
Documentation Writing (for coders)
carmenintech
66
4.5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Typedesign – Prime Four
hannesfritz
40
2.4k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
4 Signs Your Business is Dying
shpigford
181
21k
Being A Developer After 40
akosma
87
590k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Optimizing for Happiness
mojombo
376
70k
Gamification - CAS2011
davidbonilla
80
5.1k
Docker and Python
trallard
42
3.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
32
2.7k
Transcript
Go Hands-on #2 #techdo #golang #mediado #redish Nov 27, 2018
1 @kentfordev @yukpiz @ariaki4dev written by proofread CC-BY-4.0
タイムスケジュール 2 19:30 オープニング ( 10 min ) 19:40 座学
( 40 min ) 20:20 課題/出題 ( 10 min ) 20:30 課題/解答 ( 50 min ) 21:20 課題/説明&クロージング ( 10 min ) 21:30 懇親会 22:00 撤収
登壇者の紹介 3 @k_h_sissp kentfordev @yukpiz yukpiz @ariaki4dev ariaki
座学 19:40 ~ 20:20 ( 40 min )
目次 5 Goコマンド Go標準パッケージ レシーバー インターフェース 本日の学習内容 並列処理/ゴルーチン 並列処理/チャネル コーディング規約
ユニットテスト
Goコマンド command-line parameters
Goコマンド 7 get run test fmt build bug clean doc
env fix generate install list mod tool version vet コマンド一覧
Goコマンド 8 今回紹介するコマンド get run test fmt build bug clean
doc env fix generate install list mod tool version vet
Goコマンド 9 get • ライブラリをダウンロードして、プロジェクトで使えるようにする • ダウンロード先は、環境変数の $GOPATH 配下が対象となる
Goコマンド 10 get dateライブラリをgetする $GOPATH/src/配下に、github.com/rickb777/dateがダウンロードされる ※-uオプションは、対象リポジトリの最新版を常に指定してダウンロードする
Goコマンド 11 run • コマンド実行時に指定した、対象のプログラムを実行する • コンパイル結果のファイルは生成せず、即時実行する
Goコマンド 12 run 先程のdateを使った、サンプルコード
Goコマンド 13 run 実行方法 ※実行結果として、「2018-11-27」が出力される
Goコマンド 14 fmt • ソースコードを整形する • パスの指定方法により、整形対象をファイル単体か、ディレクトリ全 体かを変えることができる
Goコマンド 15 fmt 整形前
Goコマンド 16 fmt 実行方法
Goコマンド 17 fmt 整形後
Goコマンド 18 test • _test.goというサフィックスを持つファイルに対しテストを実行 • 詳細は後述のテストの項目で説明
Goコマンド 19 build • ソースコードをコンパイルし、実行ファイルを出力する • 開発環境とは別の環境に向けた実行ファイルでも、オプションで指定 すれば、コンパイルすることができる
Goコマンド 20 build 実行方法 ※-oオプション無しの場合、goファイルの拡張子なしの名前が出力ファイル名になる
Goコマンド 21 build Windows向けのバイナリを出力する例 ※開発環境がLinux、macOS等であっても、main.exeという名前で出力される
Go標準パッケージ standard packages
Go標準パッケージ 23 標準パッケージとは • Go自身に含まれるライブラリで、go getせずに使える • 入出力周りやJSONパース、サーバ起動などの機能が提供されており、 これだけでもある程度の処理を作ることができる
Go標準パッケージ 24 fmt 標準入力・標準出力を扱う io データの入出力を扱う ( Writer / Reader
) log ログ出力機能を扱う 紹介するパッケージ
Go標準パッケージ 25 fmt 標準入力された文字列を標準出力する
Go標準パッケージ 26 io 先程の標準入力、標準出力のコードを、ReaderとWriterに置き換えてみる Reader/Writerはインターフェースとして定義されており、よく使われる
Go標準パッケージ 27 log 標準出力の対象をLoggerに変更し、標準入力の内容をログ出力する
Go標準パッケージ 28 log 実行結果
レシーバー receivers
レシーバー 30 レシーバーとは • 定義した構造体に対して、関数を実装することができる • 構造体のデータ取出/変更を、処理とセットにする事ができる • 構造体の値に定義する「値レシーバー」 •
構造体のポインタ型に定義する「ポインタレシーバー」
レシーバー 31 レシーバーの定義 サンプルとしてPerson構造体を作成
レシーバー 32 レシーバーの定義 AgeとNameに対するレシーバーを作成
レシーバー 33 レシーバーの定義 定義したレシーバーの呼び出し
レシーバー 34 値レシーバーとポインタレシーバー • メモリ効率と用途によって、主にポインタレシーバーが使われる • 値レシーバーでは呼び出し時に構造体自体を一旦コピーし、呼び出し 元の構造体とは別のものが処理対象になる • ポインタレシーバーなら呼び出し元の値を変更することができる
レシーバー 35 値レシーバーとポインタレシーバー 下記のように値レシーバーで呼び出してしまうと、出力結果は29のまま
インターフェース interfaces
インターフェース 37 インターフェースとは • 型が持つべき関数を定義することで、パッケージ間でやり取りする型 を抽象化することができる • これにより構造体の型を隠蔽し、処理の抽象度を上げることができる • ここではインターフェースの定義方法と、基礎的な使い方を説明する
インターフェース 38 インターフェースの定義 前章のPersonを踏襲する形でインターフェースを定義
インターフェース 39 インターフェースを受け取る インターフェースを引数に取る関数を作る
インターフェース 40 インターフェースを使う インターフェースの定義を満たす構造体を定義する、下記は前章のPerson
インターフェース 41 インターフェースを使う Person構造体はHumanインターフェースの定義を満たすため、whoAreYou()を実行できる 「My name is kent」が出力される
インターフェース 42 インターフェースを使う Personとは別に、新しく構造体を作る
インターフェース 43 インターフェースを使う Humanインターフェースの定義を満たすので、RobotもwhoAreYou()を実行できる 「My id is abcd」が出力される
インターフェース 44 引数、返却値がある関数の定義 インターフェースの関数に引数、返却値を定義する ※引数は変数名を書いておくこともできる
Short break (5 min)
並列処理 ゴルーチン go routines
並列処理 ゴルーチン 47 • ゴルーチンはGo言語で並行処理を表すものです • 手続き実行ではなく、並列での関数の実行に使う事ができます • ゴルーチンは呼び出し元の処理をブロックせずに実行されます main()
関数 ゴルーチン ゴルーチン ゴルーチン 並列処理 ゴルーチンとは
並列処理 ゴルーチン 48 ゴルーチンの使い方 実行方法 • 関数/無名関数を扱える • 呼出元の処理をブロックしない
並列処理 ゴルーチン 49 ゴルーチンの処理順序 実行内容
並列処理 ゴルーチン 50 ゴルーチンの処理順序 実行結果
並列処理 ゴルーチン 51 main() 関数が終了すると、実行中の全てのゴルーチンを中断します ※実行中のゴルーチンがあっても、完了を待ちません メインゴルーチンの処理を ブロックせずに実行 ※実行順序は保証されない main()
関数 (メインゴルーチン) go func (ゴルーチン) go func (ゴルーチン) go func (ゴルーチン)
並列処理 チャネル channels
並列処理 チャネル 53 チャネルとは • チャネルはゴルーチン間のメッセージのやり取りをするものです • メッセージは型を指定できます • チャネルは容量
/ 送信 / 受信 / クローズで構成されています
並列処理 チャネル 54 チャネルの使い方 実行方法
並列処理 チャネル 55 チャネルのキャパシティ • チャネルにはキャパシティ(容量)があります • チャネルのキャパシティは送信された値を保管できる容量です • 受信側が待機している場合は、バッファは使用されません
• 容量が足りなくなると、チャネルへの送信はブロックされます
並列処理 ゴルーチン 56 ゴルーチンの使い方 実行方法 • 関数/無名関数を扱える • 呼出元の処理をブロックしない
並列処理 チャネル 57 送信チャネルのブロック サンプルコード
並列処理 チャネル 58 チャネルバッファを使わない送受信 サンプルコード
並列処理 チャネル 59 チャネルバッファを使った送信 サンプルコード
並列処理 チャネル 60 並列処理の完了を検知する • 並列処理の完了を検知したい時、チャネルは有効です • チャネルは使い方によっては問題を起こしてしまう事もあります • 以下の例では受信側が処理の完了を待ち続けてしまいます
並列処理 チャネル 61 サンプルコード 完了検知のアンチパターン
並列処理 チャネル 62 サンプルコード deferとcloseで完了を検知する
コーディング規約 coding standards
コーディング規約 64 コード整形とコードスタイル • Go言語は標準のgofmtを使ってコード整形をサポートしています • Go言語の実装コードで挙がったレビューコメントが公開されています • これらを厳密に守る必要はないですが、コードスタイルに悩んだ時の 参考にできます
https://qiita.com/knsh14/items/8b73b31822c109d4c497
ユニットテスト unit tests
ユニットテスト 66 標準パッケージによるユニットテスト • Go言語は標準のtestingパッケージでユニットテスト、ベンチマーク テストをサポートしています • _test.goをつけて、テストとして実行します
ユニットテスト 67 テスト対象 サンプルコード
ユニットテスト 68 ユニットテストコード サンプルコード テストとして実行する場合はTestから始まる関数名にする
ユニットテスト 69 • 実際に上記のテストを実行してみましょう • go testで実行ができます • go test
-vで詳細な実行結果を出力する事もできます • go test -coverでコードカバレッジも出力する事もできます テストの実行
ユニットテスト 70 テストの実行 実行結果
課題 20:20 ~ 21:20 ( 60 min )
目次 72 じゃんけんシミュレーターを作ろう 会話ゲームを作ろう 本日の課題
課題1 73 基本問題 • グー、チョキ、パーからランダムで1つを出す2CPを作りましょう • 結果は勝ち、負け、あいこのどれかです • ゴルーチンやチャネルを使う必要はありません •
100万回試行して、勝敗をカウントして表示しましょう 発展問題 • 片方のCPを50%の確率でパーを出すように設定して、実行しましょう じゃんけんシミュレーターを作ろう
課題1 74 実行結果の例 じゃんけんシミュレーターを作ろう 勝利=340000回 引分=330000回 敗北=300000回 ------------------------ 合計=1000000回
課題2 75 会話ゲームを作ろう 基本問題 • ゴルーチンとチャネルを使って、関数同士で会話をさせましょう • 登場人物は2人です • 各発言はそれぞれの名前がついた関数から発言します
発展問題 • 登場人物を3人に増やしましょう
課題2 76 実行結果の例 会話ゲームを作ろう kent: あなたの名前を教えてください yukpiz: 私はゆくぴずです kent: 私はけんとです
yukpiz: よろしくおねがいします kent: 生ハム食べに行きましょう yukpiz: 行きましょう
課題解答 77 解答時間のご案内 • 解答時間は 21:20 までの 50分間 です •
質問がある場合はスタッフにお声がけください ◦ 挙手いただけばスタッフが伺います ◦ Slackチャンネルで質問いただけば回答します • 解答時間中は自由にご飲食・ご休憩ください • 体調不良等ございましたらスタッフまでお申し付けください
最後に 21:20 ~ 21:30 ( 10 min )
解答について 79 解答例は以下URLよりご覧ください https://qiita.com/yukpiz/items/ef15557de423a2ccb230 ハンズオン後のサポートについて 閉会後に引き続きご質問がある場合、Slackでサポートします 以下のワークスペースにジョインし、#support-201811チャンネルでお気軽にご質問ください bit.ly/techdo-slack
次回開催予定のご案内 80 さらに進化した初心者向けハンズオンがここに・・! 2019年2月上旬頃(予定) また次回もご参加ください! https://techdo.connpass.com ※詳細が決まり次第、TwitterやConnpassグループ等で告知します
The Go gopher was designed by Renée French.
#4b4b4b #007ab7 #b61972 #4b4b4b #4b4b4b あいうえおかきくけこさしすせそ #007ab7 あいうえおかきくけこさしすせそ #b61972 あいうえおかきくけこさしすせそ
Go Hands-on #2