Пустые интерфейсы для доступа к свойствам структуры во избежание дублирования кода - PullRequest
0 голосов
/ 06 августа 2020

У меня 2 разные версии API, пытаюсь рефакторинг кода, чтобы избежать дублирования. В моем методе я могу получить объект из V1 или V2 (которые имеют одинаковые свойства). и я хочу получить доступ к этим свойствам, в настоящее время я получаю следующую ошибку:

i.name undefined (type interface {} is interface with no methods)
package main

import "fmt"

type V1 struct {
  name string
  age int
  address string
}

type V2 struct {
  name string
  age int  
}


func main() {
    v1 := &V1{name: "Susan", age: 15}
    describe(v1)
    
    v2 := &V2{name: "John", age: 21}
    describe(v2)    
}

func describe(i interface{}) error {
    fmt.Printf("(%v, %T)\n", i, i)
    switch v := i.(type) {
    default:    
           return fmt.Errorf("Error detected, unexpected type %T", v)       
    case *V1:
        fmt.Println("*V1")
        i = i.(*V1)     
    case *V2:
        fmt.Println("*V2")
        i = i.(*V2)
    }
    fmt.Println(i.name)
    return nil
}

Есть предложения?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Попробуйте следующее:

   switch v := i.(type) {
    default:    
           return fmt.Errorf("Error detected, unexpected type %T", v)       
    case *V1:
        fmt.Println("*V1")
        fmt.Println(v.name)
    case *V2:
        fmt.Println("*V2")
        // v is of type *V2 here
    }

v уже того типа, который вам нужен. Когда вы переназначаете i, вы возвращаетесь к interface{}.

1 голос
/ 06 августа 2020

i переменная имеет тип interface{}, вместо нее следует использовать v, это уже правильный тип *V1: v.name

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...