我试图改变Go中的现有字符串,但我一直收到此错误"无法分配给new_str [i]"
package main
import "fmt"
func ToUpper(str string) string {
new_str := str
for i:=0; i<len(str); i++{
if str[i]>='a' && str[i]<='z'{
chr:=uint8(rune(str[i])-'a'+'A')
new_str[i]=chr
}
}
return new_str
}
func main() {
fmt.Println(ToUpper("cdsrgGDH7865fxgh"))
}
这是我的代码,我希望将小写改为大写,但我不能改变字符串。为什么?我怎么改变它?
P.S我希望只使用fmt包!
提前致谢。
答案 0 :(得分:4)
你不能......他们是不可改变的。来自Golang Language Specification:
字符串是不可变的:一旦创建,就不可能改变字符串的内容。
但是,您可以将其投射到[]byte
切片并更改:
func ToUpper(str string) string {
new_str := []byte(str)
for i := 0; i < len(str); i++ {
if str[i] >= 'a' && str[i] <= 'z' {
chr := uint8(rune(str[i]) - 'a' + 'A')
new_str[i] = chr
}
}
return string(new_str)
}
答案 1 :(得分:3)
在Go中,字符串是不可变的。这是一种非常糟糕的做法(playground)
package main
import "fmt"
func ToUpper(str string) string {
new_str := ""
for i := 0; i < len(str); i++ {
chr := str[i]
if chr >= 'a' && chr <= 'z' {
chr = chr - 'a' + 'A'
}
new_str += string(chr)
}
return new_str
}
func main() {
fmt.Println(ToUpper("cdsrgGDH7865fxgh"))
}
这很糟糕,因为
range str
是可行的方法值得探讨一下new_str += string(chr)
这一行。字符串是不可变的,所以它的作用是在最后创建一个带有chr
的新字符串,它不会扩展旧字符串。对于长字符串来说,这是非常低效的,因为分配的内存将倾向于字符串长度的平方。
下次使用strings.ToUpper!
答案 2 :(得分:3)
使用range
并避免不必要的转化和分配。字符串是不可变的。例如,
package main
import "fmt"
func ToUpper(s string) string {
var b []byte
for i, c := range s {
if c >= 'a' && c <= 'z' {
if b == nil {
b = []byte(s)
}
b[i] = byte('A' + rune(c) - 'a')
}
}
if b == nil {
return s
}
return string(b)
}
func main() {
fmt.Println(ToUpper("cdsrgGDH7865fxgh"))
}
输出:
CDSRGGDH7865FXGH