2011-09-17 52 views
3

我试图捕获用户输入Go的小运气。我能得到非间隔字的工作:捕获间隔用户输入

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

然而,转到文件说,扫描将在空格和换行分隔。所以我认为我必须设置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”分隔,而不是在空格处?或者我应该做一些完全不同的事情?

在此先感谢。

回答

3

更改构建一个File

r := bufio.NewReader() *Reader 

阅读

r := bufio.NewReader(os.Stdin) 

来解决这个问题。

原来encantation不正确,因为你似乎只是复制和the spec粘贴的方法的签名,但该规范定义的签名,而不是调用的例子,所以*Reader在有方法的返回类型(类型的变量r将有)。该方法的唯一参数被定义为rd io.Reader;该界面可以方便地通过os.Stdin符号实现,这看起来像是完美匹配您的任务。

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

+0

谢谢,这工作得很好。我已阅读文档,只是有一些麻烦包裹我的头周围的一些概念:) – rick

1

如果你看一下bufio.NewReader的文档,它需要io.Reader类型的参数(这是有道理的,因为它需要一个正常的阅读器,并使其缓冲,在Java中,这也需要一个Reader参数类似于java.io.BufferedReader)。什么是io.Reader?看看它的文档,它是一个接口,指定任何有Read方法的东西。许多类型有一个Read方法;最常见的是*os.File。所以,你可以使用os.Open

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