func change(a string) string {
// fmt.Println(a)
v := ""
if string(a) == "a" {
return "A"
v += a
}
return ""
}
func main() {
fmt.Println(change("a"))
fmt.Println(change("ab"))
}
我是GO和编程的新手, 现在的输出是 A,但是为什么当我将变量值更改为"ab"时,它不返回任何值,输出必须是"Ab">
因此,您基本上希望输入中的所有a
都更改为A
。 目前你只是检查整个字符串是否等于"a"
,"ab"
不等于"a"
。因此,在第二种情况下,程序最终会return ""
。
通常,您可以使用类似的东西实现您想要的strings.ReplaceAll("abaaba","a","A")
.但出于教育目的,这里有一个"手动"解决方案。
func change(a string) string {
v := "" // our new string, we construct it step by step
for _, c := range a { // loop over all characters
if c != 'a' { // in case it's not an "a" ...
v += string(c) // ... just append it to the new string v
} else {
v += "A" // otherwise append an "A" to the new string v
}
}
return v
}
另请注意,c
属于rune
类型,因此必须转换为带有string(c)
的string
。
编辑:如评论中所述,在实践中,这不是构建新string
的最佳方式。公寓从从rune
到string
的麻烦,每次我们附加一些东西并删除旧的东西时,我们都会创建一个新string
。相反,我们只想创建一个string
一次 - 在最后,当我们确切地知道结果string
会是什么样子时。 因此,我们应该改用字符串生成器。为避免混淆,下面是一个单独的示例:
func change(a string) string {
var resultBuilder strings.Builder
for _, c := range a { // loop over all characters
if c != 'a' { // in case it's not an "a" ...
resultBuilder.WriteRune(c) // ... just append it to the new string v
} else {
resultBuilder.WriteString("A") // otherwise append an "A" to the new string v
}
}
return resultBuilder.String() // Create the final string once everything is set
}