osパッケージのfileオペレーションによって返却されたエラーの組について考える。 I/Oはいくつかの理由で失敗することがあるが、3つの種類の障害を頻繁に処理する必要がある。
- file already exists (create)
- file not found (read)
- permission denied
os packageはこれらをerror
値で示される失敗を分類するhelper関数を提供します。
# TASKS=1000 elixir re_bench.exs pure_re.txt trie_re.txt | |
# elixirの正規表現実装がtrieなら速度に違いはないはず | |
# pureはhoge|fooと単純にパイプで繋いだ正規表現 | |
# trieはPerlのRegexp::Assembleで生成した正規表現 | |
[pure,trie|_] = System.argv | |
pure_regexp = File.read!(pure) |> Regex.compile! | |
trie_regexp = File.read!(trie) |> Regex.compile! |
https://golang.org/src/sort/sort.go
文字列整形のように、ソートはよく使われる。 最小のクイックソートは15行でかけるとはいえ、強固な実装はもっと長くなるし、欲しい種類のコードではなかった場合、新しく書くことになる。
sort.Sortは連続なデータ型でなくてもいい。
#7 Interfeace interface型は、他の型のふるまいについて、汎化や抽象を表す。 汎化によって、特定のひとつの実装に日も付かないので、interfaceは私たちにmore flexibleで、adaptableな関数を書かせてくれる。
多くのオブジェクト志向言語はいくつかのinterfaceの概念をもっているが、Goのinterfaceが独特なのは、それらが暗黙的に満たされている点。つまり、与えられた具象型を満たす、すべてのinterfaceを宣言する必要がない。単純に必要なメソッドを所持するだけです。このデザインは 既存の型(特にあなたがコントロールできないpackage内に定義されている型に有用)の変更なしに、既存の具象型によって満たされる新しいインタフェースを作らせてくれる。
この章では、interface型の基本的な仕組みと値をみることから始めます。 途中で、standard libraryからいくつかの重要なinterfaceを学びます。多くのGo プログラムはそれら自身がそうであるように、多くの標準的なインタフェースを多く使おうとします。
#!/usr/bin/env perl | |
use strict; | |
use warnings; | |
use Time::Piece; | |
use Time::Seconds; | |
use Date::Calc; | |
use Benchmark qw(cmpthese); | |
warn $^V; |
my %seen_pkg; | |
my %result; | |
for my $method_struct (@{Class::Inspector->methods(ref $self, 'expanded')}) { | |
my $pkg_name = $method_struct->[1]; | |
my $method_name = $method_struct->[2]; | |
if (exists $seen_pkg{$pkg_name}) { | |
$result{$pkg_name} //= []; | |
push @{$result{$pkg_name}}, $method_name; | |
} |