Go进阶|青训营笔记

30 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7天

任何语言想进阶不能只停留在理论阶段,实战是必须的。俗话说熟能生巧,做的多了自然就有了不一样的感悟。不过说到go语言,要想进阶,其实很简单,golang的几个特性精通了,就算成功了一半了,golang比较有特色的无非是以下几个特性:

协程 协程是golang最重要的一个特性。在协程出现之前,线程被作为调度的最小单位。协程可以理解是一种用户态,逻辑层面的线程。 通过协程,我们将很容易地实现高并发。 加入你要做三件事,假设要执行a,b,c三个方法。代码该怎么写?平常我们的写法就是

a()
b()
c()

只有a做完了,才能做b,b做完了,才能做c。 但有了协程就可以

go a()
go b()
go c()

三个同时进行,充分利用多核的性能。

管道 1.管道概念类似unix中管道(pipe) 2.先进先出 3.线程安全,多个goroutine同时访问,不需要加锁 4.channel是有类型的,一个整数的channel只能存放整数管道的定义

var ch1 chan string
var ch2 chan map[string]string

type stu struct{}

var ch3 chan stu
var ch4 chan *stu

管道用于协程之间数据的传递。一般分为有缓冲管道,和无缓冲管道。两个协程间如果有数据交流怎么办,这时候就可以用管道来传递。 golang的设计是想就是用通信代替共享内存。

func a() {
    ch <- 1
    }
func b() {  
  ch <-
   }

管道可以带缓冲,就是说可以往管道里放多个数据,放满了,才会阻塞。

c2:=make(chan int,1) 有缓冲

c1<-1 无缓冲: 不仅仅是向 c1 通道放 1,而是一直要等有别的携程 <-c1 接手了这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着。

有缓冲: c2<-1 则不会阻塞,因为缓冲大小是1,只有当放第二个值的时候,第一个还没被人拿走,这时候才会阻塞。 面试经常会问到这个问题。实际就是同步和异步的区别。

接口 interface 定义:An interface is a collection of method signatures that an Object can implement 一个接口是一组函数签名的集合。具体结构可以实现他们。 比如:

    Area() float64
    Perimeter() float64
}

这就是一个接口,声明了两个方法Area和Perimeter 下面咱们可以定义具体结构,实现这个接口。

type Rect struct {
    height float64
    weight float64
}

func (p *Rect) Area() float64 {
    return p.height * p.weight
}

func (p *Rect) Perimeter() float64 {
    return 2 * (p.height + p.weight)
}// type rect
type Rect struct {
    height float64
    weight float64
}

func (p *Rect) Area() float64 {
    return p.height * p.weight
}

func (p *Rect) Perimeter() float64 {
    return 2 * (p.height + p.weight)
}

接口可以提供面向对象编程的能力,只要实现了某接口,就可以用该接口对象 指向具体类型对象。相同类型的引用,指向不同对象,即多态。 我们看到,golang中的派生关系,不像c++,java一样需要显式指定,只需要实现接口所定义的所有方法即可。所以,golang的继承关系,是非侵入式的,这也是golang的特色与优点。