Golang ToLower和ToLowerSpecial源码探究

本文简单探索ToLower方法及SpecialCase的使用方法和实现,如果只关注SpecialCase方法的同学可以直接跳转至分割线以下

问题起因是使用strings包中的ToLower时转换小写结果与预期不相符

a := "ADASD$%^*@%3Ω"
fmt.Println(strings.ToLower(a))   //adasd$%^*@%3ω

本只想将A-Z进行大小写转换,但strings.ToLower却把Ω转换成了ω,带着这个疑问追了下源码

func ToLower(s string) string {
    //isASCII是否只有ASCII
    //hasUpper是否只包含ASCII小写
	isASCII, hasUpper := true, false
	for i := 0; i < len(s); i++ {
		c := s[i]
		if c >= utf8.RuneSelf {
			isASCII = false
			break
		}
		hasUpper = hasUpper || ('A' <= c && c <= 'Z')
	}
	if isASCII { // optimize for ASCII-only strings.
        //只有ASCII且不包含小写直接返回
		if !hasUpper {
			return s
		}
        //只有ASCII且包含小写,按A-Z进行转换
		var b Builder
		b.Grow(len(s))
		for i := 0; i < len(s); i++ {
			c := s[i]
			if 'A' <= c && c <= 'Z' {
				c += 'a' - 'A'
			}
			b.WriteByte(c)
		}
		return b.String()
	}
    //包含unicode码,使用Map(unicode.ToLower, s)方法进行转换
	return Map(unicode.ToLower, s)
}

func Map(mapping func(rune) rune, s string) string {
    //部分代码略过......
    //该方法核心在于使用参数方法mapping解析字符串s,那么现在关键就在于unicode
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值