2014-02-28 66 views
-1

是否可以創建一個方法片或一個指向片的指針並將它們存儲在結構中的字段中?轉:結構中的一些方法和方法

下面是問題的一個例子:

package main 

import (
    "fmt" 
) 

type Foo struct { 
    fooFunc func() /// Problem here 
    name string 
    age int 
} 

type Bar struct { 
    barFunc []func() /// Problem here. 
    salary int 
    debt int 
} 

func main() { 

    fooObject := Foo{name: "micheal", 
      fooFunc: testFunc} 

    fooObject.fooFunc() 

    fooObject = Foo{name: "lisa", 
      age : 22, 
      fooFunc: testFunc2} 

    fooObject.fooFunc() 


    barFuncList := make([]func(), 2,2) 
    barFuncList[0] = barSalary 
    barFuncList[1] = barDebt 

    barObject := Bar{name: fooObject.name, 
      salary: 45000, 
      debt: 200, 
      barFunc: barFuncList) 

    for i := 0; i < len(barObject.barFunc); i++{ // This is what I really want to do 
    barObject.barFunc[i] 
    } 
} 

func (bar *Foo) testfunc() { 
    fmt.Println(bar.name) 
} 

func (bar *Foo) testfunc2() { 
    fmt.Println("My name is ", bar.name , " and my age is " , bar.age) 
} 

func (foo *Bar) barSalary() { 
    fmt.Println(" My salary is " , foo.salary) 
} 

func (foo *Bar) barDebt() { 
    fmt.Println(" My salary is " , foo.debt) 
} 

有沒有辦法爲對象的方法附加在其結構的領域?

是否有可能將對象的方法的一部分放在其結構的字段中?

+0

「動態更新通過網絡與這些對象相關聯的方法,」誰在上帝的綠色地球想保持這種代碼?如果您需要動態對象,請使用動態語言。 –

+0

在這種情況下維護不是問題。這個問題類似於[this](http://stackoverflow.com/questions/16797191/how-do-i-create-an-array-of-method-pointers-in-c),除了數組/片指針應該是結構體的一個字段。 –

回答

1

Go不具備猴子修補功能(hooray!),但是如果您真的想要的話,您可以使用對象方法進行動態函數調用。我修改了(並修正了)你的代碼,以顯示這一點。

http://play.golang.org/p/2rwCW2N93-

package main 

import (
    "fmt" 
) 

type FF func(*Foo) 

type Foo struct { 
    foofunc FF 
    name string 
    age int 
} 

func foo1(f *Foo) { 
     fmt.Println("[foo1]", f.name) 
} 

func foo2(f *Foo) { 
     fmt.Println("[foo2] My name is ", f.name , " and my age is " , f.age) 
} 


type BB func(*Bar) 

type Bar struct { 
    barFuncs []BB 
    salary int 
    debt int 
} 

func barSalary(b *Bar) { 
     fmt.Println("[barSalary] My salary is " , b.salary) 
} 

func barDebt(b *Bar) { 
     fmt.Println("[barDebt] My salary is ", b.debt) 
} 

func main() { 

     fooObject := Foo{ 
       name: "micheal", 
     } 
     fooObject.foofunc = foo1 

     fooObject.foofunc(&fooObject) 

     fooObject = Foo{ 
       name: "lisa", 
       age : 22, 
     } 
     fooObject.foofunc = foo2 

     fooObject.foofunc(&fooObject) 



     barFuncList := make([]BB, 2, 2) 
     barFuncList[0] = barSalary 
     barFuncList[1] = barDebt 

     barObject := Bar{ 
       salary: 45000, 
       debt: 200, 
       barFuncs: barFuncList, 
     } 

     for i := 0; i < len(barObject.barFuncs); i++ { 
       barObject.barFuncs[i](&barObject) 
     } 
} 
+2

我不認爲OP在用慣用的Go方式解決他的問題(他沒有很好解釋);儘管如此,這裏的代碼更接近於原始代碼(比上述代碼)的語法修正:http://play.golang.org/p/Wz1b203-CI – voidlogic

+0

@voidlogic抱歉,但當時,我不知道如何更好地描述它,所以我輸入了一些示例代碼來展示我正在嘗試做什麼。而你的版本正是我一直在努力做的。謝謝。 –

0

嗯,我不認爲你可以動態更新結構字段上的方法,但可以動態調度interfaces上的方法。