字节面试:str := “Go 测试“`,如果直接 `str[:3]` 会发生什么

简介: Go字符串底层是字节数组,`str[:3]`按字节截取会导致UTF-8中文被截断,产生乱码。正确做法是先转`[]rune`再切片,确保按字符而非字节操作——这是Go开发必知的编码坑点。

面试官:str := "Go 测试",如果直接 str[:3] 会发生什么?
候选人:得到 "Go 测"
面试官:❌ 错,是乱码。

这道题考察的是 Go 字符串底层原理UTF-8 编码,属于必知必会的基础坑点。

1️⃣ 错误示范:直接按索引截取

package main

import "fmt"

func main() {
   
    str := "Go 测试"
    // ❌ 错误:直接按字节截取
    sub := str[:3] 
    fmt.Println(sub) 
}

输出结果:

Go  // 或者乱码,因为"测"字被截断了

2️⃣ 为什么会出现乱码?

🔍 核心原因:Go 字符串是 字节数组

在 Go 中,string 底层是 []byte,索引操作 str[i] 或切片 str[:n] 按字节(byte)计算,而不是按字符(character)计算。

📊 内存布局图解

字符串:"G"  "o"  "测"       "试"
字节数: 1    1    3         3
索引:  [0]  [1]  [2][3][4]  [5][6][7]
                ↑
           str[:3] 截到这里
  • G:ASCII 码,占 1 字节
  • o:ASCII 码,占 1 字节
  • :UTF-8 中文,占 3 字节
  • :UTF-8 中文,占 3 字节

str[:3] 取的是前 3 个字节

  1. G (完整)
  2. o (完整)
  3. 的第 1 个字节 (不完整)

结果:UTF-8 解码器遇到不完整的中文编码,显示为乱码()。

3️⃣ 正确做法:转 []rune 再截取

Rune 是 Go 中的 Unicode 码点类型,一个 rune 代表一个完整的字符。

package main

import "fmt"

func main() {
   
    str := "Go 测试"

    // ✅ 正确:先转 rune 切片,再截取
    runes := []rune(str)
    sub := string(runes[:3]) // 取前 3 个字符

    fmt.Println(sub) // 输出:Go 测
}

4️⃣ 面试加分项:性能优化

如果字符串很长,频繁转 []rune 会有内存开销。面试时可以补充:

  1. 短字符串:直接 []rune 转换,代码清晰。
  2. 长字符串/高性能场景:使用 utf8.RuneCountInString 先判断长度,或遍历 range 截取。
// 遍历 range 自动按 rune 解码
for i, r := range str {
   
    // i 是字节索引,r 是 rune
    if i == 3 {
    break } // 需配合逻辑控制
}

5️⃣ 一张表总结

操作 单位 适用场景 风险
str[:n] 字节 (byte) 纯英文/ASCII 中文乱码
[]rune(str)[:n] 字符 (rune) 含中文/多语言 内存开销
range str 字符 (rune) 遍历处理 性能较好

💡 记忆口诀

Go 串底层是字节,中文三字节别切。
要想截取不乱码,转成 rune 再操作。


✅ 避坑指南:涉及用户输入、国际化场景,永远不要假设 1 字符 = 1 字节

相关文章
|
9天前
|
消息中间件 存储 Kafka
Go + Kafka实战指南!
本文以电商大促下单卡顿为切入点,生动讲解Apache Kafka如何通过异步解耦解决服务依赖、延迟与高并发瓶颈。详解Topic、Producer、Consumer等核心概念,配Go语言(Sarama库)实战代码,涵盖生产/消费、分区并行、错误重试、优雅关闭及电商、行为分析等真实场景,助你快速掌握分布式消息中间件精髓。(239字)
|
7天前
|
人工智能 弹性计算 数据可视化
部署OpenClaw有哪些成本?附OpenClaw低成本部署指南
OpenClaw(“养龙虾”)是一款开源AI代理框架,可自动化文件处理、工作流与消息管理。本文详解其部署成本:软件免费,云服务器低至68元/年,阿里云百炼新用户享7000万Token免费额度,并提供一键图形化部署指南。
428 32
|
7天前
|
关系型数据库 MySQL Serverless
MySQL 技巧:巧用窗口函数计算累计值
MySQL 技巧:巧用窗口函数计算累计值
|
7天前
|
人工智能 弹性计算 监控
OpenClaw“龙虾”入驻百度贴吧实操教程:从部署到发帖全攻略
百度贴吧上线“抓虾吧”——国内首个纯AI自治社区,专为OpenClaw(龙虾)智能体打造。AI可自由发帖互动,人类仅能围观。本文手把手教你一键部署、配置入驻、调试运行,零基础轻松让“龙虾”冲浪发帖!
611 22
|
21天前
|
人工智能 安全 API
OpenClaw不“吃灰”指南:全平台部署+免费API配置+102个即用场景解析+避坑手册
2026年,AI工具的核心价值已从“对话响应”转向“落地执行”。但多数用户仍困在“聊得热闹,做得有限”的困境——AI能写方案、改文字,却无法从头到尾独立完成一件完整任务。而OpenClaw作为首个开源本地部署的AI Agent平台,彻底打破这一局限:它不是单纯的聊天机器人,而是能连接20+平台、自动执行任务的“数字员工”——早上自动整理行业新闻推送到飞书、自动分拣100封客户邮件、监控GitHub代码漏洞并告警,这些场景现在就能落地。
476 9
|
9天前
|
消息中间件 缓存 Go
Go 语言生产环境必备包清单
本文基于2025 Go开发者调查(26%视选包为最大难题),精选多年生产验证的高可靠性第三方库:testify(测试)、zerolog/logrus(日志)、pkg/errors(错误)、lo/decimal(工具)、ristretto/freecache(缓存)、chi/resty(HTTP)、franz-go(Kafka)等,并附选型原则与对比,助你高效构建稳定Go服务。(239字)
|
12天前
|
机器学习/深度学习 算法 网络协议
AI算力狂飙背后的秘密:当“稳重老哥”Gloo遇上“极速引擎”NCCL
本文深度解析AI大模型训练中两大核心通信后端——Gloo与NCCL:前者是跨平台、高兼容的“稳健使者”,适配CPU及普通网络;后者是NVIDIA定制的“性能怪兽”,依托NVLink/RDMA实现GPU间纳秒级同步。文章以AllReduce等通信原语为切入点,对比其架构差异、适用场景与底层原理,并揭示分布式训练中通信瓶颈、拓扑感知、计算-通信重叠等关键工程实践,助开发者穿透框架表层,直抵算力调度本质。(239字)
191 6
|
14天前
|
人工智能 弹性计算 安全
AI真能成打工仔?阿里云OpenClaw虾友会现场“训虾”,百人脑暴!
北京时间3月13日晚7点,当北京的打工人还在晚高峰里“摸鱼”时,阿里巴巴朝阳科技园C区已经炸开了锅。百余位开发者、技术极客和“虾爸虾妈”齐聚一堂,把这里变成了OpenClaw虾友开放麦北京站的现场。没有枯燥的PPT轰炸,也没有高高在上的技术布道,就是一个真正的开放麦,大家聚在一起,就是要打破对AI的滤镜——不聊虚的,只看AI Agent怎么真刀真枪地干活。
|
28天前
|
人工智能 运维 自然语言处理
XgenCore Works V2.7.9(玄晶引擎)升级公告 赋能云原生开发者高效落地
XgenCore Works V2.7.9(玄晶引擎)正式发布,聚焦PC端内容创作、企业独立部署运维、自动化视频生成三大场景,新增6项功能(含数字人口播混剪入口、智能体统一管理等),修复14项高频Bug,全面提升兼容性、稳定性与实操体验,深度适配阿里云开发者及企业用户需求。
164 22
|
2天前
|
人工智能 弹性计算 数据可视化
阿里云一键部署OpenClaw保姆级攻略,直接抄作业!
阿里云推出OpenClaw一键部署方案,零代码快速拥有AI数字员工:自动处理邮件、管理日程、辅助编程。本文提供保姆级教程,涵盖轻量服务器部署、百炼API配置、避坑指南与钉钉/飞书接入、ClawHub插件扩展等进阶玩法,开箱即用!
122 15