3 回答
TA贡献1836条经验 获得超3个赞
由于您是按字符比较并且没有字符介于 1 和 9 之间,因此我认为您的解决方案是可以的,但它没有考虑后面的其他数字。
例如,如果thestr
是"192.something.invalid"
它不再是一个IP。
我建议使用正则表达式来检查 IP。
就像是
\b(?:\d{1,3}\.){3}\d{1,3}\b
TA贡献1900条经验 获得超5个赞
您的解决方案完全没问题。
但请注意,Go 中的字符串存储为只读字节切片,其中字节是 UTF-8 编码的字节序列,并且索引字符串索引其bytes,而不是它的符文(字符)。但是由于十进制数字 ( '0'..'9') 恰好有一个字节,因此在这种情况下可以测试第一个byte,但首先您应该测试 iflen(s) > 0或s != ""。
这里有一些其他的选择,在Go Playground上尝试所有:
1) 测试字节范围:
这是您的解决方案,可能是最快的解决方案:
s := "12asdf"
fmt.Println(s[0] >= '0' && s[0] <= '9')
2)使用fmt.Sscanf():
注意:如果string以负数开头,这也接受,决定它是否对你来说是一个问题(例如 accepts "-12asf")。
i := 0
n, err := fmt.Sscanf(s, "%d", &i)
fmt.Println(n > 0, err == nil) // Both n and err can be used to test
3)使用unicode.IsDigit():
fmt.Println(unicode.IsDigit(rune(s[0])))
4)使用regexp:
我可能永远不会使用它,因为这是迄今为止最慢的,但它是:
r := regexp.MustCompile(`^\d`)
fmt.Println(r.FindString(s) != "")
或者:
r := regexp.MustCompile(`^\d.*`)
fmt.Println(r.MatchString(s))
- 3 回答
- 0 关注
- 178 浏览
添加回答
举报