K8s通過reflect實現多型

2021-09-26 04:34:46 字數 1855 閱讀 7421

轉子:

關於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 來實現自...