Go源码--Strconv库

news2024/11/24 9:49:21

简介

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位就是64
		intSize == 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 := 0
		for _, 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)        // 长度 初始 为 65

	if 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+shift

		if host32bit { // 32位 操作系统 感兴趣的可以自己看看
		// ... 
		}

		// u guaranteed to fit into a uint
		us := 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 < 100
		is := 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 any
	if neg { // 如果是负值 则 在前面加 -
		i--
		a[i] = '-'
	}

	if append_ { // true 返回 byte数组
		d = append(dst, a[i:]...)
		return
	}
	s = string(a[i:]) // 返回字符串
	return
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1626983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[笔试训练](八)

目录 022&#xff1a;求最小公倍数 023&#xff1a;数组中的最长连续子序列 024&#xff1a;字母收集 022&#xff1a;求最小公倍数 求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 求最小公倍数公式&#xff1a;lcm(a,b)a*b/gcd(a,b)&am…

网页提示语闪太快的定位问题(selenium)

selenium UI自动化时&#xff0c;提示语闪太快&#xff0c;导致无法获取元素的问题 解决办法 步骤一&#xff1a; F12---》控制台输入debugger 步骤二&#xff1a;对于需要定位的部分&#xff0c;在控制台的debugger处回车&#xff0c;可以定住页面 步骤三&#xff1a;正常定…

win11 安装qt5.14.2 、qtcreator、vs编译器 。用最小安装进行 c++开发qt界面

系统 &#xff1a;win11 一、安装vs生成工具 &#xff0c;安装编译器 下载visualstudio tools 生成工具&#xff1a; 安装编译器 和 windows sdk&#xff1a; 安装debug 调试器&#xff1a; 二、Qt5.14.2下载 下载链接: Index of /archive/qt/5.14/5.14.2 安装qt 三、配置QT/…

MVP+敏捷开发

MVP敏捷开发 1. 什么是敏捷开发&#xff1f; 敏捷开发是一种软件开发方法论&#xff0c;旨在通过迭代、自组织的团队和持续反馈&#xff0c;快速响应需求变化并交付高质量的软件。相较于传统的瀑布模型&#xff0c;敏捷开发强调灵活性、适应性和与客户的紧密合作。敏捷开发方…

Llama网络结构介绍

LLaMA现在已经是开源社区里炙手可热的模型了&#xff0c;但是原文中仅仅介绍了其和标准Transformer的差别&#xff0c;并没有一个全局的模型介绍。因此打算写篇文章&#xff0c;争取让读者不参考任何其他资料把LLaMA的模型搞懂。 结构 如图所示为LLaMA的示意图&#xff0c;由…

解决ax = Axes3D(fig2)pycharm画3d图空白不显示问题

明明代码运行正确&#xff0c;却总是显示不出来 绘制出来的也是空白 改一下代码就好了 ax Axes3D(fig2) #原来代码 ax fig2.add_axes(Axes3D(fig2)) #改后代码 修改过后就可以显示了

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version of J…

【nodejs状态库mobx之computed规则】

The above example nicely demonstrates the benefits of a computed value, it acts as a caching point. Even though we change the amount, and this will trigger the total to recompute, it won’t trigger the autorun, as total will detect its output hasn’t been …

一分钟了解期权合约转仓交易的流程

期权合约转仓交易的流程 期权合约转仓交易是指在期权交易过程中&#xff0c;交易者平掉手中现有的仓位&#xff0c;并选择更高或更低的行权价格&#xff0c;进行买入或卖出开仓的交易方法。转仓交易具有多个优势&#xff0c;包括降低风险、锁定利润、提高资金使用效率以及增加…

关于Github默认分支main和master以及如何在git init时指定默认分支

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

内置对象部分

一&#xff0c;内置对象 二&#xff0c;math对象 不是构造函数&#xff0c;不需要new来调用&#xff0c;而是直接使用里面的属性和方法即可 1.随机方法random 返回一个随机的小数 [0,1&#xff09; 2.日起格式化 返回的月份会小一&#xff0c;记得加一 周一返回1&#xff…

什么是储能电站的一次设备与二次设备?

随着国家政策导向和扶持&#xff0c;储能电站的建设&#xff0c;在各地均稳步推进&#xff0c;储能电站的设备主要分一次设备和二次设备两种&#xff0c;下面分别介绍这两方面内容&#xff1a; 储能电站一次设备 一次设备是储能电站的电路基础设施&#xff0c;包含变压器、主…

提升你的C编程技能:使用cURL下载Kwai视频

概述 本文将介绍如何利用C语言以及cURL库来实现Kwai视频的下载。cURL作为一个功能强大的网络传输工具&#xff0c;能够在C语言环境下轻松地实现数据的传输。我们还将探讨如何运用代理IP技术&#xff0c;提升爬虫的匿名性和效率&#xff0c;以适应Kwai视频平台的发展趋势。 正…

代码随想录算法训练营day40

题目&#xff1a;343. 整数拆分、96.不同的二叉搜索树 参考链接&#xff1a;代码随想录 343. 整数拆分 思路&#xff1a;五部曲来走。dp数组&#xff0c;dp[i]用于记录拆i得到的最大乘积和&#xff0c;我们要求的也就是dp[n]&#xff1b;递推公式&#xff0c;我们想拆分i&am…

简单把玩下SpringAI

Hello大家好&#xff0c;今天写一些不烧脑的文章&#xff0c;我们来体验一下Spring的新框架Spring AI&#xff0c;只是简单玩玩不深入&#x1f60f; Spring AI 简介 Spring AI是为了简化人工智能相关应用程序的开发Spring AI的诞生&#xff0c;灵感来自于LangChain等项目 Oll…

江苏开放大学2024年春《会计基础 050266》第二次任务:第二次过程性考核参考答案

电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&#xff0c;包含国家开放大学、广东开放大学、超星等等多个平台题库&#xff0c;考试作业必备神器。 公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#…

Windows常见问题(技巧)总结

目录 问题Windows中更改快捷方式图标windows 中网速很慢,如何解决?因为Authenticated Users从其父系继承承权限&#xff0c;你无法删除此对象.Windows下的照片软件在哪个文件夹下?如何批量更改文件名?Windows 电脑pagefile.sys是什么文件,可以删除吗?U盘中打开文件时提示&a…

平衡小车的控制算法--结合自动控制原理学习

单纯的去看自控原理&#xff0c;很多概念有点抽象&#xff0c;最好找些应用去理解相关的概念&#xff0c;就找了实验室的一个平衡小车作为应用&#xff0c;不过主要根据小车去跑matlab去验证一些控制算法。结合台湾国立交通大学林沛群的自控线上课的总结 一、自控原理重要概念 …

Liunx下用C语言模拟实现 —— 封装文件操作接口

一、前提 本篇博客将循序渐进的模拟实现C语言中&#xff0c;简单版的对FILE和一些简单的文件操作接口的实现&#xff0c;在上一篇文件操作原理篇我们知道&#xff0c;实际的实现就是对系统接口的封装&#xff0c;为了巩固和练习之前学到的概念&#xff0c;我们也来简单的实现对…

经典的免费wordpress模板

这款经典的免费WordPress模板以鲜艳的红色为主调&#xff0c;充满了活力与热情。设计简洁而现代&#xff0c;适合各种类型的项目网站。模板采用响应式设计&#xff0c;确保在不同设备和屏幕尺寸上都能呈现出完美的视觉效果。 红色象征着激情、活力和自信&#xff0c;这款模板…