返回Go

时间:2016-01-06 14:13:03

标签: pointers struct go slice

你知道,我是Go的新手。

我一直在尝试制作这样的功能:

func PointersOf(slice []AnyType) []*AnyType{
    //create an slice of pointers to the elements of the slice parameter
}

就像对切片中的所有元素执行&slice[idx]一样,但是我在如何键入参数和返回类型时遇到问题,以及如何创建切片本身。

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

调用此函数后,如果我不必投射指针切片会更好

修改 我需要这种方法的原因是有一种通用的方法在for ... range循环中使用数组的元素,而不是使用该元素的副本。考虑:

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
    }
}

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

1 个答案:

答案 0 :(得分:3)

使用以下代码循环设置字段的结构片段。没有必要创建一个指针片段。

type SomeStruct struct {
  x int
}

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

playground example

这是PointersOf函数的建议:

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

以下是如何使用它:

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

playground example