当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


GO Scanner用法及代码示例

GO语言"bufio"包中"Scanner"类型的用法及代码示例。

Scanner 提供了一个方便的接口来读取数据,例如 newline-delimited 行文本的文件。对 Scan 方法的连续调用将逐步遍历文件的'tokens',跳过标记之间的字节。令牌的规范由 SplitFunc 类型的拆分函数定义;默认的 split 函数将输入拆分为行终止剥离的行。此包中定义了拆分函数,用于将文件扫描为行、字节、UTF-8 编码的符文和空格分隔的单词。客户端可以改为提供自定义拆分函数。

扫描在 EOF、第一个 I/O 错误或太大而无法放入缓冲区的标记处不可恢复地停止。当扫描停止时,阅读器可能已经任意前进到最后一个标记之外。需要对错误处理或大令牌进行更多控制,或者必须在阅读器上运行顺序扫描的程序应该使用 bufio.Reader 代替。

用法:

type Scanner struct {
    // contains filtered or unexported fields
}

示例(自定义):

使用具有自定义拆分函数(通过包装 ScanWords 构建)的扫描仪来验证 32 位十进制输入。

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)
    }
}

输出:

1234
5678
Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range

示例(EmptyFinalToken):

使用带有自定义拆分函数的扫描器来解析一个带有空最终值的逗号分隔列表。

package main

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

func main() {
    // Comma-separated list; last entry is empty.
    const input = "1,2,3,4,"
    scanner := bufio.NewScanner(strings.NewReader(input))
    // Define a split function that separates on commas.
    onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
        for i := 0; i < len(data); i++ {
            if data[i] == ',' {
                return i + 1, data[:i], nil
            }
        }
        if !atEOF {
            return 0, nil, nil
        }
        // There is one final token to be delivered, which may be the empty string.
        // Returning bufio.ErrFinalToken here tells Scan there are no more tokens after this
        // but does not trigger an error to be returned from Scan itself.
        return 0, data, bufio.ErrFinalToken
    }
    scanner.Split(onComma)
    // Scan.
    for scanner.Scan() {
        fmt.Printf("%q ", scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Fprintln(os.Stderr, "reading input:", err)
    }
}

输出:

"1" "2" "3" "4" ""

示例(行):

Scanner 的最简单用法,将标准输入读取为一组行。

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)
    }
}

示例(单词):

使用扫描器通过将输入扫描为以空格分隔的标记序列来实现简单的word-count 实用程序。

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)
}

输出:

15

相关用法


注:本文由纯净天空筛选整理自golang.google.cn大神的英文原创作品 Scanner。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。