Guest User

counting the number of lines in go

a guest
Sep 15th, 2014
321
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.38 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "fmt"
  6.     "os"
  7. )
  8.  
  9. func main() {
  10.     if len(os.Args) != 2 {
  11.         fmt.Fprintf(os.Stderr, "usage: %s <file>\n", os.Args[0])
  12.         os.Exit(1)
  13.     }
  14.  
  15.     f, err := os.Open(os.Args[1])
  16.     if err != nil {
  17.         fmt.Fprintf(os.Stderr, "%s\n", err)
  18.         os.Exit(1)
  19.     }
  20.  
  21.     lines := 0
  22.  
  23.     // // ~ 1) fast and readable code
  24.     // s := bufio.NewScanner(f)
  25.     // for s.Scan() {
  26.     //  lines++
  27.     // }
  28.     // if err := s.Err(); err != nil {
  29.     //  fmt.Fprintf(os.Stderr, "%s", err)
  30.     //  os.Exit(1)
  31.     // }
  32.  
  33.     // ~ 2) still fast but not nicely readable
  34.     buf := make([]byte, 64*1024)
  35.     for {
  36.         n, err := f.Read(buf)
  37.         if n == 0 {
  38.             break
  39.         }
  40.         i := 0
  41.         for {
  42.             j := bytes.IndexByte(buf[i:n], '\n')
  43.             if j == -1 {
  44.                 break
  45.             }
  46.             i += (j + 1)
  47.             lines++
  48.         }
  49.         if err != nil {
  50.             break
  51.         }
  52.     }
  53.  
  54.     // // ~ 3) basically the same as 2, but nicely readable
  55.     // buf := make([]byte, 64*1024)
  56.     // for {
  57.     //  n, err := f.Read(buf)
  58.     //  if n == 0 {
  59.     //      break
  60.     //  }
  61.     //  lines += bytes.Count(buf[:n], []byte{'\n'})
  62.     //  if err != nil {
  63.     //      break
  64.     //  }
  65.     // }
  66.  
  67.     // // ~ 4) slow and not nicely readable
  68.     // buf := make([]byte, 64*1024)
  69.     // for {
  70.     //  n, err := f.Read(buf)
  71.     //  if n == 0 {
  72.     //      break
  73.     //  }
  74.     //  for _, c := range buf[:n] {
  75.     //      if c == '\n' {
  76.     //          lines += 1
  77.     //      }
  78.     //  }
  79.     //  if err != nil {
  80.     //      break
  81.     //  }
  82.     // }
  83.  
  84.     fmt.Printf("%d\n", lines)
  85. }
Advertisement
Add Comment
Please, Sign In to add comment