gpt4 book ai didi

pointers - 如果我将成员函数指针放在指针实例范围之外,是否有任何问题

转载 作者:行者123 更新时间:2023-12-01 22:42:52 24 4
gpt4 key购买 nike

type A struct {
x1 []int
x2 []string
}
func (this *A) Test() {
fmt.Printf("this is: %p, %+v\n", this, *this)
}
func main() {
var fn func()
{
a := &A{}

a.x1 = []int{1, 2, 3}
a.x2 = []string{"one", "two", "three"}
fn = a.Test
}

fn()
}

请参阅: https://play.golang.org/p/YiwHG0b1hW-

我的问题是:
  • 'a'会在{}本地范围之外发布吗?
  • “a”的生存期是否等于“fn”的生存期?
  • 最佳答案

    Go是一种垃圾收集语言。只要您不触摸unsafe包(或类似于Value.UnsafeAddr()包中的 reflect 的包),所有值只要可访问就保留在内存中。您不必担心内存管理。

    这就是为什么返回在函数内部创建的局部变量的地址(指针)也是安全的。同样安全的是,从函数值(闭包)中引用局部变量,这些函数变量在将来某个时间执行时将超出范围,例如:

    func counter() func() int {
    i := 0
    return func() int {
    i++
    return i
    }
    }

    counter()返回一个函数(关闭),该函数在调用时返回递增的值:
    c := counter()
    fmt.Println(c())
    fmt.Println(c())
    fmt.Println(c())

    输出(在 Go Playground上尝试):
    1
    2
    3
    counter()创建一个本地变量 i,该变量不会返回,但可以从它返回的函数值中进行访问。只要可访问返回的函数值,就不会释放局部变量 i。同样,如果再次调用 counter(),则会创建一个不同于上一个的新 i变量。

    查看相关问题:

    How to delete struct object in go?

    Cannot free memory once occupied by bytes.Buffer

    关于pointers - 如果我将成员函数指针放在指针实例范围之外,是否有任何问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59211106/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com