结构域的Go递归-函数vs.指针法

x33g5p2x  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(73)

给出了一个示例性的

type container struct {
  arr int[]
}

我想 * 递归地 * 操作它的arr数组字段值。
我有两个功能选项:

  • container上的(pointer receiver)* 方法 *,直接访问其arr数组
  • a function,接收arr切片作为参数
  • 在任何情况下,必须将交替的开始和结束索引作为参数传递给每个递归调用。*
    问题:

是否存在任何已知的、理论上有利或不利的影响,主要是在性能¹和内存占用方面,通过使用一种实现而不是另一种实现,并考虑arr将保持在10^610^9元素之间?
¹运行(非专业基准)测试实现,性能似乎没有显著差异

vsnjm48y

vsnjm48y1#

我认为你可以使用这两个选项,但我建议使用指向数组的指针,因为它可以保护你免受意外追加到切片,这可能会导致整个切片内存的复制。
另外请记住,您不能以这种方式使用数组:

func foo(sl []int) {
    sl[1] = 15
}

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    foo(arr)
}

输出:

cannot use arr (variable of type [5]int) as []int value in argument to foo

但是你可以将array转换为slice而不复制它:

package main

import (
    "fmt"
)

func foo(sl []int) {
    sl[1] = 55
}

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    sl := arr[:]

    fmt.Printf("arr=%v, sl=%v\n", arr, sl)

    arr[1] = 5
    fmt.Printf("arr=%v, sl=%v\n", arr, sl)

    sl[1] = 15
    fmt.Printf("arr=%v, sl=%v\n", arr, sl)

    foo(sl)
    fmt.Printf("arr=%v, sl=%v\n", arr, sl)
}

输出:

arr=[1 2 3 4 5], sl=[1 2 3 4 5]
arr=[1 5 3 4 5], sl=[1 5 3 4 5]
arr=[1 15 3 4 5], sl=[1 15 3 4 5]
arr=[1 55 3 4 5], sl=[1 55 3 4 5]

相关问题