###### tags: `golang` `Goプログラミング実践入門` # Goプログラミング実践入門 輪読会 #初回 ## 目的 * Webアプリケーションの仕組みや基礎を学習すること * フレームワークの基盤となっている概念を学習すること * net/httpパッケージのハンドラについて理解を深めること ## 資料 * 1章 * 2章 * [3章](https://hackmd.io/El1hTaBcS7CCHKXlBjyOcQ?view) * [4章](https://hackmd.io/x4SDi9XKQ9yVIu8L3TxvTA?view) ## 1章 GoはWebアプリケーションに最適な言語 この章では以下3点について述べられている。 * Go言語がWebプログラミングに適している理由 * HTTPの動作、特性 * Webアプリケーション概略 ### 1.1 WebアプリケーションとしてのGo --- * スケーラビリティ * 垂直スケーラビリティ:goroutine * 水平スケーラビリティ:バイナリコンパイルでGo言語のない環境に分散配置可能 * モジュール性 * インターフェースによる動的な型付け * 関数型、値としての関数、クロージャなどの機能を保有 * 保守性 * gofmt * godoc * gotest * 高い実行効率 * コンパイル * 並行実行 ### 1.3 HTTP入門〜 --- 参考 :gem: [HTTP の概要](https://developer.mozilla.org/ja/docs/Web/HTTP/Overview) :gem: [HTTPとは](https://www.infraexpert.com/study/tcpip16.html) :gem: [オリジン間リソース共有](https://developer.mozilla.org/ja/docs/Web/HTTP/CORS) ### 1.9 Webアプリの構成 --- Webアプリケーションは以下の動作をするプログラムである。 1. HTTPを介し、HTTPリクエストメッセージの形でクライアントから入力を受け取る 2. HTTPリクエストメッセージを処理し、必要な作業を行う 3. HTMLを生成し、HTTPレスポンスメッセージに入れて返す ![図1.1](https://i.imgur.com/CE3mGbq.png) 多くのWebアプリは2つの要素で構成される。 * ハンドラ クライアントから送られてきたHTTPリクエストを受け付け、処理する。 MVCパターンでは、コントローラの役割を果たす。 * テンプレートエンジン クライアントにHTTPレスポンスメッセージを送り返す時に利用される。 「テンプレート」はHTMLに変換できるコード。 :gem: [MVCモデルについて](https://qiita.com/s_emoto/items/975cc38a3e0de462966a) <!-- ![MVCモデル](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F139470%2Fc65f3051-84ee-7e8a-8255-fd68272e6740.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=21434e05f5d94c0d655ffae2ecf46755) --> ## 2章 Goプログラム「ChitChat」 2章では、Webアプリケーション作成時の全体像を掴むことを目的としているため、コードの説明を省略する。 ### 2.1 ChitChatでちょっとチャット --- chitchatというアプリケーションは以下の機能を持っている。 * ログイン/登録機能 * スレッド作成機能 * スレッド書き込み機能 * (セッション管理機能) 実際に動作を確認 :gem:[書籍のソースコード](https://github.com/mushahiroyuki/gowebprog) <!-- Docker環境で実行する場合 --> <!-- :gem:[ソースコード](https://github.com/nakajima1412/go-jissen) --> ### 2.2 アプリケーションのデザイン〜 --- 一般的なWebアプリケーションは、リクエストを送るとレスポンスが返ってくる。 chitchatは`http//<サーバ名>/<ハンドラ名>?<パラメータ>`のフォーマットを使用する。 ![図2.2](https://i.imgur.com/uvXxHyT.png) chithcatに以下のようなリクエストを送るとする。 ``` http://chitchat/thread.read?id=123 ``` リクエストがサーバに到達した際、サーバ内部では以下の動作が必要。 * マルチプレクサがURLを調べ、所定のハンドラにリダイレクト * ハンドラがリクエストを処理 * データが必要な場合、ハンドラはモデルを使用する * モデルはデータ保管先(データベース)と接続し、取得する * ハンドラはテンプレートエンジンを起動し、モデルからデータを送信する * テンプレートエンジンがファイルを解析し、テンプレートを作成する ![図2.9](https://i.imgur.com/85R82Gg.png)