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中的字符串是不可变的,每次连接都会创建新的字符串。

回到顶部