• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go语言strconv.ParseInt的实现分析

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

字符串与数值之间进行转换是一个高频操作,在go语言中,SDK提供 strconv.ParseInt 将字符串转换为数值,strconv.FormatInt 可以将数值转换为字符串。

1.首先看下 strconv.ParseInt 函数如何使用:

func ParseInt(s string, base int, bitSize int) (i int64, err error){}

参数:

  • s:数字的字符串形式
  • base:数字字符串的进制,比如:2进制、10进制。
  • bitSize:预期数值的bit大小,用于数值上限限制,最终返回的还是int64类型

2.下面看下函数的具体实现:

strconv.ParseIntstrconv.ParseUint 的一个包装层,区别在数值结果的基础上处理符号,因此具体的实现在strconv.ParseUint里面。

func ParseUint(s string, base int, bitSize int) (uint64, error) {
        ...
	case base == 0:
		// Look for octal, hex prefix.
		base = 10    // 当base = 0,默认 base 按赋值10进制
		if s[0] == '0' {
			switch {
			case len(s) >= 3 && lower(s[1]) == 'b':    // 根据字符串的前缀,来判断二进制。下面同理
				base = 2
				s = s[2:]
			case len(s) >= 3 && lower(s[1]) == 'o':
				base = 8
				s = s[2:]
			case len(s) >= 3 && lower(s[1]) == 'x':
				base = 16
				s = s[2:]
			default:
				base = 8    // 当 0 开头,默认8进制
				s = s[1:]
			}
		}
	default:
		return 0, baseError(fnParseUint, s0, base)
	}
}

根据进制 base 进制数计算数值,支持2~ 36进制[0-9A-Z]

func ParseUint(s string, base int, bitSize int) (uint64, error) {
      ...
      // 逐个字符判断,然后累加求和
      for _, c := range []byte(s) {
		var d byte
		switch {
		case c == '_' && base0:
			underscores = true
			continue
		case '0' <= c && c <= '9':
			d = c - '0'
                 // 支持2 ~ 36进制
		case 'a' <= lower(c) && lower(c) <= 'z':
			d = lower(c) - 'a' + 10
		default:
			return 0, syntaxError(fnParseUint, s0)
		}

		if d >= byte(base) {
			return 0, syntaxError(fnParseUint, s0)
		}

		if n >= cutoff {
			// n*base overflows
			return maxVal, rangeError(fnParseUint, s0)
		}
		n *= uint64(base)

		n1 := n + uint64(d)
		if n1 < n || n1 > maxVal {
			// n+v overflows
			return maxVal, rangeError(fnParseUint, s0)
		}
		n = n1
	}
}

3.使用strconv.FormatInt将数值转换为字符串

func FormatInt(i int64, base int) string {}

参数:

  • i:10进制数值
  • base:进制数

示例:

 // 将10进制数 15 转换为 16 进制的字符串形式
func Test_FormatUint(t *testing.T) {
	val := strconv.FormatUint(15, 16)
	fmt.Println(val) // output:f
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
go map的使用发布时间:2022-07-10
下一篇:
golang(go语言)调试和查看gc信息,以及gc信息解析发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap