- Published on
Golang 基础分享
- Authors
- Name
- Liant
Go语言分享
教程不会重点讲解语法,而是通过语言熟悉一些常见的概念,编程中需要了解的一些知识。
1、分享大纲
- 基础语法
- 面向对象
- 设计模式
- 操作系统知识
- 协程与并发
- goroutine与swoole协程的异同
2、正文内容
2.1 基础语法(Variable.go)
语法在网上有很多教程,常见的使用方法都会囊括在内,这里只会快速浏览一次。
2.2 面向对象(Oop.go)
go是类c的语言,不是强面向对象的语言(没有继承、没有构造函数、析构函数、不支持重载、暂时没有泛型)
- 多态:同一类型呈现多种不同的状态(Program.cs)
2.3 设计模式(Pattern.go)
使用go实现一些常用的设计模式,这里使用go实现组合模式,所有的设计模式都是围绕solid原则展开(单一职责、开闭原则、里式替换、面向接口编程、依赖注入),核心思想就是代理,有代理意味着解耦
2.4 常见术语
了解一些操作系统常见的概念,进程、线程、协程,并行、并发、同步、异步、阻塞、非阻塞。
进程:内存分配的最小单元 一个应用程序可以认为是一个进程,默认只有一个主线程,操作系统不知道有进程的存在,概念只对用户有意义,可以包含多个其他线程。
线程:操作系统执行任务的最小调度单元,共享进程内的数据 线程的调度是抢占式的,操作系统随机给所有进程中的某一个分配任务执行时间(时间片,一般是几十毫秒),无论执行的任务是否完成,都会强制让该进程睡眠,而执行其他的线程,可以通过设置进程的优先级来控制获取时间片的概率。
协程:协作的线程 也成为用户态线程,任务的切换通过代码可以控制,而不是操作系统。粒度比线程更小,当进程中的某一个协程遇到耗时的操作(io、sleep)时,会将剩余的时间分配给该线程的其他协程,提高时间片的利用率。
并行、并发 并行是cpu同时有多个任务作业在运行,针对多核cpu,并发是指单个核上有多个任务切换执行。
同步、异步、阻塞、非阻塞 同步异步针对消息或者说数据的方式(主动获取为同步、被动通知为异步),阻塞非阻塞则是描述等待数据时的行为(空转为阻塞、同时在执行其他任务为非阻塞)
常见的io模型:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞。
2.3 线程 vs 协程
线程是抢占式的,只能由操作系统调度,当在io密集型场景下(大量网络请求、文件操作)效率比较低。比如:在请求第三方接口数据的时候,数据经由7层网络模型发送出去以后, 当前线程会被操作系统由运行态变为沉睡,每隔一段时间询问操作系统获取数据,也就是剩余的时间都在等待数据,什么事情都没有做,这一部分时间就白白浪费了。
协程是协作式的,可以让开发人员通过代码来控制什么时候该让出当前时间,切换到其他执行流程,重复利用cpu和时间。
2.4 协程与并发(Variable.go)
通过代码来直观看到协程的优势,协程动态展示
2.5 golang协程 vs swoole协程
- go协程是基于GMP的生产消费者模型进行工作,可以利用多核,协程可能被不同的线程消费,实现并行、并发。
- swoole的协程是单线程内切换,任何时刻代码还是从上而下串行,所以swoole采用多进程的设计,利用多核提高并行和并发能力。