随笔分类 - Go学习
摘要:3.24 Go之反射规则 静态类型语言 package mainimport "fmt"/*探讨Go的规则 */func main() { // 声明一个类型 type MyInt int // 声明一个int类型变量和一个MyInt类型变量 var a int var b MyInt //
阅读全文
摘要:3.23 Go之反射 什么是反射 反射是指在程序编译期将变量的信息整合到可执行文件中,给程序提供接口访问反射信息.可以在程序运行期获取类型的反射信息,并且有能力修改它们 反射流行时间: 在java出现之后流行起来 反射的缺点 反射功能强大但是代码可读性不理想 需要反射的原因 程序在编译时,变量被转换
阅读全文
摘要:3.22 Go之CSP:通信顺序进程 Go的并发模型 多线程共享内存 >java或c++等语言中的多线程开发 CSP(Communicating sequential processes) >两个独立并发实体通过channel进行通信的并发模型 值得注意的是: Go并没有完全实现CSP仅仅只是实现了
阅读全文
摘要:3.22 Go之聊天服务器 项目结构 服务端 一个主goroutine-->监听端口,每一个链接创建一个新的handleConn的goroutine 一个广播(broadcaster)goroutine >使用select对消息进行响应 一个(handleConn)goroutine >用户连接处理
阅读全文
摘要:3.21 Go之锁(二) 锁的种类 互斥锁(sync.Mutex) 读写互斥锁(sync.RWMutex) Go提供的函数 go的sync包下提供了两种类型: sync.Mutex sync.RWMutex Mutex Mutex的概念 最简单的锁定 特点: 当一个goroutine获得Mutex后
阅读全文
摘要:3.22 Go之等待组 等待组的作用 进行多个任务的同步,保证在并发环境中完成指定数量的任务 等待组的结构特点以及可使用的函数 等待组属于sync.WaitGroup类型.每个等待组内部维护一个技术,该计数初始默认值为零 等待组的函数: 方法名功能 (wg * WaitGroup) Add(delt
阅读全文
摘要:3.21 Go之锁(一) 锁的几种描述 死锁 活锁 饥饿锁 锁的种类 互斥锁 读写互斥锁 读写锁 读锁 写锁 死锁 死锁的概念 两个或者两个以上的进程(或线程),因争夺资源而互相等待. 特点: 这些进程(或线程)都无法推进下去. 此时系统处于死锁的状态或者系统产生了死锁. 这些进程(或线程)称为死锁
阅读全文
摘要:3.21 Go之多核并行化 并发和并行的概念 首先了解什么是并发什么是并行 Go当中实现多核多线程并发 注意: 注意区分什么是goroutine在并发和并行章节已经提到了. 获取当前操作系统CPU的核心数: 示例代码: package mainimport ( "fmt" "runtime")/
阅读全文
摘要:3.12 Go之并发打印(借助通道实现) 使用无缓冲通道实现并发打印数字 示例代码: package mainimport "fmt"/*Go之并发打印结果 *//* 定义一个打印函数 */func printer(c chan int) { // 无限循环等待数据 for { // 从chan
阅读全文
摘要:3.12 Go之通道关闭后继续使用 概念 通道是一个引用,会被垃圾回收机制回收,也可以主动关闭 关闭通道的函数 函数: close() 被关闭的通道的特点: 被关闭的通道不会被置为nil 给被关闭的通道发送数据会触发panic 向已关闭的通道发送数据会发生阻塞 package mainimport
阅读全文
摘要:3.11 Go之RPC(模拟远程调用过程) 什么是RPC框架? RPC是指Remote Procedure Call远程过程调用 作用: 简化进程间通信的过程 RPC的作用 装通信过程,让远程的数据收发通信过程看起来就像本地的函数调用一样。 Go之RPC示例 特点: 使用channel代替Socke
阅读全文
摘要:3.11 Go之使用通道响应计时器事件 通道响应计时器应用场景 由于go中的goroutine的设计,定时任务可以再goroutine中通过同步的方式进行也可以通过异步回调完成 同步进行 异步回调 延迟回调 使用time包下的time.AfterFunc函数提供了该条件。传入一个时间再传入一个函数那
阅读全文
摘要:3.10 Go之缓冲通道 缓冲通道种类 无缓冲通道 带缓冲通道 什么是无缓冲(Unbuffered Channel)通道? 指在接收前没有能力保存任何值的通道 >一进一出(只能进一个值) 特点: 要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作 理解: 可以理解为
阅读全文
摘要:3.11 Go之通道多路复用 >同时处理接收和发送多个通道的数据 什么是通道多路复用? 同时处理接收和发送多个通道的数据 表示在一个信道上传输多路信号或数据流的过程和技术 举例: 电话是一个典型的多路复用设备,在一条线路上可以同时接收或发送数据 多通道操作的两个处理办法 使用for循环进行通道处理遍
阅读全文
摘要:3.9 Go之单向通道 什么是单向通道 channel本身支持读写操作,单向通道顾名思义是指一个通道只能读或者只能写 注意: 如果一个通道只能读或者只能写将毫无意义。所以单向channel的概念只是对channel的一种使用限制 单向通道的声明格式 关键点: <指向哪儿数据往哪儿流 var 通道实例
阅读全文
摘要:3.10 Go之channel超时机制 什么是超时? 所谓的超时可以理解为token过期,需要重新操作 Go中的channel超时机制 为了防止channel被其他goroutine竞争,所以需要设置一个超时处理器 处理办法: 使用select来处理超时 Go中select的使用方法以及和switc
阅读全文
摘要:3.8 Go之通道(chan) 什么是通道? goroutine的通信管道 如何李姐通道 首先不要混淆goroutine和channel之间的关系 goroutine是并发的结构体 channel是每个结构体通信的桥梁 channel的特点: channel是一个通信机制,每个channel都有一个
阅读全文
摘要:3.8 Go之并发和并行 并发和并行 并发(concurrency) 并发是指: 把任务在不同时间点交给处理器进行处理。同一时间点,任务并不会同时运行。 核心概念: 同时管理很多事情 并行的关键: 事情可能只做了一半就被暂停去做别的事情了 并行(parallelism) 并行是指: 把每一个任务分配
阅读全文
摘要:3.2 Go之语言竞争状态 什么是竞争状态? 两个或者多个goroutine在没有相互同步的情况下,访问某个共享的资源,如同时对该资源进行读写时就会处于相互竞争的状态。这就是并发中的资源竞争。 资源竞争示例 package mainimport ( "fmt" "runtime" "sync")
阅读全文
摘要:3.2 Go之语言并发通信 并发编程的难点 并发编程的难度在于协调,协调就需要交流,并发单元间的通信是最大的问题 常见的并发通信模型 共享数据 消息 共享数据 概念: 多个并发单元分别保存对同一个数据的引用,实现对该数据的共享。实际工程中主要是指共享内存。 C语言共享内存示例: /* 头文件宏引入
阅读全文