为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
莫回无 2023-06-01 17:59:05
调试目的需要这种输出。为了获得指针切片的实际值,每次都需要迭代。有什么办法,我们可以使用简单的 fmt.printf() 直接获取值而不是切片中每个项目的地址?这是一个代码片段: https ://play.golang.org/p/bQ5vWTlKZmVpackage mainimport (    "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}]
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

调试目的需要这种输出。


有什么办法,我们可以像下面这样直接使用并获取值来读取指针切片内的值fmt.Printf?


users []*user

fmt.Printf("users at slice %v \n", users)


users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}]

包 fmt

import "fmt"

纵梁型

Stringer 由具有 String 方法的任何值实现,该方法定义该值的“本机”格式。String 方法用于打印作为操作数传递给任何接受字符串的格式或未格式化打印机(如 Print)的值。

type Stringer interface {
        String() string}


调试目的需要这种输出。


有什么办法,我们可以像下面这样直接使用并获取值来读取指针切片内的值fmt.Printf?


users []*user

fmt.Printf("users at slice %v \n", users)


users at slice [&{1 cooluser1 cool.user1@gmail.com}, &{2 cooluser2 cool.user2@gmail.com}]

包 fmt


import "fmt"


纵梁型


Stringer 由具有 String 方法的任何值实现,该方法定义该值的“本机”格式。String 方法用于打印作为操作数传递给任何接受字符串的格式或未格式化打印机(如 Print)的值。


type Stringer interface {

        String() string

}

例如,


package main


import (

    "fmt"

)


type user struct {

    userID int

    name   string

    email  string

}


type users []*user


func (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}] 



查看完整回答
反对 回复 2023-06-01
?
BIG阳

TA贡献1859条经验 获得超6个赞

代码: https: //play.golang.org/p/rBzVZlovmEc

输出 :

切片用户 [{1 cooluser1 cool.user1@gmail.com} {2 cooluser2 cool.user2@gmail.com}]

使用纵梁你可以实现它。

参考: https: //golang.org/pkg/fmt/#Stringer

package main


import (

    "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 相反,如果您只为单个用户执行此操作,它就可以正常工作。它还减少了您需要手动执行的字符串操作,使您的代码更加优雅。


查看完整回答
反对 回复 2023-06-01
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您可以使用spew


go get -u github.com/davecgh/go-spew/spew


func spewDump(users []*user) {

    _, err := spew.Printf("%v", users)

    if err != nil {

        fmt.Println("error while spew print", err)

    }

}

输出:


[<*>{1 cooluser1 cool.user1@gmail.com} <*>{2 cooluser2 cool.user2@gmail.com}]


查看完整回答
反对 回复 2023-06-01
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信