Pointers 从Go中的数组返回指针数组

Pointers 从Go中的数组返回指针数组,pointers,struct,go,slice,Pointers,Struct,Go,Slice,正如你所知,我是个新手 我一直在尝试做这样一个函数: func PointersOf(slice []AnyType) []*AnyType{ //create an slice of pointers to the elements of the slice parameter } 这就像对切片中的所有元素执行&slice[idx],但我在如何键入参数和返回类型以及如何创建切片本身方面遇到了问题 此方法需要适用于内置类型的切片,以及结构切片和指向内置类型/结构的指针切片 在调用这个函

正如你所知,我是个新手

我一直在尝试做这样一个函数:

func PointersOf(slice []AnyType) []*AnyType{
    //create an slice of pointers to the elements of the slice parameter
}
这就像对切片中的所有元素执行
&slice[idx]
,但我在如何键入参数和返回类型以及如何创建切片本身方面遇到了问题

此方法需要适用于内置类型的切片,以及结构切片和指向内置类型/结构的指针切片

在调用这个函数之后,如果我不必强制转换指针片,那就更好了


编辑: 我需要这个方法的原因是为了有一个通用的方法来使用for中的数组元素。。。范围循环,而不是使用该元素的副本。考虑:

type SomeStruct struct {
    x int
}

func main() {
    strSlice := make([]SomeStruct, 5)
    for _, elem := range strSlice {
        elem.x = 5
    }
}
这不起作用,因为elem是strSlice元素的副本

type SomeStruct struct {
    x int
}

func main() {
    strSlice := make([]SomeStruct, 5)
    for _, elem := range PointersOf(strSlice) {
        (*elem).x = 5
    }
}

但是,这应该是可行的,因为您只复制指向原始数组中元素的指针。

使用以下代码在设置字段的结构片中循环。不需要创建指针片段

type SomeStruct struct {
  x int
}

func main() {
  strSlice := make([]SomeStruct, 5)
  for i := range strSlice {
    strSlice[i].x = 5
  }
}

下面是建议的函数指针:

func PointersOf(v interface{}) interface{} {
  in := reflect.ValueOf(v)
  out := reflect.MakeSlice(reflect.SliceOf(reflect.PtrTo(in.Type().Elem())), in.Len(), in.Len())
  for i := 0; i < in.Len(); i++ {
    out.Index(i).Set(in.Index(i).Addr())
  }
  return out.Interface()
}

你不能;Go类型是不变的,并且没有泛型。您可以在需要时创建所需类型的切片。你能举个例子说明为什么你需要这个吗?也许你应该先尝试编写这样一个函数,让它只对
整数的一部分工作,例如。那么你的
AnyType
应该是一个空接口(
interface{}
),我想,如果你想支持不同的类型。你也可以给我们看一些代码,这样我们就可以专门帮助你解决你遇到的问题。。。range
返回给定切片中元素的副本。如果我想更改我的元素,我通常需要使用一个normal for循环,并从索引
e=&slice[idx]
中获取元素。但是,如果我能够获得指针数组并使用reference@coolcat007:这就是为什么。。。range返回一个索引作为第一个参数,因此您可以将其索引到切片中,而不是制作副本。Go力求不具有隐藏的复杂性,您的转换需要额外的分配和O(n)拷贝。如果您需要一个指向某个值的指针,则应始终以指针开始,即从一开始您的切片就应该是
[]*SomeStruct
for _, elem := range PointersOf(strSlice).([]*SomeStruct) {
    elem.x = 5
}