为了账号安全,请及时绑定邮箱和手机立即绑定

Go switch case 中的不一致行为

Go switch case 中的不一致行为

Go
斯蒂芬大帝 2021-08-23 17:34:24
这是非常不寻常的:给定相同的输入,Go 会随机表现不同。package mainimport "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>"有时得到:aagood随机(大约一半的时间)做同样的事情会产生:atbadWindows 7 上的安装是 go1.3.3.windows-amd64.msi 知道这里发生了什么吗?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

以防万一这是一个 eol(行尾)问题,请尝试:

fmt.Scanf("%s\r\n", &i)

这在“我如何fmt.Scanf在 Go 中使用”中提到:

这是因为不同的行尾。
Windows 使用回车和换行(' \r\n')作为行尾。
Unix 使用换行符(' \n')


查看完整回答
反对 回复 2021-08-23
?
catspeake

TA贡献1111条经验 获得超0个赞

我无法重现您的错误。


不要忽略错误。例如,


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


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信