go - 检查一个字符串只包含 ASCII 字符

标签 go ascii

Go 是否有任何方法或建议如何检查字符串是否仅包含 ASCII 字符?正确的做法是什么?

根据我的研究,解决方案之一是检查任何大于 127 的字符。

func isASCII(s string) bool {
    for _, c := range s {
        if c > unicode.MaxASCII {
            return false
        }
    }

    return true
}

最佳答案

在 Go 中,我们关心性能,因此,我们会对您的代码进行基准测试:

func isASCII(s string) bool {
    for _, c := range s {
        if c > unicode.MaxASCII {
            return false
        }
    }
    return true
}

BenchmarkRange-4    20000000    82.0 ns/op

一个更快(更好,更惯用)的版本,它避免了不必要的 rune 转换:

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
$

关于go - 检查一个字符串只包含 ASCII 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53069040/

相关文章:

go - golang 谷歌 Protocol Buffer 中的错误

javascript - 我有 ascii 密码的编码功能,但需要有关如何解码它的帮助

python - ASCII 字 rune 本对齐

java - 在java中将字符转换为ASCII数值

go - 如何理解uintptr和struct之间的关系?

mysql - 如何将 form/golang 中的连接池连接到没有数据库的实例?

go - 设置方法以使用结构 slice

validation - Golang 验证器无效的内存地址或 nil 指针取消引用

c++ - 仿射密码解密,大写和小写输出均不同

c - 值低于 0x20 的 char 变量会转换成什么?