Source File: go-coreutils/tail/main.go

package main

import (
  "fmt"
  "bufio"
  "os"
  "log"
  "flag"
  "io"
)

func TailFile(file io.Reader, count int) {
  scan := bufio.NewScanner(file)
  var lines []string

  for scan.Scan() {
    lines = append(lines, scan.Text())
  }

  if scan.Err() != nil { log.Fatal(scan.Err()) }

  start := len(lines) - count
  if start < 0 { start = 0 }

  for line := int(start); line < len(lines); line++ {
    fmt.Println(lines[line])
  }
}

func main() {
  var count int

  flag.IntVar(&count, "n", 10, "number of lines")
  flag.Parse()

  if flag.NArg() > 0 {
    files := flag.Args()
    for _, fname := range files {
      file, err := os.Open(fname)
      if err != nil { log.Fatal(err) }

      TailFile(file, count)
    }
  } else {
    TailFile(os.Stdin, count)
  }
}