Golang与结构混淆

时间:2017-10-19 03:35:17

标签: arrays go struct

nc -vz -w2 HOST PORT

PersonInfo和PersonInfo2之间是否有区别

3 个答案:

答案 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,这意味着,只要这两种类型具有相同的基础类型,它们就是等价的。

因此,对于您的问题:Personstruct{ ID int 'json:"id"'}是等效的,因为它们具有相同的基础类型,因此PersonInfoPersonInfo2也是等效的。我使用了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}]

代码示例:https://play.golang.org/p/_wlm_Yfdy2

答案 2 :(得分:-1)

type PersonInfoPerson的对象,而PersonInfo2本身就是class(或Golang中的type)。即使他们的数据结构相似。

因此,当您运行DeepEqual()来检查相似性时,它将变为假。

之前评论的示例:

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

希望这有帮助。