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

type PersonInfo []Person 

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

是否有具有PersonInfo和PersonInfo2Golang混淆結構

回答

1

轉到之間的差異是使用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

+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") 
} 

將打印「不等」。

Here是一個自己看看的鏈接。

當附加到PersonInfo2時,我們必須爲每個要添加的值重複匿名結構類型,最好將PersonInfo作爲Person類型的數組使用。

+2

請注意,由於您可以省略'elemnt的類型'並只使用'{}',所以切片的初始化不是問題,當您想要附加新元素切片。 https://play.golang.org/p/ZQR0zjEFS- – mkopriva

+1

@mkopriva謝謝,我已經更新了相應的答案。 –

-1

type PersonInfoPerson一個對象,而PersonInfo2class(或在Golang type)本身。即使他們的數據結構相似。

因此,當您運行DeepEqual()來檢查相似性時,它會變成錯誤的。

例由以前的評論:

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

希望這有助於。