2014-12-04 31 views
0
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 
} 

如何使initEvents()方法中的更改持續存在?也就是說,我想在initEvents()方法中更改函數引用Top::Events::SomeFunc的值,並且一旦initEvents()方法返回,該更改將繼續。如何更改方法內的函數引用字段?

+1

恐怕你的代碼工作正常:'t.events.SomeFunc'是不是'在所有nil'(點擊此處查看:HTTPS: // p lay.golang.org/p/s2da81Jnmg)。或者我錯了,問題在別的地方? – tomasz 2014-12-04 16:38:09

+0

似乎工作正常,只是將Foo func聲明更改爲返回int('func Foo(i int)int {return i * i}') – Makpoc 2014-12-04 16:41:02

+0

@tomasz啊,您的測試讓我意識到這與如何處理我實際上是在我的代碼中調用它(查看循環):https://play.golang.org/p/P_j4_szh2J – Dess 2014-12-04 16:51:04

回答

0

你有一些小的更正,使其可編譯的代碼工作。

  1. 有頂部
  2. 沒有包聲明你沒有指定一個整數返回類型爲你的函數foo

我已經包含代碼的完整示例下面爲了方便,如果你想這個運行自己,你可以做到這一點: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)) 
} 
+0

代碼本身只是一個例子,沒有經過語法測試。真正的原因是因爲在我自己的代碼庫中,我使用它是這樣的:https://play.golang.org/p/P_j4_szh2J – Dess 2014-12-04 16:53:22

+0

我仍然想知道如何在版本中製作更改for-each – Dess 2014-12-04 16:54:03

+0

爲此,您可以將數組從[] Top更改爲[] * Top。 – Makpoc 2014-12-04 17:10:29