Go の Interface
ダックタイピング
Go言語にはインタフェースがある。 明示的に実装しなくてもインタフェースが定義するメソッドをすべて実装していれば、そのインタフェースを実装していることになる(ダックタイピング)。
Go言語における埋め込みによるインタフェースの部分実装パターン - Qiita
Go
それぞれの言語で返答してくれるボットをお題にやってみる
package main import "fmt" type bot interface { getGreeting() string } type englishBot struct { name string } type spanishBot struct { name string } func main() { name := "taro" bots := map[string]interface{ bot }{ "eb": englishBot{name: name}, "sb": spanishBot{name: name}, } for _, bot := range bots { printGreeting(bot) } } func printGreeting(b bot) { fmt.Println(b.getGreeting()) } func (e englishBot) getGreeting() string { return "Hi there! " + e.name } func (s spanishBot) getGreeting() string { return "Hola! " + s.name }
Ruby
Ruby での例もみてみる
class EnglishBot < Struct.new(:name) def greet "Hi! #{name}" end end class SpanishBot < Struct.new(:name) def greet "Hola! #{name}" end end def print_greeting(bots) bots.each do |bot| puts bot.greet end end name = "taro" bots = [ EnglishBot.new(name), SpanishBot.new(name), ] print_greet(bots)
使い方、あってるかな
REF
Go の Map
Map
型の同じ Hash のみたいなやつ
package main import "fmt" func main() { colors := map[string]string{ "red": "#ff0000", "green": "#4bf745", "white": "#ffffff", } colors["yellow"] = "pugera" delete(colors, "yellow") printMap(colors) } func printMap(c map[string]string) { for color, hex := range c { fmt.Println("Hex code for", color, "is", hex) } }
Struct の比較
Map
- key がぜんぶ同じ型
- value がぜんぶ同じ型
- key がインデックスされてて、回せる
- 参照渡し
- (返り値2つある)
Struct
- key が違う型でもOK
- value が違う型でもOK
- 違った型をもったやつの表現に使う
- 値渡し
Go でテストかく
トランプの枚数、ちゃんと生成されているかのテスト
package main import "testing" func TestNewDeck(t *testing.T) { d := newDeck() if len(d) != 52 { t.Errorf("Expected deck lengh of 52, but got %v", len(d)) } }
実行これだけ
$ go test
タイムアウト制限かけて、特定のテストとかだけ確認もできる
$ go test -timeout 30s -run ^TestNewDeck$
くわしくは
$ go test -h
とかで確認できる
シンプルだぬ
Commit
テスト追加 · 7kaji/cards@a677391 · GitHub
与太話
真似して RSpec も書いた
あわせて読みたい
Go を触ってみてる
なんとなく気になったのでやってみてる
できたもの
トランプのデッキ作って、シャッフルして、結果をファイルに保存するやつ
- Go をはじめて触った
- 慣れている Ruby 版もかいた (OO とのアプローチの違い学ぶ)
- まだ慣れないけど、ちょっとずつやっていくぞ
- Struct, Map, Interface, Go Routine とかがまだ
- テストもまだ
- Web アプリもまだ
与太話
yes, go bold
— おつくつん (@otukutun) 2018年8月7日
なるほど pic.twitter.com/W3hKm6IElh
— 7kaji (@7kajii) 2018年8月7日