>  기사  >  백엔드 개발  >  golang에서 두 조각이 동일한지 확인

golang에서 두 조각이 동일한지 확인

藏色散人
藏色散人앞으로
2021-04-02 15:13:092250검색

튜토리얼 칼럼입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다!

golang에서는 ==를 사용하여 두 배열이 동일한지 쉽게 확인할 수 있지만 불행히도 슬라이스에는 관련 연산자가 없습니다. 두 배열이 동일한지 확인해야 할 때. , 다른 단축키만 찾을 수 있습니다.

golang에서 두 조각이 동일한지 확인

슬라이스 동일성의 정의==来判断两个数组(array)是否相等,但遗憾的是slice并没有相关的运算符,当需要判断两个slice是否相等时我们只能另寻捷径了。

slice相等的定义

我们选择最常见的需求,也就是当两个slice的类型和长度相同,且相等下标的值也是相等的,比如:

a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}

上述代码中ab是相等的,c因为长度和a不同所以不相等,d因为元素的排列顺序和a不同所以也不相等。

判断两个[]byte是否相等

为什么要单独将[]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))}

使用reflect判断slice(数组)是否相等

在判断类型不是[]byte的slice时,我们还可以借助reflect.DeepEqual

우리는 가장 일반적인 요구 사항, 즉 두 슬라이스의 유형과 길이가 동일하고 등호 첨자의 값도 동일한 경우를 선택합니다. 예:
func DeepEqual(x, y interface{}) bool

위 코드의 ab는 같고, ca와 길이가 다르기 때문에 같지 않습니다. 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를 사용하여 슬라이스(배열)가 동일한지 확인합니다.

유형이 []바이트가 아닌 슬라이스를 판단할 때, 또한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제