如何使用Golang len获取长度_Golang字符串与集合长度说明

发布时间 - 2026-01-21 00:00:00    点击率:
len函数只能用于数组、切片、字符串、map和channel;对nil切片或nil map调用合法且返回0;字符串len返回UTF-8字节数,非Unicode字符数;[]rune可获取真实字符数但有性能开销。

len 函数能直接获取哪些类型的长度

len 是 Go 内置函数,不是方法,只能用于编译期已知长度的类型:数组([5]int)、切片([]string)、字符串(string)、map(map[string]int)、channel(chan int)。它不能用于结构体、指针、函数或自定义类型(除非底层类型是上述之一)。

常见错误是试图对 nil 切片或 nil map 调用 len —— 实际上这完全合法:len(nil切片) 返回 0,len(nil map) 也返回 0。真正 panic 的是取值(如 m["k"])或遍历(for range nil map)。

  • len("你好") 返回 6(字节数,UTF-8 编码)
  • len([]rune("你好")) 返回 2(Unicode 码点数)
  • len([3]int{1,2,3}) 返回 3(数组长度固定)
  • len(map[int]string{}) 返回 0(空 map)

字符串 len 返回的是字节数,不是字符数

Go 字符串底层是只读字节序列,len(s) 永远返回 UTF-8 编码后的字节数。中文、emoji 等多字节字符会拉高这个值,但不反映“人眼看到的字符个数”。

如果业务需

要按 Unicode 字符计数(比如截断显示、校验用户名最大 10 个汉字),必须转成 []rune

name := "Hello世界?"
fmt.Println(len(name))        // 输出: 13(H-e-l-l-o-世-界-? 各自 UTF-8 字节数之和)
fmt.Println(len([]rune(name))) // 输出: 9(5 ASCII + 2 汉字 + 1 emoji = 9 个 rune)

注意:[]rune(s) 会分配新底层数组,对超长字符串(如 MB 级日志)频繁调用有性能开销。

切片和数组的 len 行为差异

数组长度是类型的一部分,len 在编译期确定;切片长度是运行时属性,可变。

  • arr := [4]int{1,2,3,4}; len(arr) → 永远是 4,不可修改
  • sl := []int{1,2,3}; sl = sl[:2]; len(sl) → 变为 2
  • len(sl)cap(sl) 可能不同:切片可能只用了底层数组一部分

误把 caplen 用会导致逻辑错误,比如循环写满整个容量而非当前长度:

data := make([]byte, 0, 1024)
data = append(data, 'a', 'b')
// 错误:for i := 0; i < cap(data); i++ { ... } —— 会访问未初始化内存
// 正确:for i := 0; i < len(data); i++ { ... }

map 和 channel 的 len 使用场景与陷阱

len(m) 返回当前键值对数量,len(ch) 返回当前缓冲区中待读取元素个数。两者都常用于条件判断,但要注意并发安全。

  • map 的 len 不是原子操作,多 goroutine 写入时,即使只读 len 也可能触发 panic(Go 1.19+ 对并发读写 map 的 panic 更敏感)
  • channel 的 len(ch) 是瞬时快照,无法替代 selectrange 做同步控制
  • 不要用 len(ch) == cap(ch) 判断是否满 —— 非缓冲 channel 的 cap 是 0,len 也是 0,永远相等

真正需要长度感知的并发场景,应配合 sync.Map、互斥锁或 channel 自身的阻塞语义来设计,而不是依赖 len 做轮询判断。

最容易被忽略的是:字符串的 len[]runelen 在语义上完全不同,而 Go 不提供类似 Python 的 len(s, encoding='utf8') 这种带选项的接口 —— 开发者必须自己决定用字节还是 rune,并承担转换成本。


# python  # go  # golang  # 编码  # app  # 字节  # 键值对  # len函数 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何彻底卸载建站之星软件?  如何在企业微信快速生成手机电脑官网?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  晋江文学城电脑版官网 晋江文学城网页版直接进入  Laravel PHP版本要求一览_Laravel各版本环境要求对照  如何在Windows环境下新建FTP站点并设置权限?  中山网站制作网页,中山新生登记系统登记流程?  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  用v-html解决Vue.js渲染中html标签不被解析的问题  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  独立制作一个网站多少钱,建立网站需要花多少钱?  如何在橙子建站上传落地页?操作指南详解  如何快速登录WAP自助建站平台?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  如何用wdcp快速搭建高效网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何快速查询域名建站关键信息?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  三星、SK海力士获美批准:可向中国出口芯片制造设备  网站制作价目表怎么做,珍爱网婚介费用多少?  Python数据仓库与ETL构建实战_Airflow调度流程详解  微信小程序 input输入框控件详解及实例(多种示例)  SQL查询语句优化的实用方法总结  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何在服务器上配置二级域名建站?  ,网页ppt怎么弄成自己的ppt?  深圳网站制作的公司有哪些,dido官方网站?  如何在云虚拟主机上快速搭建个人网站?  *服务器网站为何频现安全漏洞?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  中山网站推广排名,中山信息港登录入口?  如何快速搭建安全的FTP站点?  Laravel如何为API生成Swagger或OpenAPI文档  无锡营销型网站制作公司,无锡网选车牌流程?  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  EditPlus 正则表达式 实战(3)  Mybatis 中的insertOrUpdate操作