튜토리얼 칼럼입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!
golang에서는==
를 사용하여 두 배열이 동일한지 쉽게 확인할 수 있지만 불행히도 슬라이스에는 관련 연산자가 없습니다. 두 배열이 동일한지 확인해야 할 때. , 다른 단축키만 찾을 수 있습니다.
슬라이스 동일성의 정의==
来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了。
我们选择最常见的需求,也就是当两个slice的类型和长度相同,且相等下标的值也是相等的,比如:
a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
上述代码中a
和b
是相等的,c
因为长度和a
不同所以不相等,d
因为元素的排列顺序和a
不同所以也不相等。
为什么要单独将[]byte列举出来呢?
因为标准库提供了优化的比较方案,不再需要我们造轮子了:
package mainimport ( "bytes" "fmt")func main() { a := []byte{0, 1, 3, 2} b := []byte{0, 1, 3, 2} c := []byte{1, 1, 3, 2} fmt.Println(bytes.Equal(a, b)) fmt.Println(bytes.Equal(a, c))}
在判断类型不是[]byte的slice时,我们还可以借助reflect.DeepEqual
두 개의 []바이트가 같은지 확인하세요왜 []바이트를 별도로 나열해야 하나요? 표준 라이브러리는 최적화된 비교 방식을 제공하므로 더 이상 수레바퀴를 다시 만들 필요가 없습니다.func DeepEqual(x, y interface{}) bool
위 코드의 a
와b
는 같고,c
는a와 길이가 다르기 때문에 같지 않습니다. code>와 <code>d
는 요소의 배열 순서가a
와 다르기 때문에 동일하지 않습니다.
package mainimport ( "fmt" "reflect")func main() { a := []int{1, 2, 3, 4} b := []int{1, 3, 2, 4} c := []int{1, 2, 3, 4} fmt.Println(reflect.DeepEqual(a, b)) fmt.Println(reflect.DeepEqual(a, c))}
reflect.DeepEqual
를 사용하면 포함된 요소를 포함하여 두 개체를 심층 비교하여 동일한지 확인하는 데 사용됩니다.
func testEq(a, b []int) bool { // If one is nil, the other must also be nil. if (a == nil) != (b == nil) { return false; } if len(a) != len(b) { return false } for i := range a { if a[i] != b[i] { return false } } return true}🎜DeepEqual은 x와 y가 "완전히 동일한지 보고합니다." ,”는 다음과 같은 경우 중 하나에 해당하는 경우 동일한 유형의 두 값이 완전히 동일하다고 정의됩니다.🎜… true: 둘 다 nil이거나 둘 다 nil이 아니며, 길이가 같고, 동일한 기본 배열의 동일한 초기 항목(즉, &x[0] == &y[0])을 가리키거나 해당 요소(길이까지)는 완전히 동일합니다. nil이 아닌 빈 슬라이스와 nil 슬라이스(예: []byte{} 및 []byte(nil))는 완전히 동일하지 않습니다.🎜🎜🎜의미 이 구절의 내용은 이해하기 어렵지 않으며, 이 글의 끝 부분에서 논의한 내용과 일치합니다. 처음에 논의한 슬라이스 동일성을 결정하는 방법의 원리는 동일하지만 약간의 런타임 "흑마술"을 사용합니다. ". 🎜🎜예제를 보세요: 🎜
package main import "fmt" func main() { a := []int{1, 2, 3, 4} b := []int{1, 3, 2, 4} c := []int{1, 2, 3, 4} fmt.Println(testEq(a, b)) fmt.Println(testEq(a, c))}🎜🎜🎜손으로 쓴 판단🎜🎜golang에서 Reflect를 사용하려면 일반적으로 슬라이스 유형을 결정하는 경우 성능 비용이 필요하므로 슬라이스의 동등성 판단을 직접 구현하는 것은 상대적으로 그리 어렵지 않습니다. : 🎜rrreee 🎜테스트 코드: 🎜rrreee
위 내용은 golang에서 두 조각이 동일한지 확인의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!