在尝试测试此业务功能时:
//IsInSlice works like Array.prototype.find in JavaScript, except it
// returns -1 if `value` is not found. (Also, Array.prototype.find takes
// function, and IsInSlice takes `value` and `list`)
func IsInSlice(value interface{}, list interface{}) int {
slice := reflect.ValueOf(list)
for i := 0; i < slice.Len(); i++ {
if slice.Index(i) == value {
return i
}
}
return -1
}
我发现它没有通过我的健全性测试:
func TestIsInSlice(t *testing.T) {
digits := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
slice := digits[3:8] // returns {3,4,5,6,7}
type args struct {
value interface{}
list interface{}
}
tests := []struct {
name string
args args
want int
}{
{
name: "SanityTest",
args: args{value: 3,
list: []int{3, 4, 5, 6, 7},
},
want: 0,
},
{
name: "ElementAtEnd",
args: args{
value: 5,
list: slice,
},
want: 3,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := IsInSlice(tt.args.value, tt.args.list); got != tt.want {
t.Errorf("IsInSlice() = %v, want %v", got, tt.want)
}
})
}
}
负责修复这些错误的人员不知道是什么原因导致了该错误,更不用说如何修复该错误了,我或高级开发人员也不知道。因此,我尝试isolate the problem进行识别。
我以为是
当我记录错误时,我以为是由于某种原因,value
与reflect.Value
返回的slice.Index(i)
进行了比较。我尝试过
reflect.DeepEqual(slice.Index(i), value)
但是失败了。我可以通过测试的唯一方法是使用Int()
提取值并使用
var i int64 = 3
代替文字3
(片状af)。
问题出在哪里,我们该如何解决?
答案 0 :(得分:3)
Index() method返回一个reflect.Value。 使用该值的Interface() method获取其基础值并与之进行比较:
func IsInSlice(value interface{}, list interface{}) int {
slice := reflect.ValueOf(list)
for i := 0; i < slice.Len(); i++ {
if slice.Index(i).Interface() == value {
return i
}
}
return -1
}
答案 1 :(得分:1)
Value.Index()
返回一个reflect.Value
。将其与您收到的interface{}
进行比较,将从不返回true。您需要使用slice.Index(i).Interface()
与“真实”值进行比较。
但是,您在这里弄乱了黑魔法。您缺少许多安全检查-如果list
实际上不是切片或数组怎么办?如果value
与list
的元素类型不同怎么办?查看DeepEqual
的实现,以查看您可能要对以下功能执行的检查类型:https://golang.org/src/reflect/deepequal.go