Многие не определены, но я считаю, что для умного разработчика вам нужно создать новые app_ids для каждого проекта, который вам нужен для подключения facebook. Просто мое мнение. Это также позволяет вам отслеживать множество вещей.
Поскольку белый список может быть легко определен как регулярное выражение, используйте 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)
}
( детская площадка )
В 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».
Выражению-переключателю может предшествовать простое выражение, которое выполняется до того, как выражение будет оценено.
Оператор «fallthrough» передает управление первому оператору следующего предложения case в выражении «switch». Он может использоваться только как последнее непустое утверждение в таком предложении.
blockquote>
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) } }