给定一个数字字符串,按它们出现的顺序输出该字符串中所有长度为 n 的连续子串。
例如,字符串“49142”包含以下 3 位数的序列:
以及以下 4 位数的序列:
如果你从一个 5 位数的字符串里要一个 6 位数的序列,那不管得到什么,都是你自找的。
注意,这些序列只要求在输入中占据_相邻的位置_,数字本身不必_在数值上连续_。
定义两个函数:(两个?没错,有时候我们对 Go 的要求就是会多一些。)
All返回一个数组,包含 s 中所有长度为 n 的子字符串。
All(n int, s string) []string
UnsafeFirst返回 s 中第一个长度为 n 的子字符串。
UnsafeFirst(n int, s string) string
到这里,你可以认为这个练习已经完成,接着往下走了。
不过等一下,你可能会问一个很合理的问题:为什么这个函数叫 Unsafe First?如果你感兴趣,就继续往下读,看看附加练习。
当go test通过后,试试go test -tags asktoomuch。
这里用了一个_构建标签_来启用之前没有启用的测试。
构建标签可以用来选择包要使用哪些文件。
在我们的例子里,它会控制使用哪些测试文件。
你可以在 Go 文档 中了解更多。
你可能会发现,你没法让这个 asktoomuch 测试通过。
我们需要一种方式来表示:在某些情况下,你无法取字符串的前 N 个字符。
UnsafeFirst做不到这一点,因为它只返回一个字符串。
为了解决这个问题,我们给函数再加一个返回值吧。
定义First(int, string) (first string, ok bool),并用go test -tags first来测试。