2017-11-30 5 views
-5

この場合、DeepEqualが失敗する理由を理解できませんか?なぜDeepEqualが[...] int {0}とgolangのmake([] int、1、1)で失敗するのですか?代わりがありますか?

各値を反復することなく、組み込みゴーランの代替手段がありますか?

package main 

import (
    "fmt" 
    "reflect" 
) 

func main() { 
    a1 := [...]int{0} 
    b1 := make([]int, 1, 1) 
    fmt.Printf("Equal: %t %v %v\n", reflect.DeepEqual(a1, b1),a1,b1) 

} 

https://play.golang.org/p/lqU3nBq6B3

+1

2つのスライスを使用する場合、それらは等しくなります。https://play.golang.org/p/x3NWCNsLAD – JimB

+1

「a1」と「b1」は同じタイプではないため失敗します。期待される結果を見るには、 'reflect.DeepEqual(a1 [:]、b1)'を呼び出します。 –

答えて

5

彼らも同じタイプではありません。

a1 := [...]int{0}  // *array*, equivalent to [1]int{0} 
b1 := make([]int, 1, 1) // *slice*, equivalent to []int{0} 

// Equal: false - because they're different types! 
fmt.Printf("Equal: %t (types: %T vs %T)\n", reflect.DeepEqual(a1, b1), a1, b1) 
// But, if we take a slice of the array, they're comparable: 
fmt.Printf("Equal: %t (types: %T vs %T)\n", reflect.DeepEqual(a1[:], b1), a1[:], b1) 

遊び場デモ:https://play.golang.org/p/B77iKS8gQd

宣言はthe spec section on composite literalsで説明されています。スライスアレイは、the Go tourthe spec section on slice expressionsでカバーされています。

関連する問題