net.Dial
関数の上位互換として、引数にコンテキストを追加し、コンテキストのキャンセルを検知するDialWithContext
関数を作成。
ナレッジワークのインターン「Enablement Workshop for Gophers」の初日チーム課題。
2023年6月現在最新の Go1.21 で導入されたcontext.AfterFunc
関数を使用して、キャンセルが発生したら接続を閉じるという実装を行った。
初期の実装方針では、net.Conn
型のSetDeadline
メソッドを使用して読み書きをキャンセルする方針だったが、
キャンセルが呼ばれているなら、コネクションの再利用は考えにくいと判断し、
SetDeadline
を使用せずに直接接続をクローズする方針を採用した。
context.AfterFunc
関数を使用せず、Go1.20
以下のバージョンにも対応した。
DialWithContext
の中で新しくキャンセルを検知するゴールーチンを立ち上げる実装にした。
リークを回避するため、DialWithContext
の戻り値にゴールーチンをクローズするcancelFunc
関数を追加した。