[go] 두 조각이 같은지 확인

두 조각이 같은지 어떻게 확인할 수 있습니까?



답변

슬라이스의 각 요소를 반복하고 테스트해야합니다. 슬라이스 평등이 정의되지 않았습니다. 그러나 bytes.Equaltype의 값을 비교 하는 경우 함수가 있습니다 []byte.

func testEq(a, b []Type) 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
}


답변

reflect.DeepEqual ()을 사용해야합니다.

DeepEqual은 Go = 연산자의 재귀 완화입니다.

DeepEqual은 x와 y가 “깊게 같은지”보고하며 다음과 같이 정의됩니다. 다음 경우 중 하나에 해당하는 경우 동일한 유형의 두 값이 완전히 동일합니다. 고유 한 유형의 값은 절대로 동일하지 않습니다.

배열 값은 해당 요소가 매우 같을 때 매우 같습니다.

반출 및 반출되지 않은 해당 필드가 완전히 동일한 경우 구조 값은 매우 동일합니다.

둘 다 0이 아닌 경우 함수 값은 매우 같습니다. 그렇지 않으면 그들은 깊이 평등하지 않습니다.

인터페이스 값이 매우 동일한 콘크리트 값을 보유하는 경우 인터페이스 값이 동일합니다.

맵 값이 동일한 맵 객체이거나 길이가 동일하고 해당 키 (Go equality를 사용하여 일치)가 동일한 값을 갖는 경우 맵 값은 매우 동일합니다.

Go의 == 연산자를 사용하여 포인터 값이 같거나 값이 매우 같으면 포인터 값이 매우 같습니다.

다음 값이 모두 참이면 슬라이스 값이 완전히 동일합니다.이 값은 모두 0이거나 0이 아닌 값이며 길이가 같으며 동일한 기본 배열의 동일한 초기 항목을 가리 킵니다 (즉, & x [0 ] == & y [0]) 또는 해당 요소 (최대 길이)는 매우 같습니다. 0이 아닌 빈 슬라이스와 0이 아닌 슬라이스 (예 : [] byte {} 및 [] byte (nil))는 서로 동일하지 않습니다.

다른 값 (숫자, 부울, 문자열 및 채널)은 Go의 == 연산자를 사용하여 같으면 깊이 같습니다.


답변

이것은 @VictorDeryagin의 답변에 제공된 reflect.DeepEqual () 을 사용하는 예제 입니다.

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := []int {4,5,6}
    b := []int {4,5,6}
    c := []int {4,5,6,7}

    fmt.Println(reflect.DeepEqual(a, b))
    fmt.Println(reflect.DeepEqual(a, c))

}

결과:

true
false

Go Playground 에서 사용해보십시오


답변

두 개가 있으면 bytes.Equal을[]byte 사용하여 비교 하십시오 . Golang 설명서에는 다음과 같은 내용이 있습니다.

같음 a와 b의 길이가 같고 바이트가 같은지 여부를보고하는 부울 값을 반환합니다. nil 인수는 빈 슬라이스와 같습니다.

용법:

package main

import (
    "fmt"
    "bytes"
)

func main() {
    a := []byte {1,2,3}
    b := []byte {1,2,3}
    c := []byte {1,2,2}

    fmt.Println(bytes.Equal(a, b))
    fmt.Println(bytes.Equal(a, c))
}

이것은 인쇄됩니다

true
false


답변

그리고 지금은 https://github.com/google/go-cmp 입니다.

reflect.DeepEqual두 값이 의미 적으로 동일한 지 비교 하기 위한 보다 강력하고 안전한 대안 입니다.

package main

import (
    "fmt"

    "github.com/google/go-cmp/cmp"
)

func main() {
    a := []byte{1, 2, 3}
    b := []byte{1, 2, 3}

    fmt.Println(cmp.Equal(a, b)) // true
}


답변

시험 작성에 관심이 있다면 github.com/stretchr/testify/assert친구입니다.

파일 맨 처음에 라이브러리를 가져옵니다.

import (
    "github.com/stretchr/testify/assert"
)

그런 다음 테스트 내에서 수행하십시오.


func TestEquality_SomeSlice (t * testing.T) {
    a := []int{1, 2}
    b := []int{2, 1}
    assert.Equal(t, a, b)
}

오류 메시지는 다음과 같습니다.

                Diff:
                --- Expected
                +++ Actual
                @@ -1,4 +1,4 @@
                 ([]int) (len=2) {
                + (int) 1,
                  (int) 2,
                - (int) 2,
                  (int) 1,
Test:           TestEquality_SomeSlice


답변