Go语言起源
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。它具有简洁、快速、安全、并行、开源、内存管理、数组安全、编译迅速等特色。
Go语言没有的内容
- 类(class)
- 方法重载
- 继承
- 枚举类型
- try/catch
- 泛型
Go语言有的内容
- 结构体(struct)
- 结构体的内嵌
- 常量
- defer/recover/panic
- interface
Go语言的结构体
Go语言用结构体来替代类并可实现多态 多态通过接口来实现 以人的多种形态为例
const (
FEMALE Gender = iota
MALE
UNKNOWN
)
type Gender uint8
//多态通过接口来实现
type Person interface {
Run()
Eat()
}
//类Person的成员变量
type Teacher struct {
Name string
Age uint8
Gender Gender //gender为枚举类型
}
//类Teacher的成员函数
func (Teacher) Run() {
fmt.Println("Teacher run")
}
func (Teacher) Eat() {
fmt.Println("Teacher eat")
}
//创建一个Teacher对象
//方法1
func PersonCase1(person1 Person) {
teacher1 := Teacher{} //teacher1为Teacher类型
teacher1.Run()
teacher1.Eat()
}
//方法2
func TeacherCase2(person2 Person) {
teacher2 := new(Teacher) //teacher2为指针类型
teacher2.Run()
teacher2.Eat()
}
//teacher和student是person的子类
func PersonCase(person Person) {
person.Run()
person.Eat()
}
type Student struct {
}
//类Student的成员函数
func (Student) Run() {
fmt.Println("Student run")
}
func (Student) Eat() {
fmt.Println("Student eat")
}
若类成员函数的传入参数类型为值类型,则传入的如果是一个指针类型也可以 若类成员函数的传入参数类型为指针类型,则传入的如果是一个值类型就会发生错误 对于类型实例,值类型和指针类型都可以调用全部方法
Go语言异常处理
Go语言异常处理主要有defer/recover/panic
defer的应用场景
- 资源释放,在函数调用结束之后,即return之后
- 异常捕获和处理
- 参数值的预处理
资源释放
// return a+b 后先输出defer2,再输出defer1
func sum(a int,b int) (int) {
defer func() {
fmt.Println("defer1")
}
defer func() {
fmt.Println("defer2")
}
return a+b
}
return a+b 后先输出defer2,再输出defer1 defer遵循后进先出
异常处理
抛出异常之后,程序就会发生中断了 当协程出现异常时,recover会去恢复,当协程没有出现异常时,recover就不会执行
func TryCatchCase() {
defer func() {
err := recover()
if err != nil {
fmt.Println("err")
}
}()
PanicCase()
}
func PanicCase() {
painc("出现异常信息")
}
参数值的预处理
func DeferCase() {
i := 1
//传进去的i的值为1
defer func(j int){
fmt.Println("defer j:",i)
}(i)
//闭包 函数内部使用函数外部的值
defer func(){
i++
fmt.Println("defer i:",i)
}()
i = 99
return
}
最后的输出结果为:defer i:100 defer j: 2
Go语言特有的内容
- 头等函数,允许将函数分配给变量,作为其他函数的入参,返回值;函数还可以作为对象,函数也可以定义为类型
- 并行操作非常方便,通过go关键词启动协程
- 通过通讯共享内存
- 多路复用,channel的多路复用
这次青训营是我第一次学go,相比C++、C,从语法层面,go语言确实要简单很多,但是它也具有一些自己独特的特性,还有很多需要学习的,go语言比C++更加适合Web开发,对go语言的语法有了基本的了解之后,还需要好好了解一下go语言的标准库,任重而道远!