猿问

使用 Golang 中的命名返回值返回对切片的引用

我有这段代码,它返回对切片的引用:


package main


import "fmt"


type V2BucketAccess struct {

    BucketName   string

    AccessPolicy string

}


func main() {

    result := MyFunc()

    fmt.Print(*result)

}


func MyFunc() *[]V2BucketAccess {

    parsedBucketsNames := []V2BucketAccess{}

    mystuff1 := V2BucketAccess{

        BucketName:   "bucket-1",

        AccessPolicy: "readwrite",

    }

    mystuff2 := V2BucketAccess{

        BucketName:   "bucket-2",

        AccessPolicy: "read",

    }

    parsedBucketsNames = append(parsedBucketsNames, mystuff1, mystuff2)

    return &parsedBucketsNames

}

我想用命名的返回值重写这个,我想出了这样的事情:


package main


import "fmt"


type V2BucketAccess struct {

    BucketName   string

    AccessPolicy string

}


func main() {

    result := MyFunc()

    fmt.Print(*result)

}


func MyFunc() (parsedBucketsNames *[]V2BucketAccess) {

    *parsedBucketsNames = []V2BucketAccess{}

    mystuff1 := V2BucketAccess{

        BucketName:   "bucket-1",

        AccessPolicy: "readwrite",

    }

    mystuff2 := V2BucketAccess{

        BucketName:   "bucket-2",

        AccessPolicy: "read",

    }

    *parsedBucketsNames = append(*parsedBucketsNames, mystuff1, mystuff2)

    return

}

但是,这会在 MyFunc() 函数的第一行生成分段违规。通过命名返回值执行此操作的正确方法是什么,或者这是不应使用命名返回值的情况之一?非常欢迎解释为什么我的解决方案会生成分段错误。


一只斗牛犬
浏览 135回答 1
1回答

慕莱坞森

在返回声明中parsedBucketsNames *[]V2BucketAccess1给出了nil值。这条线*parsedBucketsNames = []V2BucketAccess{}是相同的var parsedBucketsNames *[]V2BucketAccess *parsedBucketsNames = []V2BucketAccess{}在 nil 指针上使用*会使程序因分段冲突而崩溃。您不能这么早解除对指针的引用。要分配一个值,您必须获得文字的地址parsedBucketsNames = &[]V2BucketAccess{}我在这里修复了你的代码https://go.dev/play/p/AU5InoPWFJW
随时随地看视频慕课网APP

相关分类

Go
我要回答