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

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
}

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

1

  • 2
    在第一个示例中,局部变量d设置为指向新分配的FileMetadata.在第二个示例中,结果d被初始化为零值(nil 指针)。


    – 


1 个回答
1

当您使用命名返回变量时,该变量在函数体内声明,并将初始值设置为零值。因此,在第二个示例中,您使用了命名 return d, ,d是一个 nil 指针。你仍然应该初始化它:

    d = new(FileMetadata)

0