// -------------------
type shape interface {
area() float64
}
type rect struct {
width float64
height float64
}
func (r *rect) area() float64 {
return r.width * r.height
}
type circle struct {
radius float64
}
func (c *circle) area() float64 {
return math.Pi * c.radius * c.radius
}
// -----------------
// Test
// -----------------
/**
* 结构Person[{cdai 30 cdai@gmail.com}],姓名[cdai]
* 结构Person指针[&{cdai 30 cdai@gmail.com}],姓名[cdai]
* 用指针修改结构Person为[{carter 40 cdai@gmail.com}]
*
* Shape[0]周长为[13.920000]
* Shape[1]周长为[58.088048]
*/
func main() {
testStruct()
testInterface()
}
func testStruct() {
p1 := Person{"cdai", 30, "cdai@gmail.com"}
p1 = Person{name: "cdai", age: 30, email: "cdai@gmail.com"}
fmt.Printf("结构Person[%v],姓名[%s]n", p1, p1.getName())
ptr1 := &p1
fmt.Printf("结构Person指针[%v],姓名[%s]n", ptr1, ptr1.getName())
ptr1.age = 40
ptr1.name = "carter"
fmt.Printf("用指针修改结构Person为[%v]n", p1)
}
func testInterface() {
r := rect { width: 2.9, height: 4.8 }
c := circle { radius: 4.3 }
s := []shape{ &r, &c }
for i, sh := range s {
fmt.Printf("Shape[%d]周长为[%f]n", i, sh.area())
}
}
3.7 异常处理
Golang中异常的使用比较简单,可以用errors.New创建,也可以实现Error接口的方法来自定义异常类型,同时利用函数的多返回值特性可以返回异常类。比较复杂的是defer和recover关键字的使用。Golang没有采取try-catch“包住”可能出错代码的这种方式,而是用 延迟处理 的方式。
用defer调用的函数会以后进先出(LIFO)的方式,在当前函数结束后依次顺行执行。defer的这一特点正好可以用来处理panic。当panic被调用时,它将立即停止当前函数的执行并开始逐级解开函数堆栈,同时运行所有被defer的函数。如果这种解开达到堆栈的顶端,程序就死亡了。但是,也可以使用内建的recover函数来重新获得Go程的控制权并恢复正常的执行。由于仅在解开期间运行的代码处在被defer的函数之内,recover仅在被延期的函数内部才是有用的。
package main
import (
"fmt"









