Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go开关情况下的不一致行为_Go_Switch Statement_Case - Fatal编程技术网

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

这是非常不寻常的:给定相同的输入,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
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'。奇怪的行为,可能由编译器/链接器引起,与语言规范无关。