Go語(yǔ)言怎么判斷結(jié)構(gòu)體是否存在某方法?下面本篇文章給大家介紹一下Golang判斷結(jié)構(gòu)體是否存在某方法的兩種方式(附代碼示例),希望對(duì)大家有所幫助!
go 有時(shí)需要判斷某個(gè)結(jié)構(gòu)體是不是有某個(gè)方法,但是可能突然就一臉茫然,go 也可以像 php 那樣判斷
是的,雖然 go 沒(méi)有提供現(xiàn)成的方法,但是可以用已有的邏輯來(lái)封裝實(shí)現(xiàn)。
目前能用的方式有兩種,一種是知道完整的方法可以用接口斷言方式判斷,第二種就是用反射來(lái)完成判斷。
準(zhǔn)備需要判斷的結(jié)構(gòu)體:
type RefData struct {} func (this *RefData) Show(data any, name string) string { data2 := data.(string) + "===" + name return data2 }
登錄后復(fù)制
接口斷言判斷:
refDataExists := false var refDataOb any = &RefData{} if _, ok := refDataOb.(interface { Show(any, string) string }); ok { refDataExists = true }
登錄后復(fù)制
反射判斷:
import( "reflect" ) // 判斷結(jié)構(gòu)體方法是否存在 func MethodExists(in any, method string) bool { if method == "" { return false } p := reflect.TypeOf(in) if p.Kind() == reflect.Pointer { p = p.Elem() } // 不是結(jié)構(gòu)體時(shí) if p.Kind() != reflect.Struct { return false } object := reflect.ValueOf(in) // 獲取到方法 newMethod := object.MethodByName(method) if !newMethod.IsValid() { return false } return true } // 使用 refDataExists := MethodExists(&RefData{}, "Show")
登錄后復(fù)制
【推薦學(xué)習(xí):go視頻教程】