New 与 go 中作为指针的命名返回

问题描述 投票:0回答:1

我的功能是带有此签名的工作文件

func GetFileMetadata(f *multipart.FileHeader) *FileMetadata {
    d := new(FileMetadata)

    // ...

    if typ, err := GetFileRealType(f); err == nil {
        d.Type = typ.MIME.Value
        fileExt = "." + typ.Extension
    } else {
        d.Type = "unknown"
    }

    return d
}

使用以下签名则不会。

func GetFileMetadata(f *multipart.FileHeader) (d *FileMetadata) {

    // ...

    if typ, err := GetFileRealType(f); err == nil {
        d.Type = typ.MIME.Value
        fileExt = "." + typ.Extension
    } else {
        d.Type = "unknown"
    }

    return
}

获取零指针取消引用错误。原因是什么?

go
1个回答
0
投票

当您使用命名返回变量时,该变量在函数体内声明,并将初始值设置为零值。因此,在第二个示例中,您使用了带有

d
的命名返回,
d
是一个 nil 指针。你仍然应该初始化它:

    d = new(FileMetadata)
© www.soinside.com 2019 - 2024. All rights reserved.