09 2021 档案
摘要:https://studygolang.com/articles/20704
阅读全文
摘要:新建Makefile文件 PROJECT_PATH=/root/shell hello: PROJECT_DIR=(PROJECT_PATH)/hello.sh world: bash /root/shell/world.sh hello.sh #!/bi
阅读全文
摘要:github地址:https://github.com/swaggo/gin-swagger 下载安装cmd/swag命令工具包 先下载cmd包,才能执行相关命令 go get -u github.com/swaggo/swag/cmd/swag 我开始没成功,后来进入$GOPATH/bin/ 目录
阅读全文
摘要:package main import ( "fmt" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" "github.com/tencentcloud/tencentcloud-sdk-go/tencentclou
阅读全文
摘要:https://cloud.tencent.com/document/product/866/46919 package main import ( "fmt" "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common" "gi
阅读全文
摘要:https://blog.csdn.net/zz001357/category_10813208.html
阅读全文
摘要:问题 1:条件变量的Wait方法做了什么? 在了解了条件变量的使用方式之后,你可能会有这么几个疑问。 为什么先要锁定条件变量基于的互斥锁,才能调用它的Wait方法? 为什么要用for语句来包裹调用其Wait方法的表达式,用if语句不行吗? 这些问题我在面试的时候也经常问。你需要对这个Wait方法的内
阅读全文
摘要:在上篇文章中,我们主要说的是互斥锁,今天我和你来聊一聊条件变量(conditional variable)。 前导内容:条件变量与互斥锁 我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 条件变量并不是被用来保护临界区和共享资源
阅读全文
摘要:你很棒,已经学完了本专栏最大的一个模块!这涉及了Go语言的所有内建数据类型,以及非常有特色的那些流程和语句。 你已经完全可以去独立编写各种各样的Go程序了。如果忘了什么,回到之前的文章再复习一下就好了。 在接下来的日子里,我将带你去学习在Go语言编程进阶的道路上,必须掌握的附加知识,比如:Go程序测
阅读全文
摘要:在上一篇文章中,我们主要讨论的是从使用者的角度看“怎样处理好错误值”。那么,接下来我们需要关注的,就是站在建造者的角度,去关心“怎样才能给予使用者恰当的错误值”的问题了。 知识扩展 问题:怎样根据实际情况给予恰当的错误值? 我们已经知道,构建错误值体系的基本方式有两种,即:创建立体的错误类型体系和创
阅读全文
摘要:提到Go语言中的错误处理,我们其实已经在前面接触过几次了。 比如,我们声明过error类型的变量err,也调用过errors包中的New函数。今天,我会用这篇文章为你梳理Go语言错误处理的相关知识,同时提出一些关键问题并与你一起探讨。 我们说过error类型其实是一个接口类型,也是一个Go语言的内建
阅读全文
摘要:我在前一篇文章提到过这样一个说法,panic之中可以包含一个值,用于简要解释引发此panic的原因。 如果一个panic是我们在无意间引发的,那么其中的值只能由Go语言运行时系统给定。但是,当我们使用panic函数有意地引发一个panic的时候,却可以自行指定其包含的值。我们今天的第一个问题就是针对
阅读全文
摘要:我在上两篇文章中,详细地讲述了Go语言中的错误处理,并从两个视角为你总结了错误类型、错误值的处理技巧和设计方式。 在本篇,我要给你展示Go语言的另外一种错误处理方式。不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常。 前导知识:运行时恐慌panic 这种程序异常被叫做p
阅读全文
摘要:https://blog.csdn.net/ailunlee/article/details/97831912 2 HTTP1.1和HTTP2.0的区别 2.1 多路复用 HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。HTTP
阅读全文
摘要:Go 没有像 Java 那样的异常机制,例如你无法像在 Java 中那样抛出一个异常。作为替代,它使用了恐慌和恢复(panic-and-recover)机制。一定要记得,这应当作为最后的手段被使用,你的代码中应当没有,或者很少的令人恐慌的东西。 panic 是一个内建函数,可以中断原有的控制流程,进
阅读全文
摘要:数组下标越界(运行时错误) package main import "fmt" func main() { var s []string fmt.Println(s) fmt.Println(s[0]) } 运行结果: [] panic: runtime error: index out of ra
阅读全文
摘要:golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全 可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在 堆上分配。 能引起变量逃逸到堆上的典型情况: 在方法内把局部变量指针返回 局部变量原本应该在栈中分配,在栈中回收。但是由 于返回时被
阅读全文
摘要:package main import "fmt" const ( a = iota b = iota ) const ( name = "menglu" c = iota d = iota ) func main() { fmt.Println(a) fmt.Println(b) fmt.Prin
阅读全文
摘要:package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup out := make(chan int) wg.Add(2) go func() { defer wg.Done() for i := 1; i <=
阅读全文
摘要:你好,我是鸟窝。 在前面的四节课中,我们学习了第一个同步原语,即Mutex,我们使用它来保证读写共享资源的安全性。不管是读还是写,我们都通过Mutex来保证只有一个goroutine访问共享资源,这在某些情况下有点“浪费”。比如说,在写少读多的情况下,即使一段时间内没有写操作,大量并发的读访问也不得
阅读全文
摘要:package main import ( "fmt" ) type People struct{} func (p *People) ShowA() { fmt.Println("showA") p.ShowB() } func (p *People) ShowB() { fmt.Println(
阅读全文
摘要:那么go语言的局部变量到底是在栈上还是堆上呢?go语言编译器会做逃逸分析(escape analysis),分析局部变量的作用域是否逃出函数的作用域,要是没有,那么就放在栈上;要是变量的作用域超出了函数的作用域,那么就自动放在堆上。所以不用担心会不会memory leak,因为go语言有强大的垃圾回
阅读全文
摘要:前面我们在学习Mutex、RWMutex等并发原语的实现时,你可以看到,最底层是通过atomic包中的一些原子操作来实现的。当时,为了让你的注意力集中在这些原语的功能实现上,我并没有展开介绍这些原子操作是干什么用的。 你可能会说,这些并发原语已经可以应对大多数的并发场景了,为啥还要学习原子操作呢?其
阅读全文
摘要:在这节课正式开始之前,我想先带你看一个工作中的场景。 假设有一天你进入办公室,突然同事们都围住你,然后大喊“小王小王你最帅”,此时你可能一头雾水,只能尴尬地笑笑。为啥呢?因为你缺少上下文的信息,不知道之前发生了什么。 但是,如果同事告诉你,由于你业绩突出,一天之内就把云服务化的主要架构写好了,因此被
阅读全文
摘要:线程是一种轻量级进程,是CPU调度的最小单位。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属于一个进程的其他线程共享进程所拥有的全部资源。线程拥有自
阅读全文
摘要:字节 1 go channel close后读的问题 2 Linux grep命令查找日志文件相关内容 3 B+树结构 and 为什么 4 io多路复用,epoll和select的区别 5 计网七层协议、线程进程区别 http://blog.chinaunix.net/uid-25984886-id
阅读全文
摘要:package main import ( "fmt" "github.com/garyburd/redigo/redis" ) var pool *redis.Pool func init() { pool = &redis.Pool{ Dial: func() (redis.Conn, erro
阅读全文
摘要:package main import ( "fmt" "time" ) type Cat struct { Name string } func main() { var ch chan interface{} ch = make(chan interface{},2) cat1 := Cat{N
阅读全文
摘要:package main import ( "fmt" "sync" ) var ( mp = make(map[int]uint64) wg sync.WaitGroup mux sync.Mutex ) func main() { for i := 1; i <= 20; i++ { wg.Ad
阅读全文
摘要:哈希表(Hash Table)这个数据结构,我们已经非常熟悉了。它实现的就是key-value之间的映射关系,主要提供的方法包括Add、Lookup、Delete等。因为这种数据结构是一个基础的数据结构,每个key都会有一个唯一的索引值,通过索引可以很快地找到对应的值,所以使用哈希表进行数据的插入和
阅读全文
摘要:你好,我是蒋德钧。 Redis官方在今年5月份正式推出了6.0版本,这个版本中有很多的新特性。所以,6.0刚刚推出,就受到了业界的广泛关注。 所以,在课程的最后,我特意安排了这节课,想来和你聊聊Redis 6.0中的几个关键新特性,分别是面向网络处理的多IO线程、客户端缓存、细粒度的权限控制,以及R
阅读全文
摘要:你好,我是蒋德钧。 在使用主从集群时,我曾遇到过这样一个问题:我们的主从集群有1个主库、5个从库和3个哨兵实例,在使用的过程中,我们发现客户端发送的一些数据丢失了,这直接影响到了业务层的数据可靠性。 通过一系列的问题排查,我们才知道,这其实是主从集群中的脑裂问题导致的。 所谓的脑裂,就是指在主从集群
阅读全文
摘要:你好,我是蒋德钧。 Redis的主从同步机制不仅可以让从库服务更多的读请求,分担主库的压力,而且还能在主库发生故障时,进行主从库切换,提供高可靠服务。 不过,在实际使用主从机制的时候,我们很容易踩到一些坑。这节课,我就向你介绍3个坑,分别是主从数据不一致、读到过期数据,以及配置项设置得不合理从而导致
阅读全文
摘要:内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。 为什么要有用户态和内核态? 由于需要限制不同的程序之间的访问能力, 防止他们获
阅读全文
摘要:一说起事务,你可能自然会联想到数据库。的确,我们日常使用事务的场景,绝大部分都是在操作数据库的时候。像MySQL、Oracle这些主流的关系型数据库,也都提供了完整的事务实现。那消息队列为什么也需要事务呢? 其实很多场景下,我们“发消息”这个过程,目的往往是通知另外一个系统或者模块去更新数据,消息队
阅读全文
摘要:这节课我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,你只有搞清楚它们,才能进行后续的学习。 如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Parti
阅读全文
摘要:消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。但是给消息队列下一个准确的定义却不太容易。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。 我们举个例子说明一下消息队列的作用。话说小袁是一家巧克力作坊的老板,生产出美味的巧
阅读全文
摘要:这节课我们来聊一下几个比较常见的开源的消息队列中间件。如果你正在做消息队列技术选型,不知道该选择哪款消息队列,你一定要先听一下这节课的内容。 作为一个程序员,相信你一定听过“没有银弹”这个说法,这里面的银弹是指能轻松杀死狼人、用白银做的子弹,什么意思呢?我对这句话的理解是说,在软件工程中,不存在像“
阅读全文
摘要:上一节课,我简单介绍了面向对象的一些基本概念和知识点,比如,什么是面向对象编程,什么是面向对象编程语言等等。其中,我们还提到,理解面向对象编程及面向对象编程语言的关键就是理解其四大特性:封装、抽象、继承、多态。不过,对于这四大特性,光知道它们的定义是不够的,我们还要知道每个特性存在的意义和目的,以及
阅读全文
摘要:考虑到各个水平层次的同学,并且保证专栏内容的系统性、全面性,我会循序渐进地讲解跟设计模式相关的所有内容。所以,专栏正文的第一个模块,我会讲一些设计原则、设计思想,比如,面向对象设计思想、经典设计原则以及重构相关的知识,为之后学习设计模式做铺垫。 在第一个模块中,我们又首先会讲到面向对象相关的理论知识
阅读全文
摘要:在上一节课中,我们讲到,要具备编写高质量代码的能力,你需要学习一些编程方法论,其中就包含面向对象(我们可以把它看成一种设计思想)、设计原则、设计模式、编程规范、重构技巧等。而我们整个专栏的内容也是围绕着这几块展开讲解的。所以,今天我就先来简单介绍一下这几个概念,并且说一说它们之间的联系。 今天的内容
阅读全文
摘要:前导内容:正确使用接口的基础知识 在Go语言的语境中,当我们在谈论“接口”的时候,一定指的是接口类型。因为接口类型与其他数据类型不同,它是没法被实例化的。 更具体地说,我们既不能通过调用new函数或make函数创建出一个接口类型的值,也无法用字面量来表示一个接口类型的值。 对于某一个接口类型来说,如
阅读全文
摘要:我们都知道,结构体类型表示的是实实在在的数据结构。一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型。 前导内容:结构体类型基础知识 当然了,结构体类型也可以不包含任何字段,这样并不是没有意义的,因为我们还可以为类型关联上一些方法,这里你可以把方法看做是函数的特殊版本。 函数是独
阅读全文
摘要:我们已经讨论过了通道的基本操作以及背后的规则。今天,我再来讲讲通道的高级玩法。 首先来说说单向通道。我们在说“通道”的时候指的都是双向通道,即:既可以发也可以收的通道。 所谓单向通道就是,只能发不能收,或者只能收不能发的通道。一个通道是双向的,还是单向的是由它的类型字面量体现的。 还记得我们在上篇文
阅读全文
摘要:作为Go语言最有特色的数据类型,通道(channel)完全可以与goroutine(也可称为go程)并驾齐驱,共同代表Go语言独有的并发编程模式和编程哲学。 Don’t communicate by sharing memory; share memory by communicating. (不要
阅读全文
摘要:package main import ( "fmt" "io/ioutil" "net/http" "os" "regexp" "strings" "time" ) var name ="AI技术内参" var path string = "/Users/mac/www/book/其他书籍/"+n
阅读全文
摘要:你好,我是鸟窝。 今天是我们Go并发编程实战课的第一讲,我们就直接从解决并发访问这个棘手问题入手。 说起并发访问问题,真是太常见了,比如多个goroutine并发更新同一个资源,像计数器;同时更新用户的账户信息;秒杀系统;往同一个buffer中并发写入数据等等。如果没有互斥控制,就会出现一些异常情况
阅读全文
摘要:目录: 一、继电器 二、术语“bug”的来源 三、真空管 四、晶体管 五、基础单元的发展路径 一、继电器 1937年最大的机电计算机之一是哈佛的马克一号,是IBM在1944年给二战同盟国建造的。该机器的大脑是由继电器(relay)构成的,存在大约3500个继电器。 继电器:用电控制的机械开关 控制线
阅读全文