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
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
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
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.
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
@mkopriva Merci, j'ai mis à jour la réponse en conséquence. –
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.
merci, ça m'aide vraiment –