перейдите через интерфейс в другую структуру и разберитесь с картой

# #go

Вопрос:

Я пытаюсь создать функцию проверки пользовательского ввода, которая может соответствовать большему количеству других функций, чтобы использовать ее для проверки параметров из другого интерфейса. У меня есть два интерфейса :

 type Interface1Input struct {  Name string  Age int  Address string }  
 type Interface2Input struct {  Name string  Phone string  Gender string }  

Затем, для функции, моя идея состоит в том, чтобы создать a map[string]string для хранения параметров, которые я хочу проверить. ключ-это имя parms, значение-его тип:

 func main(){  var input Interface1Input  // suppose to check address and age  paramsMap := make(map[string]string)  paramsMap["age"] = "int"  paramsMap["address"] = "string"  CheckParams(input, paramsMap) }  

Для функции checkParams, потому что мне нужно иметь дело с другим интерфейсом, вход должен быть интерфейсом? Я в тупике, ключ карты не может быть использован структурой. Или если здесь есть другие способы войти? Я пытаюсь перенести интерфейс на карту, но это недостойно

 func checkParams(input interface{}, paramsWithType map[string]string){  switch input.(type) {  case Interface1Input:  if req, ok := input.(Interface1Input); ok {  for k,v := range paramsWithType {   if v == "string" {  if req.k == "" {  fmt.Println("error")  }  }  }    }  } }  

Комментарии:

1. Вы можете использовать отражение для доступа к полям input , если это структура, paramsWithType то она даже не нужна. Хотя вам было бы лучше создавать разные checkParams() функции для разных входных данных, вы также могли бы сделать это методом.

Ответ №1:

Вместо использования карты объявите метод структуры для каждого типа интерфейса и используйте его для проверки

 package main  import "fmt"  type Interface1Input struct {  Name string  Age int  Address string }  func (c Interface1Input) Check() bool {  return len(c.Name) gt; 1 amp;amp; c.Age != 0 amp;amp; len(c.Address) gt; 1 }  type Interface2Input struct {  Name string  Phone string  Gender string }  func (c Interface2Input) Check() bool {  return len(c.Name) gt; 1 amp;amp; len(c.Phone) gt; 0 amp;amp; len(c.Gender) == 1 }  func main() {  var a Interface1Input = Interface1Input{"Frank", 90, "1 Exclusive Avenue, San Bernadio, AZ"}  var b Interface2Input = Interface2Input{"Margo", "01881 4940 4990", "Q"}     fmt.Println(a.Check())  fmt.Println(b.Check())  }