2013-06-25 5 views

ответ

8

Если файл достаточно мал, самым простым решением является использование ioutil.WriteFile в сочетании с ioutil.ReadAll:

resp, err := http.Get("your url") 
bytes, err := ioutil.ReadAll(resp.Body) 
err = ioutil.WriteFile(filename, bytes, 0666) 

Если файл не настолько мал, что лучше избегать создания и наполнения bytes массив. Тогда вы должны использовать io.Copy, который просто копирует байты от читателя к писателю:

resp, err := http.Get("your url") 
f, err := os.Create(filename) 
defer f.Close() 
_, err := io.Copy(f, resp.Body) 

Вы должны добавить соответствующую обработку ошибок в обоих случаях.

+0

Я бы очень хотел подчеркнуть «ioutil.ReadAll» - это почти никогда не то, что вы хотите делать в хорошо управляемом приложении. – Dustin

+0

@Dustin Если файл достаточно мал, я думаю, что это не имеет значения. Как вы думаете, я должен уделять больше внимания этому вопросу? –

+0

Я не согласен с вами, но, возможно, версия io.Copy должна быть первой. Я думаю, что ваш код и рассуждения являются правильными (хотя я мог бы сделать что-то неприятное для вашей программы). Я просто боюсь, что увижу больше людей, делающих «все в память». – Dustin