-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP]kadai3 happylifetaka #44
base: master
Are you sure you want to change the base?
[WIP]kadai3 happylifetaka #44
Conversation
どんなエディタを使っているかわからないのですが、フォーマッタがかかってないように見えます。 |
@knsh14 失礼いたしました。golandを試用で使った際、フォーマッタの設定が漏れておりました。普段はVSCodeを使用しております。修正しコミットいたしました。🙇♂️ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
簡単にですが、コメントしましたので、参考にしていただければと思います
return nil | ||
} | ||
|
||
func canRangeDownload(h http.Header) bool { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
場合によりますが、ここにおけるエラーは一つのファイルを消せないことでなく、消せなかったファイルが存在することだと思います
したがって、途中でエラーになった場合でもそのエラーを保存し、最後まで実行して、消せなかったファイル一覧としたほうが良いと思います
} | ||
|
||
reader := io.MultiReader(files...) | ||
b, _ := ioutil.ReadAll(reader) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
エラーは捨てないほうが良いです
} | ||
defer file.Close() | ||
|
||
file.Write(([]byte)(b)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ioutil.ReadAllですべて読み込んでしまって、Writeするよりもio.Copyで扱った方が効率が良い場合が多いです
return err | ||
} | ||
|
||
io.Copy(out, res.Body) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
io.Copyもエラーを返す可能性があるので、捨てないほうが良いです
|
||
out_path := strconv.Itoa(index) + ".temp.download" | ||
out, err := os.Create(out_path) | ||
defer out.Close() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
エラーのチェックをしてから 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
連続する変数の型が同じ場合は省略可能です (url, saveFilePath string, div int64)
@mizkei レビューありがとうございます。大分たってしまいましたがレビューでの指摘内容修正致しました。 |
課題3-2は途中段階ですが一旦コミットいたしました🙇♂️
課題3-1 タイピングゲームを作ろう
決められた英単語のみを出すようにして実装しました。
正解数と失敗数を表示するように実装しました。
今後の改善点(課題)
・英単語の外部ファイル化
・テストの実装
等
課題3-2 分割ダウンロードを行う
実装概要
http.Head でダウンロード先のファイルサイズ取得やRangeアクセスができるかを確認し、
指定された分割数で一時ファイル(例:1.temp.download、2.temp.download…)
としてダウンロードを行い、全てのダウンロード完了後一時ファイルを結合しました。
一時ファイルはファイルを結合後消去します。
今後の改善点(課題)
・エラー処理の工夫
・キャンセルが発生した場合の実装・・・タイムアウトなど?
・分割ダウンロード失敗時の復旧処理
・小さいファイルの場合は分割せずにダウンロードを行う
・テストの実装
等