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.

Verificar la existencia de elementos en una lista de estructuras en Golang.

Digamos que tengo las siguientes estructuras:

type A struct {
    Field1 string
    Field2 string
}

type B struct {
    Field3 string
    Field4 int
}

type C struct {
    A
    MyList []B
}

y una estructura más que utiliza las dos anteriores:

type X struct {
    A
    B
}

Ahora, tengo algunos datos que quiero agrupar y asignar a una estructura C y retornar un slice de C:

var results []C

Tengo un slice de estructuras que se ve así (ya que es un slice, podría suceder que tengamos “A” repetidos):

type X struct {
    A
    B
}

Entonces, quiero agrupar los resultados por “A”. Para hacerlo, voy a iterar a través de un slice de “X” que mi método recibe como parámetro:

var results []C

// Y es un slice de Xs

for _, elem := range Y {
    // Si elem.A existe, entonces agregar elem.B a C.A
    // Si no existe, entonces agregar elem.A y elem.B a C
}

¿Cómo puedo lograr lo que se menciona en los comentarios anteriores? Quiero decir, ¿cómo puedo comprobar si una estructura “A” ya existe en el slice de estructuras “C”?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para verificar si una estructura A ya existe en una lista de estructuras C, podemos recorrer la lista y comparar los campos de la estructura A. Aquí hay una implementación posible:

    for _, elem := range Y {
        // Verificar si elem.A ya existe en la lista
        var existingC *C
        for i := range results {
            if results[i].A == elem.A {
                existingC = &results[i]
                break
            }
        }
    
        // Si elem.A existe, entonces agregamos elem.B a C.MyList
        // Si no existe, entonces agregamos elem.A y elem.B a C
        if existingC != nil {
            existingC.MyList = append(existingC.MyList, elem.B)
        } else {
            results = append(results, C{
                A:      elem.A,
                MyList: []B{elem.B},
            })
        }
    }
    

    En esta implementación, la variable existingC contiene un puntero a la primera estructura C que tiene los mismos campos que elem.A. Si existe tal estructura, agregamos elem.B a su campo MyList. De lo contrario, creamos una nueva estructura C con elem.A y elem.B, y la agregamos a la lista results.

Comments are closed.