golang系列课程(五)—— golang高级特性

叶不闻 · · 2743 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

协程

协程是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的特色与优点。


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:叶不闻

查看原文:golang系列课程(五)—— golang高级特性

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2743 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传