WebsiteRacer
と呼ばれる関数を作成するように求められました。 10秒以内に戻らない場合は、「エラー(error
)」を返します。net/http
。net/http/httptest
はテストを支援するためのものです。select
。./racer_test.go:14:9: undefined: Racer
racer_test.go:25: got '', want 'http://www.quii.co.uk'
time.Now()
を使用して、 URL
を取得しようとする直前に記録します。time.Since
は開始時間を取り、差のtime.Duration
を返します。httptest.NewServer
は、anonymous function を介して送信するhttp.HandlerFunc
を受け取ります。http.HandlerFunc
は、type HandlerFunc func(ResponseWriter, *Request)
のようなタイプです。ResponseWriter
とRequest
を受け取る関数が必要なことだけです。 これは、HTTPサーバーにとってそれほど驚くべきことではありません。httptest.NewServer
でラップすることです。これにより、リッスンする開いているポートが見つかり、テストが完了したら閉じることができるため、テストでの使用が簡単になります。time.Sleep
を作成します。w.WriteHeader(http.StatusOK)
を使用してOK
応答を呼び出し元に返します。Racer
コードが非常に読みやすくなります。makeDelayedServer
という関数にリファクタリングし、興味のないコードをテストから除外して繰り返しを減らしました。defer
defer
を付けることで、その関数を含まれている関数の最後に呼び出します。select
と呼ばれる新しい構成を導入します。ping
chan struct{}
を作成して返す関数ping
を定義しました。struct{}
で、bool
のような別の型ではないのですか?まあ、chan struct{}
はメモリの観点から利用できる最小のデータ型なので、bool
に対して割り当てはありません。 ちゃんと閉じて何も送信しないので、なぜ何かを割り当てるのですか?http.Get(url)
を完了すると、そのチャネルに信号を送信するゴルーチン(goroutine
)を開始します。make
を使用する方法に注意してください。 「var ch chan struct{}
」と言うのではなく。 var
を使用すると、変数は型の「ゼロ」値で初期化されます。したがって、string
の場合は""
、int
の場合は0
になります。nil
であり、<-
で送信しようとすると、nil
チャネルに送信できないため、永久にブロックされます。select
myVar := <-ch
を使用して値がチャネルに送信されるのを待つことができます。値を待っているので、これは blocking 呼び出しです。select
でできることは、multiple チャネルで待機することです。 値を送信する最初のものは「勝ち」、case
の下のコードが実行されます。select
でping
を使用して、URL
ごとに2つのチャネルを設定します。 最初にチャネルに書き込む方は、コードがselect
で実行され、その結果、URL
が返されます(勝者となります)。Racer
に10秒以上かかる場合にエラーを返すことでした。Racer
が2つの値を返すことを期待しています。勝つURL(このテストでは_
で無視)と error
。./racer_test.go:37:10: assignment mismatch: 2 variables but 1 values
error
を返すようにRacer
の署名を変更します。ハッピーケースの場合はnil
を返します。got, _ := Racer(slowURL, fastURL)
に変更します。 確認すると、私たちの幸せなシナリオでエラーが発生しないことを確認する必要があります。time.After
は、select
を使用する場合に非常に便利な関数です。time.After
は、chan
( ping
のように)を返し、指定した時間が経過すると信号を送ります。a
またはb
が戻って成功した場合、10秒に到達すると、time.After
がシグナルを送信し、error
を返します。Racer
(これは内部でConfigurableRacer
を使用します)を使用でき、悲しいパステストではConfigurableRacer
を使用できます。error
が発生しないことを確認しました。select
case.
の1つにtime.After
を含めて、システムが永久にブロックされるのを防ぐ必要があります。httptest
net/http
サーバーと同じインターフェースを使用します。これは一貫性があり、習得するのに時間がかかります。