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

3 回复

表情

谢谢

更多关于Golang中如何打印指针切片的值而非地址(无需迭代切片)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


实现 fmt.Stringerfmt.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}

这种方法的关键点:

  1. user结构体实现String()方法,定义单个指针的显示格式
  2. []*user类型创建别名userSlice并实现String()方法
  3. 在打印时通过类型转换userSlice(users)来使用自定义的格式化方法

注意:原代码中的切片传递存在逻辑问题,users切片在addUsers函数中的修改不会影响main函数中的原始切片,但这与打印格式的问题无关。

回到顶部