strings.Builder
iteration variables in traditional 3-clause for;;
loops are implemented incorrectlyfor
loops, including both for-range
loops and traditional 3-clause for ..; ..; .. {...}
loops. For details, please read for
Loop Semantic Changes in Go 1.22: Be Aware of the Impact.
for-range
loops is positive, while the overall impact of the new semantics of traditional 3-clause for;;
loops is negative. The above referenced article shows the all the bad effects of the semantic change of traditional 3-clause for;;
loops I have found so far.
strings.Builder
values are used as (freshly-declared) iteration variables of traditional 3-clause for;;
loops. The following example shows one such case:
package main
import (
"fmt"
"strings"
)
func foo() string {
for b, i := (strings.Builder{}), byte('a'); ; i++ {
b.WriteByte(i) // not panic
if i == 'z' {
return b.String()
}
}
}
func bar(callback func(*strings.Builder)) string {
for b, i := (strings.Builder{}), byte('a'); ; i++ {
b.WriteByte(i) // panics here
callback(&b)
if i == 'z' {
return b.String()
}
}
}
func main() {
fmt.Println(foo())
debugProcess := func(pb *strings.Builder) {
//fmt.Println(pb.String()) // do nothing
}
fmt.Println(bar(debugProcess))
}
$ gotv 1.21 run main.go [Run]: $HOME/.cache/gotv/tag_go1.21.12/bin/go run main.go abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz
$ gotv 1.22 run main.go [Run]: $HOME/.cache/gotv/tag_go1.22.5/bin/go run main.go abcdefghijklmnopqrstuvwxyz panic: strings: illegal use of non-zero Builder copied by value
foo
and bar
functions should be consistent with each other, but official Go toolchain v1.22+ fail to make the guarantee. In fact, by the Go 1.22+ new semantics, both of the foo
and bar
functions should produce a panic, because nocopy values should not be used as (freshly declared) iteration variables since Go 1.22.
go vet
command provided in Go toolchain 1.22 and 1.23 versions failed to warn on such cases.
The Go 101 project is hosted on Github. Welcome to improve Go 101 articles by submitting corrections for all kinds of mistakes, such as typos, grammar errors, wording inaccuracies, description flaws, code bugs and broken links.
If you would like to learn some Go details and facts every serveral days, please follow Go 101's official Twitter account @zigo_101.
strings.Builder
iteration variables in traditional 3-clause for;;
loops are implemented incorrectly