두 조각이 같은지 어떻게 확인할 수 있습니까?
slice can only be compared to nil
하여 일어 났고 슬라이스 평등을 확인하는 관용적 golang 방법이 있는지 궁금해했습니다 ... 평등 연산자가 언어로 정의되지 않은 경우 가장 효율적인 방법을 묻는 것이 합리적이라고 생각합니다 그것을 달성하기 위해. 질문을 닫을 필요가 없습니다
두 조각이 같은지 어떻게 확인할 수 있습니까?
slice can only be compared to nil
하여 일어 났고 슬라이스 평등을 확인하는 관용적 golang 방법이 있는지 궁금해했습니다 ... 평등 연산자가 언어로 정의되지 않은 경우 가장 효율적인 방법을 묻는 것이 합리적이라고 생각합니다 그것을 달성하기 위해. 질문을 닫을 필요가 없습니다
답변:
슬라이스의 각 요소를 반복하고 테스트해야합니다. 슬라이스 평등이 정의되지 않았습니다. 그러나 bytes.Equal
type의 값을 비교 하는 경우 함수가 있습니다 []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
}
for i, v := range a { if v != b[i] { return false } }
.
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
assert.Equal
reflect.DeepEqual
테스트를 느리게 실행하고 결국에는 파이프 라인을 테스트 할 수 있도록 내부적으로 사용 합니다.
==
운영자는 그래서 더욱,이 문제는 합법적 인 하나입니다, 일부 유형의 이동에 정의되어 있습니다.