我有这段代码,它返回对切片的引用: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
- 1 回答
- 0 关注
- 134 浏览
添加回答
举报
0/150
提交
取消