Skip to content

Instantly share code, notes, and snippets.

@novalagung
Last active November 29, 2023 11:39
Star You must be signed in to star a gist
Save novalagung/13c5c8f4d30e0c4bff27 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"io"
"os"
)
var path = "/Users/novalagung/Documents/temp/test.txt"
func main() {
createFile()
writeFile()
readFile()
deleteFile()
}
func createFile() {
// detect if file exists
var _, err = os.Stat(path)
// create file if not exists
if os.IsNotExist(err) {
var file, err = os.Create(path)
if isError(err) { return }
defer file.Close()
}
fmt.Println("==> done creating file", path)
}
func writeFile() {
// open file using READ & WRITE permission
var file, err = os.OpenFile(path, os.O_RDWR, 0644)
if isError(err) { return }
defer file.Close()
// write some text line-by-line to file
_, err = file.WriteString("halo\n")
if isError(err) { return }
_, err = file.WriteString("mari belajar golang\n")
if isError(err) { return }
// save changes
err = file.Sync()
if isError(err) { return }
fmt.Println("==> done writing to file")
}
func readFile() {
// re-open file
var file, err = os.OpenFile(path, os.O_RDWR, 0644)
if isError(err) { return }
defer file.Close()
// read file, line by line
var text = make([]byte, 1024)
for {
_, err = file.Read(text)
// break if finally arrived at end of file
if err == io.EOF {
break
}
// break if error occured
if err != nil && err != io.EOF {
isError(err)
break
}
}
fmt.Println("==> done reading from file")
fmt.Println(string(text))
}
func deleteFile() {
// delete file
var err = os.Remove(path)
if isError(err) { return }
fmt.Println("==> done deleting file")
}
func isError(err error) bool {
if err != nil {
fmt.Println(err.Error())
}
return (err != nil)
}
@aayushKumarJarvis
Copy link

👍

@milosgajdos
Copy link

This is a bit buggy. Your defer file.Close() call will never be called if os.Create fails because you are calling os.Exit and according to documentation exit doesn't call any deferred calls.

@svigne1
Copy link

svigne1 commented Nov 21, 2016

Thank you!

@SerkanSipahi
Copy link

@milosgajdos83 :)

@lukeramsden
Copy link

@milosgajdos83 Would that matter though? Because if the program is exiting, it doesn't need to run the deferred functions. Either way, he could've just used fmt.Fatal().

@yutongz
Copy link

yutongz commented May 8, 2017

Helpful for me

@joe94
Copy link

joe94 commented May 30, 2017

Like some of you have already suggested, this approach has some bugs. Remember that "defers will not be run when using os.Exit" (https://gobyexample.com/exit).
I fix that issue here: https://gist.github.com/joe94/9725e84392654fbb68ff16053ea6d5bf

@novalagung
Copy link
Author

@milosgajdos83 @joe94 thanks for the responses. I just modified the file for better logging. also all os.Exit() statements are removed now

@edwinyoyada
Copy link

cool!

@LyleScott
Copy link

Hey, this came in handy. I'd rather read code than words explaining it. thanks!

@abousselmi
Copy link

thanks !

@anikaraj
Copy link

I am getting " undefine: isError"

@cys920622
Copy link

Helped me, thanks.

@kwkrisna18
Copy link

Suwun cak noval

@alexrios
Copy link

Thanks mate!

@dana321
Copy link

dana321 commented Dec 5, 2018

Did you know that you can also use the ioutil functions?

import "io/ioutil"

// read file
bytes,err:= ioutil.ReadFile(filename)
if err!=nil{
panic(err)
}
mystringdata:=string(bytes[:])

//write file
err:=ioutil.WriteFile("myfile.txt",[]byte("write this to file"),0644)
if err!=nil{
panic(err)
}

@webninjastar
Copy link

I think it has an issue in createFile() function. Because I tested the code without test.txt file in the path but there isn't "test.txt" file after running the code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment