go - 如何使用反射在go中创建接口值类型的对象
问题描述
更新
我想制作帮助函数来测试读取 env vars 函数。它使用envconfig。
func Test_T2(t *testing.T) {
os.Setenv("APP_PARAM_STR", "string value")
os.Setenv("APP_PARAM_INT", "12")
os.Setenv("APP_PARAM_DURATION", "15s")
os.Setenv("APP_PARAM_INT", "44")
c := ConfigTwo{}
d := ConfigTwo{
ParamDuration: 15*time.Second,
ParamInt: 44,
}
helper(t, &c, &d)
}
func helper(t *testing.T, confObject, expValue interface{}) {
t.Helper()
err := getParams(&confObject)
if !assert.NoError(t, err) {
return
}
assert.Equal(t, expValue, confObject)
}
func getParams(cfg interface{}) error {
return envconfig.Process("APP", cfg)
}
** UPDATE 2 **
It works. Thanks everyone.
如果我只有 getPrams 功能,它就可以工作。但是如果我添加助手(我需要测试不同的结构)我会得到一个错误:
specification must be a struct pointer
envconfig在这里执行两项检查:
解决方案
使用此代码。参数是一个指向期望值的指针。
func helper(t *testing.T, pexpected interface{}) {
t.Helper()
pactual := reflect.New(reflect.TypeOf(pexpected).Elem()).Interface()
err := getParams(pactual)
if !assert.NoError(t, err) {
return
}
assert.Equal(t, pexpected, pactual)
}
该表达式reflect.New(reflect.TypeOf(pexeceted).Elem()).Interface()
返回一个指向与 pexpected 指向的类型相同的新空值的指针。
像这样称呼它:
helper(t, &ConfigTwo{A: "expected A Field", B: "expected B field"}
推荐阅读
- java - 为什么当我更改我喜欢的价格和时间时,我的 dynamoDb 喜欢更新而不添加新的?
- javascript - 如何使用本地存储在 javascript 中制作待办事项列表
- javascript - Typeerror:name.tolowercase 在 javascript 中不起作用 - 未解决
- netbeans - 在 Netbeans 11 中输入代码时如何删除突出显示栏?
- kubernetes - GKE 自动扩缩程序“优化利用率”
- r - R:另一列的每个对应分位数的列值
- google-apps-script - 侧边栏按钮单击未捕获的异常
- vue.js - 使用 Vue.js Prop 填充 vForm 数据?
- r - 缩放生产数据
- android - Android BLE - 测量来自应用程序内部的流量