Go 如何修改字符串中的特定字符

Go 如何修改字符串中的特定字符,go,Go,在C语言中,我们将字符串的字符定义为Char。所以我想更改Go中字符串的一个字符 if sum%11 != int(str[strlen-1]) { str[strlen-1] = byte(sum % 11) //fmt.Printf("%T %T\n", str[strlen-1], byte(sum%11)) } else { fmt.Println(sum) } 但它将报告一个错误“无法分配给str[strlen-1]”。str[strlen-1]和字节(总和%

在C语言中,我们将字符串的字符定义为Char。所以我想更改Go中字符串的一个字符

if sum%11 != int(str[strlen-1]) {
    str[strlen-1] = byte(sum % 11)
    //fmt.Printf("%T %T\n", str[strlen-1], byte(sum%11))
} else {
    fmt.Println(sum)
}

但它将报告一个错误“无法分配给str[strlen-1]”。str[strlen-1]和字节(总和%11)都是uint8。为什么错了?如何转换?

与C不同,Go字符串是不可变的,因此不能修改字符串中的单个字节。但是,您可以将字符串转换为字节数组,进行更改,然后将该字节数组转换为字符串

arr:=[]byte(str)
arr[strlen-1]=byte(sum%11)
str=string(arr)

请注意,Go字符串是UTF-8编码的。符文可以表示为多个字节。通过这样修改字符串,您可能会得到一个无效字符串。

是的,但仍然是字节数组。UTF-8是一种可变长度编码,每个字符有一到四个字节。字节不是字符。如果基础字符串使用1字节符文,则可以将该字符串视为字节数组,不是吗?是的,学究式的解决方案是按最后一个
符文(1-4字节)替换符文为1字节。但由于OP引用了C&很可能是ASCII字符串,所以这个解决方案可能很好。8位Unicode码点是UTF-8编码的一个或两个字节。字符串是不可变的,但片不是。如果您正在处理二进制数据,请首先将字符串转换为
[]字节
[]uint8
。如果您正在处理UTF-8编码文本,请将其转换为
[]符文
(符文是uint32的别名)。如果你正在处理任何其他的文本编码,那你就得靠自己了。