30.Golang之错误和异常处理

[TOC]前言Go语言没有类似 Java 或 .NET 中的异常处理机制,虽然可以使用 defer、panic、recover 模拟,但官方并不主张这样做,Go语言的设计者认为其他语言的异常机制已被过度使用,上层逻辑需要为函数发生的异常付出太多的资源,同时,如果函数使用者觉得错误处理很麻烦而忽略错误,那么程序将在不可预知的时刻崩溃。Go语言希望开发者将错误处理视为正常开发必须实现的环节,正确地处理每一个可能发生错误的函数,同时,Go语言使用返回值返回错误的机制,也能大幅降低编译器、运行时处理错误的复杂度,让开发者真正地掌握错误的处理。一、错误和异常错误指的是可能出现问题的地方出现了问题。...

GO 2022-07-25 PM 71℃ 0条

29.Golang写入文件

[TOC]前言一、写入文件操作1.1 os.OpenFile()函数语法func OpenFile(name string, flag int, perm uint32) (file *File, err Error)参数name:要文件路径+文件名;flag:打开文件的模式,只读、读写等;perm:文件权限,一个八进制数。r(读)04,W(写)02,x(执行)01。os.OpenFile()函数能够以指定模式打开文件,从而实现文件写入相关功能。模式flag种类模式含义os.O_WRONLY只写os.O_CREATE如果不存在文件,创建文件os.O_RDONLY只读os.O_RDWR可读...

GO 2022-07-24 PM 82℃ 0条

28.Golang读取文件

[TOC]前言一、概念文件是数据源(保存数据的地方)的一种,文件最主要的作用就是保存数据。文件在程序中是以流的形式来操作的。输入流和输出流流:数据在数据源(文件)和程序(内存)之间经历的路径输入流:数据从数据源(文件)到程序(内存)的路径输出流:数据从程序(内存)到数据源(文件)的路径二、读取文件操作2.1 打开和关闭文件打开文件func Open(filename string) (file *File, err error)Open打开一个文件用于读取。如果操作成功,返回的文件对象的方法可用于读取数据;对应的文件描述符具有O_RDONLY模式。如果出错,错误底层类型是*PathErr...

GO 2022-07-24 PM 69℃ 0条

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 71℃ 0条

26.Golang之反射介绍

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

GO 2022-07-22 AM 75℃ 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 94℃ 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 93℃ 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 83℃ 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 86℃ 0条

21.Golang协程介绍

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

GO 2022-07-12 PM 76℃ 0条