3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
在 Go 中,我們關(guān)心性能,因此,我們會(huì)對(duì)您的代碼進(jìn)行基準(zhǔn)測(cè)試:
func isASCII(s string) bool {
for _, c := range s {
if c > unicode.MaxASCII {
return false
}
}
return true
}
BenchmarkRange-4 20000000 82.0 ns/op
一個(gè)更快(更好,更慣用)的版本,它避免了不必要的符文轉(zhuǎn)換:
func isASCII(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] > unicode.MaxASCII {
return false
}
}
return true
}
BenchmarkIndex-4 30000000 55.4 ns/op
ascii_test.go:
package main
import (
"testing"
"unicode"
)
func isASCIIRange(s string) bool {
for _, c := range s {
if c > unicode.MaxASCII {
return false
}
}
return true
}
func BenchmarkRange(b *testing.B) {
str := ascii()
b.ResetTimer()
for N := 0; N < b.N; N++ {
is := isASCIIRange(str)
if !is {
b.Fatal("notASCII")
}
}
}
func isASCIIIndex(s string) bool {
for i := 0; i < len(s); i++ {
if s[i] > unicode.MaxASCII {
return false
}
}
return true
}
func BenchmarkIndex(b *testing.B) {
str := ascii()
b.ResetTimer()
for N := 0; N < b.N; N++ {
is := isASCIIIndex(str)
if !is {
b.Log("notASCII")
}
}
}
func ascii() string {
byt := make([]byte, unicode.MaxASCII+1)
for i := range byt {
byt[i] = byte(i)
}
return string(byt)
}
輸出:
$ go test ascii_test.go -bench=.
BenchmarkRange-4 20000000 82.0 ns/op
BenchmarkIndex-4 30000000 55.4 ns/op
$

TA貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
看起來(lái)你的方法是最好的。
ASCII簡(jiǎn)單定義為:
ASCII 將 128 個(gè)指定字符編碼為七位整數(shù)
因此,字符的值為 0-2?7(或 0-127、0x0-0x7F)。
Go 無(wú)法檢查字符串中的每個(gè)符文(或切片中的字節(jié))是否具有特定范圍內(nèi)的數(shù)值,因此您的代碼似乎是最好的方法。

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
另外一個(gè)選擇:
package main
import "golang.org/x/exp/utf8string"
func main() {
{
b := utf8string.NewString("south north").IsASCII()
println(b) // true
}
{
b := utf8string.NewString("??????????").IsASCII()
println(b) // false
}
}
https://pkg.go.dev/golang.org/x/exp/utf8string#String.IsASCII
- 3 回答
- 0 關(guān)注
- 196 瀏覽
添加回答
舉報(bào)