type Person struct {
ID int `json:"id"`
}
type PersonInfo []Person
type PersonInfo2 [] struct {
ID int `json:"id"`
}
是否有具有PersonInfo和PersonInfo2Golang混淆結構
type Person struct {
ID int `json:"id"`
}
type PersonInfo []Person
type PersonInfo2 [] struct {
ID int `json:"id"`
}
是否有具有PersonInfo和PersonInfo2Golang混淆結構
轉到之間的差異是使用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}]
的主要區別是如何必須初始化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")
}
將打印「不等」。
Here是一個自己看看的鏈接。
當附加到PersonInfo2時,我們必須爲每個要添加的值重複匿名結構類型,最好將PersonInfo作爲Person類型的數組使用。
請注意,由於您可以省略'elemnt的類型'並只使用'{}',所以切片的初始化不是問題,當您想要附加新元素切片。 https://play.golang.org/p/ZQR0zjEFS- – mkopriva
@mkopriva謝謝,我已經更新了相應的答案。 –
type PersonInfo
是Person
一個對象,而PersonInfo2
是class
(或在Golang type
)本身。即使他們的數據結構相似。
因此,當您運行DeepEqual()來檢查相似性時,它會變成錯誤的。
例由以前的評論:
if !reflect.DeepEqual(m,n) {
print("Not Equal")
}
希望這有助於。
謝謝,它真的幫我 –