給定一個數字字串,請依這些子字串出現的順序,輸出該字串中所有長度為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吧。
這會使用一個_建置標籤_來啟用先前沒有啟用的測試。
建置標籤可以讓套件選擇要使用哪些檔案。
在這裡,它會控制要使用哪些測試檔案。
你可以在 the Go documentation 讀到更多相關資訊。
你可能會發現,你沒辦法讓這個 asktoomuch 測試通過。
我們需要一種方式來表示:在某些情況下,你無法取得字串的前 N 個字元。
UnsafeFirst只會回傳一個字串,所以做不到這件事。
為了解決這個問題,我們讓這個函式多回傳一個值吧。
定義First(int, string) (first string, ok bool),並用go test -tags first測試。
ok bool這個第二個回傳引數,是 Go 中常見且慣用的模式。
例如,你可以在 Map lookups 和 type assertions 中看到這種做法。