es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo filtrar []struct con struct?

Defino la estructura de esta manera:

type Repo struct {
    Key         string `json:"key"`
    Type        string `json:"type"`
    PackageType string `json:"packageType"`
}

Y los datos en formato JSON son algo así:

[
    {
        "key":"docker-sre",
        "type":"LOCAL",
        "packageType":"Docker"
    },
    {
        "key":"docker-test",
        "type":"REMOTE",
        "packageType":"Docker"
    },
    {
        "key":"go-local-dev",
        "type":"LOCAL",
        "packageType":"Go"
    },
    {
        "key":"helm-cloudops",
        "type":"LOCAL",
        "packageType":"Helm"
    }
]

¿Cuál es la mejor manera de obtener los datos correctos con diferentes condiciones?

func getWantedRepos(conf Repo) ([]Repo, error) {}
func main() {
    getWantedRepos(Repo{
        PackageType: "Docker",
    })

    getWantedRepos(Repo{
        Type: "LOCAL",
        PackageType: "Go",
    })
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    La mejor manera de obtener los datos correctos con diferentes condiciones es iterar a través del arreglo de datos json y comparar cada elemento con las condiciones dadas en el argumento de la función. Si se encuentra una coincidencia, se agrega al nuevo arreglo y se devuelve. Aquí hay un ejemplo de implementación de la función getWantedRepos:

    func getWantedRepos(conf Repo, repos []Repo) []Repo {
        var wantedRepos []Repo
        for _, repo := range repos {
            if (conf.PackageType == "" || conf.PackageType == repo.PackageType) &&
               (conf.Type == "" || conf.Type == repo.Type) &&
               (conf.Key == "" || conf.Key == repo.Key) {
                wantedRepos = append(wantedRepos, repo)
            }
        }
        return wantedRepos
    }
    

    En esta implementación, la función toma dos argumentos: la estructura de configuración Repo y el arreglo de datos repos. Crea un nuevo arreglo wantedRepos para almacenar los resultados filtrados. Luego, itera a través de cada elemento de repos y verifica si todas las condiciones en conf coinciden con los valores en el elemento actual. Si es así, agrega el elemento a wantedRepos.

    Para llamar a esta función, pasa la configuración deseada como argumento junto con el arreglo de datos json. Aquí hay un ejemplo de uso:

    func main() {
        repos := []Repo{
            {Key: "docker-sre", Type: "LOCAL", PackageType: "Docker"},
            {Key: "docker-test", Type: "REMOTE", PackageType: "Docker"},
            {Key: "go-local-dev", Type: "LOCAL", PackageType: "Go"},
            {Key: "helm-cloudops", Type: "LOCAL", PackageType: "Helm"},
        }
    
        // Obtener repositorios con tipo de paquete "Docker"
        wantedDockerRepos := getWantedRepos(Repo{PackageType: "Docker"}, repos)
        fmt.Println(wantedDockerRepos)
    
        // Obtener repositorios con tipo "LOCAL" y tipo de paquete "Go"
        wantedLocalGoRepos := getWantedRepos(Repo{Type: "LOCAL", PackageType: "Go"}, repos)
        fmt.Println(wantedLocalGoRepos)
    }
    

    Esto produciría la siguiente salida:

    [{
        Key:         "docker-sre",
        Type:        "LOCAL",
        PackageType: "Docker",
    }, {
        Key:         "docker-test",
        Type:        "REMOTE",
        PackageType: "Docker",
    }]
    
    [{
        Key:         "go-local-dev",
        Type:        "LOCAL",
        PackageType: "Go",
    }]
    

Comments are closed.