轉子:
關於reflect包使用可以參考:
我們知道在golang中可以把函式賦值給乙個變數,然後通過函式名呼叫函式。
下面的問題是我們如何實現callfunc()的內容來完成所要的功能呢。
目前已知的辦法好像是不行的,無法從全域性域中通過名字獲取乙個函式的物件。
(對於變數也一樣,無法從全域性域中通過名字獲取乙個變數的物件)
可行的辦法
使用乙個map變數顯式的把字串和函式(變數)關聯起來:
這樣我們可以通過funcs["foo"]得到函式物件,然後才能對函式進行操作。
函式操作的例子
下面是乙個函式呼叫的例子,包括引數的傳遞以及返回值的處理。
package main
import "fmt"
import "reflect"
import "errors"
type mystruct struct
func foo0() int
func foo1(a int)(string,string)
func foo2(a,b int,c string) mystruct
}func mycall(m map[string]inte***ce{},name string, params ... inte***ce{})(result reflect.value,err error)
//處理引數
in :=make(reflect.value, len(params))
for k,param := range params
result = f.call(in)
return
}func main()
//call foo0
if result,err := mycall(funcs,"foo0");err ==nil
} // call foo1
if result, err := mycall(funcs,"foo1",1);err == nil
} //
if result, err := mycall(funcs, "foo2", 1, 2, "aa"); err == nil } }
還是補充一點吧:
其中type是inte***ce型別,value是struct型別,意識到這一點很重要
value為go值提供了反射介面。
不是所有go型別值的value表示都能使用所有方法。請參見每個方法的文件獲取使用限制。在呼叫有分類限定的方法時,應先使用kind方法獲知該值的分類。呼叫該分類不支援的方法會導致執行時的panic。
value型別的零值表示不持有某個值。零值的isvalid方法返回false,其kind方法返回invalid,而string方法返回,所有其它方法都會panic。絕大多數函式和方法都永遠不返回value零值。如果某個函式/方法返回了非法的value,它的文件必須顯式的說明具體情況。
如果某個go型別值可以安全的用於多執行緒併發操作,它的value表示也可以安全的用於併發。
獲取value物件的方法:
k8s 多租戶 k8s 基礎介紹
備註 1 每乙個pod裡執行著乙個特殊的容器 pause容器,其他容器都是業務容器,這些業務容器共享pause容器的網路棧和volume 邏輯卷 掛載卷。因此他們之間的通訊和資料交換更為高效。2 k8s設計了pod物件,將每個服務程序包裝到相應的pod中,使其成為pod中執行的乙個容器 contai...
自動合併Kubeconfig,實現多k8s集群切換
隨著微服務和容器化的深入人心,以及kubernetes已經成為容器編排領域的事實標準,越來越多的公司將自己的服務遷移到kubernetes集群中。而隨著kubernetes集群的增加,集群管理的問題就凸顯出來,不同的環境存在不同的集群,不同的業務線不同的集群,甚至有些開發人員都有自己的集群。誠然,如...
k8s灰度更新 k8s實現灰度發布
灰度發布在實際生產部署中是經常被使用的方式,常規的方法是手動從前端lb 負載均衡 上將後端伺服器摘掉,然後,停服務,最後上傳 完成軟連線更新。在使用ci cd工具時,這個過程變得自動化了,我們只需要通過jenkins這個功能強大的開源持續整合和部署工具,就可以聯合gitlab 或 gogs 來實現自...