2016-10-18 1 views
1

Je suis en train de créer une extension de la méthode pour vérifier si mon struct a été initialisé mais je reçois cette erreur:Vérifiez si struct est vide si struct contient json.RawMessage

invalid operation: myStruct literal == inStruct (struct containing json.RawMessage cannot be compared)

Voici mon code:

package datamodels 

import "encoding/json" 

type myStruct struct { 
     a string json:"a" 
     b json.RawMessage json:"b" 
     c json.RawMessage json:"c" 
    } 

func (m *myStruct) IsEmpty() bool { 
    return (myStruct {}) == m 
} 

Répondre

3

La raison est que json.RawMessage est un alias pour une []byte et des cartes, des tranches etc ne peuvent pas être comparés normalement.

Vous pouvez comparer des tranches avec la méthode reflect.DeepEqual.

Voir l'exemple ci-dessous.

package main 

import "encoding/json" 
import "reflect" 

type myStruct struct 
{ 
     a string `json:"a"` 
     b json.RawMessage `json:"b"` 
     c json.RawMessage `json:"c"` 
} 

func (m myStruct) IsEmpty() bool { 
    return reflect.DeepEqual(myStruct{}, m) 
} 


func main() { 
    var mystuff myStruct = myStruct{} 

    mystuff.IsEmpty() 
} 

GOLANG Playground

référence pour comparer les tranches: How to compare struct, slice, map are equal?

Voir le type RawMessage. Type json.RawMessage: https://golang.org/src/encoding/json/stream.go?s=6218:6240#L237

+1

Cela fait l'affaire. Propre et simple. Merci de fournir le code actuel, le lien et la référence GOLANG Playground. – RAFJR

0

La valeur zéro de myStruct est un struct où a, b et c sont des valeurs nulles de leur type. La valeur zéro d'une chaîne est "", de json.RawMessage c'est nil (parce que c'est juste un alias pour []byte). La combinaison de ces connaissances, vous obtenez:

type myStruct struct { 
    a string 
    b json.RawMessage 
    c json.RawMessage 
} 

func (m *myStruct) IsEmpty() bool { 
    return m.a == "" && m.b == nil && m.c == nil 
} 

Il n'y a pas besoin de reflect.DeepEqual()

+0

cela fait le travail mais je préfère ne pas spécifier chaque champ/propriété de ma structure. Il doit y avoir un meilleur moyen puisque ma structure a en fait vingt champs/propriétés. – RAFJR