nit: All of the Go libraries arrange the arguments as `(dst, src)` (not `(src, dst)`)... 
Also, the `defer df.Close()` again ignores the returned error value, which is not safe (although it is probably fine to ignore the `sf.Close()`).