Go switch 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")

    default:

        fmt.Println("bad")

    }

}

在命令提示符我运行


go run test.go

然后我输入


"a <enter>"

有时得到:


a

a

good

随机(大约一半的时间)做同样的事情会产生:


a

t

bad

Windows 7 上的安装是 go1.3.3.windows-amd64.msi 知道这里发生了什么吗?


斯蒂芬大帝
浏览 194回答 2
2回答

隔江千里

以防万一这是一个 eol(行尾)问题,请尝试:fmt.Scanf("%s\r\n", &i)这在“我如何fmt.Scanf在 Go 中使用”中提到:这是因为不同的行尾。Windows 使用回车和换行(' \r\n')作为行尾。Unix 使用换行符(' \n')

catspeake

我无法重现您的错误。不要忽略错误。例如,package mainimport "fmt"func main() {&nbsp; &nbsp; var i string&nbsp; &nbsp; n, err := fmt.Scanf("%s\n", &i)&nbsp; &nbsp; if err != nil || n != 1 {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(n, err)&nbsp; &nbsp; }&nbsp; &nbsp; fmt.Println(i)&nbsp; &nbsp; switch i {&nbsp; &nbsp; case "a":&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("good")&nbsp; &nbsp; case "b":&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("not good")&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("bad")&nbsp; &nbsp; }}输出:C:\>go versiongo version go1.3.3 windows/amd64C:\gopath\src\so>go run test.goaagoodC:\gopath\src\so>go run test.gobbnot goodC:\gopath\src\so>go run test.gottbad
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go