J'ai démarré un backend "clone Instagram" pour essayer d'en apprendre davantage sur Golang, mais j'ai rencontré un problème que je ne sais pas comment résoudre.
J'ai construit une API simple en utilisant la fibre pour obtenir quelques publications :
package server import ( "fmt" "instagram/internal/psql" queries "instagram/internal/sql" "net/http" "github.com/gofiber/fiber/v2" ) type like struct { username string name string picture string } type post struct { id string `json:"id"` description string `json:"description"` media string `json:"media"` type string `json:"type"` likes string `json:"likes"` user_id string `json:"user_id"` created_at string `json:"created_at"` updated_at string `json:"updated_at"` } func listposts(c *fiber.ctx) error { rows, err := psql.db().query(queries.getallposts) if err != nil { c.sendstatus(400) return nil } defer rows.close() var data []post for rows.next() { var post post err := rows.scan(&post.id, &post.description, &post.media, &post.type, &post.created_at, &post.updated_at, &post.likes, &post.user_id) if err != nil { fmt.print(err) c.sendstatus(400) return nil } data = append(data, post) } return c.status(http.statusok).json(data) }
Le problème est que l'attribut likes
est renvoyé sous forme de chaîne :
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": "[]", "user_id": "...", "created_at": "...", "updated_at": "..." } ]
J'ai essayé certaines choses comme utiliser json.marshal(data)
et j'ai aussi écrit une structure like
mais je n'ai pas pu la faire fonctionner car lorsque je mets json.marshal(data)
,我还写了 like
结构,但我无法使其工作,因为当我将 likes
的类型从 string
更改为 []like
Le message suivant apparaît lors de l'appel de scan lorsque le type passe de string
à []like
sql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.likesql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.like
J'utilise la base de données postgresql et j'essaie d'utiliser la colonne jsonb
pour la première fois, donc jsonb
列,因此 likes
在数据库中是 jsonb
dans la base de données, c'est la colonne jsonb
.
Ma charge utile idéale ressemble à ceci :
[ { "id": "...", "description": "...", "media": "...", "type": "...", "likes": [], "user_id": "...", "created_at": "...", "updated_at": "..." } ]
Notez que likes
现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?
您很可能需要实现 sql.driver
est désormais un tableau plutôt qu'une chaîne. Alors est-ce que quelqu'un sait comment résoudre ce problème ?
sql.driver
pour "savoir" comment scanner votre structure, probablement quelque chose comme 🎜
type Like struct { Username string Name string picture string } type Likes []Like func (l Likes) Value() (driver.Value, error) { return json.Marshal(l) } // Make the Likes implement the sql.Scanner interface. func (l *Likes) Scan(value interface{}) error { b, ok := value.([]byte) if !ok { return errors.New("type assertion to []byte failed") } return json.Unmarshal(b, &l) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!