写在前面

capitalize
# Python实现首字母大写
print("abcd".capitalize())  # 输出Abcd

实现首字母大写

我们先来一起来看一下完整的代码,后面会对其中的一些内容进行分解。

示例代码

// Capitalize 字符首字母大写
func Capitalize(str string) string {
    var upperStr string
    vv := []rune(str)   // 后文有介绍
    for i := 0; i < len(vv); i++ {
        if i == 0 {
            if vv[i] >= 97 && vv[i] <= 122 {  // 后文有介绍
                vv[i] -= 32 // string的码表相差32位
                upperStr += string(vv[i])
            } else {
                fmt.Println("Not begins with lowercase letter,")
                return str
            }
        } else {
            upperStr += string(vv[i])
        }
    }
    return upperStr
}

rune

rune
s := "hello你好"
fmt.Println(len(s))         // 输出长度为11
fmt.Println(len([]rune(s))) // 输出长度为7
s = "你好"
fmt.Println(len(s))         // 输出长度为6
fmt.Println(len([]rune(s))) // 输出长度为2
s = "你"
fmt.Println([]byte(s)) // 输出长度为6
fmt.Println(rune('你')) // 输出20320

通过上述代码可以将rune理解为一个可以表示unicode 编码的值int 的值,称为码点(code point)。只不过go语言把这个码点抽象为rune。

想要更深入的了解可以查看这个博客:https://blog.golang.org/strings ,讲述了 Strings, bytes, runes and characters in Go

在了解了rune可以表示为unicode 编码的值int 的值之后,我们来了解一下unicode 编码值。

unicode编码表

一起来看一下Unicode的编码表

字符十进制编码值十六进制编码值
A6541
B6642
C6743
D6844
.........
a9761
b9862
c9963
d10064
.........

看过Unicode的编码表之后我们发现了一个规律,那就是十进制编码时,大小写编码之间相差了32,十六进制相差了20。既然我们知道了rune能获取字符的Unicode编码值,又知道了大小写字母的编码规律,接下来用他们做字母大写的变化就非常容易了。

Unicode库常见用法

unicodeIsLower()
unicode.IsUpper(r) // 是否大写
unicode.IsLetter(r) // 是否字母
unicode.IsSpace(r)  // 是否空格
unicode.IsTitle(r) // 是否特殊字符
unicode.IsDigit(r) //是否数字
...

1172048-20180921153614899-1505065605.png

简单应用:判断首字母是否大写

func IsStartUpper(s string) bool {
    return unicode.IsUpper([]rune(s)[0])
}

参考资料:
https://blog.golang.org/strings
https://blog.csdn.net/a41888313/article/details/78946911
https://blog.csdn.net/fedawn/article/details/7307993
https://blog.csdn.net/yang8023tao/article/details/53332827