为什么Go语言字符串单索引取值返回ASCII码而非对应字符?
Go字符串索引与切片行为差异原因
首先明确Go语言中字符串的两个核心特性:
- Go的
string类型底层存储的是UTF-8编码的字节序列,下标索引访问(s[i])返回的是byte类型(等价于uint8),而非字符类型。 - 对
string执行切片操作(s[start:end]),返回值仍然是string类型,而非字节切片。
为什么vendor1[0]输出67
你代码里的vendor1[0]取到的是字符串第一个位置的字节值,大写字母C的ASCII编码值恰好是十进制的67。fmt.Println打印byte类型值时默认输出其十进制数值,所以你看到的是67而非字符C。
如果要输出对应字符,可以显式做类型转换:
fmt.Println(string(vendor1[0])) // 输出 C
为什么切片操作返回预期字符串
当你使用vendor1[1:4]这类切片语法操作字符串时,Go会把选中的字节序列重新封装为string类型返回,fmt.Println打印string类型时会直接输出UTF-8解码后的文本内容,所以得到的就是你预期的字符片段。
额外注意
如果字符串中包含中文、emoji这类占多个字节的UTF-8字符,直接用下标访问只会拿到单个字节的编码值,无法得到完整字符,需要遍历字符串时建议使用for range语法,可以自动按rune类型(等价于int32,存储完整的Unicode码点)读取每个字符。
内容的提问来源于stack exchange,提问作者Parry Wang
相关产品推荐
相关产品推荐

