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 接口/错误处理 知识点的主要内容,如果未能解决你的问题,请参考以下文章

go 接口/错误处理 知识点

GO语言学习(十九)Go 错误处理

2.11 Go之error接口

Go 语言基础——错误处理

Go语言的异常处理之errors,panic, recover

Go-错误异常处理详解