В 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» обеспечивают многофакторное выполнение. Выражение или тип
Спецификатор сравнивается с «делами» внутри «переключателя» для определения
какую ветку выполнить.
Выключатели экспрессии
В переключателе выражений вычисляется выражение переключателя и
выражения case, которые не должны быть константами, оцениваются
слева направо и сверху вниз; первый, равный переключателю
выражение запускает выполнение операторов связанных
дело; другие дела пропущены. Если ни один случай не соответствует и есть
«по умолчанию», его операторы выполняются. Там может быть не более одного
регистр по умолчанию, и он может появляться где угодно в операторе «switch».
Выражению-переключателю может предшествовать простое утверждение, которое
выполняется до вычисления выражения.
Проходные заявления
Оператор "fallthrough" передает управление первому оператору
следующее предложение case в выражении «switch». Может быть
используется только как последний непустой оператор в таком предложении.
switch b := s[i]; {
// ...
}
эквивалентно
switch b := s[i]; true {
// ...
}
эквивалентно
{
b := s[i]
switch true {
// ...
}
}
Простой оператор b := s[i]
объявляет b
локальной switch { }
локальной переменной блока операторов.
Выражения случая оцениваются и сравниваются с true
. Если ни один из них не соответствует истине, берется default
.
Go, в отличие от C, требует явного 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)
}
}