Pointers 从作为接口传递的指针连接切片

Pointers 从作为接口传递的指针连接切片,pointers,go,reflection,slice,Pointers,Go,Reflection,Slice,我正在为一个特定的API开发一个客户端,我构建了几个结构(每个路由一个)。 API与页面一起工作,因此我有返回结构片的getter。这是通过一个公共函数完成的,该函数接受一个接口,该接口应该是指向所需结构片的指针,因此我可以使用json包中的Unmarshal 我面临的问题是,我希望在一个请求中获取所有页面,但为了实现这一点,我需要连接几个片段 我尝试使用reflect来实现这一点,但我只能设法创建一个新的切片,而不会实际更改界面所指向的值 以下是我代码的一部分: func concatenat

我正在为一个特定的API开发一个客户端,我构建了几个结构(每个路由一个)。
API与页面一起工作,因此我有返回结构片的getter。这是通过一个公共函数完成的,该函数接受一个接口,该接口应该是指向所需结构片的指针,因此我可以使用
json
包中的
Unmarshal

我面临的问题是,我希望在一个请求中获取所有页面,但为了实现这一点,我需要连接几个片段

我尝试使用
reflect
来实现这一点,但我只能设法创建一个新的切片,而不会实际更改界面所指向的值

以下是我代码的一部分:

func concatenateSlice(dst, src interface{})(){
    dstValue := reflect.ValueOf(dst)
    srcValue := reflect.ValueOf(src)
    if srcValue.Type() != dstValue.Type(){
        return
    }
    switch srcValue.Kind(){
    case reflect.Ptr, reflect.Slice:
        dstValuePoint := reflect.Indirect(dstValue)
        srcValuePoint := reflect.Indirect(srcValue)
        reflect.Copy(dstValuePoint, reflect.AppendSlice(dstValuePoint, srcValuePoint))
    }
}
很抱歉这篇文章太草率,这是我第一次讨论stackoverflow。

你不应该用它来复制结果片(在追加之后),因为目的地没有足够的空间。不会更改dst所指向的切片,如果需要,它将分配一个新切片,并返回新切片(更精确地说是保留切片的值)

只需使用以下方法,即可将
reflect.AppendSlice()
返回的切片设置为
dst
所指的值。需要注意的一点是,您不是在设置切片指针,而是在设置切片,因此首先调用,例如,在调用
Set()
之前

请参见此示例:

func concatenateSlice(dst, src interface{}) {
    dv := reflect.ValueOf(dst)
    sv := reflect.ValueOf(src)
    if dv.Type() != sv.Type() {
        return
    }

    dv2 := reflect.AppendSlice(dv.Elem(), sv.Elem())
    dv.Elem().Set(dv2)
}
测试它:

dst := []int{1, 2}
src := []int{3, 4}

concatenateSlice(&dst, &src)

fmt.Println(dst)
输出(在上尝试):


非常感谢这解决了我的问题并帮助我更好地理解了
reflect
pkg!
[1 2 3 4]