Golang中如何打印指针切片的值而非地址(无需迭代切片)
Golang中如何打印指针切片的值而非地址(无需迭代切片) 以下是一个代码片段: 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 这样的函数来遍历切片并获取相应的值。
输出:
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}]
更多关于Golang中如何打印指针切片的值而非地址(无需迭代切片)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
实现 fmt.Stringer 或 fmt.GoStringer 接口。
在Go语言中,当直接使用fmt.Printf打印指针切片时,默认会显示内存地址而不是结构体的值。不过,可以通过实现String()方法来自定义指针切片的格式化输出,从而直接显示结构体的值。
以下是修改后的代码示例:
package main
import (
"fmt"
)
type user struct {
userID int
name string
email string
}
// 为user类型实现String()方法
func (u *user) String() string {
return fmt.Sprintf("&{%d %s %s}", u.userID, u.name, u.email)
}
// 为[]*user类型实现String()方法
type userSlice []*user
func (us userSlice) String() string {
return fmt.Sprintf("%v", []*user(us))
}
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) {
// 将切片转换为userSlice类型以使用自定义的String()方法
fmt.Printf("users at slice %v \n", userSlice(users))
}
func printEachUser(users []*user) {
for index, u := range users {
fmt.Printf("user at user[%d] is : %v \n", index, *u)
}
}
运行此代码将产生以下输出:
users at slice [&{1 cooluser1 cool.user1@gmail.com} &{2 cooluser2 cool.user2@gmail.com}]
user at user[0] is : {1 cooluser1 cool.user1@gmail.com}
user at user[1] is : {2 cooluser2 cool.user2@gmail.com}
这种方法的关键点:
- 为
user结构体实现String()方法,定义单个指针的显示格式 - 为
[]*user类型创建别名userSlice并实现String()方法 - 在打印时通过类型转换
userSlice(users)来使用自定义的格式化方法
注意:原代码中的切片传递存在逻辑问题,users切片在addUsers函数中的修改不会影响main函数中的原始切片,但这与打印格式的问题无关。


