Submit Search
インタフェースの実装パターン
13 likes
6,349 views
Takuya Ueda
1 of 41
Download now
Downloaded 15 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
More Related Content
PDF
KafkaとPulsar
Yahoo!デベロッパーネットワーク
PPTX
Prometheus入門から運用まで徹底解説
貴仁 大和屋
PPTX
Apache Avro vs Protocol Buffers
Seiya Mizuno
PDF
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
PDF
外部キー制約に伴うロックの小話
ichirin2501
PDF
RISC-V User level ISA
たけおか しょうぞう
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
PDF
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
KafkaとPulsar
Yahoo!デベロッパーネットワーク
Prometheus入門から運用まで徹底解説
貴仁 大和屋
Apache Avro vs Protocol Buffers
Seiya Mizuno
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
外部キー制約に伴うロックの小話
ichirin2501
RISC-V User level ISA
たけおか しょうぞう
強いて言えば「集約どう実装するのかな、を考える」な話
Yoshitaka Kawashima
Laravelを用いたゲームサーバーのチューニング
NOW PRODUCTION
What's hot
(20)
PDF
webエンジニアのためのはじめてのredis
nasa9084
PDF
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
PDF
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
PDF
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
PPTX
Kafkaを活用するためのストリーム処理の基本
Sotaro Kimura
PDF
日本語テストメソッドについて
kumake
PDF
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
PDF
TDDBC お題
Takuto Wada
PDF
PostgreSQLアンチパターン
Soudai Sone
PDF
ゴシッププロトコルによる冗長化と負荷分散の検証
Sugawara Genki
PPTX
JIRA 업무 생산성 향상 및 프로젝트 관리
KwangSeob Jeong
PDF
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
PDF
サーバPUSHざっくりまとめ
Yasuhiro Mawarimichi
PDF
AWSのログ管理ベストプラクティス
Akihiro Kuwano
PPTX
ゲームエンジニアのためのデータベース設計
sairoutine
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
PDF
実環境にTerraform導入したら驚いた
Akihiro Kuwano
PDF
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
PDF
gRPC入門
Kenjiro Kubota
webエンジニアのためのはじめてのredis
nasa9084
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
Dockerの期待と現実~Docker都市伝説はなぜ生まれるのか~
Masahito Zembutsu
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
Masahiro Nagano
Kafkaを活用するためのストリーム処理の基本
Sotaro Kimura
日本語テストメソッドについて
kumake
FridaによるAndroidアプリの動的解析とフッキングの基礎
ken_kitahara
TDDBC お題
Takuto Wada
PostgreSQLアンチパターン
Soudai Sone
ゴシッププロトコルによる冗長化と負荷分散の検証
Sugawara Genki
JIRA 업무 생산성 향상 및 프로젝트 관리
KwangSeob Jeong
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
サーバPUSHざっくりまとめ
Yasuhiro Mawarimichi
AWSのログ管理ベストプラクティス
Akihiro Kuwano
ゲームエンジニアのためのデータベース設計
sairoutine
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
Dockerからcontainerdへの移行
Kohei Tokunaga
実環境にTerraform導入したら驚いた
Akihiro Kuwano
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
gRPC入門
Kenjiro Kubota
Ad
Viewers also liked
(20)
PDF
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
PDF
Goroutineと channelから はじめるgo言語
Takuya Ueda
PDF
Goとテスト
Takuya Ueda
PDF
Go入門
Takuya Ueda
PDF
HighBatch
Nobuhito Sato
PDF
Eureka go 2015_12_12
matsuo kenji
PDF
alphawing meets heroku
Kyosuke Kameda
PDF
らくちん Go言語
株式会社YEBIS.XYZ
PDF
Golang, make and robotics #gocon
Hideyuki TAKEI
PDF
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
Hidenori Takeshita
KEY
Chrome osとgo言語からgoogleの今後を妄想してみる
Masakazu Muraoka
PDF
Go言語と過ごした一週間
Shintaro Kitayama
PPTX
Github第8章
Yuto Suzuki
PPTX
Go+revel
Amuro Nishizawa
PDF
Goを知る
Hirokazu Fukami
PDF
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
deris0126
PDF
Dockerぐらし!
Takumi Murano
PDF
勉強会への一歩を踏み出すために
Akihiko Horiuchi
PDF
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
Satoshi Noda
PPTX
マイクロサービスにおけるクエリー言語について
sz yudppp
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
Goroutineと channelから はじめるgo言語
Takuya Ueda
Goとテスト
Takuya Ueda
Go入門
Takuya Ueda
HighBatch
Nobuhito Sato
Eureka go 2015_12_12
matsuo kenji
alphawing meets heroku
Kyosuke Kameda
らくちん Go言語
株式会社YEBIS.XYZ
Golang, make and robotics #gocon
Hideyuki TAKEI
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
Hidenori Takeshita
Chrome osとgo言語からgoogleの今後を妄想してみる
Masakazu Muraoka
Go言語と過ごした一週間
Shintaro Kitayama
Github第8章
Yuto Suzuki
Go+revel
Amuro Nishizawa
Goを知る
Hirokazu Fukami
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
deris0126
Dockerぐらし!
Takumi Murano
勉強会への一歩を踏み出すために
Akihiko Horiuchi
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
Satoshi Noda
マイクロサービスにおけるクエリー言語について
sz yudppp
Ad
Similar to インタフェースの実装パターン
(20)
PDF
エキスパートGo
Takuya Ueda
PDF
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
PDF
TechDo Goハンズオン#3
privatemy
PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
Tomohiro Kumagai
PDF
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
PDF
マスターオブゴールーチンアンドチャネル スタートGo #1
Takuya Ueda
PDF
マスター・オブ・Reflectパッケージ
Takuya Ueda
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
PDF
interface の中身
komem3
PDF
Goの文法の実例と解説
Ryuji Iwata
PDF
JSX / Haxe / TypeScript
bleis tift
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
PDF
ECMAScript没proposal追悼式
京大 マイコンクラブ
PPT
Gwt1
katsu.taira
PDF
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
PPTX
flow による型のある世界入門
sairoutine
PDF
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
PPTX
大人のお型付け
Nobuhisa Koizumi
PPTX
Javascriptのデザインパターン【勉強会資料】
株式会社キャッチアップ
エキスパートGo
Takuya Ueda
インターフェース定義言語から学ぶモダンなWeb API方式: REST, GraphQL, gRPC
Kent Ohashi
TechDo Goハンズオン#3
privatemy
ジェネリック関数の呼び出され方 #cocoa_kansai
Tomohiro Kumagai
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
マスターオブゴールーチンアンドチャネル スタートGo #1
Takuya Ueda
マスター・オブ・Reflectパッケージ
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
interface の中身
komem3
Goの文法の実例と解説
Ryuji Iwata
JSX / Haxe / TypeScript
bleis tift
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
ECMAScript没proposal追悼式
京大 マイコンクラブ
Gwt1
katsu.taira
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
flow による型のある世界入門
sairoutine
TypeScript ファーストステップ (Rev.2) ~ Any browser. Any host. Any OS. Open Source. ~
Akira Inoue
大人のお型付け
Nobuhisa Koizumi
Javascriptのデザインパターン【勉強会資料】
株式会社キャッチアップ
More from Takuya Ueda
(20)
PDF
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
PDF
WebAssembly with Go
Takuya Ueda
PDF
GAE/Goとsyncパッケージ
Takuya Ueda
PDF
静的解析を使った開発ツールの開発
Takuya Ueda
PDF
そうだ、Goを始めよう
Takuya Ueda
PDF
マスター・オブ・goパッケージ
Takuya Ueda
PDF
メルカリ カウルのマスタデータの更新
Takuya Ueda
PDF
Go1.8 for Google App Engine
Takuya Ueda
PDF
Go Friday 傑作選
Takuya Ueda
PDF
GoによるiOSアプリの開発
Takuya Ueda
PDF
Static Analysis in Go
Takuya Ueda
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
PDF
Go静的解析ハンズオン
Takuya Ueda
PDF
Goにおける静的解析と製品開発への応用
Takuya Ueda
PDF
オススメの標準・準標準パッケージ20選
Takuya Ueda
PDF
Gopher Fest 2017参加レポート
Takuya Ueda
PDF
Google Assistant関係のセッションまとめ
Takuya Ueda
PDF
Cloud functionsの紹介
Takuya Ueda
PDF
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
PDF
Cloud Functionsの紹介
Takuya Ueda
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
WebAssembly with Go
Takuya Ueda
GAE/Goとsyncパッケージ
Takuya Ueda
静的解析を使った開発ツールの開発
Takuya Ueda
そうだ、Goを始めよう
Takuya Ueda
マスター・オブ・goパッケージ
Takuya Ueda
メルカリ カウルのマスタデータの更新
Takuya Ueda
Go1.8 for Google App Engine
Takuya Ueda
Go Friday 傑作選
Takuya Ueda
GoによるiOSアプリの開発
Takuya Ueda
Static Analysis in Go
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
Go静的解析ハンズオン
Takuya Ueda
Goにおける静的解析と製品開発への応用
Takuya Ueda
オススメの標準・準標準パッケージ20選
Takuya Ueda
Gopher Fest 2017参加レポート
Takuya Ueda
Google Assistant関係のセッションまとめ
Takuya Ueda
Cloud functionsの紹介
Takuya Ueda
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
Cloud Functionsの紹介
Takuya Ueda
インタフェースの実装パターン
1.
インタフェースの 実装パターン 2014/08/09 (土) @Go lang勉強会
2.
自己紹介 上田拓也 KLab株式会社 仕事: Webviewと戦う仕事 趣味: Go言語, JS twitter :
@tenntenn
3.
はじめに ● このプレゼンは以下の記事をまとめたものです ○ インタフェースの実装パターン ○
http://qiita. com/tenntenn/items/eac962a49c56b2b15 ee8 ● たぶん15分じゃ終わらないので,間に合わな かったら,qiitaを見て下さい
4.
アジェンダ ● typeで型を宣言する ● メソッド ●
基本的なインタフェースの実装 ● 関数にインタフェース実装させる ● 構造体に埋め込んでインタフェースを実装する ● 埋め込みを使ったインタフェースの部分実装 ● 埋め込みを使ったインタフェースの動的実装
5.
typeで型を宣言する
6.
構造体型とインタフェース型の宣言 // 構造体型の宣言 type Hoge
struct { // フィールドリスト } // インタフェース型の宣言 type Fuga interface { // メソッドリスト }
7.
typeを型の宣言の文法 TypeDecl = "type"
( TypeSpec | "(" { TypeSpec ";" } ")" ) . TypeSpec = identifier Type . Type = TypeName | TypeLit | "(" Type ")" . TypeName = identifier | QualifiedIdent . TypeLit = ArrayType | StructType | PointerType | FunctionType | InterfaceType | SliceType | MapType | ChannelType .
8.
typeを型の宣言の文法(ざっくり) ● type 識別子
型 ○ 識別子:型名 ○ 型 ■ 型名 ● int, string, fmt.Stringer ■ 型リテラル ■ (型)
9.
既存の型に新しい名前をつける ● intに新しくHexという名前をつける type Hex
int
10.
型リテラル ● 配列型 :[10]int ● 構造体型 : struct
{ /* フィールドリスト */ } ● ポインタ型:*int ● 関数型 :function(s string) int ● インタフェース型: interface { /* メソッドリスト */} ● スライス型:[]int ● マップ型 :map[string]int ● チャネル型:chan bool
11.
関数型に名前をつけて型を宣言する ● net/httpパッケージのHandlerFuncは関数型にtype で名前をつけたもの type HandlerFunc
func(wResponseWriter, r *Request)
12.
メソッド
13.
メソッドの定義方法 // pはレシーバ func (p
*Person) String() string { return fmt.Sprintf( "%s %s (%d)", p.FirstName, p.LastName, p.Age, ) } type Person struct { FirstName string LastName string Age int }
14.
構造体型以外にもメソッドを設ける ● インタフェース型以外なら,どんな型でもレシー バにできる ○ もちろん,型リテラルはダメ type
Hex int func (h Hex) String() string { return fmt.Sprintf( "0x%x", int(h), ) }
15.
関数にメソッドを持たせる type HandlerFunc func( w
ResponseWriter, r *Request, ) func (f HandlerFunc) ServeHTTP( w ResponseWriter, r *Request, ) { f(w, r) }
16.
基本的なインタフェースの実装
17.
インタフェース型の宣言 type TypeName interface
{ // メソッドリスト Method1() Method2() }
18.
インタフェースの実装 ● メソッドリストのメソッドをすべて実装していれ ば,インタフェースを実装したことになる type Stringer
{ String() string } // HexはStringerインタフェースを実装 type Hex int func (h Hex) String() string { return fmt.Sprintf("0x%x", int(h)) } 実際に,fmtパッケージで 定義されているインタ フェース
19.
インタフェースの実装 ● int型の100をHex型にキャスト ● fmt.Stringer型の変数に代入して いる var
stringer fmt.Stringer stringer = Hex(100)
20.
関数にインタフェース実装させる
21.
関数にインタフェース実装させるには ● 関数の型リテラルにtypeで名前をつける ● 作った型にインタフェースで指定されているメ ソッドを設ける
22.
http.HandlerFuncの例 type HandlerFunc func( w
ResponseWriter, r *Request, ) func (f HandlerFunc) ServeHTTP( w ResponseWriter, r *Request, ) { f(w, r) }
23.
http.HandlerFuncの例 ● ServeHTTPメソッドを実装していれば,http. Handlerインタフェースを実装したことになる type Handler
interface { ServeHTTP( w ResponseWriter, r *Request, ) }
24.
http.HandlerFuncの例 ● 関数をhttp.Hanlderとして振る舞わせる f :=
http.HandlerFunc(func( w http.ResponseWriter, r *http.Request, ) { fmt.Fprintf(w, "hello, world") }) // 第1引数:pattern string // 第2引数:handler http.Handler http.Handle("/", f)
25.
http.HandlerFuncの例 ● 通常はhttp.HandleFuncを使う ● HandleFunc内では,関数をHandlerFunc型に キャストして,http.Handleを呼んでいる func
HandleFunc( pattern string, handler func(ResponseWriter, *Request), )
26.
構造体に埋め込んでインタフェースを実装する
27.
埋め込み ● 構造体には匿名フィールドとして,指定した型の 値を埋め込むことができる ● 埋め込んだ値のフィールドやメソッドはあたかも 埋め込み先のフィールドやメソッドのように利用 できる
28.
埋め込みの例 type Name struct
{ FirstName string LastName string } func (n *Name) String() string { return fmt.Sprintf("%s %s") } type Person struct { *Name // *Name型の値を埋め込む Age int }
29.
埋め込みの例 n := &Name{ FirstName:
"Taro", LastName: "Yamada", } p := &Person{ Name: n, // *Name型のnを埋め込む Age: 20, } // nのメソッドをpのメソッドのように呼べる fmt.Println(p.String())
30.
埋め込みによるインタフェースの実装 ● 埋め込んだ値がインタフェースを実装していた 場合,埋め込み先の構造体も,そのインタ フェースを実装したことになる // nがインタフェースを実装しているので, //
pもインタフェースを実装したことになる var stringer fmt.Stringer = p fmt.Println(stringer.String())
31.
埋め込みを使ったインタフェースの部分実装
32.
複数のメソッドを持つインタフェース ● インタフェースの宣言時に,メソッドリストに複数 のメソッドを指定できる type Person
interface { Title() string Name() string }
33.
一部のメソッドだけ実装させる type person struct
{ firstName string lastName string } // Nameメソッドだけだと // Personインタフェースは実装したことにならない func (p *person) Name() string { return fmt.Sprintf( "%s %s", p.firstName, p.lastName ) } type Person interface { Title() string Name() string }
34.
残りは埋め込み先で実装させる type female struct
{ *person } func (f *female) Title() string { return "Ms." } type male struct { *person } func (m *male) Title() string { return "Mr." }
35.
実装の切り分けは外部から隠蔽する func NewPerson( gender Gender, firstName,
lastName string, ) Person { p := &person{firstName, lastName} if gender == Femail { return &femail{p} } return &male{p} } type Gender int const ( Female = iota Male )
36.
埋め込みを使ったインタフェースの動的実装
37.
インタフェース型の埋め込み ● 型名がついていればどんな型でも匿名フィール ドにして埋め込むことができる type Hoge
struct { chan int // ダメ []int // ダメ fmt.Stringer // OK } 型リテラルは ダメ
38.
インタフェース型の埋め込み func main() { p
:= Person{ Stringer: nil, FirstName: "Taro", LastName: "Yamada", Age: 20, } fmt.Println(p.Stringer) // nil p.Stringer = ??? } type Person struct { fmt.Stringer FirstName string LastName string Age int } fmt.Stringerインタフェースを実装していれば代入できる
39.
埋め込む構造体をバインドする ● 埋め込んだインタフェース型の匿名フィールドに インタフェースを実装した値を動的に代入できる ● 代入するインタフェースを実装した値は,埋め込 み先の構造体にアクセスできないと意味がない ○
埋め込み先を参照できるクロージャにインタフェースを実 装させればよい
40.
埋め込む構造体をバインドする func BindStringer( p *Person, f
func(p *Person) string) fmt.Stringer, { return StringerFunc(func() string { return f(p) }) } type StringerFunc func() string func (sf StringerFunc) String() string { return sf() }
41.
まとめ ● なんでもstructで型を作るのはGo言語っぽくな い ○ typeとメソッドをちゃんとおさえる ●
埋め込みとインタフェースの実装をうまく使う ○ インタフェースの実装を埋め込む値に移譲するパターン ● The Go Programming Language Specificationを見なが ら,黒魔術を考えるの楽しい ○ http://golang.org/ref/spec
Download