사용 - golang 리플렉션




두 슬라이스의 동등성 검사 (3)

두 슬라이스가 같은지 어떻게 확인합니까?


당신은 reflect.DeepEqual() 사용해야합니다.

DeepEqual은 Go의 == 연산자를 재귀 적으로 완화 한 것입니다.

DeepEqual은 x와 y가 "깊이 동등"한지 여부를 다음과 같이 정의합니다. 동일한 유형의 두 값은 다음 경우 중 하나가 적용될 경우 깊게 동일합니다. 구별 유형의 값은 절대로 동등하지 않습니다.

배열 값은 해당 요소가 깊이 같으면 깊이가 동일합니다.

구조체 값은 해당 필드가 내보내지고 추출되지 않은 경우 완전히 같으면 동등합니다.

Func 값은 모두 nil 일 경우 깊게 동일합니다. 그렇지 않으면 그것들은 깊이 동등하지 않습니다.

인터페이스 값은 깊이가 동일한 구체적인 값을 보유하고 있으면 깊게 동일합니다.

지도 값이 동일한지도 개체이거나 길이가 같고 일치하는 키를 사용하여 일치하는 키가 매우 동일한 값으로 매핑되는 경우지도 값은 매우 동일합니다.

포인터의 값은 Go의 == 연산자를 사용하여 같거나 깊게 동일한 값을 가리키는 경우 깊게 동일합니다.

슬라이스 값은 모두 다음과 같은 경우 똑같습니다. 둘 다 같거나 둘 다 같고 길이가 같고 기본 배열의 동일한 초기 항목을 가리 킵니다 (즉, & x [0 ] == & y [0]) 또는 해당 요소 (길이까지)가 동일합니다. 비어 있지 않은 빈 슬라이스와 nil 슬라이스 (예 : [] byte {} 및 [] byte (nil))는 깊이 같지 않습니다.

숫자, 부울, 문자열 및 채널과 같은 다른 값은 Go == 연산자를 사용하여 같으면 동등합니다.


두 개의 []byte 가 있으면 bytes.Equal 사용하여 비교 bytes.Equal . Golang 문서는 다음과 같이 말합니다 :

Equal은 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

이것은 @ VictorDeryagin의 대답에 주어진 reflect.DeepEqual() 을 사용한 예제 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-reflect