go 接口/错误处理 知识点
Posted 文大侠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 接口/错误处理 知识点相关的知识,希望对你有一定的参考价值。
接口
面向对象3大特性,封装/继承/多态,封装采用结构体完成,继承使用组合的方式完成,而接口使用的是所谓的鸭子模型(Duck Type)。
也就是说不像c++/java中,实现接口必须继承实现,只需要实现了接口定义的一组方法,那么就默认为实现了该接口。
如下,利用接口实现多态,注意new后传入对象指针
// --- interface
type Animal interface {
sayHello(words string)
}
type Peopple struct {
}
func (p *Peopple) sayHello(words string) {
log.Printf("你好 %v\\n", words)
}
type Cat struct {
}
func (p *Cat) sayHello(words string) {
log.Printf("喵喵 %v\\n", words)
}
type Dog struct {
}
func (p *Dog) sayHello(words string) {
log.Printf("汪汪 %v\\n", words)
}
func SayHello(p Animal) {
p.sayHello("你好呀")
}
// 多态
func TestSayHello(t *testing.T) {
SayHello(new(Peopple))
SayHello(new(Dog))
SayHello(new(Cat))
}
异常处理
不同于传统的java/c++中使用异常的方式,go通过多返回值支持,一般使用返回error来判断,也可以看作是c++/java中通过判断返回是否为空来处理异常。
需要注意的是,panic和os.Exit的差别,前者可以可以让函数做清理操作,后者直接退出,某种程度上和c++/java的处理逻辑一致。
具体演示程序如下
// --- panic error
func doneWithPanic() {
defer func() {
fmt.Println("doneWithPanic clear before return")
if err := recover(); err != nil {
fmt.Printf("doneWithPanic recover - %v\\n", err)
}
}()
fmt.Println("doneWithPanic start")
panic("doneWithPanic panic when error")
fmt.Println("doneWithPanic end")
}
func doneWithExit() {
defer func() {
fmt.Println("doneWithExit clear before return")
}()
fmt.Println("doneWithExit start")
os.Exit(-1)
fmt.Println("doneWithExit end")
}
func TestDone(t *testing.T) {
doneWithPanic()
doneWithExit()
}
输出内容如下
=== RUN TestDone
doneWithPanic start
doneWithPanic clear before return
doneWithPanic recover - doneWithPanic panic when error
doneWithExit start
原创,转载请注明来自
以上是关于go 接口/错误处理 知识点的主要内容,如果未能解决你的问题,请参考以下文章