SlideShare a Scribd company logo
今日から始める
Go言語 と appengine
2014/01/24@FFTT勉強会
inoue
Introduction	
• 今日なにやるの?
- Go言語 で appengine を始めてみよう
- appengine でGo言語を始めてみよう
- 何かしら動くものを作ってみます
- 今日からすぐにやってみよう、という気持ちに
なってもらえれば!
Do you know golang?
• 2009年11月10日(米国時間)に Google よりリリース。OSS
• Simple
• コンパイル・実行速度が速い
• タイプセーフかつメモリセーフ
• 並行処理の記述が容易にできる(goroutine)
• Google トレンド急上昇中
• 「2014年 プログラミング大予測」(日経ソフトウェア2014年2
月号特集)にて「Go言語 のキャズム超え」を挙げる方も
(@t_wada)
Do you know appengine?
• 正式名称「Google App Engine」(略称GAE)
• Google 謹製の PaaS、プログラムを書いてデプロイするだけで
全世界に公開!
• AutoScaling
• KVS(Datastore)
• 小さなアプリであれば無料枠運用も可能
- AWSのような「1年間無料」とかではなく、各アプリごとに
無料で使える範囲が設定されている
- http[s]://<app-id>.appspot.com/
- 私もいくつかのアプリを運用しほったらかしています
Why start appengine with golang?
• spin-up は appengine の特徴のうちの一つ
- (捌き切れない)リクエストが来たら、新しいインスタンスを立ち上げ
る(=AutoScaling)
- これがJavaとかだと無茶苦茶遅い(∼数秒)
• Python, Java, PHP の他、Go のサポートを開始
• Go だと spin-up はチョー速い(∼数十ミリ秒)
• 「並列処理を書きやすい」のも、appengine アプリを書くのに適してる
- appengine の色んな機能を call するときの I/O 待ちを最小化
• appengine やるなら Go で、でしょ!状態
- (※まだexperimentalです)
Agenda
1. Introduction
i. Do you know golang?
ii. Do you know appengine?
iii. Why start appengine with golang?
2. About golang specification
3. Live developing
4. まとめ
About golang specification	
• まずは言語仕様から軽く・・・
• A Tour of Go
- http://tour.golang.org/
- 実行するコードは、golang.org サーバ上のGo Playgroundで動作
- 受けたGoコードをサーバでコンパイル・リンク・実行し、そして
その結果を返してくれる
• A Tour of Go (jp)
- http://go-tour-jp.appspot.com/
- 今日はここから要所をピックアップすることにします
- 数が多いので巻き気味でいきます
About golang specification
#1) Hello World
About golang specification
#4) Packages
• プログラムの動作の始点は main パッケージ内
• パッケージ名はインポートパスの最後の要素と同じになる
- “math/rand” パッケージに属するプログラムは、
“package rand” から始まるコード群で構成される
About golang specification
#6) Exported names
• パッケージをインポートすると、そのパッケージが外部に
公開(エクスポート)している名前(変数や関数)を参照
することが可能
- 名前の最初が大文字で始まる場合はエクスポートされる
- Hoge ならエクスポートされるが、 hoge だとされない
About golang specification
#7, 8, 9, 10) About Functions
• 引数定義では、型が変数名の後にくるので注意。戻り値の型は引数定義の後ろに
• 2つ以上の関数の引数が同じ型である場合には、最後の型だけ書くことができる
• 複数の戻り値を返すことが可能
• 戻り値にもパラメータを取ることも可能(その場合、return だけ書けば良い)
About golang specification
#11, 12, 13) Variables
• var ステートメントで変数を宣言
• 2つ以上連続した変数の型が同じなら、最後に一回だけ書けばOK(関数の引数
リストと同じ)
• 変数一つ一つに initializer を与えることも可能。その場合、型は省略できる
• := を用いることで暗黙的な型宣言も可能
- Ruby でいう ||= に似てるなー
About golang specification
#14) Basic types
• Go の基本型は以下。
- bool
- string
- int int8 int16 int32 int64
- uint uint8 uint16 uint32 uint64 uintptr
- byte
- rune
- float32 float64
- complex64 complex128
About golang specification
#15) Constants
• 定数は、キーワード const を使って宣言
• character、string、boolean、数値(numeric)のみで宣言
可能
• := を使っての宣言は不可
About golang specification
#17, 18, 19, 20) For
• Go でのループ処理に使えるのは for ループだけ、while はない
• 括弧 ( ) はつけてはならない。中括弧 { } は必要
• 条件の前後は空にできるし、セミコロンを抜くこともできる … これが Go
での while!
• 条件を省略すれば無限ループに
About golang specification
#21, 22, 23) If
• 括弧 ( ) はつけてはならない、中括弧 { } は必要
• 条件式の前に短いステートメントを記述することができる
- ここで宣言された変数は、else ブロック内でも使える
About golang specification
#25, 26) Structs
• struct(構造体)というものがある
• フィールドにはドットを用いてアクセス
About golang specification
#27, 29) Pointers, The new function
• new(T) と書くと、ゼロ初期化した T の値をメモリに割り当て、その
ポインタを返す
- Go にはポインタがある(ポインタ演算はない)
- 構造体のフィールドは、構造体のポインタを通してもアクセスでき
る
About golang specification
#30, 31, 32) Slices
• 配列変数は配列全体。スライスとは、ある配列内の連続した領域への参照のこと
• make 関数を使って生成:ゼロ初期化した配列をメモリに割り当て、その参照が
生成される
About golang specification
#34, 35) Range
• slice などの要素ひとつずつを反復処理するのに使える
• i はインデックス。その後ろに変数を置くと値が取れる
• インデックスや値の代入先をアンスコ”_”にすることで、
破棄することも可能
About golang specification
#37, 38, 39, 40) Maps
• 連想配列。make関数 で作成
• キーが存在するかどうかは、2つ目の戻り値を受け取ることで確認
- map m に key があれば、 ok は true になる
- なかった場合、ok は false になり、 v は、map の要素の型のゼロの値
になる
About golang specification
#42, 43) Function
• 関数も値として扱える
- 関数そのものを変数に代入できる
• Go の関数はクロージャだそうです
- クロージャ:関数閉包。引数以外の変数を自身のスコープにおいて解決する関数オブジェクト
- pos, neg の各クロージャは、自身の変数 sum へアクセスして変更できる(「sum にバインド
されている」)
About golang specification
#45, 46) Switch
• 上から下に評価。一致したところから下は評価されない
• 各 case の最後で break する
- Java とかだと、case 文を実行した後でも switch 文全体の処理から抜けず
に次の case の判定を行う
- fallthrough 文を case の最後に記述すれば、 Java とかと同じ挙動に
About golang specification
#50, 51) Methods
• メソッドの定義は、任意の type に対してのメソッドレシーバを定義
することで行える(Go にはクラスの仕組みがない)
- Vertex に対して Abs() が呼び出されたら func Abs() が実行される
- 他のパッケージからの型や基本型にはメソッドを定義できない
About golang specification
#52) Methods with pointer receivers
• メソッドレシーバは、ポインタ型でも値型でも書ける
• pointer receiver を使うことで、各メソッド呼び出しで値をコピーするのを回避
(元の値を変更)できる
• Scale メソッドが value receiver だった場合、元の値を変更することができない
(元の値のコピーに対する操作になる)
About golang specification
#53) Interfaces
• インターフェース型は、メソッド群として定義される。
• そのインターフェース型の値は、それらのメソッドを実
装する任意の値、となる
About golang specification
#55) Errors
• エラーを表す際には、組込みのインターフェース型の error を使う
• 文字列を返す Error メソッドを実装しておく
• fmt パッケージの各種表示ルーチンは、error 型を渡された場合、自動的に
Error メソッドを呼び出す
About golang specification
#63) Goroutines
• “goroutine” は、いわゆるスレッド(軽量)
• “go f(x, y, z)” と書けば、関数 f は新しい goroutine 上で実行される
• x, y, z の評価は現在の goroutine(スレッド)で評価され、新しい
goroutine で実行されるのは、関数 f
• goroutine は同じアドレス空間で実行されるため、共有メモリへの
アクセスは、きちんと同期する必要がある…
About golang specification
#64, 65) Channels
• goroutine 間での通信には channel を用いる
• ch <- hoge で、hoge をチャネル ch に送る
• fuga <- ch で、チャネル ch から fuga を受信する
• チャネルも make 関数で作る。2つ目の引数にバッファ長を与えられる
(チャネルはバッファ可能)
About golang specification
#66) Range and Close
• 送り手は、これ以上の送信する値がないことを示すためにチャネル
を close できる
• for i := range c と書けば、チャネルが閉じられるまで、繰り返し
チャネルから値を受信できる
もう言語仕様はこれくらいにして…
Live Developing	
• せっかくなので、Webアプリっぽい挙動をするものを
- なおかつ、勉強会の時間内で完成するようなもの
- Mashupなかんじで、「はてなスターチェッカー」を
作る!
- http://developer.hatena.ne.jp/ja/documents/star/
apis/count
• Googleアカウントを作るところからやりますので、みな
さんもぜひ、おうちでやってみてください!
Live developing
#1) install golang
• $ brew install go
• python 2.7.x 以上が必要とのこと
- $ python --version
• 作業を行うロケーションを GOPATH として設定しておくと
便利って誰かが言ってた
- $ mkdir $HOME/go
- $ export GOPATH=$HOME/go
• さらに bin サブディレクトリにもPATHを通しておくと便利
らしいけど appengine 開発にはあまり関係ないかも
- $ export PATH=$PATH:$GOPATH/bin
Live developing
#2) Download appengine SDK
• https://developers.google.com/appengine/
downloads?hl=ja にいく
• 「Google App Engine SDK for Go」がちゃんとあるの
で、ダウンロード
• 適当なところに展開
• 展開してできたディレクトリを PATH に通しておく
- $ export PATH=$PATH:$GOPATH/go_appengine
Live developing
#3) Hello World (1)
• 公式チュートリアルのHello Worldをやってみましょう
- https://developers.google.com/appengine/docs/go/
gettingstarted/helloworld
• $ cd $GOPATH
• $ mkdir -p workspace/hello
• $ cd workspace/hello
Live developing
#3) Hello World (2)
• hello.go を作る
Live developing
#3) Hello World (3)
• 設定ファイル app.yaml を書く
• hello.go と同じ階層でOK
Live developing
#3) Hello World (4)
• ローカルでサーバを立ち上げてみる
- $ goapp serve .
• http://localhost:8080 にアクセスしてみる
- 上のような画面が表示されたらOK
Live developing
#4) Take an Google Account (1)
• http://appengine.google.com/ にいく
• 「アカウントを作成」しましょう
Live developing
#5) create appengine application (1)
• 「Create Application」ボタンを押せば appengineアプ
リケーションの作成が始まります
• 電話認証が必要な場合があります
Live developing
#5) create appengine application (2)
• 「Application Identifier」には、世界でユニークなアプリケーション識別子
を入力します(これは覚えておこう)
• 「Application Title」は、自分がわかるような文字列ならなんでもOK
• その他もそのままでOK
• 1アカウントで10アプリまで作れます
Live developing
#5) create appengine application (3)
• Congraturations !!
Live developing
#6) Deploy Application to appengine (1)
• 先ほどの Hello World をデプロイしてみましょう
- $ goapp deploy .
• GMailアドレスとパスワードを聞かれます
• もしデプロイに失敗したりした場合、前回のデプロイ作
業をロールバックさせる必要があります
- $ $GOPATH/go_appengine/appcfg.py rollback .
Live developing
#6) Deploy Application to appengine (2)
• デプロイが完了したら、先ほど覚えておいたアプリケーショ
ン識別子を下記URLに当てはめてアクセス!
- http://<application-identifier>.appspot.com/
• さきほどのローカル実行時と同じ画面が表示されたら、
Congraturations !!
• いま、あなたの Hello World は全世界に公開されました!
Live developing
#7) Develop “star-checker” (1)
• では、このHello Worldをベースに、本来の目的の「はてな
スターチェッカー」を作ってみましょう
• まずはルーティングを追加・変更します
Live developing
#7) Develop “star-checker” (2)
• チェック結果(APIからのレスポンス)を表す struct を
作成します
• 変数名を大文字にして、Export可能にしておきます
Live developing
#7) Develop “star-checker” (3)
• htmlのテンプレートを作りましょう
• ちゃんとしたWebアプリをつくるときは、普通にhtmlを
置いてAjaxでDOM操作するとか…
Live developing
#7) Develop “star-checker” (4)
• トップページのルーティングハンドラを作りましょう
- いまあるハンドラは消しちゃいましょう
- 初期表示としては空っぽの結果表示をしておくことにしましょう、
そのために、空の StarReport をテンプレートに食わせときましょう
Live developing
#7) Develop “star-checker” (5)
• APIのレスポンスは JSON なので、それを parse する メソッドを定義
- StarReport に JsonProc というメソッドレシーバを定義する形
- JSON の parse 処理は今回の本質ではないので、さらっと
Live developing
#7) Develop “star-checker” (6)
• 最後に、チェックボタンをsubmitされたときのルーティングハンドラを作りましょう
- WebAPIを、appengine 上のアプリケーションからリクエストする際には、
appengine の「URL Fetch」というAPIを用います
- appengine の機能を利用する際には、予め context を取得しておく必要があります
- (続きます)
Live developing
#7) Develop “star-checker” (7)
• 続きです
- APIのレスポンスの body を ioutil.ReadAll で取得します
- defer : これを実行した関数がリターンする直前に、defer で指定した
関数の呼び出しが行われるようにスケジューリングしてくれる
- (さらに続きます)
Live developing
#7) Develop “star-checker” (8)
• さらに続きです
- string( hoge ) で、文字列に変換
- さっきのメソッドレシーバにより、parse された内容は report に
- その report をテンプレートに食わすと…
Live developing
#8) Congraturations!!
• できたっ!!
- あとはこれをもう一度デプロイすれば、Webアプリ「はてなスター
チェッカー」の全世界へのリリースが完了です!
- スターの数がわりと少ないのは、バグではないです。
Live developing
#9) Appendix
• コード全文は下記にて公開しております
- https://github.com/a-know/star_checker
• Goの言語仕様をざっと見てみました
• 実際にHello World と はてなスターチェッカー のふたつ
のアプリを書いてみました
• appengine にデプロイしてみました
• 言語はやっぱり使っていかないと習得できない!けど、
appengineはそれにじゅうぶん応えてくれる(勉強目的
くらいならタダで使える)プラットフォームだよ!
まとめ
今日から始めましょう!
Go言語 と appengine !!
完

More Related Content

PDF
GoでMinecraftっぽいの作る
PDF
Goでかんたんソースコードの静的解析
PDF
GAE/GoでWebアプリ開発入門
PDF
Go入門
PDF
GoによるWebアプリ開発のキホン
PDF
Go1.8 for Google App Engine
PDF
実践Go ツールの作成から配布まで
PDF
条件式評価器の実装による管理ツールの抽象化
GoでMinecraftっぽいの作る
Goでかんたんソースコードの静的解析
GAE/GoでWebアプリ開発入門
Go入門
GoによるWebアプリ開発のキホン
Go1.8 for Google App Engine
実践Go ツールの作成から配布まで
条件式評価器の実装による管理ツールの抽象化

What's hot (20)

PDF
ヒカルのGo 資料 Webアプリケーションの作り方
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PDF
Goでwebアプリを開発してみよう
PDF
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
PPTX
FINAL FANTASY Record Keeperを支えたGolang
PDF
Goで言語処理系(の途中まで)を作ろう
PDF
エディタの壁を越えるGoの開発ツールの文化と作成法
PDF
Goにおける静的解析と製品開発への応用
PDF
Go mobileでモバイルアプリを作ろう
PDF
Go言語でBot開発やってみた
PDF
Goとテスト
PDF
マスター・オブ・goパッケージ
PDF
静的解析を使った開発ツールの開発
PDF
Go静的解析ハンズオン
PDF
Go MobileでAndroidアプリ開発
PDF
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
PDF
Gopher Fest 2017参加レポート
PDF
エキスパートGo
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
PDF
Goをえらんだ理由
ヒカルのGo 資料 Webアプリケーションの作り方
メルカリ・ソウゾウでは どうGoを活用しているのか?
Goでwebアプリを開発してみよう
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
FINAL FANTASY Record Keeperを支えたGolang
Goで言語処理系(の途中まで)を作ろう
エディタの壁を越えるGoの開発ツールの文化と作成法
Goにおける静的解析と製品開発への応用
Go mobileでモバイルアプリを作ろう
Go言語でBot開発やってみた
Goとテスト
マスター・オブ・goパッケージ
静的解析を使った開発ツールの開発
Go静的解析ハンズオン
Go MobileでAndroidアプリ開発
Goのパッケージ構成で 試行錯誤してみた話 ~ Gocon 2015 Summer
Gopher Fest 2017参加レポート
エキスパートGo
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会2
Goをえらんだ理由
Ad

Viewers also liked (20)

PPTX
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
PPTX
運用自動化のためのプログラミング言語の作り方
PDF
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
PDF
マスター・オブ・Reflectパッケージ
PPTX
AndroidのUXアンチパターンについて
PDF
Unlimited Frameworks
PDF
Log解析の超入門
PDF
形式手法で捗る!インフラ構成の設計と検証
PDF
GAE/GoでLINE Messaging API を使う
PDF
HighBatch
PPTX
Go+revel
KEY
Chrome osとgo言語からgoogleの今後を妄想してみる
PDF
Go言語と過ごした一週間
PDF
Goを知る
PDF
らくちん Go言語
PPTX
Github第8章
PDF
Golang, make and robotics #gocon
PDF
alphawing meets heroku
PDF
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
PDF
Eureka go 2015_12_12
Go言語のフレームワークRevelの紹介とサービスにおける活用事例
運用自動化のためのプログラミング言語の作り方
インフラ運用管理ツールとGolang OSS運用管理勉強会LT
マスター・オブ・Reflectパッケージ
AndroidのUXアンチパターンについて
Unlimited Frameworks
Log解析の超入門
形式手法で捗る!インフラ構成の設計と検証
GAE/GoでLINE Messaging API を使う
HighBatch
Go+revel
Chrome osとgo言語からgoogleの今後を妄想してみる
Go言語と過ごした一週間
Goを知る
らくちん Go言語
Github第8章
Golang, make and robotics #gocon
alphawing meets heroku
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Eureka go 2015_12_12
Ad

Similar to 今日から始める Go言語 と appengine (20)

PDF
今日から始めるGopher - スタートGo #0 @GDG名古屋
PDF
goパッケージで型情報を用いたソースコード検索を実現する
PDF
Tizen 2.0 alpha でサポートされなかった native api
PDF
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
PPTX
Go言語ってどんな言語? 導入実績や気になるトレンド
PPT
Google Product
PDF
Pyconjp2014_implementations
PDF
Easy scripting in Go
PDF
Golang handson
PPT
appengine活用事例資料@TDDBC札幌2.1
PDF
Go一緒にいかが?
PDF
0621 ndk game
PDF
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PDF
はてなにおける継続的デプロイメントの現状と Docker の導入
PDF
Debug Hacks at Security and Programming camp 2011
KEY
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
PDF
Groovy Bootcamp 2015 by JGGUG
PDF
OSSで楽に作るGo言語クライアントツール
PDF
PythonのGUI_2018 with NSEG
今日から始めるGopher - スタートGo #0 @GDG名古屋
goパッケージで型情報を用いたソースコード検索を実現する
Tizen 2.0 alpha でサポートされなかった native api
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
Go言語ってどんな言語? 導入実績や気になるトレンド
Google Product
Pyconjp2014_implementations
Easy scripting in Go
Golang handson
appengine活用事例資料@TDDBC札幌2.1
Go一緒にいかが?
0621 ndk game
インフラエンジニアがk8sでアプリを作って見えた今後のインフラ
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
はてなにおける継続的デプロイメントの現状と Docker の導入
Debug Hacks at Security and Programming camp 2011
オープン・ソースで構築するARMマイコン開発環境 ―― GCC,Eclipse,OpenOCDで統合開発環境,JTAGデバッグもできる!
Groovy Bootcamp 2015 by JGGUG
OSSで楽に作るGo言語クライアントツール
PythonのGUI_2018 with NSEG

More from a know (10)

PDF
Pixela introduction document - builderscon 2019
PDF
"草APIサービス" Pixela を作った話
PDF
セールスエンジニアとして今後身につけていきたい技術
PDF
私の「キャリアキーノート」
PDF
Mackerel の standard プランを個人利用している話
PDF
「お手軽な機械学習サービス」で、ルーティンワークに立ち向かおう!
PDF
フィードフォースと AWS と私
PDF
サンタソン【サンタは俺らに何もくれない!だったら、俺らでアプリを作ろう】
PDF
はじめよう JavaFX 2.x
PDF
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
Pixela introduction document - builderscon 2019
"草APIサービス" Pixela を作った話
セールスエンジニアとして今後身につけていきたい技術
私の「キャリアキーノート」
Mackerel の standard プランを個人利用している話
「お手軽な機械学習サービス」で、ルーティンワークに立ち向かおう!
フィードフォースと AWS と私
サンタソン【サンタは俺らに何もくれない!だったら、俺らでアプリを作ろう】
はじめよう JavaFX 2.x
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)

今日から始める Go言語 と appengine

  • 2. Introduction • 今日なにやるの? - Go言語 で appengine を始めてみよう - appengine でGo言語を始めてみよう - 何かしら動くものを作ってみます - 今日からすぐにやってみよう、という気持ちに なってもらえれば!
  • 3. Do you know golang? • 2009年11月10日(米国時間)に Google よりリリース。OSS • Simple • コンパイル・実行速度が速い • タイプセーフかつメモリセーフ • 並行処理の記述が容易にできる(goroutine) • Google トレンド急上昇中 • 「2014年 プログラミング大予測」(日経ソフトウェア2014年2 月号特集)にて「Go言語 のキャズム超え」を挙げる方も (@t_wada)
  • 4. Do you know appengine? • 正式名称「Google App Engine」(略称GAE) • Google 謹製の PaaS、プログラムを書いてデプロイするだけで 全世界に公開! • AutoScaling • KVS(Datastore) • 小さなアプリであれば無料枠運用も可能 - AWSのような「1年間無料」とかではなく、各アプリごとに 無料で使える範囲が設定されている - http[s]://<app-id>.appspot.com/ - 私もいくつかのアプリを運用しほったらかしています
  • 5. Why start appengine with golang? • spin-up は appengine の特徴のうちの一つ - (捌き切れない)リクエストが来たら、新しいインスタンスを立ち上げ る(=AutoScaling) - これがJavaとかだと無茶苦茶遅い(∼数秒) • Python, Java, PHP の他、Go のサポートを開始 • Go だと spin-up はチョー速い(∼数十ミリ秒) • 「並列処理を書きやすい」のも、appengine アプリを書くのに適してる - appengine の色んな機能を call するときの I/O 待ちを最小化 • appengine やるなら Go で、でしょ!状態 - (※まだexperimentalです)
  • 6. Agenda 1. Introduction i. Do you know golang? ii. Do you know appengine? iii. Why start appengine with golang? 2. About golang specification 3. Live developing 4. まとめ
  • 7. About golang specification • まずは言語仕様から軽く・・・ • A Tour of Go - http://tour.golang.org/ - 実行するコードは、golang.org サーバ上のGo Playgroundで動作 - 受けたGoコードをサーバでコンパイル・リンク・実行し、そして その結果を返してくれる • A Tour of Go (jp) - http://go-tour-jp.appspot.com/ - 今日はここから要所をピックアップすることにします - 数が多いので巻き気味でいきます
  • 9. About golang specification #4) Packages • プログラムの動作の始点は main パッケージ内 • パッケージ名はインポートパスの最後の要素と同じになる - “math/rand” パッケージに属するプログラムは、 “package rand” から始まるコード群で構成される
  • 10. About golang specification #6) Exported names • パッケージをインポートすると、そのパッケージが外部に 公開(エクスポート)している名前(変数や関数)を参照 することが可能 - 名前の最初が大文字で始まる場合はエクスポートされる - Hoge ならエクスポートされるが、 hoge だとされない
  • 11. About golang specification #7, 8, 9, 10) About Functions • 引数定義では、型が変数名の後にくるので注意。戻り値の型は引数定義の後ろに • 2つ以上の関数の引数が同じ型である場合には、最後の型だけ書くことができる • 複数の戻り値を返すことが可能 • 戻り値にもパラメータを取ることも可能(その場合、return だけ書けば良い)
  • 12. About golang specification #11, 12, 13) Variables • var ステートメントで変数を宣言 • 2つ以上連続した変数の型が同じなら、最後に一回だけ書けばOK(関数の引数 リストと同じ) • 変数一つ一つに initializer を与えることも可能。その場合、型は省略できる • := を用いることで暗黙的な型宣言も可能 - Ruby でいう ||= に似てるなー
  • 13. About golang specification #14) Basic types • Go の基本型は以下。 - bool - string - int int8 int16 int32 int64 - uint uint8 uint16 uint32 uint64 uintptr - byte - rune - float32 float64 - complex64 complex128
  • 14. About golang specification #15) Constants • 定数は、キーワード const を使って宣言 • character、string、boolean、数値(numeric)のみで宣言 可能 • := を使っての宣言は不可
  • 15. About golang specification #17, 18, 19, 20) For • Go でのループ処理に使えるのは for ループだけ、while はない • 括弧 ( ) はつけてはならない。中括弧 { } は必要 • 条件の前後は空にできるし、セミコロンを抜くこともできる … これが Go での while! • 条件を省略すれば無限ループに
  • 16. About golang specification #21, 22, 23) If • 括弧 ( ) はつけてはならない、中括弧 { } は必要 • 条件式の前に短いステートメントを記述することができる - ここで宣言された変数は、else ブロック内でも使える
  • 17. About golang specification #25, 26) Structs • struct(構造体)というものがある • フィールドにはドットを用いてアクセス
  • 18. About golang specification #27, 29) Pointers, The new function • new(T) と書くと、ゼロ初期化した T の値をメモリに割り当て、その ポインタを返す - Go にはポインタがある(ポインタ演算はない) - 構造体のフィールドは、構造体のポインタを通してもアクセスでき る
  • 19. About golang specification #30, 31, 32) Slices • 配列変数は配列全体。スライスとは、ある配列内の連続した領域への参照のこと • make 関数を使って生成:ゼロ初期化した配列をメモリに割り当て、その参照が 生成される
  • 20. About golang specification #34, 35) Range • slice などの要素ひとつずつを反復処理するのに使える • i はインデックス。その後ろに変数を置くと値が取れる • インデックスや値の代入先をアンスコ”_”にすることで、 破棄することも可能
  • 21. About golang specification #37, 38, 39, 40) Maps • 連想配列。make関数 で作成 • キーが存在するかどうかは、2つ目の戻り値を受け取ることで確認 - map m に key があれば、 ok は true になる - なかった場合、ok は false になり、 v は、map の要素の型のゼロの値 になる
  • 22. About golang specification #42, 43) Function • 関数も値として扱える - 関数そのものを変数に代入できる • Go の関数はクロージャだそうです - クロージャ:関数閉包。引数以外の変数を自身のスコープにおいて解決する関数オブジェクト - pos, neg の各クロージャは、自身の変数 sum へアクセスして変更できる(「sum にバインド されている」)
  • 23. About golang specification #45, 46) Switch • 上から下に評価。一致したところから下は評価されない • 各 case の最後で break する - Java とかだと、case 文を実行した後でも switch 文全体の処理から抜けず に次の case の判定を行う - fallthrough 文を case の最後に記述すれば、 Java とかと同じ挙動に
  • 24. About golang specification #50, 51) Methods • メソッドの定義は、任意の type に対してのメソッドレシーバを定義 することで行える(Go にはクラスの仕組みがない) - Vertex に対して Abs() が呼び出されたら func Abs() が実行される - 他のパッケージからの型や基本型にはメソッドを定義できない
  • 25. About golang specification #52) Methods with pointer receivers • メソッドレシーバは、ポインタ型でも値型でも書ける • pointer receiver を使うことで、各メソッド呼び出しで値をコピーするのを回避 (元の値を変更)できる • Scale メソッドが value receiver だった場合、元の値を変更することができない (元の値のコピーに対する操作になる)
  • 26. About golang specification #53) Interfaces • インターフェース型は、メソッド群として定義される。 • そのインターフェース型の値は、それらのメソッドを実 装する任意の値、となる
  • 27. About golang specification #55) Errors • エラーを表す際には、組込みのインターフェース型の error を使う • 文字列を返す Error メソッドを実装しておく • fmt パッケージの各種表示ルーチンは、error 型を渡された場合、自動的に Error メソッドを呼び出す
  • 28. About golang specification #63) Goroutines • “goroutine” は、いわゆるスレッド(軽量) • “go f(x, y, z)” と書けば、関数 f は新しい goroutine 上で実行される • x, y, z の評価は現在の goroutine(スレッド)で評価され、新しい goroutine で実行されるのは、関数 f • goroutine は同じアドレス空間で実行されるため、共有メモリへの アクセスは、きちんと同期する必要がある…
  • 29. About golang specification #64, 65) Channels • goroutine 間での通信には channel を用いる • ch <- hoge で、hoge をチャネル ch に送る • fuga <- ch で、チャネル ch から fuga を受信する • チャネルも make 関数で作る。2つ目の引数にバッファ長を与えられる (チャネルはバッファ可能)
  • 30. About golang specification #66) Range and Close • 送り手は、これ以上の送信する値がないことを示すためにチャネル を close できる • for i := range c と書けば、チャネルが閉じられるまで、繰り返し チャネルから値を受信できる
  • 32. Live Developing • せっかくなので、Webアプリっぽい挙動をするものを - なおかつ、勉強会の時間内で完成するようなもの - Mashupなかんじで、「はてなスターチェッカー」を 作る! - http://developer.hatena.ne.jp/ja/documents/star/ apis/count • Googleアカウントを作るところからやりますので、みな さんもぜひ、おうちでやってみてください!
  • 33. Live developing #1) install golang • $ brew install go • python 2.7.x 以上が必要とのこと - $ python --version • 作業を行うロケーションを GOPATH として設定しておくと 便利って誰かが言ってた - $ mkdir $HOME/go - $ export GOPATH=$HOME/go • さらに bin サブディレクトリにもPATHを通しておくと便利 らしいけど appengine 開発にはあまり関係ないかも - $ export PATH=$PATH:$GOPATH/bin
  • 34. Live developing #2) Download appengine SDK • https://developers.google.com/appengine/ downloads?hl=ja にいく • 「Google App Engine SDK for Go」がちゃんとあるの で、ダウンロード • 適当なところに展開 • 展開してできたディレクトリを PATH に通しておく - $ export PATH=$PATH:$GOPATH/go_appengine
  • 35. Live developing #3) Hello World (1) • 公式チュートリアルのHello Worldをやってみましょう - https://developers.google.com/appengine/docs/go/ gettingstarted/helloworld • $ cd $GOPATH • $ mkdir -p workspace/hello • $ cd workspace/hello
  • 36. Live developing #3) Hello World (2) • hello.go を作る
  • 37. Live developing #3) Hello World (3) • 設定ファイル app.yaml を書く • hello.go と同じ階層でOK
  • 38. Live developing #3) Hello World (4) • ローカルでサーバを立ち上げてみる - $ goapp serve . • http://localhost:8080 にアクセスしてみる - 上のような画面が表示されたらOK
  • 39. Live developing #4) Take an Google Account (1) • http://appengine.google.com/ にいく • 「アカウントを作成」しましょう
  • 40. Live developing #5) create appengine application (1) • 「Create Application」ボタンを押せば appengineアプ リケーションの作成が始まります • 電話認証が必要な場合があります
  • 41. Live developing #5) create appengine application (2) • 「Application Identifier」には、世界でユニークなアプリケーション識別子 を入力します(これは覚えておこう) • 「Application Title」は、自分がわかるような文字列ならなんでもOK • その他もそのままでOK • 1アカウントで10アプリまで作れます
  • 42. Live developing #5) create appengine application (3) • Congraturations !!
  • 43. Live developing #6) Deploy Application to appengine (1) • 先ほどの Hello World をデプロイしてみましょう - $ goapp deploy . • GMailアドレスとパスワードを聞かれます • もしデプロイに失敗したりした場合、前回のデプロイ作 業をロールバックさせる必要があります - $ $GOPATH/go_appengine/appcfg.py rollback .
  • 44. Live developing #6) Deploy Application to appengine (2) • デプロイが完了したら、先ほど覚えておいたアプリケーショ ン識別子を下記URLに当てはめてアクセス! - http://<application-identifier>.appspot.com/ • さきほどのローカル実行時と同じ画面が表示されたら、 Congraturations !! • いま、あなたの Hello World は全世界に公開されました!
  • 45. Live developing #7) Develop “star-checker” (1) • では、このHello Worldをベースに、本来の目的の「はてな スターチェッカー」を作ってみましょう • まずはルーティングを追加・変更します
  • 46. Live developing #7) Develop “star-checker” (2) • チェック結果(APIからのレスポンス)を表す struct を 作成します • 変数名を大文字にして、Export可能にしておきます
  • 47. Live developing #7) Develop “star-checker” (3) • htmlのテンプレートを作りましょう • ちゃんとしたWebアプリをつくるときは、普通にhtmlを 置いてAjaxでDOM操作するとか…
  • 48. Live developing #7) Develop “star-checker” (4) • トップページのルーティングハンドラを作りましょう - いまあるハンドラは消しちゃいましょう - 初期表示としては空っぽの結果表示をしておくことにしましょう、 そのために、空の StarReport をテンプレートに食わせときましょう
  • 49. Live developing #7) Develop “star-checker” (5) • APIのレスポンスは JSON なので、それを parse する メソッドを定義 - StarReport に JsonProc というメソッドレシーバを定義する形 - JSON の parse 処理は今回の本質ではないので、さらっと
  • 50. Live developing #7) Develop “star-checker” (6) • 最後に、チェックボタンをsubmitされたときのルーティングハンドラを作りましょう - WebAPIを、appengine 上のアプリケーションからリクエストする際には、 appengine の「URL Fetch」というAPIを用います - appengine の機能を利用する際には、予め context を取得しておく必要があります - (続きます)
  • 51. Live developing #7) Develop “star-checker” (7) • 続きです - APIのレスポンスの body を ioutil.ReadAll で取得します - defer : これを実行した関数がリターンする直前に、defer で指定した 関数の呼び出しが行われるようにスケジューリングしてくれる - (さらに続きます)
  • 52. Live developing #7) Develop “star-checker” (8) • さらに続きです - string( hoge ) で、文字列に変換 - さっきのメソッドレシーバにより、parse された内容は report に - その report をテンプレートに食わすと…
  • 53. Live developing #8) Congraturations!! • できたっ!! - あとはこれをもう一度デプロイすれば、Webアプリ「はてなスター チェッカー」の全世界へのリリースが完了です! - スターの数がわりと少ないのは、バグではないです。
  • 54. Live developing #9) Appendix • コード全文は下記にて公開しております - https://github.com/a-know/star_checker
  • 55. • Goの言語仕様をざっと見てみました • 実際にHello World と はてなスターチェッカー のふたつ のアプリを書いてみました • appengine にデプロイしてみました • 言語はやっぱり使っていかないと習得できない!けど、 appengineはそれにじゅうぶん応えてくれる(勉強目的 くらいならタダで使える)プラットフォームだよ! まとめ