2017-10-19 5 views
3
type Person struct { 
    ID int `json:"id"` 
} 

type PersonInfo []Person 

type PersonInfo2 [] struct { 
    ID int `json:"id"` 
} 

est-il entre personinfo ont la différence et PersonInfo2golang confusion avec struct

Répondre

1

Go utilise structural typing, cela signifie que, tant que les deux types ont le même type sous-jacent, ils sont équivalents.

Alors, pour votre question: Person et struct{ ID int 'json:"id"'} est équivalent parce qu'ils ont le même type sous-jacent et, par conséquent, PersonInfo et PersonInfo2 sont également équivalentes. J'ai pris des tags json pour simplifier l'exemple.

person1 := Person{1} 

pStruct1 := struct{ID int}{2} 


pInfo1 := PersonInfo{ 
    person1, 
    pStruct1, 
} 

pInfo2 := PersonInfo2{ 
    person1, 
    pStruct1, 
} 


fmt.Printf("%+v\n", pInfo1) 
fmt.Printf("%+v", pInfo2); 

//outputs 
//PersonInfo: [{ID:1} {ID:2}] 
//PersonInfo2: [{ID:1} {ID:2}] 

Exemple de code: https://play.golang.org/p/_wlm_Yfdy2

+0

merci, ça m'aide vraiment –

6

La principale différence est la façon dont vous devez initialiser les objets personne en dehors de l'initialisation personinfo/PersonInfo2. Puisque PersonInfo2 est un tableau du type struct anonyme, nous ne savons rien de ce type en dehors de l'initialisation PersonInfo2.

Ils peuvent tous deux être initialisé comme ceci:

m := PersonInfo{{1}, {2}} 
n := PersonInfo2{{1},{2}} 

Toutefois, si nous voulons ajouter un élément du type struct anonyme nous faudrait préciser le type complet:

append(n, struct { ID int `json:"id"` }{3}) 

Si nous imprimons ces derniers dehors, nous pouvons voir qu'ils semblent être les mêmes: fmt.Printf("%+v\n%+v", m, n) Sorties:

[{ID:1} {ID:2}] 
[{ID:1} {ID:2}] 

Cependant, ils ne seront pas profondément égaux car PersonInfo est un tableau de type Person et PersonInfo2 est un tableau de type struct anonyme. Ainsi, ce qui suit:

if !reflect.DeepEqual(m,n) { 
    print("Not Equal") 
} 

affichera "Non égal".

Here est un lien pour voir par vous-même. Lors de l'ajout à PersonInfo2, nous devons répéter le type de structure anonyme pour chaque valeur que nous souhaitons ajouter, il est probablement préférable d'utiliser PersonInfo comme un tableau de type Person.

+2

s'il vous plaît noter, l'initialisation de la tranche n'est pas un problème puisque vous pouvez omettre le 'elemnt's type' et utiliser seulement {}}, la douleur vient quand vous voulez ajouter un nouvel élément à la tranche. https://play.golang.org/p/ZQR0zjEFS- – mkopriva

+1

@mkopriva Merci, j'ai mis à jour la réponse en conséquence. –

-1

type PersonInfo est un objet de Person, tandis que PersonInfo2 est un class (ou type en golang) par lui-même. Même si leur structure de données est similaire. Par conséquent, lorsque vous exécutez DeepEqual() pour vérifier la similarité, il s'avère que cela est faux.

Exemple précédent commentaire:

if !reflect.DeepEqual(m,n) { 
    print("Not Equal") 
} 

Hope this helps.