Maison >développement back-end >Golang >GORM : sérialiser l'octet en chaîne hexadécimale

GORM : sérialiser l'octet en chaîne hexadécimale

WBOY
WBOYavant
2024-02-12 16:24:05424parcourir

GORM:将 bytea 序列化为十六进制字符串

Contenu de la question

J'ai une table comme celle-ci dans psql :

table transactions (
    hash bytea not null
)

Je souhaite récupérer les données de la base de données et les renvoyer en réponse à l'utilisateur :

type transaction struct {
    hash []byte `gorm:"column:hash" json:"hash"`
}
func getalltransactions(c *gin.context) {
    var transactions []models.transaction
    initializers.database.limit(10).find(&transactions)

    c.json(http.statusok, gin.h{"result": transactions})
}

Réponse :

{
    "result": [
        {
            "hash": "lvei8w7ugvs7s/ay3wuxnbr2s9a+p7b/1l1+6z9k9jg="
        }
    ]
}

Mais par défaut hash a des données erronées, je veux obtenir quelque chose comme ceci :

SELECT '0x' || encode(hash::bytea, 'hex') AS hash_hex FROM transactions LIMIT 1;

0x2d5788f30eee815b3bb3f018dd65319db476b3d6be3fb6ffd65d7ee99f4af638

J'ai essayé de faire scanner / valuer mais jusqu'à présent, cela n'a pas aidé

Solution de contournement

Sur la base de la suggestion de cerise limón, j'ai fait ceci :

type hexbytes []byte

type transaction struct {
    hash              hexbytes `gorm:"column:hash" json:"hash"`
}

func (b hexbytes) marshaljson() ([]byte, error) {
    hexstr := hex.encodetostring(b)
    return []byte(`"0x` + hexstr + `"`), nil
}

La réponse devient comme ceci :

{
    "result": [
        {
            "hash": "0x2d5788f30eee815b3bb3f018dd65319db476b3d6be3fb6ffd65d7ee99f4af638"
        }
    ]
}

Il existe peut-être une meilleure façon, je serais heureux de voir d'autres suggestions

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer