如何从控制台线读取输入?

时间:2014-01-03 02:33:41

标签: go

我想从命令行读取输入,但是在我提示输入之前,我的尝试已经结束,程序退出。我在C#中寻找相当于Console.ReadLine()的东西。

这就是我目前所拥有的:

package main

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

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')
    fmt.Println(text)

    fmt.Println("Enter text: ")
    text2 := ""
    fmt.Scanln(text2)
    fmt.Println(text2)

    ln := ""
    fmt.Sscanln("%v", ln)
    fmt.Println(ln)
}

11 个答案:

答案 0 :(得分:241)

我不确定该块有什么问题

reader := bufio.NewReader(os.Stdin)
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Println(text)

因为它适用于我的机器。但是,对于下一个块,您需要一个指向您要为其分配输入的变量的指针。尝试将fmt.Scanln(text2)替换为fmt.Scanln(&text2)。不要使用Sscanln,因为它解析了内存中的字符串而不是stdin。如果您想要执行类似于您尝试执行的操作,请将其替换为fmt.Scanf("%s", &ln)

如果这仍然不起作用,你的罪魁祸首可能是一些奇怪的系统设置或一个有缺陷的IDE。

答案 1 :(得分:103)

你也可以试试:

scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if scanner.Err() != nil {
    // handle error.
}

答案 2 :(得分:76)

我认为更为标准的做法是:

package main

import "fmt"

func main() {
    fmt.Print("Enter text: ")
    var input string
    fmt.Scanln(&input)
    fmt.Print(input)
}

看看scan godoc:http://godoc.org/fmt#Scan

  

扫描扫描从标准输入读取的文本,将连续的空格分隔值存储到连续的参数中。换行计为空格。

     

Scanln与“扫描”类似,但在换行符处停止扫描,在最终项目之后必须有换行符或EOF。

答案 3 :(得分:9)

另一种在循环中读取多个输入的方法,可以处理带空格的输入:

package main
import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var text string
    for text != "q" {  // break the loop if text == "q"
        fmt.Print("Enter your text: ")
        scanner.Scan()
        text = scanner.Text()
        if text != "q" {
            fmt.Println("Your text was: ", text)
        }
    }
}

输出:

Enter your text: Hello world!
Your text was:  Hello world!
Enter your text: Go is awesome!
Your text was:  Go is awesome!
Enter your text: q

答案 4 :(得分:9)

始终尝试使用 bufio.NewScanner 从控制台收集输入。正如其他人所提到的,有多种方法可以完成这项工作,但Scanner最初是为了完成这项工作。 Dave Cheney解释了为什么你应该使用Scanner而不是bufio.Reader的ReadLine。

https://twitter.com/davecheney/status/604837853344989184?lang=en

以下是您的问题的代码段解答

package main

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

/*
 Three ways of taking input
   1. fmt.Scanln(&input)
   2. reader.ReadString()
   3. scanner.Scan()

   Here we recommend using bufio.NewScanner
*/

func main() {
    // To create dynamic array
    arr := make([]string, 0)
    scanner := bufio.NewScanner(os.Stdin)
    for {
        fmt.Print("Enter Text: ")
        // Scans a line from Stdin(Console)
        scanner.Scan()
        // Holds the string that scanned
        text := scanner.Text()
        if len(text) != 0 {
            fmt.Println(text)
            arr = append(arr, text)
        } else {
            break
        }

    }
    // Use collected inputs
    fmt.Println(arr)
}

如果您不想以编程方式收集输入,只需添加这些行

即可
   scanner := bufio.NewScanner(os.Stdin)
   scanner.Scan()
   text := scanner.Text()
   fmt.Println(text)

以上程序的输出将是:

Enter Text: Bob
Bob
Enter Text: Alice
Alice
Enter Text:
[Bob Alice]

以上程序收集用户输入并将其保存到数组中。我们也可以用特殊的角色打破这种流动。 Scanner为高级用法提供API,例如使用自定义函数进行拆分等,扫描不同类型的I / O流(Stdin,String)等。

答案 5 :(得分:4)

试试这段代码: -

var input string
func main() {
      fmt.Print("Enter Your Name=")
      fmt.Scanf("%s",&input)
      fmt.Println("Hello "+input)
      }

答案 6 :(得分:3)

我迟到了。但是一个班轮怎么样:

data, err := ioutil.ReadAll(os.Stdin)

答案 7 :(得分:3)

也可以这样:-

package main
import "fmt"     

func main(){
    var myname string
fmt.Scanf("%s", &myname)           
fmt.Println("Hello", myname)       
}

答案 8 :(得分:2)

干净地阅读几个提示值:

// Create a single reader which can be called multiple times
reader := bufio.NewReader(os.Stdin)
// Prompt and read
fmt.Print("Enter text: ")
text, _ := reader.ReadString('\n')
fmt.Print("Enter More text: ")
text2, _ := reader.ReadString('\n')
// Trim whitespace and print
fmt.Printf("Text1: \"%s\", Text2: \"%s\"\n",
    strings.TrimSpace(text), strings.TrimSpace(text2))

这是一个跑步:

Enter text: Jim
Enter More text: Susie
Text1: "Jim", Text2: "Susie"

答案 9 :(得分:0)

您需要提供指向要扫描的var的指针,如下所示:

fmt.scan(&text2)

答案 10 :(得分:0)

在我的情况下,程序没有等待,因为我正在使用watcher命令来自动运行程序。手动运行程序go run main.go导致“输入文本”并最终打印到控制台。

fmt.Print("Enter text: ")
var input string
fmt.Scanln(&input)
fmt.Print(input)