[TOC]前言示例一需求:定义两个方法,一个方法向通道里面写数据,一个向通道里面读取数据。要求同步进行说明1、开启一个 fn1 的协程向通道 inChan 中写入 100 条数据 2、开启一个 fn2 的协程读取 inChan 中写入的数据 3、注意:fn1 和 fn2 同时操作一个通道 4、主线程必须等待操作完成后才可以退出代码import ( "fmt" "sync" "time" ) /** goroutine结合Channel使用的简单demo,定义两个方法,一个方法给通道里面写数据,一个给通道...
[TOC]前言一、概述 通道(Channel)是 Golang 在语言级别上提供的 goroutine 间的通讯方式,可以使用channel在多个 goroutine 之间传递消息。如果说 goroutine 是 Go 程序并发的执行体,channel 就是它们之间的连接。channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。 Golang 的并发模型是 CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。 Go 语...
[TOC]前言一、概述协程(Goroutines) 是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建 Goroutine 的成本很小。因此,Go 应用程序通常会同时运行数千个 Goroutine。协程的优势:与线程相比,Goroutines 非常小。它们的堆栈大小只有几 kb,堆栈可以根据应用程序的需要增长和缩小,而在线程的情况下,堆栈大小必须指定并固定。Goroutines 被多路复用到较少数量的 OS 线程。一个包含数千个 Goroutine 的程序中可能只有一个线程。如果该线程块中的任何 Goroutine 要等待用户输入,则创...
[TOC]前言Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。一、什么是GoroutineGoroutine = Golang + Coroutine。Goroutine是golang实现的协程,是用户级线程。Goroutine具有以下特点:相比线程,其启动的代价很小,以很小栈空间启动(2Kb左右)能够动态地伸缩栈的大小,最大可以支持到Gb级别工作在用户态,切换成很小与线程关系是n:m,即可以在n个系统线...
[TOC]前言一、概述1.1 动态类型语言和静态类型语言动态类型语言动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段,在运行期间才去做数据类型检查。主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。静态类型语言静态语言的数据类型是在编译期间(或运行之前)确定的,编写代码的时候要明确确定变量的数据类型。主要语言:C、C++、C#、Java、Object-C。1.2 GO语言类型Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分...
[TOC]前言作为go中的两个内置函数,主要用来创建和分配内存,创建内存时的规则如下:new只能用来分配内存;make只能用于slice、map以及channel等引用类型的初始化。一、引用类型和值类型在讲new和make的使用场景之前,先介绍一下golang中的值类型和引用类型。值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。 (struct在...
[TOC]前言go语言并没有面向对象的相关概念,go语言提到的接口和java、c++等语言提到的接口不同,它不会显示的说明实现了接口,没有继承、子类、implements关键词。一、概述在 Go 语言中接口包含两种含义:它既是方法的集合, 同时还是一种类型。在Go 语言中是隐式实现的,意思就是对于一个具体的类型,不需要声明它实现了哪些接口,只需要提供接口所必需的方法。go语言通过隐性的方式实现了接口功能,相对比较灵活。Go语言接口的特点:interface 是方法或行为声明的集合interface接口方式实现比较隐性,任何类型的对象实现interface所包含的全部方法,则表明该类型实现...
[TOC]前言在前面的章节中介绍过了Golang中的方法和函数,但是如果不进行比较,对于两者的认识还是很容易产生混淆。一、概述Go语言支持方法。Go方法与Go函数相似,但有一点不同,方法就是一个包含了接收者参数的函数。在接收者参数的帮助下,该方法可以访问接收者的属性。接收方可以是结构类型或非结构类型。在代码中创建方法时,接收者和接收者类型必须出现在同一个包中。而且不允许创建一个方法,其中的接收者类型已经在另一个包中定义,包括像int、string等内建类型。如果您尝试这样做,那么编译器将抛出错误。语法func(reciver_name Type) method_name(paramete...
[TOC]前言一、概述流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。流程控制语句有三个作用:选择:根据条件跳转到不同的执行序列;循环:根据条件反复执行某个序列;跳转:据条件返回到某执行序列。流程控制语句类型Go语言支持如下的几种流程控制语句:条件语句:关键字为if、else和else if。选择语句:关键字为switch、case和select。循环语句:关键字为for和range。跳转语句:关键字为goto。在具体的应用场景中,为了满足更丰富的控制需求,Go语言还添加了如下关键字: break 、 continue 和 fallthroug...
[TOC]前言一、概述大多数语言都有“依赖”、“包”等概念,Go语言的依赖处理经历了几次变革。最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面从v1.5开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等从v1.11开始,引入了Go Module 作为依赖解决方案,到v1.14宣布Go Module已经可以用于生产环境,到v1.16版本开始Go Module默认开启。二、GO PATH介绍首先从 Golang 的环境配置说起,安装好之后,通过命令行来看下当前 Golang 的环境配置。go env有两个...