Two things:
1. Go's *os.File have finalizers that close the underlying file descriptor or handle during garbage collection. See runtime.SetFinalizer
2. I hate that use of defer has become conventional in the Java High Ceremony sense. That is, you must use defer, or "AI" and code reviewers call it out as a mistake. Granted, not deferring is usually a mistake, but not always.