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
- ¿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?
- ¿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
- 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>
}
- 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()
- 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)
davy.ai
Respuestas
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 estructuraSubObjects
dentro del bucle:subObj := struct {
SpecificDetail string `json:"specific-detail"`
}{}
SubObject
aSubObjectDetail
, peroSubObjectDetail
no está definido en ninguna parte de tu código. En su lugar, debes agregarsubObj
a la listaNewMainObject.SubObjects
:NewMainObject.SubObjects = append(NewMainObject.SubObjects, subObj)
NewMainObject
a una lista, lo cual no es posible ya queNewMainObject
no es una lista sino una estructura. En su lugar, debes crear una lista de estructurasMainObject
y agregar cadaNewMainObject
a ella:mainObjects := []MainObject{}
mainObjects = append(mainObjects, NewMainObject)
Aquí tienes el código corregido para el Paso 3:
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.