golang
文章平均质量分 74
Arlingtonroad
这个作者很懒,什么都没留下…
展开
-
golang中的信号捕捉与处理,及常见信号含义
golang 中的signal 包的Notify函数函数声明为func Notify(c chan<- os.Signal, sig ...os.Signal)官方描述:Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。signal包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,signal包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道,缓存为.原创 2021-03-31 20:17:28 · 1371 阅读 · 0 评论 -
理解Golang包导入机制
Golang使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java 、python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得“先进”了许多。 Golang中包的定义和使用看起来十分简单: 通过package关键字定义包: package xxx 使用import关键字,导入要使用的标准库包或第三方依赖包。 import "a/b/c" i...转载 2020-07-22 17:39:04 · 320 阅读 · 1 评论 -
Golang 垃圾回收机制详解
摘要在实际使用 go 语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究。本文对研究的结果进行一下总结。什么是垃圾回收?曾几何时,内存管理是程序员开发应用的一大难题。传统的系统级编程语言(主要指C/C++)中,程序员必须对内存小心的进行管理操作,控制内存的申请及释放。稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰开发者的噩梦。如何解决这个头疼的问题呢?过去一般采用两种办法:内存泄露检测工具。这种工具的原理一般是静态代码扫转载 2020-07-05 18:56:55 · 560 阅读 · 1 评论 -
Golang中的并发控制与通信详解
开发go程序的时候,时常需要使用goroutine并发处理任务,有时候这些goroutine是相互独立的,而有的时候,多个goroutine之间常常是需要同步与通信的。那么Golang中控制并发的方法,主要有哪几类呢?大致可以分为三类:全局共享变量 channel context1. 全局共享变量应用场景 主goroutine中通知子goroutine停止运行 代码比较简单,直接上代码package mainimport ( "fmt" "time")...原创 2020-06-25 19:37:07 · 500 阅读 · 0 评论 -
Golang中利用channel和select实现计算目录大小
package mainimport ( "flag" "fmt" "io/ioutil" "os" "path/filepath" "sync" "time")var ( dir *string = flag.String("p", "/Users/xiaoshan02/gopath", "input directory") routineCount *int = flag.Int("c", 10, "concurrency of program") verbose *bo.原创 2020-06-25 17:59:36 · 416 阅读 · 0 评论 -
goroutine调度详解,以及进程、线程、协程区别
1. 进程 通俗点讲,程序(比如你写的爬虫程序,http服务器等)运行起来就是进程。 每个进程都有自己的独立内存空间,拥有自己独立的地址空间、独立的堆和栈,既不共享堆,亦不共享栈。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。 操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。进程的状态转移图进程间的通信方式 管道(Pip...原创 2020-06-24 23:17:37 · 747 阅读 · 0 评论 -
Golang中的传值和传引用详解
1. 基础类型byte,int,bool,string,float,数组等均是传值。2. structstruct作为函数中的参数,其传递可以是传值(对象的复制,需要开辟新的空间来存储该新对象)和传引用(指针的复制,和原来的指针指向同一个对象) 建议使用指针,原因有两个:能够改变参数的值,避免大对象的复制操作节省内存。3. 函数函数作为参数,其本质是传函数指针,为传引用4. slice结论:作为函数参数时,为传引用。 数组切片的本质是一个如下的数据结构包含一个pointer,原创 2020-06-24 01:24:07 · 1139 阅读 · 0 评论 -
golang中new和make的区别详解
但凡我们比较两个函数的区别,都是从三个方面进行比较:函数参数,返回值及适用范围。1. new函数原型 func new(Type) *Type 函数参数 任意类型,包括我们自定义的类型 返回值 返回指向新分配类型零值的指针,因为对于不同的数据类型,零值的意义是完全不一样的。比如,对于bool类型,零值为false;int的零值为0;string的零值是空字符串 适用范围 可用于分配指向任意类型的指针。 2. make函数原型 func make(t...原创 2020-06-23 23:26:45 · 308 阅读 · 0 评论 -
Golang之如何(优雅的)比较两个未知结构的json
假设,现在有两个简单的json文件。{ "id":1, "name":"testjson01", "isadmin":true}{ "isadmin":true, "name":"testjson01", "id":1 } 那么,如何比较这两个json的内容是否相同呢? 首先,最基本的方法就是利用golang的反射提供的DeepEqual() 假设我们有一个读取json...原创 2020-05-11 01:52:14 · 1504 阅读 · 0 评论 -
Golang中的struct比较
1. 可排序、可比较和不可比较可排序的数据类型有三种 整型Integer 浮点型Floating-point 字符串String 可比较的数据类型除了上述三种外,还有Boolean,Complex,Pointer,Channel,Interface和Array 不可比较的数据类型包括,Slice, Map, 和Function2.同一个struct的2个实例比较包含不可比较的成员变量(map,slice,func等) ==操作符可以比较指针,不能直接比较实例; 不包含不.原创 2020-05-11 01:39:54 · 3117 阅读 · 0 评论 -
Golang中读写锁和互斥锁 源码详解
1. 前言 Golang中有两种类型的锁,Mutex (互斥锁)和RWMutex(读写锁)对于这两种锁的使用这里就不多说了,本文主要侧重于从源码的角度分析这两种锁的具体实现。2. 引子问题 我一般喜欢带着问题去看源码。那么对于读写锁,你是否有这样的问题,为什么可以有多个读锁?有没有可能出现有协程一直无法 获取到写锁的情况?带着你的疑问来往下看看,具体这个锁是如何实现的。 如果你自己想看,我给出阅读的一个思路,可以先看读写锁,因为读写锁的实现依赖于互...原创 2020-05-11 00:07:47 · 603 阅读 · 0 评论 -
golang之读写锁,互斥锁的理解
golang sync包里提供了 Locker接口、互斥锁 Mutex、读写锁 RWMutex用于处理并发过程中可能出现同时两个或多个协程(或线程)读或写同一个变量的情况。一、为什么需要锁 在并发的情况下,多个线程或协程同时去修改一个变量。使用锁能保证在某一时间点内,只有一个协程或线程修改这一变量,具体我们可以看示例。先看不加锁的程序(会出现多个程序同时读该变量):package mainimport ( "fmt" "time")func ...原创 2020-05-10 23:27:05 · 277 阅读 · 0 评论 -
golang中的recover和panic
本教程讨论的内容如下:什么是 panic? 什么时候应该使用 panic? panic 示例 发生 panic 时的 defer recover panic,recover 和 Go 协程 运行时 panic 恢复后获得堆栈跟踪1.什么是 panic 在 Go 语言中,程序中一般是使用错误来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。 但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用panic来终止程序。当函数发生 pani...原创 2020-05-09 01:07:37 · 356 阅读 · 0 评论 -
defer详解--结合实例
1. defer的用途及执行defer语句中的函数会在return语句更新返回值变量后再执行 又因为在函数中定义的匿名函数可以访问该函数包括返回值变量在内的所有变量,所以,对匿名函数采用defer机制,可以使其观察函数的返回值。2. 两个简单实例2.1 示例1func main() { fmt.Println("in main func:", foo())}func foo() int { i := 0 defer fmt.Println("in defer原创 2020-05-09 00:49:35 · 451 阅读 · 0 评论 -
golang net/http的server源码浅析
不错的参考资料 https://blog.csdn.net/weixin_42390791/article/details/89209787 https://blog.csdn.net/qq_24850089/article/details/52713701 https://blog.csdn.net/mengxinghuiku/article/details/65631583 ht...原创 2020-03-29 17:29:17 · 263 阅读 · 0 评论 -
go 依赖包 golang.org/x/net/html
问题 go get golang.org/x/net/html的时候遇到:package golang.org/x/net/html: unrecognized import path "golang.org/x/net/html",这是因为golang 的官网被墙了解决办法 我们可以从github上拿到这部分包,放入项目中。 git clo...原创 2020-03-07 23:45:05 · 2087 阅读 · 0 评论 -
golang goquery selector(选择器) 示例大全
最近研究Go爬虫相关的知识,使用到goquery这个库比较多,尤其是对爬取到的HTML进行选择和查找匹配的内容时,goquery的选择器使用尤其多,而且还有很多不常用但又很有用的选择器,这里总结下,以供参考。 如果大家以前做过前端开发,对jquery不会陌生,goquery类似jquery,它是jquery的go版本实现。使用它,可以很方便的对HTML进行处理。...转载 2020-03-07 22:55:02 · 354 阅读 · 0 评论 -
go开发工具
在Go语言中,我们很多操作都是通过go命令进行的,比如我们要执行go文件的编译,就需要使用go build命令,除了build命令之外,还有很多常用的命令,这一次我们就统一进行介绍,对常用命令有一个了解,这样我们就可以更容易的开发我们的Go程序了。1. Go 开发工具概览 go这个工具,别看名字短小,其实非常强大,是一个强大的开发工具,让我们打开终端,看看这个工具有哪...原创 2020-01-06 01:06:08 · 274 阅读 · 0 评论 -
Golang读写文件操作
1. 读文件1.1 使用ioutil直接读取 需要引入io/ioutil包,该包默认拥有以下函数供用户调用。 func NopCloser(r io.Reader) io.ReadCloser func ReadAll(r io.Reader) ([]byte, error) func ReadDir(dirname st...原创 2018-12-16 01:43:10 · 3020 阅读 · 0 评论 -
Golang reflect详解
1. 什么是反射 通俗来讲就是, go 语言中提供一种机制,可以在代码运行时获取变量的类型和值,这种机制就是反射。 反射是由 reflect 包提供支持. 它定义了两个重要的类型, Type 和 Value. 一个 Type 表示一个Go类型.函数 reflect.TypeOf 接受任意的 interface{} 类型, 并返回对应动态类型的reflect.T...原创 2019-01-19 20:44:03 · 3003 阅读 · 0 评论 -
golang中的引号(单引号,双引号,反引号)和几种相关特殊类型(rune,byte)
1. 引号go语言中不倾向使用单引号表示字符串,单引号用于表示Golang的一个特殊类型:rune,不做任何转义的原始内容,详见第二节的官方解释与示例分析。 双引号用来表示可解析的字符串字面量(支持转义,但不能用来引用多行) 反引号用来创建原生的字符串字面量(不支持任何转义序列,支持多行),原生的字符串字面量多用于书写多行消息、HTML以及正则表达式,详见如下示例代码。代码示例:pa...翻译 2019-08-04 13:22:48 · 1131 阅读 · 0 评论 -
golang 实现HTTP代理和反向代理
代理的核心功能可以用一句话概括:接受客户端的请求,转发到后端服务器,获得应答之后返回给客户端。下图是 《HTTP 权威指南》一书中给出的图例,可以很清晰地说明这一流程: 代理的功能有很多,事实上整个互联网到处都充斥着代理服务器。如果所有的 HTTP 访问都是客户端和服务器端直接进行的话,我们的网络不仅会变得缓慢,而且性能会大打折扣。 代理服务器根据不同的配置和使用,...转载 2019-07-27 20:25:11 · 296 阅读 · 0 评论 -
golang使用http client发起get和post请求
get请求get请求可以直接http.Get方法,非常简单。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 func httpGet() { resp, err := http.Get("http://www.01happy...原创 2019-07-27 20:45:21 · 588 阅读 · 0 评论 -
golang https 跳过证书检查
package mainimport ( "crypto/tls" "fmt" "io/ioutil" "net/http")func main() { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, ...原创 2019-07-27 21:04:19 · 1284 阅读 · 0 评论 -
GOROOT,GOPATH,GOBIN
GOROOTgo的安装目录(/usr/local/go)GOPATH GOPATH的值是包含一个目录(或多个目录)的路径,每个目录都代表Go的一个工作区(workspace)。一般情况下,为了分离自己与第三方的代码,我们会设置两个或更多的工作区。当有多个GOPATH时,默认会将go get的内容放在第一个目录下。 工作区用于放置Go语言的源码文件,以及安装(install)...原创 2019-08-13 20:06:58 · 296 阅读 · 0 评论 -
golang package strings学习笔记总结
package mainimport ( "fmt" "strings")func main() { // Contain(s,str string) bool, 查找子串是否在指定的字符串中 fmt.Println(strings.Contains("TigerwolfC", "wolf")) //true fmt.Println(strings...原创 2019-08-17 22:37:09 · 178 阅读 · 0 评论 -
golang 正则匹配语法及示例
字符串处理我们可以使用strings包来进行搜索(Contains、Index)、替换(Replace)和解析(Split、Join)等操作,但是这些都是简单的字符串操作,他们的搜索都是大小写敏感,而且固定的字符串,如果我们需要匹配可变的那种就没办法实现了,当然如果strings包能解决你的问题,那么就尽量使用它来解决。因为他们足够简单、而且性能和可读性都会比正则好。1. 语法...转载 2019-08-18 00:19:57 · 2264 阅读 · 0 评论 -
golang 正则匹配(更详细易懂 语法+示例)
1. Golang中的正则语法1.1 用法------------------------------ 单一: . 匹配任意一个字符,如果设置 s = true,则可以匹配换行符 [字符类] 匹配“字符类”中的一个字符,“字符类”见后面的说明 [^字符类] 匹...转载 2019-08-18 00:47:46 · 17588 阅读 · 2 评论 -
golang regexp包中函数的用法详解
------------------------------------------------------------func Match(pattern string, b []byte) (matched bool, err error)// 判断在 b 中能否找到正则表达式 pattern 所匹配的子串// pattern:要查找的正则表达式// b:要在其中进行查找的 []by...转载 2019-08-18 01:43:09 · 894 阅读 · 0 评论 -
Golang调用linux命令,并解析命令输出内容
Golang使用 os/exec 来执行 Linux 命令,分享出来供大家参考学习。1. 第一个示例(一次性读取命令所有输出内容)package mainimport ( "fmt" "io/ioutil" "os/exec")func main() { cmd := exec.Command("/bin/bash", "-c", `df ...原创 2019-08-27 00:36:18 · 3364 阅读 · 0 评论 -
golang信号捕捉与处理
notify方法原型: funcNotify(c chan<- os.Signal, sig ...os.Signal) 第一个参数表示接收信号的管道 第二个及后面的参数表示设置要监听的信号,如果不设置表示监听所有的信号。1. 捕捉信号的简单示例1.1 捕捉所有信号package mainimport ( "fmt...原创 2019-08-27 01:00:58 · 1566 阅读 · 0 评论 -
Golang中string(包括ip类的string)和int,int64的相互转化
1. 普通string, int32, int64的相互转换 string到int int, err := strconv.Atoi(string) string到int64 int64, err := strconv.ParseInt(string, 10, 64) int到string string := strconv....原创 2018-12-16 00:59:07 · 1426 阅读 · 0 评论