Golang中如何仅打印结构体切片中每个结构体的payload部分
Golang中如何仅打印结构体切片中每个结构体的payload部分
type Node struct {
payload intl
left, right *Node
}
我有一个Node切片:var nodes []Node
如何只打印这个结构体中节点的payload,并用逗号分隔?
目前我这样做:
result := ""
for i := range nodes {
result += strconv.Itoa(nodes[i].payload) + " "
}
但我确信可以有更好或更简短的方法。有什么想法吗?
3 回复
你好,
看起来你忘记了你的节点切片中的任何节点都可能拥有左右子节点,而这些子节点不一定存在于你的切片中!考虑使用递归。
更多关于Golang中如何仅打印结构体切片中每个结构体的payload部分的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在循环中拼接字符串时,最好使用 strings.Builder
var sb strings.Builder
for _, node := range nodes {
sb.WriteString(strconv.Itoa(node.payload))
sb.WriteString(" ")
}
result := sb.String()
可以使用Go标准库中的strings.Join结合strings.Builder或直接使用切片来更高效地实现这个需求。以下是几种改进方法:
方法1:使用strings.Join(推荐)
import (
"strconv"
"strings"
)
payloads := make([]string, len(nodes))
for i, node := range nodes {
payloads[i] = strconv.Itoa(node.payload)
}
result := strings.Join(payloads, ", ")
fmt.Println(result)
方法2:使用strings.Builder(性能更好)
import (
"strconv"
"strings"
)
var builder strings.Builder
for i, node := range nodes {
if i > 0 {
builder.WriteString(", ")
}
builder.WriteString(strconv.Itoa(node.payload))
}
result := builder.String()
fmt.Println(result)
方法3:直接打印,不构建字符串
import "strconv"
for i, node := range nodes {
if i > 0 {
fmt.Print(", ")
}
fmt.Print(strconv.Itoa(node.payload))
}
fmt.Println()
方法4:使用fmt.Sprintf(简洁但性能稍差)
import "fmt"
result := ""
for i, node := range nodes {
if i > 0 {
result += ", "
}
result += fmt.Sprintf("%d", node.payload)
}
fmt.Println(result)
对于大量数据,方法2(strings.Builder)性能最佳。对于中等数据量,方法1(strings.Join)代码最简洁。你的原始方法在字符串连接上效率较低,因为Go中的字符串是不可变的,每次连接都会创建新的字符串。

