You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:39:45