Go开关情况下的不一致行为
这是非常不寻常的:给定相同的输入,Go将随机表现出不同的行为Go开关情况下的不一致行为,go,switch-statement,case,Go,Switch Statement,Case,这是非常不寻常的:给定相同的输入,Go将随机表现出不同的行为 package main import "fmt" func main() { var i string fmt.Scanf("%s\n", &i) fmt.Println(i) switch i { case "a": fmt.Println("good") case "b": fmt.Println("not good") d
package main
import "fmt"
func main() {
var i string
fmt.Scanf("%s\n", &i)
fmt.Println(i)
switch i {
case "a":
fmt.Println("good")
case "b":
fmt.Println("not good")
default:
fmt.Println("bad")
}
}
在命令提示符下,我运行
go run test.go
然后我打字
"a <enter>"
随机(大约一半的时间)做同样的事情会产生:
a
t
bad
在windows 7上安装的是go1.3.3.windows-amd64.msi
知道这里发生了什么吗?如果这是一个下线(end of line)问题,请尝试:
fmt.Scanf("%s\r\n", &i)
这在“”中提到:
这是因为行尾不同。windows使用回车符和换行符(“
\r\n
”)作为行尾。Unix使用换行符(“
\n
”)
如果这是eol(生产线末端)问题,请尝试:
fmt.Scanf("%s\r\n", &i)
这在“”中提到:
这是因为行尾不同。windows使用回车符和换行符(“
\r\n
”)作为行尾。Unix使用换行符(“
\n
”)
我无法重现你的错误 不要忽略错误。比如说,
package main
import "fmt"
func main() {
var i string
n, err := fmt.Scanf("%s\n", &i)
if err != nil || n != 1 {
fmt.Println(n, err)
}
fmt.Println(i)
switch i {
case "a":
fmt.Println("good")
case "b":
fmt.Println("not good")
default:
fmt.Println("bad")
}
}
输出:
C:\>go version
go version go1.3.3 windows/amd64
C:\gopath\src\so>go run test.go
a
a
good
C:\gopath\src\so>go run test.go
b
b
not good
C:\gopath\src\so>go run test.go
t
t
bad
我无法重现你的错误 不要忽略错误。比如说,
package main
import "fmt"
func main() {
var i string
n, err := fmt.Scanf("%s\n", &i)
if err != nil || n != 1 {
fmt.Println(n, err)
}
fmt.Println(i)
switch i {
case "a":
fmt.Println("good")
case "b":
fmt.Println("not good")
default:
fmt.Println("bad")
}
}
输出:
C:\>go version
go version go1.3.3 windows/amd64
C:\gopath\src\so>go run test.go
a
a
good
C:\gopath\src\so>go run test.go
b
b
not good
C:\gopath\src\so>go run test.go
t
t
bad
我按照你说的重写了Scanf,但它并没有改变输出。不过,我确实进一步隔离了它:如果我调用“go run test.go”并立即输入值'a',在它完成编译之前,出于某种原因,它会注册为't'。奇怪的行为,可能是由编译器/链接器引起的,与语言规范无关。正如您所说,我重写了Scanf,但它不会更改输出。不过,我确实进一步隔离了它:如果我调用“go run test.go”并立即输入值'a',在它完成编译之前,出于某种原因,它会注册为't'。奇怪的行为,可能由编译器/链接器引起,与语言规范无关。