有人问道:
我刚开始接触go语言,在根据书写二分法的时候发现个问题。
虽然解决了,但搞不清楚原因是为什么。 代码如下:
package main
import "fmt"
func main() {
min, max := 0, 100
fmt.Printf("%d--%d", min, max)
for min < max {
i := (min + max) / 2
fmt.Printf("<=%d(y or n) ", i)
var s string
fmt.Scanf("%s", &s)
if s != "" && s[0] == 'y' {
max = i
} else {
min = i + 1
}
}
fmt.Printf("%d\n", max)
}
运行结果: 0--100 <=50(y or n) 输入 n <=75(y or n) <=88(y or n)
这里会连续两次执行 fmt.Printf("<=%d(y or n) ", i) 即
fmt.Scanf("%s", &s)未被执行,或者说默认输入了某项内容,经过试验是默认了""空字符串。 我将fmt.Scanf("%s", &s)改成fmt.Scan(&s)后,这个错误没有再发生。
我对fmt.Scan()和fmt.Scanf()的用法就有了疑问,哪位能详细解释下!!!!! 感谢!!!!!!!!
有疑问加站长微信联系(非本文作者)

将Scanf改为:
或者,你应该捕获一下fmt.Scanf返回的错误,看看是啥原因,就可以找到对应的解决方案了。
你这个方法没有用啊?
我测试过的,怎么可能没用。注意是有"\n"的。
不好意思,是我没处理n这个变量导致无法编译,我将n替换成_就没问题了。 我还想问下\n在这里起得是什么作用?nil代表什么意思?
在写《Golang标准库》的fmt一节时,个人感觉这是Go在Windows下的bug,已经向官方提出 https://code.google.com/p/go/issues/detail?id=5391。
nil是go中的关键字,相当于其他语言的null啊;其实加上\n,相当于使用fmt.Scanln()。
感谢站长,我马上去仔细看看!
fmt.Scanf不能出现2次以上,第二次就会出现跳过无需输入。 应该是个bug
已找到解决方法 // 初始化stdin os.Stdin = os.NewFile(uintptr(syscall.Stdin), "/dev/stdin")