2014-10-24 4 views
1

Это очень необычно: учитывая тот же ввод, Go будет вести себя по-разному наугад.Несоответствующее поведение в случае с переключателем 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 

Установка go1.3.3.windows-amd64.msi на Windows 7 Любая идея, что здесь происходит?

ответ

3

Только в случае, если это EOL (конец строки), попробуйте:

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

Это упоминается в "How do I use fmt.Scanf in Go":

это из-за различных окончаний линий.
Окна используют возврат каретки и линию ('\r\n') в качестве окончания строки.
Unix использует перевод строки («\n»)

+0

Я переписал Scanf, как вы сказали, но это не меняет выход. Однако я все же изолировал его: если я назову «go run test.go» и сразу же введите значение «a», то до того, как он завершит компиляцию, по какой-то причине он регистрируется как «t». Нечетное поведение, вероятно, вызванное компилятором/компоновщиком и не имеет ничего общего с спецификацией языка. – ridthyself

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 
Смежные вопросы