2017-03-31 40 views
1

我在想,如果做這樣的事情在golang甚至有可能 -在golang中,如何將方法分配給現有的結構對象?

type MyStruct struct { 
    id int 
} 

func (ms *MyStruct) PrintHello() { 
    fmt.Printf("Hello from original method %v", ms.id) 
} 

func main() { 
    fmt.Println("Hello, playground") 
    m := MyStruct{} 
    m.PrintHello() 

    m.PrintHello = func() {fmt.Printf("Hello from newer method 2")} 
} 

Error: cannot assign to m.PrintHello 

https://play.golang.org/p/2oJQFFH4O5

很抱歉,如果這不適合去程序員是有意義的,我是新來的你去,如果一些人懷疑可以在Go中完成可以用動態類型語言完成的事情。謝謝! :-)

+1

這個答案可能會提供一些見解http://stackoverflow.com/questions/21251242/is-it-possible-to-call-overridden-method-from-parent-struct-in-golang – Adam

+2

https:// play .golang.org/p/Lp3aP2dqpt – mkopriva

+0

@mkopriva做這件事的特殊方式可能比我的更優先。但是再次,它仍然包含能夠訪問內部結構數據成員的問題。但至少該方法本身是一個真正的方法。 – RayfenWindspear

回答

4

鑑於Go是一種靜態類型語言,您無法執行此特定代碼。但是,函數是變量,所以你可以做這樣的事情。請記住,這在技術上與分配新方法不同,正如JimB在評論中所述。

https://play.golang.org/p/rfuCzXD8fP

package main 

import (
    "fmt" 
) 

type MyStruct struct { 
    id   int 
    PrintHello func(ms * MyStruct) 
} 

func (ms *MyStruct) init() { 
    ms.PrintHello = func(ms *MyStruct) { fmt.Printf("Hello from original method %v\n", ms.id) } 
} 

func main() { 
    m := &MyStruct{id: 42} 
    m.init() 
    m.PrintHello(m) 

    m.PrintHello = func(ms *MyStruct) { fmt.Printf("Hello from newer method 2 %d\n", ms.id) } 
    m.PrintHello(m) 
} 

因爲這個功能是不是一個真正的方法,你只能把它當作一個參數訪問內部結構值。這意味着如果這必須跨越包裝邊界,則未提供的值將不可用。

注意功能類型需要相同也很重要。因此,如果您在結構中將函數定義爲PrintHello func(ms * MyStruct) error,則需要指定一個返回錯誤的函數。

+0

但這不是一種方法,因此它不是方法集的一部分。 – JimB

+0

@JimB確實如此,但這是一種替代方法來完成所期望的任務。如果修改方法真的是我想要的,我認爲不能完成。 – RayfenWindspear

+0

實際上,不,你是對的,這是不理想的,因爲你不能以這種方式訪問​​結構值。你可以通過'PrintHello func(ms * MyStruct)'來定義函數var來接受結構指針。編輯回答對此進行說明。 – RayfenWindspear