首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reflect.Value问题

Reflect.Value问题
EN

Stack Overflow用户
提问于 2018-09-27 14:01:42
回答 2查看 352关注 0票数 1

在尝试测试这个业务功能时:

代码语言:javascript
复制
//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
}

我发现它没能通过我的理智测试:

代码语言:javascript
复制
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)
            }
        })
    }

}

负责修复这些bug的人不知道是什么导致了bug,更不用说如何修复它了,我和高级开发人员也不知道。因此,我试图通过隔离问题来识别它。

我以为是

当我记录这些bug时,我认为它们是因为不知何故,valueslice.Index(i)返回的reflect.Value进行了比较。我试过了

代码语言:javascript
复制
reflect.DeepEqual(slice.Index(i), value)

但那失败了。通过测试的唯一方法是使用Int()提取值并使用

代码语言:javascript
复制
var i int64 = 3

而不是文字3,它是片状af。

,什么是问题,我们如何解决它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 14:12:40

索引()方法返回一个reflect.Value。使用该值的接口()方法获取其基础值,并与之进行比较:

代码语言:javascript
复制
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
}
票数 2
EN

Stack Overflow用户

发布于 2018-09-27 14:15:02

Value.Index()返回一个reflect.Value。将其与您收到的interface{}进行比较,将永远不会返回true。您需要使用slice.Index(i).Interface()与“真实”值进行比较。

不过,你在这里捣乱了黑魔法。您错过了很多安全检查--如果list实际上不是一个片或数组,怎么办?如果valuelist的元素类型不同呢?看看DeepEqual的实现,看看您可能希望对这样一个函数执行什么样的检查:https://golang.org/src/reflect/deepequal.go

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52538869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档