捕获间隔用户输入

时间:2011-09-17 05:25:15

标签: user-input go

我试图在Go中捕获用户输入但运气不佳。我可以得到非间隔的单词:

var s string
println("enter string:")
fmt.Scan(&s)

但是,Go文档说扫描会在空格和新行上划分界限。所以我想我必须设置bufio.Reader的ReadLine。这是我的尝试,不会编译:

package main

import (
    "bufio"
    "os"
    "fmt"
)

const delim = '\n'
const file = "file"

func main() {

    r := bufio.NewReader() *Reader

    println("enter string:")
    line, err := r.ReadString(delim)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println(line)

}

错误:

1.go:14: not enough arguments in call to bufio.NewReader
1.go:14: undefined: Reader

那么,我该如何定义“读者”?如果已定义,这是将输入捕获为字符串的正确方法,以“\ n”分隔,而不是在空格处?或者我应该做一些完全不同的事情?

提前致谢。

2 个答案:

答案 0 :(得分:3)

更改

r := bufio.NewReader() *Reader

阅读

r := bufio.NewReader(os.Stdin)

解决问题。

原始加密是不正确的,因为您似乎只是从the spec复制并粘贴了方法的签名,但规范定义了签名,而不是调用的示例,因此*Reader中有r方法的返回类型(变量rd io.Reader将具有的类型)。并且该方法的唯一参数定义为os.Stdin;该界面可以通过{{1}}符号方便地实现,这似乎与您的任务完美匹配。

P.S。 请考虑阅读"Learning Go"文档部分中的所有文档,尤其是“Effective Go”。

答案 1 :(得分:1)

如果查看bufio.NewReader的文档,则需要io.Reader类型的参数(这是有道理的,因为它需要一个普通的读者并使其缓冲,类似于java.io.BufferedReader在Java中,它也采用Reader参数。什么是io.Reader?查看其文档,它是一个接口,指定具有Read方法的任何内容。许多类型都有Read方法;最常见的是*os.File。因此,您可以使用File等构建os.Open

f, _ := os.Open(file)
r := bufio.NewReader(f)