golang panic及处理机制
一 panic机制 panic会将这个异常不断向上抛出,直到有地方处理它,如果有处理,则不会再向上抛出。倘若没有处理,那么最终会导致main挂掉. golang虽然没有try catch机制,却有一种类似的recover机制,后续demo我们可以观测到它的用法和作用 二 实例 2.1 main用recover func main() { defer func() { if err := recover(); err != nil {...
一 panic机制 panic会将这个异常不断向上抛出,直到有地方处理它,如果有处理,则不会再向上抛出。倘若没有处理,那么最终会导致main挂掉. golang虽然没有try catch机制,却有一种类似的recover机制,后续demo我们可以观测到它的用法和作用 二 实例 2.1 main用recover func main() { defer func() { if err := recover(); err != nil {...
互斥锁简单粗暴,谁拿到谁操作。今天给大家介绍一下读写锁,读写锁比互斥锁略微复杂一些,不过我相信我们今天能够把他拿下! golang读写锁,其特征在于 读锁:可以同时进行多个协程读操作,不允许写操作 写锁:只允许同时有一个协程进行写操作,不允许其他写操作和读操作 读写锁有两种模式。没错!一种是读模式,一种是写模式。当他为写模式的话,作用和互斥锁差不多,只允许有一个协程抢到这把锁,其他协程乖乖排队。但是读模式就不一样了,他允许你多个协程读,但是不能写。总结起来就是: 仅读模式: 多协程可读不...
与其他主流语言如 Javascript、Java 和 Python 相比,Golang 的错误处理方式可能和这些你熟悉的语言有所不同。所以才有了这个想法根大家聊一聊 golang 的错误处理方式,以及实际开发中应该如何对错误进行处理。因为分享面对 Golang有一个基本的了解 developers, 所以一些简单地方就不做赘述了。 如何定义错误 在 golang 语言中,无论是在类型检查还是编译过程中,都是将错误看做值来对待,和 string 或者 integer 这些类型值并不差别。声明一个 string...
死锁 死锁的4个条件 不可剥夺 线程已经获得的资源,在未使用完之前,不能被其他线程剥夺,只能在使用完后自己释放。 请求保持 线程 T1 保持了一个资源 R1 占用,但是又提出另外一个资源 R2 请求,此时,资源 R2 被线程 T2 占用,于是 T1 线程必须等待,但又对自己保持的 R1 资源不释放。 循环等待 死锁发生时,必然存在一个 “进程-资源环形链”,例如 进程p0 等待 p1 占用资源,p1 等待 p2 占用的资源, p2 等待 p0 占用的资源,形成了一个环形...
强类型语言有它的优势,但也有不便利的地方,最典型的就是类型转换。Golang 作为一门强类型语言,而且不支持隐式类型转换,因此这个问题更突出。虽然 Go 提供了不少方式进行类型转换,包括相关的标准库,比如 strconv 包。 然而,strconv 包使用没那么方便,比如 "8" 转为 int 类型: s := "8" i, err := strconv.Atoi(s) 你必须对 err 进行处理,因为返回两个值,没法直接将结果传递给接收 int 参数的函数,使用不方便。 今天给大家介绍一个第三方库,...
前言 先来看一道面试题: 对已经关闭的 chan 进行读写,会怎么样?为什么? 在上一篇学习 Go 协程的文章中,知道 go 关键字可以用来开启一个 goroutine 进行任务处理,但多个任务之间如果需要通信,就需要用到通道(channel)了。 一、Channel的定义 声明并初始化一个通道,可以使用 Go 语言的内建函数 make,同时指定该通道类型的元素类型,下面声明了一个 chan int 类型的 channel: ch := make(chan int) 二、Chann...
Switch简介 Go的switch的基本功能和C、Java类似: switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。 匹配项后面也不需要再加 break。 特点: switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case 重点介绍Go当中的Switch的两个特别点:** 表达式判断为true还需要执行后面的 case,可以使用 fallthrough type-switch...
说明 在golang中,时间转换都会通过Time类型做一系列转换。主要包含,时间戳和时间字符串,时间字符串转换成另外的格式。总之所有的转换都是通过Time类型做中间转换。参考文档:https://golang.org/pkg/time/ 操作 1,获取当前时间 t1 := time.Now() // 返回的是时间Time类型 fmt.Println(t1, reflect.TypeOf(t1)) 2,获取指定时间 t4 := ti...
1. 需求 要求统计1-200000的数字中,哪些是素数?这个问题在本章开篇就提出来了,可以使用goroutine和channel来完成 2.分析思路 传统的方法,就是使用一个循环,循环的判断各个数是不是素数【ok】 使用并发/并行的方式,将统计素数的任务分配给多个(x个)goroutine去完成,完成任务时间短 分析思路图: 代码实现: package main import ( "fmt" "time" ) // 需求: // 要求统计1-200000的数字...
一、需求 实现二级缓存 程序运行起来后提示:“请输入命令:”,如果输入getall,查询并显示所有人员的信息 第一次时查询mysql并将结果缓存在redis,设置60秒的过期时间 以后的每次查询,如果redis有数据就从redis加载,没有则重复上一步的操作 二、实现连接Mysql并执行查询语句 先实现需求二,当输入命令getall时,查询并显示所有人员的信息。 package main import ( "fmt" _"github.com/go-...
哈希算法 md5 128bit,16字节 如:md5 (“hello world!”) = fc3ff98e8c6a0d3087d515c0473f8677 // 32位16进制数字 func Test(t *testing.T) { //方法一 str := "hello world!" has := md5.Sum([]byte(str)) md5str1 := fmt.Sprintf("%x", has) //将[]byte转成16进制 t.Log(md...
本文主要针对Golang的内置库 net/http 做了简单的扩展,通过添加中间件的形式实现了管道(Pipeline)模式,这样的好处是各模块之间是低耦合的,符合单一职责原则,可以很灵活的通过中间件的形式添加一些功能到管道中,一次请求和响应在管道中的执行过程如下 首先, 我定义了三个测试的中间件 Middleware1,2,3 如下 func Middleware1(next http.Handler) http.Handler { return http.HandlerFunc(func(...
Go 协程超时控制 Select 阻塞方式 Context 方式 先说个场景: 假设业务中 A 服务需要调用 服务B,要求设置 5s 超时,那么如何优雅实现? Select 超时控制 考虑是否可以用 select + time.After 方式进行实现 这里主要利用的是通道在携程之间通信的特点,当程序调用成功后,会向通道中发送信号。没调用成功前,通道会阻塞。 select { case res := <-c2: fmt.Println(res) case <...
算数运算符 算数运算符和C语言几乎一样 运算符 描述 实例 + 相加 A + B - 相减 A - B * 相乘 A * B / 相除 B / A % 求余 B % A ++ 自增 A++...
普通指针 和C语言一样, 允许用一个变量来存放其它变量的地址, 这种专门用于存储其它变量地址的变量, 我们称之为指针变量 和C语言一样, Go语言中的指针无论是什么类型占用内存都一样(32位4个字节, 64位8个字节) package main import ( "fmt" "unsafe" ) func main() { var p1 *int; var p2 *float64; var p3 *bool; fmt.Println(unsafe.Si...