在我看来,Google对例外的替代方法是
GO:多值返回“ return val,err;”
GO,C ++:无检查(早期返回)
GO,C ++:“处理该死的错误”(我的说法)
C ++:断言(表达式)
GO:延迟/紧急/恢复是询问此问题后添加的语言功能
多值回报是否足够有用以充当替代选择?为什么将“资产”视为替代品?如果发生程序错误而无法正确处理的程序而导致程序停止运行,那么Google认为可以吗?
有效的GO:多个返回值
Go的不寻常功能之一是函数和方法可以返回多个值。这可以用来改善C程序中的一些笨拙的习惯用法:带内错误返回(例如,对于EOF为-1)和修改自变量。
在C语言中,写入错误由负数表示,错误代码被隐藏在易失性位置中。在Go中,Write可以返回一个计数和一个错误:“是的,您写了一些字节,但不是全部,因为您填满了设备”。软件包os中* File.Write的签名为:
func (file *File) Write(b []byte) (n int, err Error)
如文档所述,当n!= len(b)时,它返回写入的字节数和非nil错误。这是一种常见的样式。有关更多示例,请参见错误处理部分。
有效的GO:命名结果参数
可以给Go函数的返回或结果“参数”指定名称,并将其用作常规变量,就像传入的参数一样。命名后,函数开始时会将它们初始化为其类型的零值;否则,将它们初始化为零。如果函数执行不带参数的return语句,则将结果参数的当前值用作返回值。
名称不是强制性的,但它们可以使代码更短,更清晰:它们是文档。如果我们命名nextInt的结果,则显而易见,返回的int是哪个。
func nextInt(b []byte, pos int) (value, nextPos int) {
由于命名结果已初始化并绑定到未经修饰的返回值,因此它们既可以简化又可以澄清。这是io.ReadFull的一个很好使用它们的版本:
func ReadFull(r Reader, buf []byte) (n int, err os.Error) {
for len(buf) > 0 && err == nil {
var nr int;
nr, err = r.Read(buf);
n += nr;
buf = buf[nr:len(buf)];
}
return;
}
Panic是一个内置函数,可停止常规控制流并开始发出恐慌。当函数F调用紧急情况时,F的执行停止,F中任何延迟的函数都将正常执行,然后F返回其调用方。对于呼叫者,F然后表现得像是发生了恐慌。该过程将继续执行堆栈,直到返回当前goroutine中的所有函数为止,此时程序崩溃。紧急事件可以通过直接调用紧急事件来启动。它们也可能是由运行时错误引起的,例如越界数组访问。
恢复是一个内置功能,可以重新获得对紧急恐慌例程的控制。恢复仅在延迟函数内部有用。在正常执行期间,恢复调用将返回nil并且没有其他效果。如果当前goroutine处于恐慌状态,则调用recovery会捕获为panic提供的值并恢复正常执行。
这是一个示例程序,演示了恐慌和延迟的机制:
<snip>
有关恐慌和恢复的真实示例,请参阅Go标准库中的json包。它使用一组递归函数对JSON编码的数据进行解码。遇到格式错误的JSON时,解析器调用panic会将堆栈退回到顶层函数调用,该函数从panic中恢复并返回适当的错误值(请参见decode.go中的“ error”和“ unmarshal”函数) 。regexp包的Compile例程中有此技术的类似示例。Go库中的约定是,即使程序包内部使用了紧急情况,其外部API仍会显示显式的错误返回值。
defer的其他用法(在先前给出的file.Close()示例之外)包括释放互斥锁:
mu.Lock() defer mu.Unlock
SMILET
哔哔one
慕桂英4014372
相关分类