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

只是你知道,我对 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

    }

}

然而,这应该有效,因为您只复制指向原始数组中元素的指针。


米琪卡哇伊
浏览 215回答 1
1回答

MYYA

使用以下代码循环访问设置字段的结构片段。没有必要创建一个指针切片。type SomeStruct struct {&nbsp; x int}func main() {&nbsp; strSlice := make([]SomeStruct, 5)&nbsp; for i := range strSlice {&nbsp; &nbsp; strSlice[i].x = 5&nbsp; }}playground example这是建议的 PointersOf 函数:func PointersOf(v interface{}) interface{} {&nbsp; in := reflect.ValueOf(v)&nbsp; out := reflect.MakeSlice(reflect.SliceOf(reflect.PtrTo(in.Type().Elem())), in.Len(), in.Len())&nbsp; for i := 0; i < in.Len(); i++ {&nbsp; &nbsp; out.Index(i).Set(in.Index(i).Addr())&nbsp; }&nbsp; return out.Interface()}下面是如何使用它:for _, elem := range PointersOf(strSlice).([]*SomeStruct) {&nbsp; &nbsp; elem.x = 5}playground example
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go