如何将Scanner封装为独立函数并使其正常工作?
问题分析与解决
你这段代码的问题出在Go的值传递机制上:TakeInput函数的参数value string是传入变量的副本,函数里对value的赋值只会修改这个副本,根本影响不到main函数里定义的name和school变量,所以最后输出的是空值。
下面给两种可行的解决办法:
方法一:使用指针传递参数
把函数参数改成指针类型,直接操作原始变量的内存地址,就能修改原始变量的值:
package main import ( "bufio" "fmt" "os" ) func TakeInput(value *string) { scanner := bufio.NewScanner(os.Stdin) if scanner.Scan() { *value = scanner.Text() // 解引用指针,修改原始变量内容 } if err := scanner.Err(); err != nil { fmt.Println("Error encountered:", err) } } func main() { var name, school string fmt.Printf("Enter your name: ") TakeInput(&name) // 传入变量的内存地址 fmt.Printf("Enter your school name: ") TakeInput(&school) fmt.Println(name, school) }
方法二:让函数返回读取结果
让TakeInput直接返回读取到的字符串,main函数接收返回值即可,这种写法更贴合Go的编码风格:
package main import ( "bufio" "fmt" "os" ) func TakeInput() string { scanner := bufio.NewScanner(os.Stdin) if scanner.Scan() { return scanner.Text() } if err := scanner.Err(); err != nil { fmt.Println("Error encountered:", err) } return "" } func main() { var name, school string fmt.Printf("Enter your name: ") name = TakeInput() fmt.Printf("Enter your school name: ") school = TakeInput() fmt.Println(name, school) }
内容的提问来源于stack exchange,提问作者Veins Tree
相关产品推荐
相关产品推荐

