首頁 >後端開發 >Golang >如何在 Go 中建立具有不同簽名的函數切片?

如何在 Go 中建立具有不同簽名的函數切片?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-26 05:01:10442瀏覽

How Can I Create a Slice of Functions with Different Signatures in Go?

建立具有不同簽章的函式切片

問題

如何在 Go 中建立具有不同簽章的函式切片?

上下文

Go 的型別系統是靜態型別的,這表示函數在編譯時必須有固定的簽章。但是,建立可以接受不同類型或數字參數的函數切片可能會很有用。

解決方案

雖然提供的程式碼可以正常運行,但它需要使用 switch 語句來處理每個函數簽章類型。更簡潔靈活的解決方案是使用反射。

下面是一個範例:

package main

import (
    "fmt"
    "reflect"
)

type Executor func(...interface{})

func main() {
    functions := []Executor{
        func(a, b int) { fmt.Println(a + b) },
        func(s string) { fmt.Println(s) },
        func() { fmt.Println("No arguments") },
    }

    for _, f := range functions {
        numIn := reflect.TypeOf(f).NumIn()
        args := make([]reflect.Value, numIn)

        for i := 0; i < numIn; i++ {
            switch reflect.TypeOf(f).In(i).Kind() {
            case reflect.Int:
                args[i] = reflect.ValueOf(12)
            case reflect.String:
                args[i] = reflect.ValueOf("Hello")
            default:
                args[i] = reflect.Value{}
            }
        }

        f.Call(args)
    }
}

在這個解中,我們建立了一片 Executor 函數,這些函數可以接受任意數量的論點。 Reflect套件用於確定每個函數期望的參數數量和類型,並產生相應的reflect.Value切片。

使用反射允許我們動態呼叫具有不同簽名的函數,而不需要類型切換或介面{}切片。

以上是如何在 Go 中建立具有不同簽名的函數切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn