[WIP]kadai3 happylifetaka - #44
Conversation
|
どんなエディタを使っているかわからないのですが、フォーマッタがかかってないように見えます。 |
|
@knsh14 失礼いたしました。golandを試用で使った際、フォーマッタの設定が漏れておりました。普段はVSCodeを使用しております。修正しコミットいたしました。🙇♂️ |
| return nil | ||
| } | ||
|
|
||
| func canRangeDownload(h http.Header) bool { |
There was a problem hiding this comment.
http.Header には Get(key string) (value string) が実装されているので、forせずに確認することもできます
| for _, f := range filenames { | ||
| err := os.Remove(f) | ||
| if err != nil { | ||
| return err |
There was a problem hiding this comment.
場合によりますが、ここにおけるエラーは一つのファイルを消せないことでなく、消せなかったファイルが存在することだと思います
したがって、途中でエラーになった場合でもそのエラーを保存し、最後まで実行して、消せなかったファイル一覧としたほうが良いと思います
| } | ||
|
|
||
| reader := io.MultiReader(files...) | ||
| b, _ := ioutil.ReadAll(reader) |
| } | ||
| defer file.Close() | ||
|
|
||
| file.Write(([]byte)(b)) |
There was a problem hiding this comment.
ioutil.ReadAllですべて読み込んでしまって、Writeするよりもio.Copyで扱った方が効率が良い場合が多いです
| return err | ||
| } | ||
|
|
||
| io.Copy(out, res.Body) |
|
|
||
| out_path := strconv.Itoa(index) + ".temp.download" | ||
| out, err := os.Create(out_path) | ||
| defer out.Close() |
There was a problem hiding this comment.
エラーのチェックをしてから out の変数を触ったほうが良いです
理由は、エラーが帰ってきている時点でファイルが作成されているかどうかわからない( out がnilの可能性がある)ため、そのCloseは利用しないほうが良いです
| // url :download target url. | ||
| // saveFilePath:save file path. | ||
| // div:Number of divided downloads. | ||
| func (d *Downloader) Download(url string, saveFilePath string, div int64) error { |
There was a problem hiding this comment.
連続する変数の型が同じ場合は省略可能です (url, saveFilePath string, div int64)
|
@mizkei レビューありがとうございます。大分たってしまいましたがレビューでの指摘内容修正致しました。 |
課題3-2は途中段階ですが一旦コミットいたしました🙇♂️
課題3-1 タイピングゲームを作ろう
決められた英単語のみを出すようにして実装しました。
正解数と失敗数を表示するように実装しました。
今後の改善点(課題)
・英単語の外部ファイル化
・テストの実装
等
課題3-2 分割ダウンロードを行う
実装概要
http.Head でダウンロード先のファイルサイズ取得やRangeアクセスができるかを確認し、
指定された分割数で一時ファイル(例:1.temp.download、2.temp.download…)
としてダウンロードを行い、全てのダウンロード完了後一時ファイルを結合しました。
一時ファイルはファイルを結合後消去します。
今後の改善点(課題)
・エラー処理の工夫
・キャンセルが発生した場合の実装・・・タイムアウトなど?
・分割ダウンロード失敗時の復旧処理
・小さいファイルの場合は分割せずにダウンロードを行う
・テストの実装
等