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

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

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

    }

}

在上面的代码中,如果我直接通过 fmt.printf 打印切片,我只会得到值的地址而不是实际值本身。


输出 :users at slice [0x442260 0x442280]


要始终读取值,我必须调用funclikeprintEachUser来迭代切片并获取适当的值。


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


莫回无
浏览 129回答 3
3回答

慕沐林林

调试目的需要这种输出。有什么办法,我们可以像下面这样直接使用并获取值来读取指针切片内的值fmt.Printf?users []*userfmt.Printf("users at slice %v \n", users)users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}]包 fmtimport "fmt"纵梁型Stringer 由具有 String 方法的任何值实现,该方法定义该值的“本机”格式。String 方法用于打印作为操作数传递给任何接受字符串的格式或未格式化打印机(如 Print)的值。type Stringer interface {         String() string}调试目的需要这种输出。有什么办法,我们可以像下面这样直接使用并获取值来读取指针切片内的值fmt.Printf?users []*userfmt.Printf("users at slice %v \n", users)users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}]包 fmtimport "fmt"纵梁型Stringer 由具有 String 方法的任何值实现,该方法定义该值的“本机”格式。String 方法用于打印作为操作数传递给任何接受字符串的格式或未格式化打印机(如 Print)的值。type Stringer interface {        String() string}例如,package mainimport (    "fmt")type user struct {    userID int    name   string    email  string}type users []*userfunc (users users) String() string {    s := "["    for i, user := range users {        if i > 0 {            s += ", "        }        s += fmt.Sprintf("%v", user)    }    return s + "]"}func addUsers(users users) {    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"})    fmt.Printf("users at slice %v \n", users)}func main() {    var users users    addUsers(users)}游乐场:https://play.golang.org/p/vDmdiKQOpqD输出:users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}] 

BIG阳

代码: https: //play.golang.org/p/rBzVZlovmEc输出 :切片用户 [{1 cooluser1 cool.user1@gmail.com} {2 cooluser2 cool.user2@gmail.com}]使用纵梁你可以实现它。参考: https: //golang.org/pkg/fmt/#Stringerpackage mainimport (    "fmt")type user struct {    userID int    name   string    email  string}func (t user) String() string {    return fmt.Sprintf("{%v %v %v}", t.userID, t.name, t.email)}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)}func printUsers(users []*user) {    fmt.Printf("users at slice %v \n", users)}您不需要将 stringer 应用于用户,即 []*users 相反,如果您只为单个用户执行此操作,它就可以正常工作。它还减少了您需要手动执行的字符串操作,使您的代码更加优雅。

拉莫斯之舞

您可以使用spewgo get -u github.com/davecgh/go-spew/spewfunc spewDump(users []*user) {&nbsp; &nbsp; _, err := spew.Printf("%v", users)&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("error while spew print", err)&nbsp; &nbsp; }}输出:[<*>{1 cooluser1 cool.user1@gmail.com} <*>{2 cooluser2 cool.user2@gmail.com}]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go