for
の知識 を使ってSum
関数を作ってみましょう。Sum
は数値の配列を受け取り、その合計を返します。sum_test.go
固定容量
があり、これは変数を宣言する際に定義します。配列を初期化するには、以下の2つの方法があります。numbers := [5]int{1, 2, 3, 4, 5}
numbers := [...]int{1, 2, 3, 4, 5}
%v
プレースホルダを使用しています。go test
を実行すると、コンパイラは失敗します。 ./sum_test.go:10:15: undefined: Sum
sum.go
sum_test.go:13: got 0 want 15 given, [1 2 3 4 5]
array[index]
構文を使えば大丈夫です。この例ではfor
を使って配列を5回繰り返し、各項目をsum
に加算しています。[5]int
を期待する関数に [4]int
を渡そうとしてもコンパイルできません。 これらは異なる型なので、int
を求める関数に string
を渡そうとするのと同じです。slices
がありますが、これはコレクションのサイズをエンコードするものではなく、任意のサイズを持つことができます。myArray := [3]int{1,2,3}
ではなく、mySlice := []int{1,2,3}
こちらです。./sum_test.go:22:13: cannot use numbers (type []int) as type [5]int in argument to Sum
Sum
をスライスに変更することで、既存のAPIを壊します。Sum
をリファクタリングしており、配列からスライスに変更しただけなので、ここでやることはそれほど多くありません。リファクタリングの段階でテストコードをおろそかにしてはいけないことを覚えておいてください。信頼
を持つことが目標です。あまりにも多くのテストを持っていると、実際に問題になることがありますし、メンテナンスのオーバーヘッドを増やすだけです。 すべてのテストにはコストがある.go test -cover
SumAll
を含む新しいスライスを返します。SumAll([]int{1,2}, []int{0,9})
は []int{3, 9}
を返します。SumAll([]int{1,1,1})
は []int{3}
を返します。./sum_test.go:23:9: undefined: SumAll
SumAll
を定義する必要があります。./sum_test.go:26:9: invalid operation: got != want (slice can only be compared to nil)
got
と want
の各スライスを繰り返し処理して値を確認する関数を書くこともできますが、便利のために reflect.DeepEqual
を使うと、2つの変数が同じであるかどうかを確認するのに便利です。DeepEqual
にアクセスできるようにするには、ファイルの先頭でimport reflect
を作成します)reflect.DeepEqual
は「型安全」ではないことに注意することです。これを確認するには、テストを一時的に変更してください。slice
と string
を比較しようとしていることです。これでは意味がありませんが、テストはコンパイルされます。だから、reflect.DeepEqual
を使うのはスライスを比較するのに便利な方法ですが、使うときは注意が必要です。sum_test.go:30: got [] want [3 9]
Sum
関数を使って合計を計算し、それを返すスライスに追加することです。make
を使うと、numbersToSum
の開始容量が len
であるスライスを作成できるようになります。mySlice[N]
でスライスをインデックス化して値を取得したり、=
で新しい値を代入したりすることができます。mySlice[10] = 1
を実行しようとすると、ランタイムエラーが発生します。append
関数を使えば、スライスと新しい値を受け取り、その中にあるすべての項目を含む新しいスライスを返すことができます。sums
から始め、 可変長引数を処理しながら Sum
の結果をそれに追加します。SumAll
を SumAllTails
に変更することです。コレクションの末尾とは、最初のものを除いたすべてのアイテムのことです。./sum_test.go:26:9: undefined: SumAllTails
SumAllTails
に変更し、テストを再実行します。sum_test.go:30: got [3 9] want [2 9]
slice[low:high]
で、:
の片方の辺の値を省略すると、その辺までのすべての値をキャプチャします。この例では、numbers[1:]
を使って「1から最後まで取る」と言っています。スライスを使った他のテストを書いたり、スライス演算子に慣れるために実験をしたりすることに時間を投資したほうがいいかもしれません。myEmptySlice[1:]
からすべての要素をキャプチャするように指示するとどうなるか?checkSums(t, got, "dave")
で新しいテストを追加しても、コンパイラはその場で止めてくれます。append
を使えば追加できますlen
を使用します。reflect.DeepEqual
と、なぜそれが便利なのか、しかしコードの型安全性を低下させる可能性があるのか。[][]string
の変数を宣言することができます。