Input 如何在Go中使用strconv.Atoi()方法?

Input 如何在Go中使用strconv.Atoi()方法?,input,go,casting,Input,Go,Casting,我试图在这个小程序中获得用户输入。我用strconv.Atoi()方法尝试了几种方法(我的输入显然是一个字符串,我正在尝试将其转换为整数)。这是我的第一次尝试: package main import ( "fmt" "strconv" ) func main() { //fmt.Println(strconv.Itoa) fmt.Println("

我试图在这个小程序中获得用户输入。我用
strconv.Atoi()
方法尝试了几种方法(我的输入显然是一个字符串,我正在尝试将其转换为整数)。这是我的第一次尝试:

package main
    import (
        "fmt"
        "strconv"
    )
    
    func main() {
        //fmt.Println(strconv.Itoa)
        fmt.Println("Say something, in numbers.")
        var inputstr string
        fmt.Scanln("%s", &inputstr)
        input := strconv.Atoi(inputstr)
        output := (input * 2)
        outputstr := strconv.Itoa(output)
        fmt.Println(outputstr)
    }
在编译时出现以下错误:

(第19行)单值上下文中的多值strconv.Atoi()

然后我查看了Godocs,并试图自己解决这个问题,然后意识到也会返回一个错误值。所以,我改变了主意

input := strconv.Atoi(inputstr)

现在它编译得很好,没有任何错误。然而,当我运行程序时,我得到的是:

用数字说话

0


然后它退出。。。我做错了什么?我相信这是一个关于
Atoi()
方法的问题,但如果是关于
Scanln()
的,请纠正我。

问题原来是Scanln。由于%s的原因,Scanln正在返回一个错误
而不是指针。这将使inputstr留空,当将其提供给Atoi时,将返回一个错误:
strconv.ParseInt:parsing”“:无效语法

在不改变Atoi的情况下,按如下方式使用Scanf:

func main() {
    //fmt.Println(strconv.Itoa)
    fmt.Println("Say something, in numbers.")
    var inputstr string

    //fmt.Scanln("%s", &inputstr)
    _, err := fmt.Scanf("%s", &inputstr)
    if err != nil {
        fmt.Println(err)
    }
    input, e := strconv.Atoi(inputstr)
    if e != nil {
        fmt.Println(e)
    }
    output := (input * 2)
    outputstr := strconv.Itoa(output)
    fmt.Println(outputstr)
}

最简单的解决方案可能是从Scanln中删除“%s”。

您应该处理错误,而不仅仅是忽略它们。他们可能会帮助你诊断问题。你完全正确。我在这里做的是糟糕的编程,但最重要的是我需要一个关于如何工作的解释。所以,我来这里…所以基本上,“%s”只是一个将输入转换为字符串的格式字符?实际上,%s被用作Sscan的格式字符,但在您的代码中,它有两个错误,一个来自
Scanf(“%s”,…)
不喜欢%s,另一个来自
Atoi
不喜欢空字符串。
func main() {
    //fmt.Println(strconv.Itoa)
    fmt.Println("Say something, in numbers.")
    var inputstr string

    //fmt.Scanln("%s", &inputstr)
    _, err := fmt.Scanf("%s", &inputstr)
    if err != nil {
        fmt.Println(err)
    }
    input, e := strconv.Atoi(inputstr)
    if e != nil {
        fmt.Println(e)
    }
    output := (input * 2)
    outputstr := strconv.Itoa(output)
    fmt.Println(outputstr)
}