我有一个包含1,2,3
之类的变量。这些实际上是三个值,我希望在三个变量中有v1
,v2
,v3
(但在数组中不)。
现在我正在通过以下方式做到这一点:
tmp := strings.Split(*w, ",")
sw, _ := strconv.Atoi(tmp[0])
rw, _ := strconv.Atoi(tmp[1])
pw, _ := strconv.Atoi(tmp[2])
这很有效,虽然它非常重复,并且在Go中没有感觉感觉。
什么是更清洁的方法来解决这个问题?
答案 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)
}