27.Golang之反射三定律

[TOC]前言一、概述一个接口变量,实际上都是由一 pair 对(type 和 data)组合而成,pair 对中记录着实际变量的值和类型。也就是说在真实世界(反射前环境)里,type 和 value 是合并在一起组成接口变量的。而在反射的世界(反射后的环境)里,type 和 data 却是分开的,他们分别由 reflect.Type 和 reflect.Value 来表现。二、反射第一定律反射可以将“接口类型变量”转换为“反射类型对象”。注:这里反射类型指 reflect.Type 和 reflect.Value。通过之前我们讲过的 reflect.TypeOf() 方法和 refle...

GO 2022-07-22 AM 685℃ 0条

26.Golang之反射介绍

[TOC]前言反射(reflection)是在 Java 出现后迅速流行起来的一种概念,通过反射可以获取丰富的类型信息,并可以利用这些类型信息做非常灵活的工作。一、概述反射:是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。使用反射注意...

GO 2022-07-22 AM 677℃ 0条

25.Golang并发安全和锁

[TOC]前言一、概述有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。这就好比现实生活中十字路口被各个方向的汽车竞争,还有火车上的卫生间被车厢里的人竞争。数据竞争的示例import ( "fmt" "sync" ) var ( x int64 sw sync.WaitGroup // 等待组 ) // add 对全局变量x执行5000次加1操作 func add() { for i := 0; i < 5000; i++ { ...

GO 2022-07-15 PM 985℃ 0条

24.Golang之select

[TOC]前言一、概述select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,select 会随机执行一个可运行的 case。如果没有 case 可运行,goroutine 将阻塞,直到有 case 可运行。二、基本语法语法//select基本用法 select { case <- chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2 <- 1: // 如果成功向chan2写入数据,则进行该ca...

GO 2022-07-14 PM 782℃ 0条

23.Golang之Channel示例

[TOC]前言示例一需求:定义两个方法,一个方法向通道里面写数据,一个向通道里面读取数据。要求同步进行说明1、开启一个 fn1 的协程向通道 inChan 中写入 100 条数据 2、开启一个 fn2 的协程读取 inChan 中写入的数据 3、注意:fn1 和 fn2 同时操作一个通道 4、主线程必须等待操作完成后才可以退出代码import ( "fmt" "sync" "time" ) /** goroutine结合Channel使用的简单demo,定义两个方法,一个方法给通道里面写数据,一个给通道...

GO 2022-07-14 PM 706℃ 0条

22.Golang之Channel

[TOC]前言一、概述​ 通道(Channel)是 Golang 在语言级别上提供的 goroutine 间的通讯方式,可以使用channel在多个 goroutine 之间传递消息。如果说 goroutine 是 Go 程序并发的执行体,channel 就是它们之间的连接。channel 是可以让一个 goroutine 发送特定值到另一个 goroutine 的通信机制。​ Golang 的并发模型是 CSP(Communicating Sequential Processes),提倡通过通信共享内存而不是通过共享内存而实现通信。​ Go 语...

GO 2022-07-13 PM 717℃ 0条

21.Golang协程介绍

[TOC]前言一、概述协程(Goroutines) 是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建 Goroutine 的成本很小。因此,Go 应用程序通常会同时运行数千个 Goroutine。协程的优势:与线程相比,Goroutines 非常小。它们的堆栈大小只有几 kb,堆栈可以根据应用程序的需要增长和缩小,而在线程的情况下,堆栈大小必须指定并固定。Goroutines 被多路复用到较少数量的 OS 线程。一个包含数千个 Goroutine 的程序中可能只有一个线程。如果该线程块中的任何 Goroutine 要等待用户输入,则创...

GO 2022-07-12 PM 869℃ 0条

【转载】20.Golang之GMP模型

[TOC]前言Golang的一大特色就是Goroutine。Goroutine是Golang支持高并发的重要保障。Golang可以创建成千上万个Goroutine来处理任务,将这些Goroutine分配、负载、调度到处理器上采用的是G-M-P模型。一、什么是GoroutineGoroutine = Golang + Coroutine。Goroutine是golang实现的协程,是用户级线程。Goroutine具有以下特点:相比线程,其启动的代价很小,以很小栈空间启动(2Kb左右)能够动态地伸缩栈的大小,最大可以支持到Gb级别工作在用户态,切换成很小与线程关系是n:m,即可以在n个系统线...

GO 2022-07-12 PM 805℃ 0条

19.Golang静态类型与动态类型

[TOC]前言一、概述1.1 动态类型语言和静态类型语言动态类型语言动态类型语言的数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段,在运行期间才去做数据类型检查。主要语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。静态类型语言静态语言的数据类型是在编译期间(或运行之前)确定的,编写代码的时候要明确确定变量的数据类型。主要语言:C、C++、C#、Java、Object-C。1.2 GO语言类型Go 语言是一种静态类型的编程语言,所以在编译器进行编译的时候,就要知道每个值的类型,这样编译器就知道要为这个值分配多少内存,并且知道这段分...

GO 2022-07-11 PM 1341℃ 0条

18.Golang之make和new区别

[TOC]前言作为go中的两个内置函数,主要用来创建和分配内存,创建内存时的规则如下:new只能用来分配内存;make只能用于slice、map以及channel等引用类型的初始化。一、引用类型和值类型在讲new和make的使用场景之前,先介绍一下golang中的值类型和引用类型。值类型:int、float、bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中。当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝。可以通过 &i 获取变量 i 的内存地址。 (struct在...

GO 2022-07-07 PM 914℃ 0条