首頁 > 後端開發 > Golang > 主體

將方法參數傳遞給函數

王林
發布: 2024-02-14 08:21:08
轉載
1039 人瀏覽過

將方法參數傳遞給函數

在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
登入後複製

規格:方法值

#如果ffoo 類型的值,則表達式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中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板