百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 软件资讯 > 正文

(*error)(nil)详解

dezehang 2024-11-22 13:05 3 浏览

先看C语言中的类似问题:空字符串。

const char* empty_str0 = "";
const char* empty_str1 = "\0empty";
const char* empty_str2 = NULL;

以上3个字符串并不相等,但是从某种角度看,它们都是对应空的字符串。

  • empty_str0 指向一个空的字符串,但是empty_str0本身的值是有效的。
  • empty_str1 指向一个非空的字符串,但是字符串的第一个字符是’\0’。
  • empty_str2 本身是一个空的指针。

Go的error是一个interface类型,error的nil问题和C语言的字符串类似。

参考官方的error文档说明:

  • http://golang.org/doc/go_faq.html#nil_error

在底层,interface作为两个成员实现:一个类型和一个值。该值被称为接口的动态值, 它是一个任意的具体值,而该接口的类型则为该值的类型。对于 int 值3, 一个接口值示意性地包含(int, 3)。

只有在内部值和类型都未设置时(nil, nil),一个接口的值才为 nil。特别是,一个 nil 接口将总是拥有一个 nil 类型。若我们在一个接口值中存储一个 *int 类型的指针,则内部类型将为 *int,无论该指针的值是什么:(*int, nil)。 因此,这样的接口值会是非 nil 的,即使在该指针的内部为 nil。

下面是一个错误的错误返回方式:

func returnsError() error {    
    var p *MyError = nil    
    if bad() {        
        p = ErrBad    
    }    
    return p // Will always return a non-nil error.
}

这里 p 返回的是一个有效值(非nil),值为 nil。 类似上面的 empty_str0。

因此,下面判断错误的代码会有问题:

func main() {    
    if err := returnsError(); err != nil {        
        panic(nil)    
    }
}

针对 returnsError 的问题,可以这样处理(不建议的方式):

func main() {    
    if err := returnsError(); err.(*MyError) != nil {        
        panic(nil)    
    }
}

在判断前先将err转型为*MyError,然后再判断err的值。 类似的C语言空字符串可以这样判断:

bool IsEmptyStr(const char* str) {    
    return !(str && str[0] != '\0');
}

但是Go语言中标准的错误返回方式不是returnsError这样。 下面是改进的returnsError:

func returnsError() error {    
    if bad() {        
        return (*MyError)(err)    
    }    
    return nil
}

因此,在处理错误返回值的时候,一定要将正常的错误值转换为 nil。

比如,syscall中就有一个bug是由于没有处理好error导致的:

// syscall: (*Proc).Call always returns non-nil err
// http://code.google.com/p/go/issues/detail?id=4686package main import "syscall" 
func main() {    
    h := syscall.MustLoadDLL("kernel32.dll")    
    proc := h.MustFindProc("GetVersion")    
    r, _, err := proc.Call()    
    major := byte(r)    
    minor := uint8(r >> 8)    
    build := uint16(r >> 16)    
    print("windows version ", major, ".", minor, " (Build ", build, ")\n")   
    if err != nil {       
        e := err.(syscall.Errno)       
        println(err.Error(), "errno =", e)   
    }
}

目前issues4686这个bug已经在修复中。

作为用户,临时可以用前面的方法回避这个bug:

// Issue 4686: syscall: (*Proc).Call always returns non-nil err
// https://code.google.com/p/go/issues/detail?id=4686
func call(h *syscall.LazyDLL, name string,    a ...uintptr) (r1, r2 uintptr, err error) {    
    r1, r2, err = h.NewProc(name).Call(a...)    
    if err.(syscall.Errno) == 0 {        
        return r1, r2, nil    
    }    
    return
}

Go作为一个强类型语言,不同类型之前必须要显示的转换(而且必须是基础类型相同)。 这样可以回避很多类似C语言中因为隐式类型转换引入的bug。

但是,Go中interface是一个例外:type到interface和interface之间可能是隐式转换的。 或许,这是Go做得不太好的地方吧。

相关推荐

WIN10系统如何安装UG10.0

随着科技的不断进步与更新,现在有很多公司己经安装上了WIN10的系统以及使用UG10.0了,但很多人反映WIN10系统安装UG10.0不好装,以下详细介绍一下1如果WIN10系统没有自带有JAVA需...

自学UG编程的心得分享

为什么有的人3个月学会基本的UG建模画图编程,有的断断续续3——5年才学会,还有的人干了7年的加工中心还不会电脑画图编程。这是什么原因?1.顾虑太多,什么都想得到,什么都想一起抓,总是上班加班没时间,...

UG/NX 绘制一个捞笊(zhào)模型,或者也可以叫它漏勺?

今天我们来看看这个模型,起因是群里有小伙伴说要做一个捞笊的模型,看见这名字直接给我整懵了,然后他发了张家里漏勺的图片才知道原来这玩意还有个这种名字。这东西相信每个小伙伴家里都有吧,它的建模方法也比较...

再也不用为学UG编程发愁了!380集最新UG资料免费送

上期发的UG教程很多粉丝都领到了,收获越来越多的好评!有你们一直陪伴真的很高兴,谢谢各位粉丝!为了给大家提供更优质的资源,这两个月都在整理你们最关心的UG资源,都是多位编程工厂老师傅的工厂实战精华,真...

优胜原创UG_3-4-5轴后处理下载

反复上机调试,安全稳定可靠,请放心使用2020.11.21,修复YSUG4-5轴后处理锁轴输出...

青华模具学院-UG10.0安装文件说明

青华模具学院分享:今天我们来跟大家一起学习NX10.0版本的安装方法,网上有很多这个版本的安装视频以及方法图文,但到最终安装软件时仍有很多新手对安装仍然感到头痛,基于这样的情况,我们特别就NX10.0...

UGnx10安装说明

温馨提示,安装前,请退出杀毒软件,关闭防火墙,因为这些软件可能阻断NX主程序和许可程序间的通信,导致安装后,软件无法启动。1、解压下载后的压缩包,右键,选择‘’解压到UGNX10_64位正式版(csl...

正版UG软件,正版UG代理,正版软件和盗版软件的区别

大家都知道,UG软件是制造业必不可少的一款三维软件,广泛应用于:CAE(有限元分析),CAD(产品设计/模具设计),CAM(计算机辅助制造编程),那么有人不禁要问了,正版软件和盗版软件在使用上有明显区...

非常全面的UG加工模块中英对照(图标注释)

大家好,我是粥粥老师,听说很多同学都在学习UG但是没有学习资料和安装包,今天粥粥老师就全部打包好免费发放给你们,那么怎么获取全套资料图档安装包呢领取途径①关注②评论、点赞、转发③私信“UG或者...

腾讯自研Git客户端 UGit|Git 图形界面客户端

支持平台:#Windows#macOS腾讯推出的一款Git图形界面客户端,简化了Git的使用流程,特别适合处理大型项目和文件。支持直接提交和推送操作,避免在大规模项目中由于远程频繁变更而导致...

经典收藏:UG重用库的一些不为人知小技巧

免费领取UG产品编程、UG多轴UG模具编程、安装包安装教程图档资料关注私信我“领取资料”,即可免费领取完整版,感谢支持,爱你们哟,么么主题:UG后处理+仿真+外挂UG重用库的正确使用方法:首先有...

UG编程常用指令G、M代码,快收藏好

今天给大家分享数控编程常用的指令代码,希望对正在学习路上的你带来一丝丝帮助。最好的方法就是转发到自己空间,方便以后学习。对了,如果你还需要其他UG教程学习资料,CNC加工中心的一些参数,以及UG画图,...

UG NX7.0中文版从入门到精通

Unigraphics(简称UG)是一套功能强大的CAD/CAE/CAM应用软件,UGNX7是其最新版本。《UGNX7从入门到精通(中文版)》以UGNX7为平台,从工程应用的角度出发,通过基...

经典UG建模基础练习图纸

UG是目前工作中比较优秀拥有大量用户的一款机械模具产品行业三维设计软件,cam加工丶软件支持全中文汉化;能够带给用户更为非凡的设计与加工新体验。很多朋友私信小编问有没有UG建模练习图纸,今天给大家分享...

UG NC软件基础操作,如何设置UG草图精度

默认情况下我们绘制草图一般只保留一位小数,即使你输入多位小数软件也会自动四舍五入,这个你做一些国标的图还好,国标以毫米为单位,一般保留小数点后一位就够了,但如果你做的图是英制单位,那么保留一位小数肯定...