2 回答

TA貢獻1828條經(jīng)驗 獲得超3個贊
在 Go 中,編寫一個簡單的函數(shù)。例如,
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 編程語言規(guī)范
開關(guān)語句
“Switch”語句提供多路執(zhí)行。將表達式或類型說明符與“開關(guān)”內(nèi)的“案例”進行比較,以確定要執(zhí)行的分支。
表情開關(guān)
在表達式 switch 中,switch 表達式被求值,case 表達式不需要是常量,從左到右和從上到下求值;第一個等于 switch 表達式的觸發(fā)執(zhí)行關(guān)聯(lián)案例的語句;其他情況被跳過。如果沒有匹配的案例并且存在“默認”案例,則執(zhí)行其語句。最多可以有一個 default case,它可以出現(xiàn)在“switch”語句的任何地方。
switch 表達式之前可以有一個簡單的語句,該語句在計算表達式之前執(zhí)行。
失敗聲明
“fallthrough”語句將控制轉(zhuǎn)移到表達式“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,我們可以簡單的比較字節(jié)。
這是一個簡單的基準。
輸出:
$ 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條經(jīng)驗 獲得超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 關(guān)注
- 162 瀏覽
添加回答
舉報