在go语言的开发中我们经常需要对各种命名进行规范, 今天给大家介绍的是一个高效的将字符串转 驼峰命名 (即 首字母大写的命名方式)的函数。
Go
// 字符串转驼峰命名
// @author tekintian <tekintian@gmail.com>
func CamelStr(str string) string {
// 如果有 - 链接,统一将其替换为 _
if strings.IndexByte(str, '-') != -1 {
str = strings.Replace(str, "-", "_", -1)
}
//按下划线切割字符串为单词
tmp := strings.Split(str, "_")
for i, w := range tmp {
// 判断第一个单词字母是否为小写字母
if w[0] >='a' && w[0] <='z' {
// 这个地方的 w[0]-32 即将单词的第一个字母转换为大写.
// 利用ascii码值差来转换, 小写字母的ascii码值比大写字母的ascii码值大32
tmp[i] = fmt.Sprintf("%v%v", string(w[0]-32), string(w[1:]))
}
// 单词首字母非大写字母的情况不需要处理
}
return strings.Join(tmp, "") // 将切片拼接为字符串后返回
}
另外给大家看一个效率较低,且代码冗长的一个字符串转驼峰命名函数, 看看你能找出多少个效率低下和不规范的地方?
Go
// 驼峰命名 问题代码
func CamelStrX(s string) string {
data := make([]byte, 0, len(s))
j := false
k := false
num := len(s) - 1
for i := 0; i <= num; i++ {
d := s[i]
if k == false && d >= 'A' && d <= 'Z' {
k = true
}
if d >= 'a' && d <= 'z' && (j || k == false) {
d = d - 32
j = false
k = true
}
if k && d == '_' && num > i && s[i+1] >= 'a' && s[i+1] <= 'z' {
j = true
continue
}
data = append(data, d)
}
return string(data)
}
怎么样,你能看出上面代码中有多少个问题吗? 如果是你你会如何做呢?