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

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

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

Go
一只斗牛犬 2022-12-13 16:22:34
我有这段代码,它返回对切片的引用:package mainimport "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 mainimport "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() 函数的第一行生成分段违规。通过命名返回值执行此操作的正确方法是什么,或者这是不应使用命名返回值的情况之一?非常欢迎解释为什么我的解决方案会生成分段错误。
查看完整描述

1 回答

?
慕莱坞森

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

在返回声明中parsedBucketsNames *[]V2BucketAccess1给出了nil值。这条线

*parsedBucketsNames = []V2BucketAccess{}

是相同的

var parsedBucketsNames *[]V2BucketAccess
*parsedBucketsNames = []V2BucketAccess{}

在 nil 指针上使用*会使程序因分段冲突而崩溃。您不能这么早解除对指针的引用。要分配一个值,您必须获得文字的地址

parsedBucketsNames = &[]V2BucketAccess{}

我在这里修复了你的代码https://go.dev/play/p/AU5InoPWFJW


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

添加回答

举报

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