Go语言实现单词反转并保留首字母大写报错求助
问题分析与解决
错误原因
Go语言里的字符串是不可变类型,你代码里的word是string类型,通过word[j]访问到的是byte值的副本,并非指向原字符串的可修改引用,所以直接对word[j]赋值会触发编译错误。
修复方案
把要修改的字符串先转换成[]byte切片(切片是可变的),修改完成后再转回string即可。同时还要修正代码里的两个小问题:
- 最后拼接字符串时的判断条件错误:
i==len(stringArray)应该改成i == len(stringArray)-1,否则最后会多一个空格 - 变量名拼写错误:
revered应该是reversed
修改后的完整代码
package main import ( "fmt" ) func main() { //Input - This Is Test //Output - Siht Si Tset s := "This Is Test" reversed := reverseString(s) fmt.Println(reversed) } func reverseString(input string) string { stringArray := convertToArray(input) finalWord := "" for i := 0; i < len(stringArray); i++ { reversedWord := "" // 将string转为[]byte,允许修改元素 wordBytes := []byte(stringArray[i]) wordLen := len(wordBytes) for j := wordLen - 1; j >= 0; j-- { // 反转后原单词的最后一位变成新单词的第一位,需要转大写 if wordBytes[j] >= 97 && wordBytes[j] <= 122 && j == wordLen-1 { wordBytes[j] -= 32 } // 反转后原单词的第一位变成新单词的最后一位,需要转小写 if wordBytes[j] >= 65 && wordBytes[j] <= 90 && j == 0 { wordBytes[j] += 32 } reversedWord += string(wordBytes[j]) } // 修正判断条件,避免最后多一个空格 if i == len(stringArray)-1 { finalWord += reversedWord } else { finalWord += reversedWord + " " } } return finalWord } func convertToArray(input string) []string { stringSlice := []string{} newStr := "" for i := 0; i < len(input); i++ { if string(input[i]) == " " { stringSlice = append(stringSlice, newStr) newStr = "" } else { newStr += string(input[i]) } } // 把最后一个单词加入切片(原count变量无意义) if newStr != "" { stringSlice = append(stringSlice, newStr) } return stringSlice }
额外优化说明
原convertToArray函数里的count变量完全多余,直接判断newStr是否为空来追加最后一个单词更简洁。
内容的提问来源于stack exchange,提问作者Pratyush
相关产品推荐
相关产品推荐

