为什么数组由Golang中的stdin生成,将最后一项转换为零?

时间:2016-07-31 19:43:21

标签: go

注意:我是StackOverflow和编程新手,所以如果我的问题不是“专业”或“格式良好”,请原谅我。

我使用以下Go(Golang)代码从终端捕获一些以空格分隔的数字(字符串),然后将其拆分为一个切片。后来我通过从字符串切片一次获取一个项目并将其转换为float64并将其附加到float64-slice,将此切片转换为一片float64。 然后我将返回生成的float64切片并将其打印在main函数中。 问题是当我将一些以空格分隔的数字传递给终端时,最后一位数字被转换为零。

例如,如果我通过1 2 3 4 5我希望结果切片为[1 2 3 4 5],但它会将切片显示为[1 2 3 4 0]

我正在尝试从最近5个小时开始,但我无法找到我所缺少的东西或弄乱。

代码:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    a := ReadInput()
    fmt.Println(a)
}

func ReadInput() []float64 {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, _ := reader.ReadString('\n')

    textSlice := strings.Split(text, " ")
    floatsSlice := make([]float64, 0)
    for _, elem := range textSlice {
        i, _ := strconv.ParseFloat(elem, 64)
        floatsSlice = append(floatsSlice, i)
    }

    return floatsSlice
}

提前谢谢你!

1 个答案:

答案 0 :(得分:1)

  

ReadString读取直到输入中第一次出现delim,
   返回包含数据的字符串,包括   分隔符。

所以,strings.Split(text, " ")不会分割最后\n个字符,所以:
您可以使用strings.Fields(text)代替strings.Split(text, " ") 并始终检查错误:
像这样的工作示例代码:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    a := ReadInput()
    fmt.Println(a)
}

func ReadInput() []float64 {
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Enter text: ")
    text, err := reader.ReadString('\n')
    if err != nil {
        fmt.Println(err)
    }

    textSlice := strings.Fields(text)
    floatsSlice := make([]float64, 0)
    for _, elem := range textSlice {
        i, err := strconv.ParseFloat(elem, 64)
        if err != nil {
            fmt.Println(err)
        }
        floatsSlice = append(floatsSlice, i)
    }

    return floatsSlice
}