如何在不进行迭代的情况下打印指针切片以获取值而不是其地址?

Sid*_*ath 6 go slice

调试目的需要这种输出.每次需要迭代时,要获得指针切片的实际值.

有没有办法,我们可以使用简单的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]

要阅读的价值观始终,我要打电话funcprintEachUser迭代切片,并得到相应的价值.

输出: 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}]

pet*_*rSO 5

\n

这种输出需要用于调试目的。

\n\n

有什么办法,我们可以使用读取指针切片内的值fmt.Printf并直接获取值,如下所示?

\n\n
users []*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
Run Code Online (Sandbox Code Playgroud)\n
\n\n
\n\n
\n

封装 fmt

\n\n

import "fmt"

\n\n

类型纵梁

\n\n

Stringer 由具有 String 方法的任何值实现,该方法定义该值的 \xe2\x80\x9cnative\xe2\x80\x9d 格式。String 方法用于将作为操作数传递的值打印到接受字符串的任何格式或打印到未格式化的打印机(例如 Print)。

\n\n
type Stringer interface {\n        String() string\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n
\n\n

例如,

\n\n
package 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

游乐场:https://play.golang.org/p/vDmdiKQOpqD

\n\n

输出:

\n\n
users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}] \n
Run Code Online (Sandbox Code Playgroud)\n