在PHP開發中,將方法參數傳遞給函數是常見的需求。透過將參數傳遞給函數,我們可以在函數內部對參數進行操作和處理,從而實現更靈活和可重複使用的程式碼。在本文中,php小編百草將為大家介紹如何正確地將方法參數傳遞給函數,並分享一些實用的技巧和注意事項,幫助開發者更好地理解和應用這一重要的程式設計概念。無論您是初學者還是有一定經驗的開發者,本文都會為您提供有價值的參考和指導。
我很好奇這在 go 中是否可行。我有一個具有多種方法的類型。是否可以有一個函數,它接受一個方法參數,然後為該類型呼叫它?
這是我想要的一個小例子:
package main import ( "fmt" ) type Foo int func (f Foo) A() { fmt.Println("A") } func (f Foo) B() { fmt.Println("B") } func (f Foo) C() { fmt.Println("C") } func main() { var f Foo bar := func(foo func()) { f.foo() } bar(A) bar(B) bar(C) }
go 認為類型 foo
有一個名為 foo()
的方法,而不是將其替換為傳入的方法名稱。
是的,這是可能的。您有 2 (3) 種選擇:
#表達式foo.a
產生一個與a
等效的函數,但具有明確接收器作為其第一個參數;它有簽章func(f foo )
。
var foo foo bar := func(m func(f foo)) { m(foo) } bar(foo.a) bar(foo.b) bar(foo.c)
這裡方法接收者是明確的。您只需將方法名稱(及其所屬類型)傳遞給bar()
,並且在呼叫它時,您必須傳遞實際的接收者:m(f)
。
按預期輸出(在 go playground 上嘗試):
a b c
#如果f
是foo
類型的值,則表達式f.a
產生func()
類型的函數值,其隱式接收者值為f
。
var f foo bar := func(m func()) { m() } bar(f.a) bar(f.b) bar(f.c)
請注意,這裡的方法接收者是隱式的,它與傳遞給bar()
的函數值一起保存,因此無需明確指定即可呼叫它:m( )
。
輸出是相同的(在 go playground 上嘗試)。
低於先前的解決方案(在效能和「安全性」方面),但您可以將方法名稱作為string
值傳遞,然後使用reflect
套件以透過該名稱呼叫方法。它可能看起來像這樣:
var f Foo bar := func(name string) { reflect.ValueOf(f).MethodByName(name).Call(nil) } bar("A") bar("B") bar("C")
在 go playground 上嘗試。
以上是將方法參數傳遞給函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!