Go源码--Strconv库

news/2024/9/22 15:19:11/

简介

Strconv 库是一些跨类型的转换函数集合,大家应该很熟悉。源码没有什么难点,主要是面试题有可能会出这种类型的,所以简单介绍下,主要介绍 以下两种常用转换,其他的没细研究,感兴趣的可以看看。

Strconv.Atoi 函数

将 字符串数组 转换为 数字,比较简单,源码如下

// Atoi  算法 核心思想 就是 每个字符 跟 ’0‘ 求差 然后迭代相加。因为面试可能会出这种题,可以借鉴下 整体不太难
func Atoi(s string) (int, error) {const fnAtoi = "Atoi"sLen := len(s)if intSize == 32 && (0 < sLen && sLen < 10) ||  // intSize = 32 << (^uint(0) >> 63) 操作系统位数 ;如果是 32为操作系统,为 32<<0 32左移0位 还是 32,如果是64位 则 ^uint(0) >> 63==1 32左移1位就是64intSize == 64 && (0 < sLen && sLen < 19) {// Fast path for small integers that fit int type.s0 := s   // 这边之所以会复制一份 就是为了 将 对 s的处理 跟 输出 完整s信息和使用完整s进行一些判断 分开,使得逻辑简单。if s[0] == '-' || s[0] == '+' {  // 处理符号s = s[1:]if len(s) < 1 {return 0, syntaxError(fnAtoi, s0)}}n := 0for _, ch := range []byte(s) {  // 面试常考ch -= '0'if ch > 9 {return 0, syntaxError(fnAtoi, s0)}n = n*10 + int(ch)  // n 是每次迭代的结果}if s0[0] == '-' {n = -n}return n, nil // 返回}// Slow path for invalid, big, or underscored integers.i64, err := ParseInt(s, 10, 0)  // 大数或者 无效整数走这里,感兴趣的可以看看if nerr, ok := err.(*NumError); ok {nerr.Func = fnAtoi}return int(i64), err
}

Strconv.Itoa 函数

Itoa 将 数字转换为字符串 其调用链如下
](https://img-blog.csdnimg.cn/direct/66f9267ce02a4d56923a3a3108c2c0e3.png)

我们来看 formatBits 源码


// formatBits 执行逻辑:(只讲解10进制) 就是 将大数 %100 然后 再采取 在 smallsString映射的方法 查找 对应字符 再迭代。面试常考
func formatBits(dst []byte, u uint64, base int, neg, append_ bool) (d []byte, s string) { // base 进制 如果是 10 就对应  Itoa(i)if base < 2 || base > len(digits) {panic("strconv: illegal AppendInt/FormatInt base")}// 2 <= base && base <= len(digits)var a [64 + 1]byte // +1 for sign of 64bit value in base 2 // 结果字节数组i := len(a)        // 长度 初始 为 65if neg {u = -u}// convert bits// We use uint values where we can because those will// fit into a single register even on a 32bit machine.if base == 10 {// common case: use constants for / because// the compiler can optimize it into a multiply+shiftif host32bit { // 32位 操作系统 感兴趣的可以自己看看// ... }// u guaranteed to fit into a uintus := uint(u) // 转换成平台自适应 类型for us >= 100 { is := us % 100 * 2 // is 是 在 smallString 提取的起始索引us /= 100          // us是下次扫描数据i -= 2             // 一次可以获取两个a[i+1] = smallsString[is+1]a[i+0] = smallsString[is+0]}// us < 100is := us * 2              // 走到这里 小于 100了i--                       // 更新 值a[i] = smallsString[is+1] // 输出结果if us >= 10 {             // 小于10 就只有上面结果 大于10 则还需要输出 smallsString[is]i--a[i] = smallsString[is]}} else if isPowerOfTwo(base) { // 是 二进制 走这里// ... }// add sign, if anyif neg { // 如果是负值 则 在前面加 -i--a[i] = '-'}if append_ { // true 返回 byte数组d = append(dst, a[i:]...)return}s = string(a[i:]) // 返回字符串return
}

http://www.ppmy.cn/news/1444586.html

相关文章

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者&#xff1a;知孤云出岫 目录 一&#xff0e; 关于comate产品 二&#xff0e; 关于comate产品体验 三&#xff0e; 关于实际案例. 四&#xff0e; 关于baidu comate编程助手的实测体验感悟 五&#xff0e; …

StatusBar,状态栏设置中文

在Qt的ui中&#xff0c; 菜单栏–View–Property Editor–statusBarVisible–勾选– 在C代码中&#xff0c; sloem1.h private://任意写一个函数void onStatusBarShow();sloem1.cpp void sloem1::onStatusBarShow() {QString strLabel;//显示文字来源this->setTextResour…

centos上网卡突然找不到了

问题 今天登录centos突然发现ssh连接不上&#xff0c;在虚拟机中输入ifconfig才发现没有找到对应的网卡ens33了 解决 只需要输入两行命令就可以解决 禁用NetworkManager systemctl stop NetworkManagersystemctl disable NetworkManager 然后重启网络systemctl start netwo…

nacos外接mysql的docker部署方式

文章目录 引言I 安装nacos(m1版本)1.1 镜像启动1.2 查看docker容器日志1.3 开启鉴权II 外接mysql的docker部署方式2.1 复制mysql-schema.sql2.2 导入mysql-schema.sqlIII 配置远程用户3.1 创建数据库远程用户3.2 案例: 创建nacos用户,用于nacos配置3.3 查看远程用户是否有密码…

c++初阶——类和对象(中)

大家好&#xff0c;我是小锋&#xff0c;我们今天继续来学习类和对象。 类的6个默认成员函数 我们想一想如果一个类什么都没有那它就是一个空类&#xff0c;但是空类真的什么都没有吗&#xff1f; 其实并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以…

人力资源优化配置:实现人力资源的最大化利用

在快速发展的现代社会中&#xff0c;人力资源作为组织的核心要素&#xff0c;其优化配置显得尤为重要。通过人力资源的优化配置&#xff0c;企业可以充分发挥员工的潜力&#xff0c;提高工作效率&#xff0c;从而实现人力资源的最大化利用。本文将探讨人力资源优化配置的意义、…

qt学习篇---C++基础学习

本学习笔记学习下面视频总结&#xff0c;感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

ai智能电销机器人是怎样进行工作的,各版本机器人部署的效果

在物联网、大数据、云计算、认知科学等科技的深度融合和推动下&#xff0c;机器人不断形成新的发展形态&#xff0c;智能化的发展方向日益突显。当然电销行业也不列外&#xff0c;智能电销机器人让80%的金融行业、教育培训、房地产行业等电销行业公司工作效率明显提高了。 智能…