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)

使い方、あってるかな

via GIFMAGAZINE

REF

qiita.com

otiai10.hatenablog.com

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 も書いた

あわせて読みたい

whitech0c0late.hatenablog.com

Go を触ってみてる

なんとなく気になったのでやってみてる

できたもの

トランプのデッキ作って、シャッフルして、結果をファイルに保存するやつ

github.com

  • Go をはじめて触った
  • 慣れている Ruby 版もかいた (OO とのアプローチの違い学ぶ)
  • まだ慣れないけど、ちょっとずつやっていくぞ
    • Struct, Map, Interface, Go Routine とかがまだ
    • テストもまだ
    • Web アプリもまだ

与太話