package DNSProvider import ( "reflect" "github.com/go-acme/lego/v4/challenge" ) type DNSProvider struct { TencentCloud TencentCloud `json:"TencentCloud,omitempty"` AliCloud AliCloud `json:"AliCloud,omitempty"` HuaweiCloud HuaweiCloud `json:"HuaweiCloud,omitempty"` WestCN WestCN `json:"WestCN,omitempty"` RainYun RainYun `json:"RainYun,omitempty"` Dode Dode `json:"Dode,omitempty"` } func (dnsProvider *DNSProvider) Choose() ([]challenge.Provider, []error) { var Providers []challenge.Provider var Errors []error v := reflect.ValueOf(dnsProvider).Elem() for i := 0; i < v.NumField(); i++ { field := v.Field(i) if field.Kind() == reflect.Struct { for ii := 0; ii < field.NumField(); ii++ { if field.Field(ii).String() != "" { method, _ := field.Type().MethodByName("Provider") results := method.Func.Call([]reflect.Value{field}) err, _ := results[1].Interface().(error) if err != nil { Errors = append(Errors, err) } else { Providers = append(Providers, results[0].Interface().(challenge.Provider)) } break } } } } return Providers, Errors }