Consider the following program: https://play.golang.org/p/_RjR5dCQ_KW
package main import ( "bufio" "strings" "fmt" ) const data = "short\nthisisverylonglong\n" var in = bufio.NewScanner(strings.NewReader(data)) func next() []byte { in.Scan() return in.Bytes() } func main() { in.Buffer(make([]byte, 20), 20) s, t := string(next()), next() // line 20 fmt.Println(s) fmt.Printf("%s\n", t) } What I expected at line 20: 1) call next() 2) convert it to string 3) call next() 4) assign to s and t Expected output: short thisisverylonglong What was the actual compiled code: 1) call next() 2) call next() 3) convert first result to string 4) assign to s and t Actual output: thisi thisisverylonglong 0x008f 00143 (longscan.go:20) PCDATA $0, $0 0x008f 00143 (longscan.go:20) CALL "".next(SB) 0x0094 00148 (longscan.go:20) MOVQ 8(SP), AX 0x0099 00153 (longscan.go:20) MOVQ AX, ""..autotmp_21+88(SP) 0x009e 00158 (longscan.go:20) MOVQ 16(SP), CX 0x00a3 00163 (longscan.go:20) MOVQ CX, ""..autotmp_22+80(SP) 0x00a8 00168 (longscan.go:20) MOVQ (SP), DX 0x00ac 00172 (longscan.go:20) MOVQ DX, ""..autotmp_23+104(SP) 0x00b1 00177 (longscan.go:20) PCDATA $0, $1 0x00b1 00177 (longscan.go:20) CALL "".next(SB) 0x00b6 00182 (longscan.go:20) MOVQ 16(SP), AX 0x00bb 00187 (longscan.go:20) MOVQ AX, "".t.cap+72(SP) 0x00c0 00192 (longscan.go:20) MOVQ 8(SP), CX 0x00c5 00197 (longscan.go:20) MOVQ CX, "".t.len+64(SP) 0x00ca 00202 (longscan.go:20) MOVQ (SP), DX 0x00ce 00206 (longscan.go:20) MOVQ DX, "".t.ptr+96(SP) 0x00d3 00211 (longscan.go:20) MOVQ $0, (SP) 0x00db 00219 (longscan.go:20) MOVQ ""..autotmp_23+104(SP), BX 0x00e0 00224 (longscan.go:20) MOVQ BX, 8(SP) 0x00e5 00229 (longscan.go:20) MOVQ ""..autotmp_21+88(SP), BX 0x00ea 00234 (longscan.go:20) MOVQ BX, 16(SP) 0x00ef 00239 (longscan.go:20) MOVQ ""..autotmp_22+80(SP), BX 0x00f4 00244 (longscan.go:20) MOVQ BX, 24(SP) 0x00f9 00249 (longscan.go:20) PCDATA $0, $2 0x00f9 00249 (longscan.go:20) CALL runtime.slicebytetostring(SB) 0x00fe 00254 (longscan.go:20) MOVQ 32(SP), AX 0x0103 00259 (longscan.go:20) MOVQ 40(SP), CX In this case, second next() causes Scanner buffer clear, which invalidates result of first next() before making it to string. I think https://golang.org/ref/spec#Order_of_evaluation is going to explain this situation, but I had hard time understanding. Is current behavior consistent with language spec? -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.