我想从命令行读取标准输入,但在提示输入之前,我的尝试已经以程序退出而告终。我正在寻找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)
}

当前回答

试试下面的代码:

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

其他回答

试试下面的代码:

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

总是尽量使用bufio。NewScanner用于从控制台收集输入。正如其他人所提到的,有多种方法可以完成这项工作,但Scanner最初的目的是完成这项工作。Dave Cheney解释了为什么你应该使用Scanner而不是bufio。读者的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)等。

编辑:原始帖子中链接的推文无法访问。但是,您可以从这个标准库文档中找到使用Scanner的官方参考:https://pkg.go.dev/bufio@go1.17.6#example-Scanner-Lines

你不妨试试:

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

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

我不知道这个积木有什么问题

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)

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

你需要提供一个指向你想要扫描的变量的指针,如下所示:

fmt.scan(&text2)