Golang求助 - 如何将字符串转换为大写
Golang求助 - 如何将字符串转换为大写 我正在参加一个强化课程,学习如何在Go语言中创建我们自己的包(函数)。考虑到这一点,我们不允许使用任何现成的包。那么,我如何才能将字符串中的小写字符转换为大写,同时保持已经是大写的字符不变呢?
5 回复
嗨,非常感谢!我现在正致力于用 Go 语言构建一个数独求解器,除了 os 包之外不使用任何导入……但还是要感谢大家!>.<
更多关于Golang求助 - 如何将字符串转换为大写的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package main
import (
"fmt"
)
func main() {
test := "This Is A Test To Upper"
fmt.Println(toUpper(test))
}
func toUpper(str string) string {
var ret_str = ""
for _, chr := range str {
if chr >= 97 && chr <= 122 {
chr -= 32
}
ret_str += fmt.Sprintf("%c", chr)
}
return ret_str
}
以下是一些想法,虽然不直接提供答案,但可能有助于你找到实现的方向:
- 查阅 Go 博客中关于字符串的部分,特别注意符文(rune)以及针对字符串的
range循环。 - 对于一个简单的实现,可以看看 maps。然后看看 如何检查一个 map 是否包含某个键。如果你有一个
map[rune]string类型的 map,结合你学到的关于遍历字符串中符文的知识,你可以如何使用它? - 通常,如果我想做与标准库中类似的事情,我会查看标准库中实现了类似功能的代码。为此,如果你想追求 @hollowaykeanho 所暗示的终极实现,那么
strings.Map、strings.ToUpper以及unicode/letter.ToUpper的源代码可能会让你感兴趣。
你可以:
- 首先从网上研究将纯小写字母
a-z转换为大写A-Z的算法。 - 创建一个将
a转换为A的函数。 - 用一个句子进行测试。观察是否所有的
a都被转换成了A。 - 如果可行,保存一个副本(或使用 git add),然后一次升级一个字符,直到处理完
Z。
你可能需要询问你的教练,转换是否包含方言字符(例如 å-з)。原因是,由于需要覆盖的字符数量太多,你可能需要申请使用 runes 包。
由于这是一项 Go 编程作业,我不能提供代码片段,因为你需要亲自动手开发的经验(例如,如何通过广泛使用谷歌搜索来获取资源、处理挫折、管理压力以及在规定时间内交付成果)。好的一面是,我们可以审查代码。关键在于,代码必须由你自己编写,而不是其他人。
提示:
- 肯定会涉及循环和/或切片。
- 模糊逻辑方法(例如
if else if或switch)。 - 或者:查找表方法。如果你喜欢冒险,可以查看 Unicode-8 字节表 并分析一种查找这些字符的方法。
- Go 包示例(提示:
Titlecase) - 如果你想要一个终极答案,字节表中存在一种模式,可以通过数学运算执行转换。
// 不使用strings包的ToUpper函数,手动实现字符串大写转换
func ToUpperCustom(s string) string {
// 将字符串转换为rune切片以便处理Unicode字符
runes := []rune(s)
for i := 0; i < len(runes); i++ {
// 检查字符是否为小写字母
if runes[i] >= 'a' && runes[i] <= 'z' {
// 小写字母与大写字母的ASCII码差值为32
runes[i] = runes[i] - 32
}
// 如果是Unicode小写字母(超出ASCII范围)
// 这里可以扩展处理其他语言的小写字母
}
return string(runes)
}
// 更完整的版本,支持更多Unicode字符
func ToUpperCustomUnicode(s string) string {
runes := []rune(s)
for i, r := range runes {
// 使用Unicode属性检查是否为小写字母
if r >= 'a' && r <= 'z' {
// ASCII小写字母转换
runes[i] = r - ('a' - 'A')
} else if r >= 'à' && r <= 'ÿ' && r != '÷' && r != '×' {
// 扩展拉丁字母处理示例
// 实际应用中需要更完整的Unicode映射表
}
}
return string(runes)
}
// 使用示例
func main() {
testString := "Hello World! 123 gò-lang"
result1 := ToUpperCustom(testString)
// 输出: HELLO WORLD! 123 Gò-LANG
result2 := ToUpperCustomUnicode(testString)
// 输出: HELLO WORLD! 123 GÒ-LANG
}
这个实现通过直接操作字符的ASCII/Unicode码点来转换大小写。对于纯ASCII字符串,简单的减法(减32)即可完成转换。如果需要更完整的Unicode支持,可以扩展字符范围检查。

