Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bytes"
- "fmt"
- "os"
- )
- func main() {
- if len(os.Args) != 2 {
- fmt.Fprintf(os.Stderr, "usage: %s <file>\n", os.Args[0])
- os.Exit(1)
- }
- f, err := os.Open(os.Args[1])
- if err != nil {
- fmt.Fprintf(os.Stderr, "%s\n", err)
- os.Exit(1)
- }
- lines := 0
- // // ~ 1) fast and readable code
- // s := bufio.NewScanner(f)
- // for s.Scan() {
- // lines++
- // }
- // if err := s.Err(); err != nil {
- // fmt.Fprintf(os.Stderr, "%s", err)
- // os.Exit(1)
- // }
- // ~ 2) still fast but not nicely readable
- buf := make([]byte, 64*1024)
- for {
- n, err := f.Read(buf)
- if n == 0 {
- break
- }
- i := 0
- for {
- j := bytes.IndexByte(buf[i:n], '\n')
- if j == -1 {
- break
- }
- i += (j + 1)
- lines++
- }
- if err != nil {
- break
- }
- }
- // // ~ 3) basically the same as 2, but nicely readable
- // buf := make([]byte, 64*1024)
- // for {
- // n, err := f.Read(buf)
- // if n == 0 {
- // break
- // }
- // lines += bytes.Count(buf[:n], []byte{'\n'})
- // if err != nil {
- // break
- // }
- // }
- // // ~ 4) slow and not nicely readable
- // buf := make([]byte, 64*1024)
- // for {
- // n, err := f.Read(buf)
- // if n == 0 {
- // break
- // }
- // for _, c := range buf[:n] {
- // if c == '\n' {
- // lines += 1
- // }
- // }
- // if err != nil {
- // break
- // }
- // }
- fmt.Printf("%d\n", lines)
- }
Advertisement
Add Comment
Please, Sign In to add comment