将控制台的字符串输入切片转换为数字切片

时间:2017-09-10 18:10:10

标签: go slice type-conversion

我正在尝试编写一个Go脚本,该脚本接收用户希望的逗号分隔坐标线,将坐标字符串拆分并转换为float64,将每一行存储为切片,然后追加每个切片在一片切片中供以后使用。

示例输入是:

1.1,2.2,3.3
3.14,0,5.16

示例输出是:

[[1.1 2.2 3.3],[3.14 0 5.16]]

Python中的等价物是

def get_input():
    print("Please enter comma separated coordinates:")
    lines = []
    while True:
        line = input()
        if line:
            line = [float(x) for x in line.replace(" ", "").split(",")]
            lines.append(line)
        else:
            break
    return lines

但是我在Go中写的内容似乎太长了(粘贴在下面),而且我创建了很多变量而没有像Python中那样更改变量类型的能力。由于我刚刚开始编写Golang来学习它,我担心我的脚本很长,因为我正在尝试将Python思想转换为Go。因此,我想问一些关于如何在Go风格中更短更简洁地编写脚本的建议?谢谢。

package main

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

func main() {
    inputs := get_input()
    fmt.Println(inputs)
}

func get_input() [][]float64 {
    fmt.Println("Please enter comma separated coordinates: ")

    var inputs [][]float64

    scanner := bufio.NewScanner(os.Stdin)
    for scanner.Scan() {
        if len(scanner.Text()) > 0 {
            raw_input := strings.Replace(scanner.Text(), " ", "", -1)
            input := strings.Split(raw_input, ",")
            converted_input := str2float(input)
            inputs = append(inputs, converted_input)
        } else {
            break
        }
    }

    return inputs
}

func str2float(records []string) []float64 {

    var float_slice []float64

    for _, v := range records {
        if s, err := strconv.ParseFloat(v, 64); err == nil {
            float_slice = append(float_slice, s)
        }
    }

    return float_slice
}

2 个答案:

答案 0 :(得分:2)

仅使用字符串函数:

package main

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

func main() {
    scanner := bufio.NewScanner(os.Stdin)
    var result [][]float64
    var txt string
    for scanner.Scan() {
        txt = scanner.Text()
        if len(txt) > 0 {
            values := strings.Split(txt, ",")
            var row []float64
            for _, v := range values {
                fl, err := strconv.ParseFloat(strings.Trim(v, " "), 64)
                if err != nil {
                    panic(fmt.Sprintf("Incorrect value for float64 '%v'", v))
                }
                row = append(row, fl)
            }
            result = append(result, row)
        }
    }
    fmt.Printf("Result: %v\n", result)
}

执行命令

$ printf "1.1,2.2,3.3
3.14,0,5.16
2,45,76.0, 45 , 69" | go run experiment2.go

Result: [[1.1 2.2 3.3] [3.14 0 5.16] [2 45 76 45 69]]

答案 1 :(得分:1)

使用给定的输入,您可以连接它们以生成JSON字符串,然后解组(反序列化):

func main() {
    var lines []string
    for {
        var line string
        fmt.Scanln(&line)
        if line == "" {
            break
        }
        lines = append(lines, "["+line+"]")
    }
    all := "[" + strings.Join(lines, ",") + "]"
    inputs := [][]float64{}
    if err := json.Unmarshal([]byte(all), &inputs); err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(inputs)
}