在Go语言中,指针切片 []*TaskNode
和结构体切片 []TaskNode
之间的转换可以通过遍历切片并逐个转换元素来实现。以下是如何高效地进行这两种转换的示例代码。
[]*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
}
[]TaskNode
转换为 []*TaskNode
func ConvertStructSliceToPtrSlice(structSlice []TaskNode) []*TaskNode {
ptrSlice := make([]*TaskNode, len(structSlice))
for i := range structSlice {
ptrSlice[i] = &structSlice[i]
}
return ptrSlice
}
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)
}
[]TaskNode
转换为 []*TaskNode
时,返回的指针切片中的每个指针都指向原始结构体切片中的元素。因此,如果原始结构体切片被修改,指针切片中的元素也会受到影响。[]*TaskNode
转换为 []TaskNode
时,如果切片中包含 nil
指针,需要特别处理,以避免解引用 nil
指针导致的运行时错误。通过上述方法,你可以高效地在 []*TaskNode
和 []TaskNode
之间进行转换。