调试目的需要这种输出.每次需要迭代时,要获得指针切片的实际值.
有没有办法,我们可以使用简单的fmt.printf()直接获取值而不是切片上每个项目的地址?
这是一个代码片段:https: //play.golang.org/p/bQ5vWTlKZmV
package main
import (
"fmt"
)
type user struct {
userID int
name string
email string
}
func main() {
var users []*user
addUsers(users)
}
func addUsers(users []*user) {
users = append(users, &user{userID: 1, name: "cooluser1", email: "cool.user1@gmail.com"})
users = append(users, &user{userID: 2, name: "cooluser2", email: "cool.user2@gmail.com"})
printUsers(users)
printEachUser(users)
}
func printUsers(users []*user) {
fmt.Printf("users at slice %v \n", users)
}
func printEachUser(users []*user) {
for index, u := range users {
fmt.Printf("user at user[%d] is : %v \n", index, *u)
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,如果我通过fmt.printf直接打印切片,我只得到值的地址而不是实际值本身.
输出: users at slice [0x442260 0x442280]
要阅读的价值观始终,我要打电话func像printEachUser迭代切片,并得到相应的价值.
输出:
user at user[0] is : {1 cooluser1 cool.user1@gmail.com}
user at user[1] is : {2 cooluser2 cool.user2@gmail.com}
有没有办法,我们可以读取指针切片中的fmt.printf值并直接获取值,如下所示?
users at slice [&{1 cooluser1 cool.user1@gmail.com} , &{2 cooluser2 cool.user2@gmail.com}]
\n\n\n这种输出需要用于调试目的。
\n\n有什么办法,我们可以使用读取指针切片内的值
\n\nfmt.Printf并直接获取值,如下所示?Run Code Online (Sandbox Code Playgroud)\nusers []*user\nfmt.Printf("users at slice %v \\n", users)\n\nusers at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}]\n
\n \n\n\n\n\n\n \n\n
import "fmt"Stringer 由具有 String 方法的任何值实现,该方法定义该值的 \xe2\x80\x9cnative\xe2\x80\x9d 格式。String 方法用于将作为操作数传递的值打印到接受字符串的任何格式或打印到未格式化的打印机(例如 Print)。
\n\nRun Code Online (Sandbox Code Playgroud)\ntype Stringer interface {\n String() string\n}\n
例如,
\n\npackage main\n\nimport (\n "fmt"\n)\n\ntype user struct {\n userID int\n name string\n email string\n}\n\ntype users []*user\n\nfunc (users users) String() string {\n s := "["\n for i, user := range users {\n if i > 0 {\n s += ", "\n }\n s += fmt.Sprintf("%v", user)\n }\n return s + "]"\n}\n\nfunc addUsers(users users) {\n users = append(users, &user{userID: 1, name: "cooluser1", email: "cool.user1@gmail.com"})\n users = append(users, &user{userID: 2, name: "cooluser2", email: "cool.user2@gmail.com"})\n\n fmt.Printf("users at slice %v \\n", users)\n}\n\nfunc main() {\n var users users\n addUsers(users)\n}\nRun Code Online (Sandbox Code Playgroud)\n\n游乐场:https://play.golang.org/p/vDmdiKQOpqD
\n\n输出:
\n\nusers at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}] \nRun Code Online (Sandbox Code Playgroud)\n