如何从控制台线读取input?

我想从命令行读取input,但是在提示input之前,我的尝试已经结束,程序退出。 我正在寻找相当于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) } 

我不确定这个区块有什么问题

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

因为它在我的机器上工作。 但是,对于下一个块,您需要一个指向要分配input的variables的指针。 尝试用fmt.Scanln(text2) fmt.Scanln(&text2)replacefmt.Scanln(text2) fmt.Scanln(&text2) 。 不要使用Sscanln ,因为它parsing已经在内存中的string,而不是从标准input。 如果你想做一些你想做的事情,把它replace成fmt.Scanf("%s", &ln)

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

你也可以试试:

 scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { fmt.Println(scanner.Text()) } if scanner.Err() != nil { // handle error. } 

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

 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

扫描扫描从标准input中读取的文本,将连续的空格分隔的值存储为连续的参数。 换行占据空间。

Scanln与Scan类似,但停止在换行符处扫描,并且在最后的项目之后必须有换行符或EOF。

读取多个input的另一种方法是使用空格处理input:

 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 

试试这个代码:

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

干净地阅读一对夫妇提示值:

 // 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" 

你可以使用闭包来抽象这个东西:

 func makeReader() func(string) string { reader := bufio.NewReader(os.Stdin) return func (s string) string { fmt.Println(s) txt, _ := reader.ReadString('\n') return txt } } 

你需要提供一个指向你想要扫描的var的指针,像这样:

 fmt.scan(&text2)