codekingpro/portable-devtools
114k
1// Copyright 2013 The Go Authors. All rights reserved.2// Use of this source code is governed by a BSD-style3// license that can be found in the LICENSE file.4 5package bufio_test6 7import (8 "bufio"9 "bytes"10 "fmt"11 "os"12 "strconv"13 "strings"14)15 16func ExampleWriter() {17 w := bufio.NewWriter(os.Stdout)18 fmt.Fprint(w, "Hello, ")19 fmt.Fprint(w, "world!")20 w.Flush() // Don't forget to flush!21 // Output: Hello, world!22}23 24func ExampleWriter_AvailableBuffer() {25 w := bufio.NewWriter(os.Stdout)26 for _, i := range []int64{1, 2, 3, 4} {27 b := w.AvailableBuffer()28 b = strconv.AppendInt(b, i, 10)29 b = append(b, ' ')30 w.Write(b)31 }32 w.Flush()33 // Output: 1 2 3 434}35 36// ExampleWriter_ReadFrom demonstrates how to use the ReadFrom method of Writer.37func ExampleWriter_ReadFrom() {38 var buf bytes.Buffer39 writer := bufio.NewWriter(&buf)40 41 data := "Hello, world!\nThis is a ReadFrom example."42 reader := strings.NewReader(data)43 44 n, err := writer.ReadFrom(reader)45 if err != nil {46 fmt.Println("ReadFrom Error:", err)47 return48 }49 50 if err = writer.Flush(); err != nil {51 fmt.Println("Flush Error:", err)52 return53 }54 55 fmt.Println("Bytes written:", n)56 fmt.Println("Buffer contents:", buf.String())57 // Output:58 // Bytes written: 4159 // Buffer contents: Hello, world!60 // This is a ReadFrom example.61}62 63// The simplest use of a Scanner, to read standard input as a set of lines.64func ExampleScanner_lines() {65 scanner := bufio.NewScanner(os.Stdin)66 for scanner.Scan() {67 fmt.Println(scanner.Text()) // Println will add back the final '\n'68 }69 if err := scanner.Err(); err != nil {70 fmt.Fprintln(os.Stderr, "reading standard input:", err)71 }72}73 74// Return the most recent call to Scan as a []byte.75func ExampleScanner_Bytes() {76 scanner := bufio.NewScanner(strings.NewReader("gopher"))77 for scanner.Scan() {78 fmt.Println(len(scanner.Bytes()) == 6)79 }80 if err := scanner.Err(); err != nil {81 fmt.Fprintln(os.Stderr, "shouldn't see an error scanning a string")82 }83 // Output:84 // true85}86 87// Use a Scanner to implement a simple word-count utility by scanning the88// input as a sequence of space-delimited tokens.89func ExampleScanner_words() {90 // An artificial input source.91 const input = "Now is the winter of our discontent,\nMade glorious summer by this sun of York.\n"92 scanner := bufio.NewScanner(strings.NewReader(input))93 // Set the split function for the scanning operation.94 scanner.Split(bufio.ScanWords)95 // Count the words.96 count := 097 for scanner.Scan() {98 count++99 }100 if err := scanner.Err(); err != nil {101 fmt.Fprintln(os.Stderr, "reading input:", err)102 }103 fmt.Printf("%d\n", count)104 // Output: 15105}106 107// Use a Scanner with a custom split function (built by wrapping ScanWords) to validate108// 32-bit decimal input.109func ExampleScanner_custom() {110 // An artificial input source.111 const input = "1234 5678 1234567901234567890"112 scanner := bufio.NewScanner(strings.NewReader(input))113 // Create a custom split function by wrapping the existing ScanWords function.114 split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {115 advance, token, err = bufio.ScanWords(data, atEOF)116 if err == nil && token != nil {117 _, err = strconv.ParseInt(string(token), 10, 32)118 }119 return120 }121 // Set the split function for the scanning operation.122 scanner.Split(split)123 // Validate the input124 for scanner.Scan() {125 fmt.Printf("%s\n", scanner.Text())126 }127 128 if err := scanner.Err(); err != nil {129 fmt.Printf("Invalid input: %s", err)130 }131 // Output:132 // 1234133 // 5678134 // Invalid input: strconv.ParseInt: parsing "1234567901234567890": value out of range135}136 137// Use a Scanner with a custom split function to parse a comma-separated138// list with an empty final value.139func ExampleScanner_emptyFinalToken() {140 // Comma-separated list; last entry is empty.141 const input = "1,2,3,4,"142 scanner := bufio.NewScanner(strings.NewReader(input))143 // Define a split function that separates on commas.144 onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) {145 for i := 0; i < len(data); i++ {146 if data[i] == ',' {147 return i + 1, data[:i], nil148 }149 }150 if !atEOF {151 return 0, nil, nil152 }153 // There is one final token to be delivered, which may be the empty string.154 // Returning bufio.ErrFinalToken here tells Scan there are no more tokens after this155 // but does not trigger an error to be returned from Scan itself.156 return 0, data, bufio.ErrFinalToken157 }158 scanner.Split(onComma)159 // Scan.160 for scanner.Scan() {161 fmt.Printf("%q ", scanner.Text())162 }163 if err := scanner.Err(); err != nil {164 fmt.Fprintln(os.Stderr, "reading input:", err)165 }166 // Output: "1" "2" "3" "4" ""167}168 169// Use a Scanner with a custom split function to parse a comma-separated170// list with an empty final value but stops at the token "STOP".171func ExampleScanner_earlyStop() {172 onComma := func(data []byte, atEOF bool) (advance int, token []byte, err error) {173 i := bytes.IndexByte(data, ',')174 if i == -1 {175 if !atEOF {176 return 0, nil, nil177 }178 // If we have reached the end, return the last token.179 return 0, data, bufio.ErrFinalToken180 }181 // If the token is "STOP", stop the scanning and ignore the rest.182 if string(data[:i]) == "STOP" {183 return i + 1, nil, bufio.ErrFinalToken184 }185 // Otherwise, return the token before the comma.186 return i + 1, data[:i], nil187 }188 const input = "1,2,STOP,4,"189 scanner := bufio.NewScanner(strings.NewReader(input))190 scanner.Split(onComma)191 for scanner.Scan() {192 fmt.Printf("Got a token %q\n", scanner.Text())193 }194 if err := scanner.Err(); err != nil {195 fmt.Fprintln(os.Stderr, "reading input:", err)196 }197 // Output:198 // Got a token "1"199 // Got a token "2"200}201 