【发布时间】:2019-06-15 13:27:46
【问题描述】:
调试需要这种输出。 为了获得指针切片的实际值,每次都需要迭代。
有什么办法,我们可以使用简单的 fmt.printf() 直接获取值而不是切片中每个项目的地址吗?
这是一个代码 sn-p : 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)
}
}
在上面的代码中,如果我直接通过 fmt.printf 打印切片,我只得到值的地址而不是实际值本身。
输出:users at slice [0x442260 0x442280]
要始终读取这些值,我必须像 printEachUser 一样调用 func 来迭代切片并获得适当的值。
输出:
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}]
【问题讨论】:
-
不,没有迭代就没有办法。事实上,没有迭代也无法打印值——只是
fmt为您处理了该迭代。但是有一些库会为你做这样的迭代。 spew 可能值得考虑。 -
哦,是的!
fmt负责迭代。但是,与其依赖其他软件包,您不认为实现fmt.Stringer会是一个更明智的选择吗? @Flimzy -
当然,实现
fmt.Stringer是可行的。哪个是更好的选择取决于您的目标。