Enviar pesquisa
Carregar
インタフェースの実装パターン
•
13 gostaram
•
6,331 visualizações
Takuya Ueda
Seguir
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 41
Baixar agora
Baixar para ler offline
Recomendados
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
Takuya Ueda
Go入門
Go入門
Takuya Ueda
gRPC入門
gRPC入門
Kenjiro Kubota
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
日本語テストメソッドについて
日本語テストメソッドについて
kumake
Recomendados
マスター・オブ・Reflectパッケージ
マスター・オブ・Reflectパッケージ
Takuya Ueda
Go入門
Go入門
Takuya Ueda
gRPC入門
gRPC入門
Kenjiro Kubota
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Docker Tokyo
Docker Tokyo
cyberblack28 Ichikawa
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
Shohei Okada
日本語テストメソッドについて
日本語テストメソッドについて
kumake
Android デバッグ小ネタ
Android デバッグ小ネタ
l_b__
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
やりなおせる Git 入門
やりなおせる Git 入門
Tomohiko Himura
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
Takafumi Yoshida
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
非同期処理の基礎
非同期処理の基礎
信之 岩永
PHPでマルチスレッド
PHPでマルチスレッド
karky7
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
試験にでるSpring
試験にでるSpring
土岐 孝平
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
Hiro H.
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
いまさら聞けないパスワードの取り扱い方
いまさら聞けないパスワードの取り扱い方
Hiroshi Tokumaru
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
KeijiUehata1
async/await のしくみ
async/await のしくみ
信之 岩永
エキスパートGo
エキスパートGo
Takuya Ueda
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
Takuya Ueda
Mais conteúdo relacionado
Mais procurados
Android デバッグ小ネタ
Android デバッグ小ネタ
l_b__
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
やりなおせる Git 入門
やりなおせる Git 入門
Tomohiko Himura
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
Takafumi Yoshida
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
非同期処理の基礎
非同期処理の基礎
信之 岩永
PHPでマルチスレッド
PHPでマルチスレッド
karky7
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
試験にでるSpring
試験にでるSpring
土岐 孝平
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
Hiro H.
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
shinjiigarashi
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
いまさら聞けないパスワードの取り扱い方
いまさら聞けないパスワードの取り扱い方
Hiroshi Tokumaru
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Masakazu Matsushita
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
KeijiUehata1
async/await のしくみ
async/await のしくみ
信之 岩永
エキスパートGo
エキスパートGo
Takuya Ueda
Mais procurados
(20)
Android デバッグ小ネタ
Android デバッグ小ネタ
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
やりなおせる Git 入門
やりなおせる Git 入門
オブジェクト指向できていますか?
オブジェクト指向できていますか?
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
Pythonによる黒魔術入門
Pythonによる黒魔術入門
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
非同期処理の基礎
非同期処理の基礎
PHPでマルチスレッド
PHPでマルチスレッド
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
試験にでるSpring
試験にでるSpring
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
いまさら聞けないパスワードの取り扱い方
いまさら聞けないパスワードの取り扱い方
いつやるの?Git入門 v1.1.0
いつやるの?Git入門 v1.1.0
Python製BDDツールで自動化してみた
Python製BDDツールで自動化してみた
async/await のしくみ
async/await のしくみ
エキスパートGo
エキスパートGo
Destaque
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Takuya Ueda
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
Takuya Ueda
Goとテスト
Goとテスト
Takuya Ueda
HighBatch
HighBatch
Nobuhito Sato
Eureka go 2015_12_12
Eureka go 2015_12_12
matsuo kenji
alphawing meets heroku
alphawing meets heroku
Kyosuke Kameda
らくちん Go言語
らくちん Go言語
株式会社YEBIS.XYZ
Golang, make and robotics #gocon
Golang, make and robotics #gocon
Hideyuki TAKEI
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
Hidenori Takeshita
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
Masakazu Muraoka
Go言語と過ごした一週間
Go言語と過ごした一週間
Shintaro Kitayama
Github第8章
Github第8章
Yuto Suzuki
Go+revel
Go+revel
Amuro Nishizawa
Goを知る
Goを知る
Hirokazu Fukami
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
deris0126
Dockerぐらし!
Dockerぐらし!
Takumi Murano
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
Akihiko Horiuchi
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
Satoshi Noda
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語について
sz yudppp
ISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみた
Ken Gotoh
Destaque
(20)
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineと channelから はじめるgo言語
Goroutineと channelから はじめるgo言語
Goとテスト
Goとテスト
HighBatch
HighBatch
Eureka go 2015_12_12
Eureka go 2015_12_12
alphawing meets heroku
alphawing meets heroku
らくちん Go言語
らくちん Go言語
Golang, make and robotics #gocon
Golang, make and robotics #gocon
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
Go言語と過ごした一週間
Go言語と過ごした一週間
Github第8章
Github第8章
Go+revel
Go+revel
Goを知る
Goを知る
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Dockerぐらし!
Dockerぐらし!
勉強会への一歩を踏み出すために
勉強会への一歩を踏み出すために
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
2015/02/21 GDG神戸 Go on Android ハンズオン&もくもく会
マイクロサービスにおけるクエリー言語について
マイクロサービスにおけるクエリー言語について
ISUCON2015 PHPで予選を戦ってみた
ISUCON2015 PHPで予選を戦ってみた
Semelhante a インタフェースの実装パターン
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
Takuya Ueda
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
Shiroyagi Corporation
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
Takuya Ueda
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
kimukou_26 Kimukou
C#勉強会
C#勉強会
hakugakucafe
50分で掴み取る ASP.NET Web API パターン&テクニック
50分で掴み取る ASP.NET Web API パターン&テクニック
miso- soup3
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Yuya Takeyama
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
No Bu
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
Yusuke Ando
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"
Ken'ichi Matsui
Go Friday 傑作選
Go Friday 傑作選
Takuya Ueda
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
cch-robo
Boost.Flyweight
Boost.Flyweight
gintenlabo
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Shinnosuke Tokuda
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Tomohiro Kumagai
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
Takuya Ueda
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
Tetsuya Morimoto
Struts2を始めよう!
Struts2を始めよう!
Shinpei Ohtani
PHPとJavaScriptの噺
PHPとJavaScriptの噺
Shogo Kawahara
WebRTC開発者向けプラットフォーム SkyWayの裏側
WebRTC開発者向けプラットフォーム SkyWayの裏側
Yusuke Naka
Semelhante a インタフェースの実装パターン
(20)
マスター・オブ・reflectパッケージ II
マスター・オブ・reflectパッケージ II
Goji とレイヤ化アーキテクチャ
Goji とレイヤ化アーキテクチャ
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
C#勉強会
C#勉強会
50分で掴み取る ASP.NET Web API パターン&テクニック
50分で掴み取る ASP.NET Web API パターン&テクニック
Good Parts of PHP and the UNIX Philosophy
Good Parts of PHP and the UNIX Philosophy
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
8時間耐久 PHP構築の教室
8時間耐久 PHP構築の教室
「深層学習」勉強会LT資料 "Chainer使ってみた"
「深層学習」勉強会LT資料 "Chainer使ってみた"
Go Friday 傑作選
Go Friday 傑作選
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
Boost.Flyweight
Boost.Flyweight
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Flutterで単体テストを行う方法とGitHub Actionsを使った自動化
Swift 2.0 で変わったところ「後編」 #cswift
Swift 2.0 で変わったところ「後編」 #cswift
GAE/GoでWebアプリ開発入門
GAE/GoでWebアプリ開発入門
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
Struts2を始めよう!
Struts2を始めよう!
PHPとJavaScriptの噺
PHPとJavaScriptの噺
WebRTC開発者向けプラットフォーム SkyWayの裏側
WebRTC開発者向けプラットフォーム SkyWayの裏側
Mais de Takuya Ueda
Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −
Takuya Ueda
WebAssembly with Go
WebAssembly with Go
Takuya Ueda
GAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
Takuya Ueda
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
Takuya Ueda
そうだ、Goを始めよう
そうだ、Goを始めよう
Takuya Ueda
マスター・オブ・goパッケージ
マスター・オブ・goパッケージ
Takuya Ueda
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
Takuya Ueda
Go1.8 for Google App Engine
Go1.8 for Google App Engine
Takuya Ueda
GoによるiOSアプリの開発
GoによるiOSアプリの開発
Takuya Ueda
Static Analysis in Go
Static Analysis in Go
Takuya Ueda
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
Takuya Ueda
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Takuya Ueda
Go静的解析ハンズオン
Go静的解析ハンズオン
Takuya Ueda
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
Takuya Ueda
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
Takuya Ueda
Gopher Fest 2017参加レポート
Gopher Fest 2017参加レポート
Takuya Ueda
Google Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめ
Takuya Ueda
Cloud functionsの紹介
Cloud functionsの紹介
Takuya Ueda
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
Takuya Ueda
Cloud Functionsの紹介
Cloud Functionsの紹介
Takuya Ueda
Mais de Takuya Ueda
(20)
Goにおけるバージョン管理の必要性 − vgoについて −
Goにおけるバージョン管理の必要性 − vgoについて −
WebAssembly with Go
WebAssembly with Go
GAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
そうだ、Goを始めよう
そうだ、Goを始めよう
マスター・オブ・goパッケージ
マスター・オブ・goパッケージ
メルカリ カウルのマスタデータの更新
メルカリ カウルのマスタデータの更新
Go1.8 for Google App Engine
Go1.8 for Google App Engine
GoによるiOSアプリの開発
GoによるiOSアプリの開発
Static Analysis in Go
Static Analysis in Go
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
Go静的解析ハンズオン
Go静的解析ハンズオン
Goにおける静的解析と製品開発への応用
Goにおける静的解析と製品開発への応用
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
Gopher Fest 2017参加レポート
Gopher Fest 2017参加レポート
Google Assistant関係のセッションまとめ
Google Assistant関係のセッションまとめ
Cloud functionsの紹介
Cloud functionsの紹介
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
Cloud Functionsの紹介
Cloud Functionsの紹介
Último
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Hiroshi Tomioka
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
Último
(11)
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
インタフェースの実装パターン
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
Baixar agora