return在 Golang 中使用命名的 return 值引用切片
returning a reference to a slice using named return values in Golang
我有这段代码,return是对切片的引用:
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
}
我想使用命名的 return 值重写它,我想到了这样的东西:
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() 函数的第一行生成分段冲突。通过命名 return 值执行此操作的正确方法是什么,或者这是不应使用命名 return 值的情况之一?非常欢迎解释为什么我的解决方案会产生分段错误。
在 return 声明中 parsedBucketsNames *[]V2BucketAccess1
被赋予 nil
值。这行
*parsedBucketsNames = []V2BucketAccess{}
与
相同
var parsedBucketsNames *[]V2BucketAccess
*parsedBucketsNames = []V2BucketAccess{}
在 nil 指针上使用 *
会使程序因分段冲突而崩溃。您不能这么早解除对指针的引用。要分配一个值,您必须获得文字的地址
parsedBucketsNames = &[]V2BucketAccess{}
我在这里修正了你的代码https://go.dev/play/p/AU5InoPWFJW
我有这段代码,return是对切片的引用:
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
}
我想使用命名的 return 值重写它,我想到了这样的东西:
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() 函数的第一行生成分段冲突。通过命名 return 值执行此操作的正确方法是什么,或者这是不应使用命名 return 值的情况之一?非常欢迎解释为什么我的解决方案会产生分段错误。
在 return 声明中 parsedBucketsNames *[]V2BucketAccess1
被赋予 nil
值。这行
*parsedBucketsNames = []V2BucketAccess{}
与
相同var parsedBucketsNames *[]V2BucketAccess
*parsedBucketsNames = []V2BucketAccess{}
在 nil 指针上使用 *
会使程序因分段冲突而崩溃。您不能这么早解除对指针的引用。要分配一个值,您必须获得文字的地址
parsedBucketsNames = &[]V2BucketAccess{}
我在这里修正了你的代码https://go.dev/play/p/AU5InoPWFJW