Go switch案例中的行为不一致

时间:2014-10-24 17:05:10

标签: 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")
    default:
        fmt.Println("bad")
    }
}

在命令提示符下我运行

go run test.go

然后我输入

"a <enter>"

有时会得到:

a
a
good

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

a
t
bad

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

2 个答案:

答案 0 :(得分:3)

如果这是一个eol(行尾)问题,请尝试:

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

&#34; How do I use fmt.Scanf in Go&#34;:

中提到了这一点
  

这是因为不同的行结尾   窗口使用回车符和换行符(&#39; \r\n&#39;)作为行结尾   Unix使用换行符(&#39; \n&#39;)

答案 1 :(得分:1)

我无法重现您的错误。

不要忽视错误。例如,

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