为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
米琪卡哇伊 2021-12-06 19:35:35
只是你知道,我对 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 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

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


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


查看完整回答
反对 回复 2021-12-06
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信