首頁 > 後端開發 > Golang > 映射中的多種函數類型,Golang

映射中的多種函數類型,Golang

WBOY
發布: 2024-02-12 08:39:09
轉載
905 人瀏覽過

映射中的多種函數類型,Golang

映射是Golang中一種強大的資料結構,它允許我們將一個值與另一個值相關聯。在Golang中,我們可以使用映射來實作各種不同類型的函數。 php小編柚子將在本文中介紹映射中的多種函數類型,包括普通函數、匿名函數和方法。不僅如此,我們還將探討如何在映射中使用函數作為值,並展示它們的強大功能和靈活性。無論您是初學者還是有經驗的Golang開發者,本文都會為您提供有用的知識和實例來幫助您更好地理解和應用映射中的函數類型。讓我們開始探索吧!

問題內容

我希望將使用者輸入連接到函數。使用者輸入是字串。例如, "func_name=MyPrintf&s1=你好,世界\!" 或者 "func_name=MyAdd&i1=1&i2=2"

每個函數的程式碼是,

func MyPrintf(s1 string) {
    fmt.Println(s1)
}

func MyAdd(i1, i2 int) {
    fmt.Println(i1, i2)
}
登入後複製

我想要一張如下圖的地圖,

type Myfunc func(string) | func(int, int)   // <- Of course, it's wrong code, just I hope like this.

myMap := make(map[string]Myfunc)

myMap["MyPrintf"] = MyPrintf
myMap["MyAdd"] = MyAdd
登入後複製

myMap 可以透過使用者輸入的 func_name 字串呼叫函數。

myMap[func_name](s1) 輸出:你好,世界! myMap[func_name](i1, i2) 輸出:3

這可能嗎? 也許我認為使用“eval”是可能的,但我聽說使用“eval”不好。所以,我想到使用函數指針,但是Golang中沒有函數指針。

我嘗試了一些 Golang 通用編程,

type Myfunc interface {
    func(string) | func(int, int)
}

myMap := make(map[string]Myfunc)
登入後複製

輸出:發生錯誤:無法在類型限制之外使用類型 Myfunc:介麵包含類型約束

再嘗試,

myMap := make(map[string]interface{})

myMap["MyPrintf"] = interface{}(MyPrintf)
myMap["MyPrintf"].(func(string))("Hello, world!")
登入後複製

輸出:你好,世界!

myMap["MyAdd"] = interface{}(MyAdd)
myMap["MyAdd"].(func(int,int))(1, 2)
登入後複製

輸出:3

它可以工作,但必須指定正確的函數類型,這不太舒服。我認為這種方式不適合我的場景。請給我幫忙。 我為我糟糕的英語寫作感到抱歉。

解決方法

你可以試試看這個:

我必須說這不是一個好的做法,因為錯誤類型導致的恐慌\錯誤沒有得到驗證。我會考慮另一種方法。

package main

import "fmt"

type GeneralFunc func(args ...interface{})

func main() {
    // Create a map of functions with the type GeneralFunc
    functionsMap := map[string]GeneralFunc{
        "MyPrintf": func(args ...interface{}) { fmt.Println(args[0].(string)) },
        "MyAdd":    func(args ...interface{}) { fmt.Println(args[0].(int), args[1].(int)) },
    }

    // Use the functions from the map
    functionsMap["MyPrintf"]("Hello World")
    functionsMap["MyAdd"](2, 3)
}
登入後複製

以上是映射中的多種函數類型,Golang的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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