From 3b153c7d805c3ed5374923480f42b7561af655b2 Mon Sep 17 00:00:00 2001 From: Maciek Niemczyk Date: Mon, 17 Jun 2019 14:25:41 +0200 Subject: [PATCH 1/4] according to https://www.joeshaw.org/dont-defer-close-on-writable-files/ one should not use defer file.close(), its a bad pattern --- examples/defer/defer.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/examples/defer/defer.go b/examples/defer/defer.go index 06c827f..8d1c3ed 100644 --- a/examples/defer/defer.go +++ b/examples/defer/defer.go @@ -40,5 +40,9 @@ func writeFile(f *os.File) { func closeFile(f *os.File) { fmt.Println("closing") - f.Close() + err := f.Close() + if err != nil { + _, _ = fmt.Fprintf(os.Stderr, "error: %v\n", err) + os.Exit(1) + } } From 862833fcb87968830c9a7cb533d198dbfbddb06d Mon Sep 17 00:00:00 2001 From: Maciek Niemczyk Date: Mon, 17 Jun 2019 14:46:02 +0200 Subject: [PATCH 2/4] CDR request --- examples/defer/defer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/defer/defer.go b/examples/defer/defer.go index 8d1c3ed..0eca985 100644 --- a/examples/defer/defer.go +++ b/examples/defer/defer.go @@ -42,7 +42,7 @@ func closeFile(f *os.File) { fmt.Println("closing") err := f.Close() if err != nil { - _, _ = fmt.Fprintf(os.Stderr, "error: %v\n", err) + fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) } } From b00cb1ec7eb532ddc1bf5a27fd1303fc78714b49 Mon Sep 17 00:00:00 2001 From: Maciek Niemczyk Date: Mon, 17 Jun 2019 14:47:46 +0200 Subject: [PATCH 3/4] CDR request 2 --- examples/defer/defer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/defer/defer.go b/examples/defer/defer.go index 0eca985..0941d10 100644 --- a/examples/defer/defer.go +++ b/examples/defer/defer.go @@ -41,6 +41,7 @@ func writeFile(f *os.File) { func closeFile(f *os.File) { fmt.Println("closing") err := f.Close() + // It is important to check for errors when closing a file, even in a deferred function. if err != nil { fmt.Fprintf(os.Stderr, "error: %v\n", err) os.Exit(1) From 1aa6ac2a7a747405c1bc993ebbcca9cb47e20e26 Mon Sep 17 00:00:00 2001 From: Maciek Niemczyk Date: Mon, 17 Jun 2019 15:13:11 +0200 Subject: [PATCH 4/4] those files has been changed after running tools/build --- examples/defer/defer.hash | 4 ++-- public/defer | 24 ++++++++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/examples/defer/defer.hash b/examples/defer/defer.hash index 2994617..5e437d4 100644 --- a/examples/defer/defer.hash +++ b/examples/defer/defer.hash @@ -1,2 +1,2 @@ -570699fc50a1d39e9d0ad6a4461aef3248b080e1 -xPbQ5SGkH2O +4e2229c593e102d4efd101a7e9aa21f3345e90d1 +S2RuPTkABip diff --git a/public/defer b/public/defer index 43445ec..8f0b130 100644 --- a/public/defer +++ b/public/defer @@ -30,7 +30,7 @@ purposes of cleanup. defer is often used where e.g. - +
package main
@@ -132,15 +132,31 @@ of the enclosing function (main), after
           
         
         
+        
+          
+            

It is important to check for errors when closing a file, even in a deferred function.

+ + + + +
func closeFile(f *os.File) {
+    fmt.Println("closing")
+    err := f.Close()
+
+ + + + -
func closeFile(f *os.File) {
-    fmt.Println("closing")
-    f.Close()
+            
    if err != nil {
+        fmt.Fprintf(os.Stderr, "error: %v\n", err)
+        os.Exit(1)
+    }
 }