如何在方法中更改函数参考字段?

type FuncPtr func(int) int

func Foo(i int) { return i * i }

type Events struct {
  SomeFunc FuncPtr
}

type Top struct {
  events Events
}

func (self *Top) initEvents() {
  // This change works within this function, but
  // doesn't stick around after this method returns.
  self.events.SomeFunc = Foo 
}

func main() {
  var t := Top{}
  t.initEvents()
  t.events.SomeFunc == nil // True: Change in initEvents() doesn't stick
}

How can I make the change inside initEvents() method persist? That is, I want to change the value of the function reference Top::Events::SomeFunc within the initEvents() method and for that change to stick once the initEvents() method returns.

The code you have works with some minor corrections to make it compileable.

  1. There's no package declaration at the top
  2. You're not specifying an integer return type for your function Foo

I've included a full example of the code below for convenience and if you want to run this yourself you can do it at: https://play.golang.org/p/Ngu8FFiGrI

package main

import(
  "fmt"
)

type FuncPtr func(int) int

func Foo(i int) int {
  return i*i
}

type Events struct {
  SomeFunc FuncPtr
}

type Top struct {
  events Events
}

func (self *Top) initEvents() {
  // This change works within this function, but
  // doesn't stick around after this method returns.
  self.events.SomeFunc = Foo 
}

func main() {
  var t = Top{}
  t.initEvents()
  if t.events.SomeFunc == nil {
    fmt.Println("SomeFunc not set")
  }
  fmt.Println("6^2 =",t.events.SomeFunc(6))
}