2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
在 Go 中,編寫(xiě)一個(gè)簡(jiǎn)單的函數(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(`#}{&*"(£)`))
}
游樂(lè)場(chǎng):https://play.golang.org/p/Y2KjDcHSupH
輸出:
true false
Go 編程語(yǔ)言規(guī)范
開(kāi)關(guān)語(yǔ)句
“Switch”語(yǔ)句提供多路執(zhí)行。將表達(dá)式或類型說(shuō)明符與“開(kāi)關(guān)”內(nèi)的“案例”進(jìn)行比較,以確定要執(zhí)行的分支。
表情開(kāi)關(guān)
在表達(dá)式 switch 中,switch 表達(dá)式被求值,case 表達(dá)式不需要是常量,從左到右和從上到下求值;第一個(gè)等于 switch 表達(dá)式的觸發(fā)執(zhí)行關(guān)聯(lián)案例的語(yǔ)句;其他情況被跳過(guò)。如果沒(méi)有匹配的案例并且存在“默認(rèn)”案例,則執(zhí)行其語(yǔ)句。最多可以有一個(gè) default case,它可以出現(xiàn)在“switch”語(yǔ)句的任何地方。
switch 表達(dá)式之前可以有一個(gè)簡(jiǎn)單的語(yǔ)句,該語(yǔ)句在計(jì)算表達(dá)式之前執(zhí)行。
失敗聲明
“fallthrough”語(yǔ)句將控制轉(zhuǎn)移到表達(dá)式“switch”語(yǔ)句中下一個(gè) case 子句的第一條語(yǔ)句。它只能用作此類子句中的最終非空語(yǔ)句。
switch b := s[i]; {
? ? // ...
}
相當(dāng)于
switch b := s[i]; true {
? ? // ...
}
相當(dāng)于
{
? ? b := s[i]
? ? switch true {
? ? ? ? // ...
? ? }?
}
簡(jiǎn)單語(yǔ)句聲明b := s[i]
為b
語(yǔ)句switch { }
塊局部變量。
評(píng)估案例表達(dá)式并與 進(jìn)行比較true
。如果沒(méi)有一個(gè)是真的,則default
采取。
與 C 不同,Go 需要顯式的fallthrough
.
ASCII 是 Unicode UTF-8 的子集。由于標(biāo)準(zhǔn)字符都是ASCII,我們可以簡(jiǎn)單的比較字節(jié)。
這是一個(gè)簡(jiǎn)單的基準(zhǔn)。
輸出:
$ 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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
由于白名單可以很容易地定義為正則表達(dá)式,因此使用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)注
- 172 瀏覽
添加回答
舉報(bào)