面试题答案
一键面试package main
import (
"fmt"
)
func convertStringToBytes(s string) ([]byte, error) {
if len(s) == 0 {
return nil, fmt.Errorf("empty string")
}
// 尝试直接转换
byteSlice := []byte(s)
// 这里虽然Go语言中字符串底层是UTF - 8编码,可以直接转换为字节切片,
// 但为了检测无效UTF - 8编码,需要使用如下方法
for len(byteSlice) > 0 {
r, size := rune(byteSlice[0]), 1
if r < 0x80 {
// 单字节字符
} else if r < 0xE0 {
size = 2
} else if r < 0xF0 {
size = 3
} else if r < 0xF8 {
size = 4
} else {
return nil, fmt.Errorf("invalid UTF - 8 encoding")
}
if len(byteSlice) < size {
return nil, fmt.Errorf("invalid UTF - 8 encoding")
}
for i := 1; i < size; i++ {
if byteSlice[i]&0xC0 != 0x80 {
return nil, fmt.Errorf("invalid UTF - 8 encoding")
}
}
byteSlice = byteSlice[size:]
}
return []byte(s), nil
}
你可以使用以下方式调用这个函数:
func main() {
s := "hello世界"
result, err := convertStringToBytes(s)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Byte slice:", result)
}
}
上述代码定义了一个 convertStringToBytes
函数,该函数将UTF - 8编码的字符串转换为字节切片,并在遇到无效UTF - 8编码时返回有意义的错误信息。在 main
函数中,演示了如何调用这个函数。
- 转换逻辑:
- 首先检查字符串是否为空,如果为空,返回错误。
- 由于Go语言字符串底层是UTF - 8编码,可以直接转换为字节切片
[]byte(s)
。 - 然后遍历字节切片,根据UTF - 8编码规则检查每个字符是否有效。如果发现无效字符,返回错误。
- 错误处理:
- 如果字符串为空,返回
empty string
错误。 - 如果发现无效的UTF - 8编码,返回
invalid UTF - 8 encoding
错误。
- 如果字符串为空,返回