gpt4 book ai didi

testing - 使用反射调用带有 nil 参数的函数导致 "Call using zero Value argument" panic

转载 作者:IT王子 更新时间:2023-10-29 01:36:51 41 4
gpt4 key购买 nike

我正在尝试测试接受“错误”类型参数的函数。该函数在某些情况下应该会出现 panic ,我正在尝试测试场景。

但是,当我尝试对 nil 值(可以将其传递到接受“error”类型的函数)使用 reflect.Call 时,它似乎会导致 panic 并显示以下消息:

reflect: Call using zero Value argument

我找到了以下帖子,但未能将其整合到我的功能中。

相关围棋 Playground :http://play.golang.org/p/cYQMQ6amPH

在上面的 playground 中,我希望调用 InvocationCausedPanic(PanicOnErr, nil) 以返回 false,但是,上述来自 reflect 的 panic 导致误报.

我是否可以对 InvocationCausedPanicinvoke 函数进行任何修改以使其正常工作(同时保留其测试无法接受 的其他函数的能力nil 作为参数 - 例如接受字符串的函数)?

也许问题出在函数的调用方式上?

我试过像 InvocationCausedPanic(PanicOnErr, new(error))InvocationCausedPanic(PanicOnErr, error(nil)) 之类的东西都没有用。

感谢您的任何建议。

最佳答案

如果参数值为nil,则使用函数参数类型的零值。

    if paramValue == nil {
reflectedParams[paramIndex] = reflect.New(expectedType).Elem()
} else {
reflectedParams[paramIndex] = reflect.ValueOf(paramValue)
}

playground

如果计算反射值然后检查可分配性,则可以简化代码。通过此更改,不再需要 compatible 函数。

for paramIndex, paramValue := range params {
if paramValue == nil {
reflectedParams[paramIndex] = reflect.New(expectedType).Elem()
} else {
reflectedParams[paramIndex] = reflect.ValueOf(paramValue)
}
expectedType := funcType.In(paramIndex)
actualType := reflectedParams[paramIndex].Type()
if !actualType.AssignableTo(expectedType) {
errStr := fmt.Sprintf("InvocationCausedPanic called with a mismatched parameter type [parameter #%v: expected %v; got %v].", paramIndex, expectedType,actualType)
panic(errStr)
}
}

关于testing - 使用反射调用带有 nil 参数的函数导致 "Call using zero Value argument" panic ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26321115/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com