Golang?中判斷兩個結構體相等的方法
更新時間:2023年08月30日 11:20:20 作者:農夫小田
這篇文章主要介紹了Golang?中如何判斷兩個結構體相等,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
結論
golang中,哪些數(shù)據(jù)類型是可比較的,哪些是不可比較的:
- 可比較:Integer,F(xiàn)loating-point,String,Boolean,Complex(復數(shù)型),Pointer,Channel,Interface,Array
- 不可比較:Slice,Map,F(xiàn)unction
同一個struct的兩個實例能不能比較
type S struct {
Name string
Age int
Address *int
}
func main() {
a := S{
Name: "aa",
Age: 1,
Address: new(int),
}
b := S{
Name: "aa",
Age: 1,
Address: new(int),
}
fmt.Println(a == b) // false
}輸出false,說明:
- 可以比較,因為都是基礎數(shù)據(jù)類型
- false:因為其中的指針變量 Address 的值不同,所以 a != b,如果a b 在初始化時把 Address 去掉(不給 Address 初始化),那么這時 a == b 為true, 因為ptr變量默認值是nil,又或者給 Address 成員變量賦上同一個指針變量的值,也是成立的。
type S struct {
Name string
Age int
Address *int
Data []int
}
func main() {
a := S{
Name: "aa",
Age: 1,
Address: new(int),
Data: []int{1, 2, 3},
}
b := S{
Name: "aa",
Age: 1,
Address: new(int),
Data: []int{1, 2, 3},
}
fmt.Println(a == b) // invalid operation: a == b (struct containing []int cannot be compared)
}報錯:Slice,Map,F(xiàn)unction不可比較
結構體比較推薦用法
type S struct {
Name string
Age int
Address *int
Data []int
}
func main() {
a := S{
Name: "aa",
Age: 1,
Address: new(int),
Data: []int{1, 2, 3},
}
b := S{
Name: "aa",
Age: 1,
Address: new(int),
Data: []int{1, 2, 3},
}
fmt.Println(reflect.DeepEqual(a, b)) // true
}DeepEqual函數(shù)用來判斷兩個值是否深度一致。具體比較規(guī)則如下:
- 不同類型的值永遠不會深度相等
- 當兩個數(shù)組的元素對應深度相等時,兩個數(shù)組深度相等
- 當兩個相同結構體的所有字段對應深度相等的時候,兩個結構體深度相等
- 當兩個函數(shù)都為nil時,兩個函數(shù)深度相等,其他情況不相等(相同函數(shù)也不相等)
- 當兩個interface的真實值深度相等時,兩個interface深度相等
- map的比較需要同時滿足以下幾個
- -兩個map都為nil或者都不為nil,并且長度要相等
- -相同的map對象或者所有key要對應相同
- -map對應的value也要深度相等
- 指針,滿足以下其一即是深度相等
- -兩個指針滿足go的==操作符
- -兩個指針指向的值是深度相等的
- 切片,需要同時滿足以下幾點才是深度相等
- -兩個切片都為nil或者都不為nil,并且長度要相等
- -兩個切片底層數(shù)據(jù)指向的第一個位置要相同或者底層的元素要深度相等
- -注意:空的切片跟nil切片是不深度相等的
- 其他類型的值(numbers, bools, strings, channels)如果滿足go的==操作符,則是深度相等的。要注意不是所有的值都深度相等于自己,例如函數(shù),以及嵌套包含這些值的結構體,數(shù)組等
到此這篇關于Golang 中如何判斷兩個結構體相等的文章就介紹到這了,更多相關go判斷兩個結構體相等內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go實現(xiàn)一個輕量級并發(fā)任務調度器(支持限速)
本文主要介紹了Go實現(xiàn)一個輕量級并發(fā)任務調度器(支持限速),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-04-04

