Golang bufio包使用范例

来源:互联网 发布:蒙古音乐软件ehshig 编辑:程序博客网 时间:2024/06/05 14:23

bufio包实现了有缓冲的I/O。它包装一个io.Reader或io.Writer接口对象,创建另一个也实现了该接口,且同时还提供了缓冲和一些文本I/O的帮助函数的对象。


范例1:统计输入行数据出现的次数

package main


import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    counts := make(map[string]int)
    input := bufio.NewScanner(os.Stdin)    // 命令行控制台输入
    for input.Scan() {  // 遇到 \n 或者\r\n循环一次,每输入一行内容必须回车,退出循环按组合键 Ctrl +D
        counts[input.Text()]++
    }
    // NOTE: ignoring potential errors from input.Err()
    for line, n := range counts {
        if n > 1 {
            fmt.Printf("%d\t%s\n", n, line)
        }
    }
    fmt.Println(counts)

}

scanner对象从程序的标准输入中读取内容。对input.Scanner的每一次调用都会调入一个新行,并且会
自动将其行末的换行符去掉;结果用input.Text()得到。Scan方法在读到了新行的时候会返回true,而
在没有新行被读入时,会返回false。

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~

[root@contoso ~]# book
ABC
DEF
GHI
GHI
ABC
ABC
ABC
JKL
JKL

4       ABC
2       GHI
2       JKL
map[GHI:2 JKL:2 ABC:4 DEF:1]

[root@contoso ~]#

范例2:使用日志直接打印输出控制台输入的内容

package main

import (
    "bufio"
    "log"
    "os"
)

func main() {
    s := bufio.NewScanner(os.Stdin)
    for s.Scan() {     // 当扫描因为抵达输入流结尾或者遇到错误而停止时,本方法会返回false。
        log.Println("line", s.Text())
    }
}

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~
[root@contoso ~]# book
hi,welcome to china !
2017/07/02 22:24:58 line hi,welcome to china !
i'm glad to see you again.
2017/07/02 22:25:29 line i'm glad to see you again.
[root@contoso ~]#


范例3:

package main

import (
    "bufio"
    "fmt"
    "strings"
)

func main() {
    r := strings.NewReader("ABC\nDEF\r\nGHI\nJKL")  // r是一个 *Read指针
    bs := bufio.NewScanner(r)   
    for bs.Scan() {    // 当扫描因为抵达输入流结尾或者遇到错误而停止时,本方法会返回false。
        fmt.Printf("%d %v\n", bs.Bytes(), bs.Text())
    }
}

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~
[root@contoso ~]# book   ## 直接输出全部内容

[65 66 67] ABC
[68 69 70] DEF
[71 72 73] GHI
[74 75 76] JKL

[root@contoso ~]#


范例4:

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    w := bufio.NewWriter(os.Stdout)
    fmt.Fprint(w, "Hello, ")
    fmt.Fprint(w, "world!\n")
    w.Flush() // Don't forget to flush!
}

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~
[root@contoso ~]# book
Hello, world!

[root@contoso ~]#

范例5:Example (Custom) http://studygolang.com/pkgdoc

package main

import (
    "bufio"
    "fmt"
    "strconv"
    "strings"
)

func main() {
    // An artificial input source.
    const input = "1234 5678 1234567901234567890"
    scanner := bufio.NewScanner(strings.NewReader(input)) // Create a custom split function by wrapping the existing ScanWords function.
    split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
        advance, token, err = bufio.ScanWords(data, atEOF)
        if err == nil && token != nil {
            _, err = strconv.ParseInt(string(token), 10, 32)
        }
        return
    }
    // Set the split function for the scanning operation.
    scanner.Split(split) // Validate the input
    for scanner.Scan() {
        fmt.Printf("%s\n", scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Printf("Invalid input: %s", err)
    }
}

调试控制台打印输出如下信息:

2017/07/02 23:16:05 server.go:73: Using API v1
2017/07/02 23:16:05 debugger.go:97: launching process with args: [/root/code/go/src/contoso.org/book/debug 141 13 105 17 208]
API server listening at: 127.0.0.1:2345
2017/07/02 23:16:06 debugger.go:505: continuing
1234
5678
Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range


范例6:Example (Lines) http://studygolang.com/pkgdoc

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        fmt.Println(scanner.Text()) // Println will add back the final '\n'
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading standard input:", err)
    }
}

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~
[root@contoso ~]# book
this is a testing line1

this is a testing line1
this is a testing line2  ## 粗体是手动输入的行,例如定向输入到文件 book >> data.txt
this is a testing line2
this is a tesing line3
this is a tesing line3
[root@contoso ~]#

范例7:Example (Words) http://studygolang.com/pkgdoc

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    // An artificial input source.
    const input = "Now is the winter of our discontent,\nMade glorious summer by this sun of York.\n"
    scanner := bufio.NewScanner(strings.NewReader(input))
    // Set the split function for the scanning operation.
    scanner.Split(bufio.ScanWords)
    // Count the words.
    count := 0
    for scanner.Scan() {
        count++
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading input:", err)
    }
    fmt.Printf("%d\n", count)
}

[root@contoso ~]# cd $GOPATH && go install contoso.org/book && cd ~
[root@contoso ~]# book
15
[root@contoso ~]#

范例8:两个Scanner分别从不同的文件中按行取内容,用嵌套循环生产一个n*m的列表

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    userFile := "user.txt"
    passFile := "pass.txt"
    userf, usererr := os.OpenFile(userFile, os.O_RDONLY, 0660)
    passf, passerr := os.OpenFile(passFile, os.O_RDONLY, 0660)
    defer userf.Close()
    defer passf.Close()
    if usererr != nil || passerr != nil {
        fmt.Printf("OpenFile Error!")
        return
    }
    i := 0
    userScanner := bufio.NewScanner(userf)
    passScanner := bufio.NewScanner(passf)
    tokens := map[int]string{}
    for userScanner.Scan() {
        user := userScanner.Text()
        for passScanner.Scan() {
            pass := passScanner.Text()
            tokens[i] = user + ":" + pass
            i++
        }
        passf.Seek(0, 0)
        passScanner = bufio.NewScanner(passf)
    }
    fmt.Println(len(tokens))
    for _, token := range tokens {
        fmt.Println(token)
    }
}

[root@contoso ~]# tree $GOPATH/src/contoso.org -L 3  ##查看项目目录结构
/root/code/go/src/contoso.org
├── book
   ├── debug
   ├── main.go
   ├── pass.txt
   └── user.txt

[root@contoso ~]# more $GOPATH/src/contoso.org/book/user.txt
user1
user2
user3
user4
user5
user6
user7
user8
user9
user10
user11
user12
user13
user14
user15
user16
user17
user18
user19
user20
[root@contoso ~]# more $GOPATH/src/contoso.org/book/pass.txt
password1
password2
password3
password4
password5
password6
password7
password8
password9
password10
password11
password12
password13
password14
password15
password16
password17
password18
password19
password20
[root@contoso ~]#

[root@contoso ~]# cd $GOPATH/src/contoso.org/book
[root@contoso book]# go run main.go   ## 临时性非全局执行程序
400
user1:password8
user3:password3
user3:password7
user4:password12
user5:password3
user6:password15
user7:password4
user1:password6
user20:password11
user11:password18
user19:password14
user20:password4
user2:password4
user6:password7
user9:password4
user12:password7
user14:password13
user15:password15
user16:password15
user17:password1
user2:password11
user17:password10
user6:password16
user8:password6
user9:password1
user3:password19
user4:password1
user9:password6
user10:password4
user11:password14
user11:password19
user13:password6
user14:password1
user3:password1
user19:password11
user20:password12
user16:password20
user4:password19
user6:password3
user11:password7
user12:password6
user14:password8
user14:password19
user16:password19
user3:password2
user20:password16
user17:password14
user2:password18
user7:password6
user8:password4
user12:password13
user14:password12
user16:password17
user18:password12
user1:password9
user19:password8
user18:password17
user7:password5
user7:password13
user11:password6
user1:password20
user3:password5
user3:password18
user4:password2
user8:password17
user10:password8
user15:password9
user16:password8
user1:password1
user18:password3
user17:password17
user5:password9
user7:password14
user9:password11
user12:password16
user16:password7
user18:password20
user2:password10
user3:password12
user8:password19
user16:password6
user17:password12
user18:password4
user1:password15
user5:password5
user9:password10
user12:password4
user12:password18
user13:password10
user14:password9
user18:password5
user3:password9
user19:password16
user11:password16
user12:password3
user19:password5
user1:password19
user5:password6
user9:password17
user15:password18
user16:password1
user18:password18
user2:password9
user2:password14
user4:password11
user6:password13
user8:password10
user10:password13
user11:password4
user20:password5
user2:password12
user20:password6
user11:password10
user12:password12
user12:password17
user14:password2
user14:password4
user15:password13
user17:password16
user6:password10
user20:password18
user6:password20
user4:password8
user7:password12
user11:password17
user12:password14
user12:password20
user18:password10
user18:password15
user3:password15
user1:password16
user2:password3
user2:password7
user2:password13
user5:password10
user1:password7
user4:password10
user4:password16
user11:password1
user11:password20
user16:password10
user3:password13
user10:password3
user19:password10
user20:password2
user4:password6
user13:password2
user14:password6
user15:password4
user20:password15
user12:password2
user8:password8
user11:password15
user17:password4
user7:password10
user6:password2
user8:password1
user9:password3
user2:password15
user5:password11
user13:password7
user1:password10
user5:password16
user10:password15
user11:password12
user15:password16
user18:password9
user19:password3
user3:password6
user12:password1
user13:password11
user15:password14
user17:password20
user19:password7
user6:password12
user13:password14
user14:password20
user6:password9
user3:password17
user7:password15
user12:password19
user15:password5
user16:password11
user3:password11
user6:password4
user8:password14
user16:password5
user18:password2
user19:password2
user19:password13
user20:password1
user5:password4
user5:password8
user7:password8
user8:password12
user20:password9
user20:password17
user3:password10
user10:password5
user10:password16
user12:password10
user13:password18
user16:password18
user18:password7
user8:password3
user4:password13
user8:password5
user8:password11
user10:password11
user13:password4
user14:password17
user20:password8
user1:password18
user7:password16
user7:password17
user9:password5
user6:password8
user11:password9
user13:password17
user16:password2
user18:password13
user18:password19
user3:password16
user7:password9
user15:password11
user19:password6
user2:password16
user3:password14
user5:password19
user10:password1
user14:password14
user19:password12
user20:password14
user1:password14
user13:password3
user15:password2
user17:password3
user19:password19
user9:password19
user9:password2
user15:password17
user17:password11
user5:password13
user5:password17
user9:password8
user10:password18
user17:password5
user3:password4
user4:password20
user5:password7
user7:password3
user10:password10
user13:password20
user16:password4
user18:password11
user4:password9
user20:password10
user19:password9
user8:password16
user12:password9
user13:password12
user14:password5
user7:password2
user1:password13
user10:password14
user13:password1
user14:password18
user15:password8
user19:password17
user1:password3
user6:password14
user8:password7
user9:password12
user13:password16
user2:password19
user2:password2
user5:password15
user6:password18
user8:password18
user11:password8
user13:password8
user19:password4
user1:password11
user20:password19
user19:password15
user8:password2
user20:password3
user2:password8
user1:password5
user4:password17
user7:password19
user9:password20
user10:password9
user11:password13
user15:password19
user1:password2
user16:password14
user10:password12
user18:password14
user5:password12
user2:password20
user4:password3
user9:password16
user17:password6
user17:password9
user2:password6
user11:password11
user14:password10
user16:password16
user17:password18
user20:password13
user10:password20
user3:password8
user9:password18
user17:password7
user17:password8
user17:password15
user19:password1
user1:password12
user9:password9
user12:password11
user13:password5
user13:password13
user8:password20
user6:password17
user8:password9
user8:password13
user9:password14
user18:password16
user6:password6
user4:password7
user6:password5
user9:password13
user10:password2
user12:password15
user16:password9
user1:password4
user7:password20
user11:password2
user13:password15
user16:password12
user18:password6
user5:password1
user5:password2
user5:password20
user7:password1
user7:password11
user7:password18
user12:password8
user14:password11
user2:password1
user16:password13
user6:password19
user17:password13
user20:password20
user2:password5
user4:password5
user10:password19
user15:password7
user15:password10
user4:password4
user2:password17
user5:password14
user9:password7
user13:password19
user14:password3
user15:password6
user15:password12
user1:password17
user18:password1
user17:password19
user10:password6
user11:password3
user12:password5
user13:password9
user14:password15
user14:password16
user19:password18
user7:password7
user5:password18
user14:password7
user15:password1
user18:password8
user4:password15
user10:password17
user16:password3
user19:password20
user10:password7
user8:password15
user9:password15
user11:password5
user15:password20
user4:password14
user4:password18
user6:password1
user6:password11
user15:password3
user17:password2
user20:password7
user3:password20
[root@contoso book]#


原创粉丝点击