Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Go初心者向け
ハンズオン
コマンドラインツールを作ろう
2015/10/31(土)
@Go初心者向けハンズオン
The Go gopher was designed by Renee French.
The gopher stickers was made by Takuya Ueda.
Licensed under the Creative Commons 3.0
Attributions license.
アジェンダ
● 自己紹介
● ハンズオンについて
● ドキュメントとPlayground
● 型・メソッド・インタフェース
● もう一歩先へ
自己紹介
KLab株式会社
KLabGames事業本部 エンジニア
上田拓也
twitter: @tenntenn
■ 好きな言語
Go, JavaScript, Lua
■ 業務
モバイルオンラインゲームの開発(クライアントサイド)
ハンズオンについて
このハンズオンの目的
■ 日本でのGo普及
● Goが流行れば仕事が増える
● きっとGoで仕事できる
■ Go Conferenceへ
● セッションの内容についていけるように
● なんとなく参加 → 勉強したいから参加
○ ドタキャン率を下げれたら嬉しい
● 発表者になってほしい
今日作るもの
■ リポジトリ
● https://github.
com/tenntenn/gohandson/tree/master/imgconv/ja
■ コマンドラインツール
● ターミナルで動くプログラム
● 画像を変換するツール
# 50%に縮小して、JPEGにする
$ imgconv -resize 50% a.png b.jpg
学べること
■ このハンズオンで学べること
● go getやGOPATHについて
● コマンドライン引数の取り方
● ファイルの扱い方
● 画像ファイルの扱い方
● flagパッケージの使い方
● 埋込み
● 画像処理の仕方
● golang.org/x/以下のパッケージについて
● テンプレートエンジンの使い方
● ディレクトリを再帰的に処理する方法
学べないこと
■ このハンズオンで学べないこと
● Goの開発環境のインストール方法
● IDEやエディタの設定
● 基本的な文法
● ゴールーチンとチャネル
● net/httpパッケージ
ドキュメントとPlayground
ドキュメント
■ パッケージドキュメント
● https://golang.org/pkg
● 標準パッケージの使い方が書いてある
■ FAQ
● https://golang.org/doc/faq
● なぜGoに◯◯がないのか?など
■ 言語仕様
● https://golang.org/ref/spec
公式ドキュメントを読もう!!
Playground
■ Go Playground
● http://play.golang.org/
● Web上でGoを実行できる
● Share機能で、SNSで共有したり質問する
型・メソッド・インタフェース
typeを使った型の作成
■ シンプルで強力な type
// 組み込み型に名前をつける
type Int int
// 他のパッケージの型に名前をつける
type MyWriter io.Writer
// 型リテラルに名前をつける
type Person struct {
Name string
}
typeで名前が付けれるもの
■ 組み込み型
int、float64、string など
■ 型リテラル
構造体、インタフェース、
マップ、スライス、チャネル、関数 など
■ 名前付きの型
パッケージの内外で作った型
別の型として再定義できる
typeを使った型の作成
■ typeで作った型はレシーバにできる
type Hex int
func (h Hex) String() string {
return fmt.Sprintf(“%x”, int(h))
}
// 100をHex型として代入
var hex Hex = 100
// Stringメソッドを呼び出す
fmt.Println(hex.String())
intとHexは別の型として扱われる
レシーバにできるもの
■ 名前のついた型
typeで定義したもの
■ パッケージ内の型のみ
外部のパッケージの型はtypeで再定義する
■ ポインタも含む
レシーバに変更を与えたい場合
レシーバも引数と同じ扱い
構造体以外もメソッドを持てる
インタフェース
■ 明示的に実装しなくてよい
// interface型の型リテラルにStringerという名前をつける
type Stringer interface {
// メソッドリストを書く
String() string
}
type Hex int
// メソッドリストが一致してれば実装してることになる
func (h Hex) String() string {
return fmt.Sprintf(“%x”, int(h))
}
型とメソッドとインタフェース
■ 既存の型にもインタフェースを実装
● 後づけで実装させる
● メソッドリストさえ一致してればよい
■ 構造体以外も実装可能
● typeで宣言すればメソッドが設けられる
● メソッドリストさえ一致してればよい
io.Writerとio.Reader
■ 1つのメソッドしか持たない
● io.Writer: Writeメソッド
● io.Reader: Readメソッド
■ 標準パッケージで多く使われている
● fmt, net, bytes, encoding, bufio, os ...
● ファイルやネットワークのコネクション
● 抽象度の高いインタフェース
埋込み
■ 構造体に匿名フィールドとして値を埋め込む
type Hoge struct {
N int
}
// Fuga型にHoge型を埋め込む
type Fuga struct {
Hoge // 名前のないフィールドになる
}
埋込み
■ 埋め込んだ値に移譲(継承ではない)
f := Fuga{Hoge{N:100}}
// Hoge型のフィールドにアクセスできる
fmt.Println(f.N)
// 型名を指定してアクセスできる
fmt.Println(f.Hoge.N)
type Hoge struct {N int}
type Fuga struct {Hoge}
埋込みの特徴
■ 型リテラルでなければ埋め込められる
● typeで定義したものや組み込み型
● インタフェースも埋め込められる
■ インタフェースの実装
埋め込んだ値のメソッドもカウント
// Stringerを実装
type Hex int
func (h Hex) String() string {
return fmt.Sprintf(“%x”, int(h))
}
// Hex2もStringerを実装
type Hex2 struct {Hex}
type Stringer interface {
String() string
}
インタフェースと埋め込み
■ 既存のインタフェースの振る舞いを変える
type Hoge interface{M();N()}
type fuga struct {Hoge}
func (f fuga) M() {
fmt.Println(“Hi”)
f.Hoge.M() // 元のメソッドを呼ぶ
}
func HiHoge(h Hoge) Hoge {
return fuga{h} // 構造体作る
}
Mの振る舞いを変える
もう一歩先へ
ハンズオンが終わったら
■ 改造してみよう
● テストを書いてみよう
● 回転させてみよう
● 画像形式を増やそう
● gifアニメーションを作ろう
● 画像変換サーバにしよう
ハンズオンを開こう
■ ハンズオンを開催してほしい
● 資料はすでにある!
○ これからも増やしていきます
● 脱初心者で次の初心者を助けよう
● 教えるということは良い学びになる
● 身近なところでいいので
○ 会社、大学、コミュニティ
何か作って発表しよう
■ Go Conferenceに参加しよう
http://eventdots.jp/event/573121
Go初心者向けハンズオン コマンドラインツールを作ろう

More Related Content

Go初心者向けハンズオン コマンドラインツールを作ろう