Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 如何取消引用作为空接口传递的指针值?_Pointers_Go_Interface - Fatal编程技术网

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()