Problem
func main() {
scanner := bufio.NewScanner(strings.NewReader(`one
two
three
four
`))
var (
text string
n int
)
for scanner.Scan() {
n++
text += fmt.Sprintf("%d. %s\n", n, scanner.Text())
}
fmt.Print(text)
// Output:
// 1. One
// 2. Two
// 3. Three
// 4. Four
}
The program numbers the lines in a buffer and uses the text/scanner
to read the input line-by-line. What might be wrong with it?
First, it is not necessary to collect the input in the string before putting it out to standard output. This example is slightly contrived.
Second, the string text is not modified with the +=
operator, it is created anew for every line. This is a significant difference between strings and []byte
slices — strings in Go are non-modifiable. If you need to modify a string, use a []byte
slice.
Here’s a provided small program, written in a better way:
func main() {
scanner := bufio.NewScanner(strings.NewReader(`one
two
three
four
`))
var (
text []byte
n int
)
for scanner.Scan() {
n++
text = append(text, fmt.Sprintf("%d. %s\n", n, scanner.Text())...)
}
os.Stdout.Write(text)
// 1. One
// 2. Two
// 3. Three
// 4. Four
}
That is the point of the existence of both bytes
and strings
packages.