如何从控制台线读取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)