拆分字符串并将子字符串转换为Go中的整数

时间:2017-11-06 16:17:13

标签: string variables go split substring

我有一个包含1,2,3之类的变量。这些实际上是三个值,我希望在三个变量中有v1v2v3(但在数组中)。

现在我正在通过以下方式做到这一点:

tmp := strings.Split(*w, ",")
sw, _ := strconv.Atoi(tmp[0])
rw, _ := strconv.Atoi(tmp[1])
pw, _ := strconv.Atoi(tmp[2])

这很有效,虽然它非常重复,并且在Go中没有感觉感觉

什么是更清洁的方法来解决这个问题?

3 个答案:

答案 0 :(得分:9)

使用特定格式从string解析数据并将解析后的值存储到变量中是一项完美的任务,并且可以使用fmt.Sscanf()轻松完成:

src := "1,2,3"

var a, b, c int

parsed, err := fmt.Sscanf(src, "%d,%d,%d", &a, &b, &c)
fmt.Println(parsed, err, a, b, c)

输出(在Go Playground上尝试):

3 <nil> 1 2 3

严格要求

如上所述,这非常宽松,并且还会成功解析"1,2,3,""1,2,3,4"输入。这可能是也可能不是问题(取决于您的情况)。如果你想严格要求,你可以应用这个小技巧:

var temp int
parsed, err := fmt.Sscanf(src+",1", "%d,%d,%d,%d", &a, &b, &c, &temp)

我们所做的是添加一个与输入相匹配的数字。如果原始输入没有以数字结尾(例如"1,2,3,"),则解析将失败并出现非nil错误,并且上面的示例给出:

3 expected integer 1 2 3

Go Playground上试一试。当然它会继续解析“有效”输入而没有任何错误。

请注意,这仍然接受输入"1,2,3,4"。我们可以将这个技巧“减少”为单个字符,并且我们不一定需要“目标”变量来存储它,它可以简单地由格式字符串指定,如下例所示:

parsed, err := fmt.Sscanf(src+"~", "%d,%d,%d~", &a, &b, &c)

我们在输入中附加一个特殊字符不太可能,我们希望格式字符串中有特殊字符。尝试解析无效输入(例如"1,2,3,""1,2,3,4")将导致错误,例如:

3 input does not match format 1 2 3

Go Playground上尝试。

答案 1 :(得分:0)

最好的选择是使用地图:

Debug/Properties/Application/Web root

答案 2 :(得分:0)

如果你对切片结果很好,你可以用切片来做:

tmp := strings.Split(*w, ",")
values := make([]int, 0, len(tmp))
for _, raw := range tmp {
    v, err := strconv.Atoi(raw)
    if err != nil {
        log.Print(err)
        continue
    }
    values = append(values, v)
}

工作场所示例:https://play.golang.org/p/Y-QHmHP8Iy