在示例中,一切正常。但他们不使用变量a并立即显示它https://play.golang.org/p/O0XwtQJRej
但我有一个问题:
package main
import (
"fmt"
"strings"
)
func main() {
str := "fulltext"
var slice []string
slice = strings.Split(str , "")
fmt.Printf("anwer: ", slice)
}
答案中有多余的字符,例如
%! (EXTRA [] string =
P.S。我知道我需要使用append将元素添加到切片中,但现在我不明白如何在这里应用append。
UP: 现在我有了答案:
anwer:%!(EXTRA [] string = [f u l l t e x t])
但我只需要:
[f u l l t e x t]
但我不明白我应该如何更改代码?
答案 0 :(得分:2)
问题不在于将strings.Split()
的返回值赋值给局部变量slice
,这完全没问题。
问题在于您使用了需要格式字符串的fmt.Printf()
,并且基于该格式字符串,它格式化/替换了预期的参数。由于您的格式字符串不包含任何动词,因此fmt.Printf()
调用不需要参数,但是您将其传递一个,因此它会用这些额外的字符(错误字符串类型)发出信号。
提供有效的格式字符串,表明您将提供1个参数,即切片:
fmt.Printf("answer: %v", slice)
这样,输出为:
answer: [f u l l t e x t]
或者使用fmt.Println()
,它不期望格式字符串:
fmt.Println("answer:", slice)
(请注意冒号后面没有空格,因为fmt.Println()
如果其中一个值为string
类型,则会在2个值之间添加空格。
输出是一样的。试试Go Playground上的示例。
保持fmt.Printf()
,当参数涉及string
值时,%q
动词通常更有用,因为它会打印引用的字符串值,更容易发现某些错误(例如不可见的字符,或者如果string
包含空格,它将变得明显):
fmt.Printf("answer: %q\n", slice)
输出(在Go Playground上试试):
answer: ["f" "u" "l" "l" "t" "e" "x" "t"]
如果你想附加一个函数调用的结果,它的外观如下:
slice := []string{"initial", "content"}
slice = append(slice, strings.Split(str, "")...)
fmt.Printf("answer: %q\n", slice)
现在输出(在Go Playground上试试):
answer: ["initial" "content" "f" "u" "l" "l" "t" "e" "x" "t"]
答案 1 :(得分:0)
给printf指定期望的格式,在大多数情况下,%v
没问题。
package main
import (
"fmt"
"strings"
)
func main() {
str := "fulltext"
var slice []string
slice = strings.Split(str, "")
fmt.Printf("anwer: %v", slice)
}
请参阅https://golang.org/pkg/fmt/了解详情。