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 escribir datos de una tabla en una estructura anidada en Go.

Resumen

Estoy intentando escribir datos de varias tablas de postgres en una estructura anidada de Go con el propósito de devolver una única respuesta json a una solicitud GET dentro de mi aplicación web.

Preguntas

  1. ¿Es razonable la forma en que estoy declarando una estructura anidada desde una perspectiva de las mejores prácticas de Go, o hay una razón por la que debería evitar este método y hacerlo de otra manera?
  2. ¿Qué estoy haciendo mal en el Paso 3 para evitar que mi código funcione? (Temo que la respuesta sea ‘todo’)

Lo que he intentado hasta ahora

  1. He declarado mi estructura de estructuras
type MainObject struct {

<pre><code>SubObjects []struct {
    SpecificDetail string `json:"specific-detail"`
                       }  `json:"sub-object"`

...(otras []estructuras)...
</code></pre>

}
  1. He obtenido filas de las tablas

“`
func getMainObjectHandler(w http.ResponseWriter, r *http.Request) {

<pre><code>…(conexión a la base de datos)…

MainObjectID := r.URL.Query().Get("moid")
if MainObjectID != "null" {
NewMainObject := MainObject{}
SubObjectDetail_rows, err := db.Query("SELECT specific_detail from the_table WHERE moid='" + MainObjectID + "'")
if err != nil {
log.Fatalf("no se pudo ejecutar la consulta: %v", err)
}

…(otras filas de db.Query)…
</code></pre>

“`
3. He intentado (y fallado) construir los datos de las filas en la estructura.


for SubObjectDetail_rows.Next() {
SpecificDetail := NewMainObject.SubObject.SpecificDetail{}
SubObjectDetail_rows.Scan(&SpecificDetail)
SubObject = append(SubObject, SpecificDetail)
}
NewMainObject = append(MainObject, SubObject)
defer persona_rows.Close()

  1. Por último, he configurado Marshal y write.


NMOListBytes, err := json.Marshal(NewMainObject)
if err != nil {
fmt.Println(fmt.Errorf("Error: %v", err))
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Write(NMOListBytes)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Respuestas

    1. Declarar una estructura anidada es razonable desde la perspectiva de las mejores prácticas de Go, y es una forma común de representar estructuras de datos anidadas en Go. Sin embargo, debes tener en cuenta que las estructuras anidadas profundas pueden ser difíciles de gestionar y depurar, por lo que es mejor mantener el nivel de anidamiento al mínimo.
    2. Hay algunos problemas con el Paso 3 que evitan que el código funcione:
    • NewMainObject.SubObject.SpecificDetail{} no es una sintaxis válida para inicializar un campo de estructura anidado. En su lugar, debes crear una nueva instancia de la estructura SubObjects dentro del bucle:
      subObj := struct {
      SpecificDetail string `json:"specific-detail"`
      }{}
    • Estás agregando la lista SubObject a SubObjectDetail, pero SubObjectDetail no está definido en ninguna parte de tu código. En su lugar, debes agregar subObj a la lista NewMainObject.SubObjects:
      NewMainObject.SubObjects = append(NewMainObject.SubObjects, subObj)
    • Finalmente, estás intentando agregar NewMainObject a una lista, lo cual no es posible ya que NewMainObject no es una lista sino una estructura. En su lugar, debes crear una lista de estructuras MainObject y agregar cada NewMainObject a ella:
      mainObjects := []MainObject{}
      mainObjects = append(mainObjects, NewMainObject)

    Aquí tienes el código corregido para el Paso 3:

    // Iterar sobre las filas de SubObjectDetail y crear sub-objetos
    for SubObjectDetail_rows.Next() {
      // Crear una nueva estructura SubObjects
      subObj := struct {
        SpecificDetail string `json:"specific-detail"`
      }{}
      // Leer el valor de SpecificDetail en el sub-objeto
      SubObjectDetail_rows.Scan(&subObj.SpecificDetail)
      // Agregar el sub-objeto a la lista SubObjects de MainObject
      NewMainObject.SubObjects = append(NewMainObject.SubObjects, subObj)
    }
    // Crear una lista de estructuras MainObject y agregar NewMainObject a ella
    mainObjects := []MainObject{}
    mainObjects = append(mainObjects, NewMainObject)
    

    Con estos cambios, tu código ahora debería ser capaz de construir correctamente los datos de las filas en la estructura y convertirlos en JSON.

Comments are closed.