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

Kar*_*och 5 string variables split substring go

我有一个包含类似内容的变量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])
Run Code Online (Sandbox Code Playgroud)

这是有效的,虽然它非常重复,并且在Go中感觉不对.

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

icz*_*cza 10

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)
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

3 <nil> 1 2 3
Run Code Online (Sandbox Code Playgroud)

严格要求

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

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

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

3 expected integer 1 2 3
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试一下.当然,它将继续解析"有效"输入而没有任何错误.

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

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

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

3 input does not match format 1 2 3
Run Code Online (Sandbox Code Playgroud)

Go Playground尝试一下.