插件窝 干货文章 Go语言中如何高效转换指针切片 []*TaskNode 与结构体切片 []TaskNode?

Go语言中如何高效转换指针切片 []*TaskNode 与结构体切片 []TaskNode?

TaskNode structSlice 转换 切片 956    来源:    2025-03-13

在Go语言中,指针切片 []*TaskNode 和结构体切片 []TaskNode 之间的转换可以通过遍历切片并逐个转换元素来实现。以下是如何高效地进行这两种转换的示例代码。

1. 将 []*TaskNode 转换为 []TaskNode

type TaskNode struct {
    ID   int
    Name string
}

func ConvertPtrSliceToStructSlice(ptrSlice []*TaskNode) []TaskNode {
    structSlice := make([]TaskNode, len(ptrSlice))
    for i, ptr := range ptrSlice {
        if ptr != nil {
            structSlice[i] = *ptr
        }
    }
    return structSlice
}

2. 将 []TaskNode 转换为 []*TaskNode

func ConvertStructSliceToPtrSlice(structSlice []TaskNode) []*TaskNode {
    ptrSlice := make([]*TaskNode, len(structSlice))
    for i := range structSlice {
        ptrSlice[i] = &structSlice[i]
    }
    return ptrSlice
}

3. 使用示例

func main() {
    // 示例数据
    ptrSlice := []*TaskNode{
        {ID: 1, Name: "Task1"},
        {ID: 2, Name: "Task2"},
    }

    // 将 []*TaskNode 转换为 []TaskNode
    structSlice := ConvertPtrSliceToStructSlice(ptrSlice)
    fmt.Println(structSlice)

    // 将 []TaskNode 转换为 []*TaskNode
    newPtrSlice := ConvertStructSliceToPtrSlice(structSlice)
    fmt.Println(newPtrSlice)
}

4. 注意事项

  • 性能:这两种转换方法都是通过遍历切片来实现的,时间复杂度为 O(n),其中 n 是切片的长度。对于大多数应用场景来说,这种性能是可以接受的。
  • 内存管理:在将 []TaskNode 转换为 []*TaskNode 时,返回的指针切片中的每个指针都指向原始结构体切片中的元素。因此,如果原始结构体切片被修改,指针切片中的元素也会受到影响。
  • 空指针处理:在将 []*TaskNode 转换为 []TaskNode 时,如果切片中包含 nil 指针,需要特别处理,以避免解引用 nil 指针导致的运行时错误。

通过上述方法,你可以高效地在 []*TaskNode[]TaskNode 之间进行转换。