阅读 696

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 ch0 chan int
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 <- 
}
复制代码

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

c1:=make(chan int) 无缓冲
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 一个接口是一组函数签名的集合。具体结构可以实现他们。 比如:

type Shape interface {
    Area() float64
    Perimeter() float64
}
复制代码

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

// 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的特色与优点。