当前位置: 首页 > article >正文

别再问Go有没有char了!一文搞懂byte、rune和单引号字符串的实战区别

别再问Go有没有char了一文搞懂byte、rune和单引号字符串的实战区别每次看到Go新手在群里问为什么Go没有char类型我就想起自己当年被C语言思维支配的恐惧。作为一个从Java/C转Go的老兵我完全理解这种困惑——毕竟在其他语言里char可是基础中的基础。但Go的设计哲学就是少即是多它用更简洁的byte和rune解决了字符处理问题只是需要你转换下思维方式。1. 为什么Go不需要char类型Go语言诞生在Unicode普及的时代设计者们清楚地知道用8位表示字符的char类型在全球化软件开发中已经不够用了。想象一下当你用C语言的char处理中文时要么面临乱码要么需要额外引入wchar_t等类型。Go的解决方案很聪明byte对应C的unsigned char专门处理ASCII字符rune相当于C的wchar_t但更强大能表示任何Unicode字符string本质是byte或rune的序列自动处理编码问题看看这个典型的编译错误很多从C转Go的开发者都会遇到var c byte 中 // 编译错误constant 20013 overflows byte错误信息直白地告诉你中文字符的Unicode值超过了byte的表示范围。这时候就该用runevar c rune 中 // 正确中文字符需要4字节存储2. byte和rune的底层真相理解这两种类型的关键在于它们的本质类型底层类型字节数表示范围典型用途byteuint810-255ASCII字符、二进制数据runeint324所有Unicode码点多语言文本处理重要区别byte的零值是0rune的零值是0byte比较用rune比较也用但涉及到字符串遍历时行为完全不同s : Hello, 世界 for i : 0; i len(s); i { fmt.Printf(%x , s[i]) // 按字节遍历 } // 输出: 48 65 6c 6c 6f 2c 20 e4 b8 96 e7 95 8c for _, r : range s { fmt.Printf(%U , r) // 按rune遍历 } // 输出: U0048 U0065 U006C U006C U006F U002C U0020 U4E16 U754C提示当需要处理非ASCII文本时务必使用for range循环它能正确解码UTF-8字符。3. 单引号与双引号的陷阱Go的单引号和双引号有严格区分这是很多bug的来源单引号只能包裹一个字符生成的是byte或rune类型a→ byte类型中→ rune类型ab→ 编译错误双引号生成string类型可以包含多个字符a→ 长度1的字符串中国→ 长度6的字符串(UTF-8编码)\n→ 包含换行符的字符串看看这个实际案例fmt.Println(len(A)) // 输出1 fmt.Println(len(A)) // 编译错误invalid argument fmt.Println(len(string(A))) // 输出1为什么第二个表达式会报错因为len()不能直接用于byte/rune需要先转换为string。4. 实战中的字符处理模式经过多年Go开发我总结了几个高频使用场景的最佳实践4.1 ASCII字符处理当确定只处理英文、数字和标点时使用byte更高效// 快速判断字符类别 func isDigit(c byte) bool { return c 0 c 9 } // 字节级操作 func toUpper(s string) string { b : []byte(s) for i : range b { if b[i] a b[i] z { b[i] - 32 } } return string(b) }4.2 多语言文本处理处理用户输入、国际化文本时必须使用rune// 安全地截断字符串 func truncate(s string, length int) string { runes : []rune(s) if len(runes) length { return string(runes[:length]) } return s } // 统计字符数不是字节数 func charCount(s string) int { return len([]rune(s)) }4.3 字符串与数值转换字符和数字之间的转换需要特别注意类型// byte与数字 var b byte A num : int(b) // 65 // rune与Unicode码点 r : 你 code : int(r) // 20320 str : string(r) // 你 // 错误示范 // var c byte 20000 // 编译错误5. 那些年我踩过的坑分享几个真实项目中遇到的典型问题JSON处理中的特殊字符// 错误方式 data : {name:OReilly} var m map[string]string json.Unmarshal([]byte(data), m) // 报错 // 正确方式 data : {name:O\Reilly} // 或使用反引号正则表达式中的字符类// 匹配中文字符 re : regexp.MustCompile([\p{Han}]) // 正确 re : regexp.MustCompile([一-龥]) // 过时且不完整数据库字段长度限制// VARCHAR(10)能存多少个汉字 // 答案10个字符不是字节但需要考虑数据库的编码设置在微服务开发中我曾经因为混淆byte和rune导致用户昵称截断错误。一个用户叫音乐注意第一个字符是音乐符号占4字节用len()判断长度返回6但实际只有3个字符。最后用[]rune转换才正确解决了问题。

相关文章:

别再问Go有没有char了!一文搞懂byte、rune和单引号字符串的实战区别

别再问Go有没有char了!一文搞懂byte、rune和单引号字符串的实战区别 每次看到Go新手在群里问"为什么Go没有char类型",我就想起自己当年被C语言思维支配的恐惧。作为一个从Java/C转Go的老兵,我完全理解这种困惑——毕竟在其他语言里…...

【2026 Docker AI Toolkit实战白皮书】:从本地PoC到万卡集群推理的7步标准化交付流程

更多请点击: https://intelliparadigm.com 第一章:Docker AI Toolkit 2026 核心架构演进与版本特性概览 Docker AI Toolkit 2026 是面向生成式AI工作流深度优化的容器化开发平台,其核心架构从单体引擎全面转向“可插拔编排层 智能运行时沙箱…...

Python高频交易系统被监管问询后连夜升级的4项合规增强:订单流指纹追踪、成交确认幂等性、审计日志原子写入、熔断策略热加载

更多请点击: https://intelliparadigm.com 第一章:Python高频交易系统监管合规升级全景概览 随着中国证监会《证券期货业网络安全管理办法》及《程序化交易管理规定(试行)》正式实施,Python构建的高频交易系统正面临…...

Citra模拟器:在电脑上畅玩任天堂3DS游戏的完整指南

Citra模拟器:在电脑上畅玩任天堂3DS游戏的完整指南 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 想要在电脑上重温《精灵宝可梦》系列、《动物之森》等经典任天堂3DS游戏吗?Citra模拟…...

Easy-VIBE:从单目视频到三维动作捕捉的实战指南

1. 项目概述:从姿态估计到动作捕捉的“平民化”革命如果你关注过计算机视觉或者游戏动画领域,大概率听说过“姿态估计”和“动作捕捉”这两个词。前者是从一张图片或一段视频里,把人的关节位置(比如头、肩膀、手肘、手腕&#xff…...

Elasticsearch实战指南:多语言全文搜索实现方案详解

Elasticsearch实战指南:多语言全文搜索实现方案详解 前言一、多语言搜索核心基础1.1 核心概念1.2 为什么默认分词器无法支持多语言? 二、多语言搜索整体工作流程2.1 核心流程图(文档写入搜索查询) 三、ES支持的主流语言分析器&…...

终极免费Switch模拟器Ryujinx:5步快速安装与配置完整指南

终极免费Switch模拟器Ryujinx:5步快速安装与配置完整指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上畅玩《塞尔达传说:旷野之息》、《马里奥赛车…...

别再让MOSFET悄悄“累死”!聊聊开关电源里那个看不见的杀手:重复雪崩EAR

揭秘MOSFET的隐形杀手:如何驯服开关电源中的重复雪崩效应 当你在深夜调试一块开关电源板时,是否遇到过MOSFET莫名其妙失效的情况?那些看似健康的器件,运行几个月后突然"罢工",留下的只有烧毁的痕迹和一堆问号…...

怎么理解Redis的String的二进制安全??不再以\0作为判断标准

文章目录1. C 语言字符串的“致命弱点”:\02. Redis 的解决方案:SDS (Simple Dynamic String)3. 为什么这被称为“二进制安全”?4. 深度对比总结要理解 Redis 的“二进制安全(Binary Safety)”,最直接的方法…...

新手避坑指南:ABB机器人工件坐标系标定,这3个点千万别标错(RobotStudio实操)

ABB机器人工件坐标系标定避坑实战:三点法操作细节全解析 在工业机器人应用领域,工件坐标系的准确标定直接决定了后续所有运动轨迹的精度。许多新手工程师在RobotStudio环境中进行三点法标定时,常常因为几个关键点的选择不当或TCP姿态控制失误…...

YOLOv11涨点改进| CVPR 2026 | 独家创新首发、卷积改进篇| 引入 AFFN 自相关前馈网络模块,通过频域与空间域的双域融合增强,助力多种目标检测、图像分割、图像分类、图像修复任务涨点

一、本文介绍 🔥本文给大家介绍使用 AFFN 自相关前馈网络模块 改进YOLOv11网络模型,通过在特征提取与融合阶段显式建模特征图内部的周期性结构信息,通过自相关机制强化重复出现的目标纹理与结构特征,从而提升模型对规则性模式的感知能力。在复杂背景或存在噪声干扰的情况…...

告别臃肿!用Pipenv虚拟环境给PyInstaller打包的exe瘦身提速(实测从167M到47M)

告别臃肿!用Pipenv虚拟环境给PyInstaller打包的exe瘦身提速(实测从167M到47M) 每次用PyInstaller打包Python脚本,生成的exe文件总是大得离谱,启动速度慢得像蜗牛?这可能是你的开发环境"太脏"了。…...

明日方舟自动化助手:5大核心功能教你如何解放双手,轻松长草!

明日方舟自动化助手:5大核心功能教你如何解放双手,轻松长草! 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clie…...

AiZynthFinder完整指南:如何用AI为复杂分子快速设计合成路线?

AiZynthFinder完整指南:如何用AI为复杂分子快速设计合成路线? 【免费下载链接】aizynthfinder A tool for retrosynthetic planning 项目地址: https://gitcode.com/gh_mirrors/ai/aizynthfinder 想象一下,你面对一个从未合成过的复杂…...

Image-Downloader:如何用Python实现三引擎批量图片采集?

Image-Downloader:如何用Python实现三引擎批量图片采集? 【免费下载链接】Image-Downloader Download images from Google, Bing, Baidu. 谷歌、百度、必应图片下载. 项目地址: https://gitcode.com/gh_mirrors/im/Image-Downloader 在数字内容创…...

基于agentic-engineering-framework构建生产级LLM智能体:从模块化设计到数据分析实战

1. 项目概述:一个面向智能体工程的实践框架最近在探索如何将大语言模型(LLM)从单纯的“聊天机器人”或“代码生成器”,升级为能够自主、可靠地处理复杂任务的“智能体”(Agent)。这听起来很酷,但…...

5大理由告诉你:为什么YesPlayMusic是网易云音乐用户的终极第三方播放器解决方案

5大理由告诉你:为什么YesPlayMusic是网易云音乐用户的终极第三方播放器解决方案 【免费下载链接】YesPlayMusic 高颜值的第三方网易云播放器,支持 Windows / macOS / Linux :electron: 项目地址: https://gitcode.com/gh_mirrors/ye/YesPlayMusic …...

5个关键步骤:用Dark Reader打造完美夜间浏览体验,提升工作效率300%

5个关键步骤:用Dark Reader打造完美夜间浏览体验,提升工作效率300% 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader 你是否经常在深夜加班时被刺眼的屏幕亮光灼伤…...

PvZWidescreen终极指南:三步解决植物大战僵尸宽屏黑边问题

PvZWidescreen终极指南:三步解决植物大战僵尸宽屏黑边问题 【免费下载链接】PvZWidescreen Widescreen mod for Plants vs Zombies 项目地址: https://gitcode.com/gh_mirrors/pv/PvZWidescreen 还在为《植物大战僵尸》两侧恼人的黑边而烦恼吗?Pv…...

用Python实战卡方检验:从孟德尔豌豆到数据分布拟合(附完整代码)

Python实战卡方检验:从数据分布验证到业务决策 卡方检验是数据分析师工具箱中不可或缺的统计工具,它能帮助我们判断观察数据与理论分布是否存在显著差异。本文将带你从经典案例出发,通过Python代码实现完整的卡方检验流程,并探讨在…...

简单视频下载助手:一键保存在线视频的终极指南

简单视频下载助手:一键保存在线视频的终极指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经遇到过想保存一个精彩的…...

别再手动调表格宽度了!LaTeX中tabularx、adjustbox和tabular*三种方法实现页面同宽表格的保姆级对比

LaTeX表格宽度终极指南:tabularx、adjustbox与tabular*的深度对比与实战选择 在学术写作和技术文档中,表格是展示数据的核心工具。但许多LaTeX用户都会遇到这样的困境:精心制作的表格要么挤在页面一侧留出大片空白,要么因为过宽而…...

用Python和akshare库5分钟搞定LOF基金实时数据抓取与CSV保存(保姆级教程)

零基础Python实战:5分钟自动化获取LOF基金行情数据 最近两年,越来越多的个人投资者开始关注LOF基金的投资机会。这类基金既能在场内像股票一样交易,又能通过场外渠道申购赎回,流动性优势明显。但很多新手在跟踪LOF基金行情时&…...

达沙替尼dasatinib出现胸腔积液或血小板减少时需不需要减量,减到多少能继续治疗?

达沙替尼(Dasatinib)在治疗费城染色体阳性(Ph)慢性髓细胞白血病(CML)及部分急性淋巴细胞白血病(ALL)患者中发挥着重要作用。然而,其治疗过程中可能出现的胸腔积液和血小板…...

用PyTorch复现UNet:从DRIVE数据集到视网膜血管分割的保姆级实战

PyTorch实战:UNet视网膜血管分割全流程解析与DRIVE数据集深度应用 视网膜血管分割是医学图像分析中的经典课题,而UNet作为图像分割领域的标杆架构,其优雅的编码器-解码器结构特别适合处理这类任务。本文将带您从零开始,完整实现一…...

自托管开源联系人管理系统:数据主权、vCard标准与API驱动架构实践

1. 项目概述:一个面向未来的联系人管理解决方案最近在整理一个老项目时,我重新审视了“Aquariosan/veyra-contacts”这个仓库。这不仅仅是一个简单的通讯录应用,它更像是一个理念的实践场,探讨在数据主权意识日益增强的今天&#…...

机器学习即搜索:从原理到实践的参数优化指南

1. 机器学习作为搜索问题的本质理解我第一次听到"机器学习即搜索"这个概念是在2015年参加NIPS会议时,当时一位谷歌研究员用国际象棋的比喻让我茅塞顿开。想象你是一位棋手,每个落子决定都是在可能的走法中搜索最佳解——这与机器学习中参数优化…...

告别卡顿!在WinForm里用ScottPlot 5.0实现丝滑的XY轴缩放与拖拽(附完整源码)

告别卡顿!在WinForm里用ScottPlot 5.0实现丝滑的XY轴缩放与拖拽(附完整源码) 当工业监控系统需要实时展示数万条传感器数据,或是金融分析软件要快速响应投资者的交互操作时,图表控件的流畅度直接决定了用户体验的成败。…...

GDSDecomp深度技术解析:如何实现Godot游戏逆向工程的全栈解决方案

GDSDecomp深度技术解析:如何实现Godot游戏逆向工程的全栈解决方案 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp GDSDecomp作为Godot游戏引擎逆向工程的终极工具套件&#xff0c…...

YOLOv5-7.0 模型魔改实战:手把手教你给Neck换上BiFPN(附完整代码)

YOLOv5-7.0模型深度优化:BiFPN模块集成实战与性能突破 在目标检测领域,YOLOv5以其卓越的平衡性——兼顾检测精度与推理速度,成为工业界和学术界的热门选择。随着v7.0版本的发布,其内置的智能优化器为模型结构调整提供了前所未有的…...