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

时间:2019-12-06 10:16:38

标签: pointers go member-functions

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-

我的问题是:

  1. 'a'会在{}本地范围之外发布吗?
  2. “ a”的生命周期等于“ fn”的生命周期吗?

1 个答案:

答案 0 :(得分:4)

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

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

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