2 回答
TA贡献1828条经验 获得超3个赞
在 Go 中,编写一个简单的函数。例如,
package main
import (
"fmt"
)
func isStandard(s string) bool {
for i := 0; i < len(s); i++ {
switch b := s[i]; {
case b >= 'a' && b <= 'z':
continue
case b >= 'A' && b <= 'Z':
continue
case b >= '0' && b <= '9':
continue
default:
return false
}
}
return true
}
func main() {
fmt.Println(isStandard(`ABCabc123`))
fmt.Println(isStandard(`#}{&*"(£)`))
}
游乐场:https://play.golang.org/p/Y2KjDcHSupH
输出:
true false
Go 编程语言规范
开关语句
“Switch”语句提供多路执行。将表达式或类型说明符与“开关”内的“案例”进行比较,以确定要执行的分支。
表情开关
在表达式 switch 中,switch 表达式被求值,case 表达式不需要是常量,从左到右和从上到下求值;第一个等于 switch 表达式的触发执行关联案例的语句;其他情况被跳过。如果没有匹配的案例并且存在“默认”案例,则执行其语句。最多可以有一个 default case,它可以出现在“switch”语句的任何地方。
switch 表达式之前可以有一个简单的语句,该语句在计算表达式之前执行。
失败声明
“fallthrough”语句将控制转移到表达式“switch”语句中下一个 case 子句的第一条语句。它只能用作此类子句中的最终非空语句。
switch b := s[i]; {
// ...
}
相当于
switch b := s[i]; true {
// ...
}
相当于
{
b := s[i]
switch true {
// ...
}
}
简单语句声明b := s[i]
为b
语句switch { }
块局部变量。
评估案例表达式并与 进行比较true
。如果没有一个是真的,则default
采取。
与 C 不同,Go 需要显式的fallthrough
.
ASCII 是 Unicode UTF-8 的子集。由于标准字符都是ASCII,我们可以简单的比较字节。
这是一个简单的基准。
输出:
$ go test standard_test.go -bench=. -benchmem
BenchmarkPeterSO-8 200000000 8.10 ns/op 0 B/op 0 allocs/op
BenchmarkJubobs-8 10000000 222 ns/op 0 B/op 0 allocs/op
$
standard_test.go:
package main
import (
"regexp"
"testing"
)
func isStandard(s string) bool {
for i := 0; i < len(s); i++ {
switch b := s[i]; {
case b >= 'a' && b <= 'z':
continue
case b >= 'A' && b <= 'Z':
continue
case b >= '0' && b <= '9':
continue
default:
return false
}
}
return true
}
func BenchmarkPeterSO(b *testing.B) {
std := `ABCabc123`
for N := 0; N < b.N; N++ {
isStandard(std)
}
}
var (
whitelist = "A-Za-z0-9"
disallowed = regexp.MustCompile("[^" + whitelist + " ]+")
)
func IsValid(s string) bool {
return !disallowed.MatchString(s)
}
func BenchmarkJubobs(b *testing.B) {
std := `ABCabc123`
for N := 0; N < b.N; N++ {
IsValid(std)
}
}
TA贡献1829条经验 获得超9个赞
由于白名单可以很容易地定义为正则表达式,因此使用regexp.MatchString
:
package main
import (
"fmt"
"regexp"
)
var (
whitelist = "A-Za-z0-9"
disallowed = regexp.MustCompile(fmt.Sprintf("[^%s]+", whitelist))
)
func main() {
fmt.Println(IsValid("foobar007"))
fmt.Println(IsValid("foo%bar&007"))
}
func IsValid(s string) bool {
return !disallowed.MatchString(s)
}
- 2 回答
- 0 关注
- 123 浏览
添加回答
举报