Command-line todo list written in Golang

By Steve Claridge on 2015-05-26.

This is the output from my quick look at Golang. It is a simple command-line todo list that lets you add, delete and view your todo items. I'm sure the code can be improved in many places, I'm new to Go. Here's the source:

package main import ( 
) // Read all lines from the given file and return as an array of strings. Returns an empty array
// if there was a problem reading the file. 
func readFile( filename string ) []string {
  file, err := os.Open( filename )
  if err != nil {
    return []string{}
  defer file.Close()
  scanner := bufio.NewScanner( bufio.NewReader( file ) )   var tmp []string
  for scanner.Scan() {
    tmp = append( tmp, scanner.Text() )
  return tmp
} // Write the given string array to the specified file, overwriting any lines
// that were previously in the file.
func writeFile( filename string, lines []string ) {
  file, err := os.Create( filename ) //example of multiple results from a function where one is the error code
  if err != nil {
    panic( "could not open todo file" )
  defer file.Close() //will call file's close function at the end of writeFile
  w := bufio.NewWriter( file )
  defer w.Flush() //interesting, two deferred funcs, one needs to be called first....
  for _, each := range lines { //ignore the first param with "_"
    fmt.Fprint( w, each + "\n" )
} // Displays list of todo items and their index within the list, for example:
// 0. First todo item
// 1. Remember the milk
// 2. Make some stuff
func show( arr []string ) {
  for index, each := range arr {
    fmt.Printf( "%d. %s \n", index, each )
} // Remove the element from the given array as specified by index i. If i is greater
// than size of array then just return the array as-is with no deletion.
func deleteIt( i int, arr []string ) []string {
  if i < len( arr ) { 		
    return append( arr[:i], arr[i+1:]... ) // 	
  } else { 		
    return arr 	
}  // Main entry point of the application. 
// If a user runs app with no paraemeters then it shows all todo list items. 
// If a user passes a string then it adds string to the list of todo items and then displays the list. 
// If a user passes a number then it deletes that item from the list (zero based) and then displays the list.  
func main() {	 	
  lines := readFile( "/tmp/todo.dat" ) //improve this by using a constant for filename 	 
  args := os.Args[1:] //Ignore element 0, which is the program name 	   if len( args ) > 0 {	
    n, err := strconv.Atoi( args[0] )	
    if err == nil {
      lines = deleteIt( n, lines )
    } else {
      lines = append( lines, args[0] )
  show( lines )
  writeFile( "/tmp/todo.dat", lines ) //improve this by using a constant for filename

Some examples of using the app from the command-line in Windows: