Pointers 如何取消引用作为空接口传递的指针值?
我有一个方法,在我用于数据库访问的类型上使用Pointers 如何取消引用作为空接口传递的指针值?,pointers,go,interface,Pointers,Go,Interface,我有一个方法,在我用于数据库访问的类型上使用目标接口{},如: func (c *client) Query(query someType, target interface{}) error { return c.db.Query(query).Decode(target) } 这就叫做like result := resultType{} if err := c.Query(myQuery, &result); err == nil { // do sth with
目标接口{}
,如:
func (c *client) Query(query someType, target interface{}) error {
return c.db.Query(query).Decode(target)
}
这就叫做like
result := resultType{}
if err := c.Query(myQuery, &result); err == nil {
// do sth with result
}
当我传递result
我现在遇到的麻烦是,我不知道如何在测试中模拟这种行为(改变传递的引用)
如果我不需要通过接口{}
,我可以想象这样做:
type mockClient struct {
targetValue resultType
}
func (m *mockClient) Query(query someType, target *resultType) error {
*target = m.targetValue
return nil
}
type mockClient struct {
targetValue interface{}
}
func (m *mockClient) Query(query someType, target interface{}) error {
target = m.targetValue // this does not mutate the passed target
return nil
}
如果我尝试使用我的实际签名执行相同的操作,我无法像下面这样取消引用target
中包含的值:
type mockClient struct {
targetValue resultType
}
func (m *mockClient) Query(query someType, target *resultType) error {
*target = m.targetValue
return nil
}
type mockClient struct {
targetValue interface{}
}
func (m *mockClient) Query(query someType, target interface{}) error {
target = m.targetValue // this does not mutate the passed target
return nil
}
当指针值作为空接口传入时,我可以取消引用它吗?如果这是不可能的,那么在不使用具体类型作为参数的情况下,测试我的方法的副作用的另一种方法是什么呢?您可以使用“reflect”包来完成
package main
import (
"fmt"
"reflect"
)
type mockClient struct {}
func (m *mockClient) Query(query string, target interface{}) error {
a := "changed"
va := reflect.ValueOf(a)
reflect.ValueOf(target).Elem().Set(va)
return nil
}
func main() {
var mc mockClient
target := "initial"
mc.Query("qwe", &target)
fmt.Println(target)
}
您可以找到必须使用的参考的简单示例,与所有使用相同技术传递<代码>接口{}输出参数的解组器相同。您知道stdlib中的某个地方可以这样做,我可以查找它吗?或者任何其他的例子?正如@Adrian提到的,看看解封者。这个答案对我帮助很大,谢谢!对我来说,我设置的值也是一个指针,所以我必须执行
va:=reflect.ValueOf(a.Elem()