Go 语言入门指南 | 青训营

75 阅读3分钟

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语言的标准库,任重而道远!

Golang标准库