【Golang】字符串首字母大小写转化
写在前面
在自动化过程中,我们用得最多的可能就是字符串的处理,熟悉Python的都知道在Python中要让一个字符串的首字母大写直接用capitalize
就可以了,但是同样的事情在Golang中没有这么简单,今天我们一起来学习用golang实现字符串首字母大写。
# 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
这个关键字,那么rune是什么呢?rune在golang中是int32的别名,在各个方面都与int32相同。通常被用来区分字符值和整数值。 我们可以通过做几个小测试来理解它。
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的编码表
字符 | 十进制编码值 | 十六进制编码值 |
---|---|---|
A | 65 | 41 |
B | 66 | 42 |
C | 67 | 43 |
D | 68 | 44 |
... | ... | ... |
a | 97 | 61 |
b | 98 | 62 |
c | 99 | 63 |
d | 100 | 64 |
... | ... | ... |
看过Unicode的编码表之后我们发现了一个规律,那就是十进制编码时,大小写编码之间相差了32,十六进制相差了20。既然我们知道了rune能获取字符的Unicode编码值,又知道了大小写字母的编码规律,接下来用他们做字母大写的变化就非常容易了。 |
更多 Unicode的编码可以参考 https://blog.csdn.net/fedawn/article/details/7307993
Unicode库常见用法
其实我们上面的代码中的第六行有一种更简单的方法,那就是标准库unicode
的IsLower()
方法,unicode库还有很多其他类似的方法:
unicode.IsUpper(r) // 是否大写
unicode.IsLetter(r) // 是否字母
unicode.IsSpace(r) // 是否空格
unicode.IsTitle(r) // 是否特殊字符
unicode.IsDigit(r) //是否数字
...
更多的用法可以参考 https://blog.csdn.net/chenbaoke/article/details/40318215
简单应用:判断首字母是否大写
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
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)