nc -vz -w2 HOST PORT
PersonInfo和PersonInfo2之间是否有区别
答案 0 :(得分:6)
主要区别在于如何在PersonInfo / PersonInfo2初始化之外初始化Person对象。由于PersonInfo2是匿名结构类型的数组,因此在PersonInfo2初始化之外我们对此类型一无所知。
所以他们都可以像这样初始化:
m := PersonInfo{{1}, {2}}
n := PersonInfo2{{1},{2}}
但是如果我们想要附加匿名结构类型的元素,我们必须指定完整类型:
append(n, struct { ID int `json:"id"` }{3})
如果我们打印出来,我们可以看到它们看起来是一样的:
fmt.Printf("%+v\n%+v", m, n)
输出:
[{ID:1} {ID:2}]
[{ID:1} {ID:2}]
然而,它们不会非常相等,因为PersonInfo是Person类型的数组,PersonInfo2是一个匿名结构类型的数组。以下是:
if !reflect.DeepEqual(m,n) {
print("Not Equal")
}
将打印“Not Equal”。
Here是一个可以自己查看的链接。
当附加到PersonInfo2时,我们必须为我们想要追加的每个值重复匿名结构类型,最好将PersonInfo用作Person类型的数组。
答案 1 :(得分:1)
Go正在使用structural typing
,这意味着,只要这两种类型具有相同的基础类型,它们就是等价的。
因此,对于您的问题:Person
和struct{ ID int 'json:"id"'}
是等效的,因为它们具有相同的基础类型,因此PersonInfo
和PersonInfo2
也是等效的。我使用了json标签来简化示例。
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}]
答案 2 :(得分:-1)
type PersonInfo
是Person
的对象,而PersonInfo2
本身就是class
(或Golang中的type
)。即使他们的数据结构相似。
因此,当您运行DeepEqual()来检查相似性时,它将变为假。
之前评论的示例:
if !reflect.DeepEqual(m,n) {
print("Not Equal")
}
希望这有帮助。