如何在单独的函数中编写扫描仪以使其工作?

在此代码中,我创建了一个函数,该函数TakeInput()也将接受用户输入,包括空格。但每当我运行此代码并输入姓名和学校名称时,它都会为我打印数据。


尽管如果我写的scanner没有任何功能,它会获取带有空格的数据。


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)

}


蝴蝶不菲
浏览 123回答 1
1回答

杨魅力

每个参数都是函数内部的本地副本。您必须将指针传递给TakeInput()(例如&name和&school)并修改指向的值(例如*value = scanner.Text(),否则您只修改函数返回时丢弃的副本。例如: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)}还要注意bufio.Scanner有一个内部缓冲区。它可能读取的内容多于返回的内容,当您bufio.Scanner在另一个TakeInput()调用中创建新的内容时,它可能无法读取以前读取、缓冲和丢弃的数据。所以在外部创建扫描仪TakeInput(),例如func TakeInput(scanner *bufio.Scanner, value *string) {    if scanner.Scan() {        *value = scanner.Text()    }    if err := scanner.Err(); err != nil {        fmt.Println("Error encountered:", err)    }}func main() {    scanner := bufio.NewScanner(os.Stdin)    var name, school string    fmt.Printf("Enter your name: ")    TakeInput(scanner, &name)    fmt.Printf("Enter your school name: ")    TakeInput(scanner, &school)    fmt.Println(name, school)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go