Published on

Golang 基础分享

Authors
  • avatar
    Name
    Liant
    Twitter

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采用多进程的设计,利用多核提高并行和并发能力。