数字の文字列が与えられたとき、その文字列の中にある長さnの連続した部分文字列を、現れる順にすべて出力します。
たとえば、文字列"49142"には、次の3桁の並びがあります。
また、次の4桁の並びもあります。
そして、5桁の文字列から6桁の並びを求めようとしたなら、何が返ってきても仕方ありません。
なお、これらの並びは、入力の中で_隣り合った位置_にあればよいだけで、数字が_数的に連続している_必要はありません。
関数を2つ定義します。(2つ? そう、ときにはGoにもう少し多くを求めることもあります。)
Allは、sの部分文字列のうち、長さがnのものをすべて集めた配列を返します。
All(n int, s string) []string
UnsafeFirstは、sの部分文字列のうち、長さがnの最初のものを返します。
UnsafeFirst(n int, s string) string
ここまでで、この演習は完了したと考えて先に進んでもよいでしょう。
でも待ってください。もっともな疑問が浮かぶかもしれません。なぜこの関数はUnsafeFirstという名前なのでしょうか? 興味があれば、この先のおまけの演習を読んでみてください。
go testが通るようになったら、go test -tags asktoomuchを試してみましょう。
これは_ビルドタグ_を使って、それまで有効になっていなかったテストを有効にします。
ビルドタグを使うと、パッケージが使うファイルを選べます。
ここでは、どのテストファイルを使うかを制御します。
詳しくはGoのドキュメントを読んでみてください。
この_asktoomuch_テストを通らせるのは無理だと気づくかもしれません。 場合によっては、文字列の先頭からN文字を取り出せないことを伝える方法が必要です。 UnsafeFirstは文字列しか返さないので、それができません。
これを解決するには、関数にもう1つ戻り値を追加してみましょう。
First(int, string) (first string, ok bool)を定義して、go test -tags firstでテストしてみましょう。
2番目の戻り値であるok boolは、Goでよく使われるイディオマティックなパターンです。
たとえば、マップの参照や型アサーションで見られます。