![](https://img-blog.csdnimg.cn/20200815122325154.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Go
文章平均质量分 53
Go
、Edgar
Coding with fun
展开
-
使用 dlv 进行 debug
本文主要讲解如何使用 dlv 对 go 的产物进行 debug原创 2022-11-17 23:53:24 · 897 阅读 · 1 评论 -
动手写一个 HTTP 正向代理
概念首先我们来了解一下 HTTP 代理的相关概念,通常来说,有两类 HTTP 代理,一类是正向代理,一类是反向代理,虽都是代理,但仍有区别。我们平时使用的 VPN 就是正向代理,我们指定一个服务器,然后通过正向代理去连接这个服务器获取资源Nginx 是典型的反向代理服务器,可以用于负载均衡和缓存,我们不清楚服务器的地址,但是我们访问反向代理服务器的时候,它会自动为我们请求服务器,并且返回相应的内容。总结:正向代理下,我们知道服务器的具体地址,反向代理下,我们只需要知道代理服务的地址,无需知道具原创 2021-12-06 15:17:59 · 2772 阅读 · 0 评论 -
八大排序算法及其Go代码实现
1.选择排序原理每次选择数组中的最小元素,排在第一个位置算法步骤[38,65,97,76,13,27,49]13 [65 97 76 38 27 49]13 27 [97 76 38 65 49]13 27 38 [76 97 65 49]13 27 38 49 [97 65 76]13 27 38 49 65 [97 76]13 27 38 49 65 76 [97]13 27 38 49 65 76 97代码实现func SelectSort(data []int) { l原创 2021-11-29 18:00:14 · 412 阅读 · 0 评论 -
分布式 ID 生成器
背景假设我们有一个分布式系统,系统中需要维护全局 id 字段,我们可以把它认为是唯一的标识,不能够重复出现,那么问题来了,我们应该如何生成这样的 id 呢?其实很容易想到的一种解决方式就是使用 Redis 的键值对了,每次更新的时候直接调用 incr,生成的 id 也是唯一的,还有一种方式就是使用 MySQL 或者其他的数据库,因为我们知道 MySQL 中可以生成自增主键,使用这个主键作为一个分布式 id 也是可行的。但是上面的这两种方式效率不会特别高,并且依赖于第三方,我们如果想要更高效的生成分布式原创 2021-11-24 16:40:50 · 448 阅读 · 0 评论 -
一致性哈希算法原理及代码实现
一致性哈希安装go get -u github.com/junhaideng/consistent使用c := consistent.New()ips := []string{"192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4"}for _, ip := range ips { c.Add(ip)}fmt.Println("ip: ", c.Get("/hello.txt"))背景在介绍一致性哈希之前,首先来看原创 2021-11-10 21:43:17 · 1039 阅读 · 0 评论 -
NATS 基本使用
NATS 是一个开源的分布式消息队列系统,基于消息发布订阅机制。使用NATS我们的程序可以在不同的环境,不同的语言之间进行通信。客户端一般使用一个URL连接到NATS服务端,然后订阅消息或者发布消息。基于主题的消息机制NATS的消息基于subject,发送的消息和订阅的消息都有一个subject标记,简单来说,subject就是一串字符串,发布者和订阅者可以使用这些名称来查找对方NATS 服务端保留了几个特殊的字符,规范的subject只包括字母数字和.,并且区分大小写不能包含空格。主题层次原创 2021-07-13 10:21:22 · 9517 阅读 · 0 评论 -
爬取51Job数据
爬取前程无忧上的招聘岗位,项目地址:GitHub使用方式go get github.com/junhaideng/51job// 创建一个新的Job,指定log,数据保存地方以及关键字j := job.NewJob(zap.NewExample(), f, keyword)// 直接运行j.Run()效果数据列可以有很多,这里主要取了一部分job_name, job_href, company_name, company_href, salary, workarea, issuedat原创 2021-06-20 20:16:07 · 5329 阅读 · 0 评论 -
go get 指定commit 版本
今天使用go get命令下载包的时候,最开始因为自己上传到GitHub上的module名称有误,没有声明为github.com/xx/xx格式,后来修改之后重新push了一下,但是go get还是之前的commit的版本,这种情况下我们使用下面的命令即可// 这里以github.com为例,当然其他的仓库也是可以的go get github.com/xxx/xxx@commit-idcommit-id可以在本地查看,使用git log或者git reflog均可,也可以在网上仓库上查看,GitHub原创 2021-06-20 15:52:24 · 5357 阅读 · 1 评论 -
go 生成火焰图简单讲解
环境搭建进入 官网 安装好 graphviz使用方式首先,我们实现自己的逻辑代码,并且完成对应的基准测试代码编写,比如:func BenchmarkStrConcat(b *testing.B) { for i := 0; i < b.N; i++ { str := "" for i:=0; i < 128 ; i ++{ str += "Hi " } }}在运行测试代码的时候指定cpuprofile参数go test -bench . -cpuprofil原创 2021-06-18 09:59:34 · 1635 阅读 · 0 评论 -
全自动下载Leetcode题目
LeetCode 题目下载助手爬取所有的题目,保存在每一个文件夹下的README.md中,并且保存对应的代码模板源码见: GitHub运行之后会在对应的目录下写入题目描述和对应的代码模板leetcode/├── LCP 06 │ ├── README.md│ └── main.go ├── LCP 07 │ ├── README.md│ └── main.go ├── LCP 08 │ ├── README.md│原创 2021-06-05 22:44:11 · 976 阅读 · 0 评论 -
资源分配之最大最小公平分配算法
在实际生产过程中,我们经常面临给多个用户分配一组资源的场景,他们都有等价的权力来共享这一段资源,那么我们应该如何来分配资源呢?下面的最大最小公平分配算法是实际中广泛运用的一种算法最大最小公平分配算法的形式化定义如下:资源按照需求递增的顺序进行分配不存在用户得到的资源超过自己的需求未得到满足的用户等价的分享资源比如说有4个用户,分别需要[2,4,4,5]的资源量,总的资源只有12,那么首先进行第一次分配,平均分配12/4=3资源量,但是对于第一个用户来说分配的资源量大于需求,那么进行第二层分配的原创 2021-01-23 11:40:06 · 4648 阅读 · 1 评论 -
Go获取腾讯动漫今日份更新动漫并使用飞书进行消息通知
喜欢看动漫,但是不喜欢记每天啥啥动漫更新了(也不太记得????),所以写了个小程序进行通知获取最近更新我们只需要获取到下面的这些内容就好了右击进行元素检查,很容易可以找到最近更新所在的元素那么我们只需要获取到对应的元素即可,下面使用colly进行抓取,当然你也可以使用python等语言继续进行操作// 保存相关内容type Info struct { Index int Title string Info string Href string}func getUpdate原创 2021-01-15 13:34:16 · 426 阅读 · 0 评论 -
Go中对于时间戳的操作
Go time包中包含了一系列对于时间的操作,下面的代码演示了如何获取到Time类型对应的时间戳以及如何将时间戳转换成对应的Time类型package mainimport ( "fmt" "time")func main(){ // 解析时间 t, err := time.Parse("2006-01-02 15:04:05", "2021-01-13 14:04:05") if err != nil{ fmt.Println(err) return } // 输出时间原创 2021-01-13 14:15:36 · 614 阅读 · 0 评论 -
RSA算法的加解密过程及Go语言中RSA使用
RSA算法过程首先选择两个不相等的素数 p,qp, qp,q计算p,qp, qp,q的乘积n=pqn=pqn=pq,nnn即为密钥的长度计算n的欧拉函数φ(n)=(p−1)(q−1)\varphi(n)=(p-1)(q-1)φ(n)=(p−1)(q−1)随机选择一个整数eee使得1<e<φ(n),(e,φ(n))=11<e<\varphi(n), (e, \varphi(n))=11<e<φ(n),(e,φ(n))=1,即e,φ(n)e, \var原创 2021-01-12 12:07:12 · 532 阅读 · 0 评论 -
使用Go对文件进行tar打包和解包
使用tar进行归档package mainimport ( "archive/tar" "fmt" "io" "os" "path/filepath" "flag")var filename string var directory string func init(){ flag.StringVar(&filename, "f", "", "the tar filename") flag.StringVar(&directory, "dir", "", "原创 2021-01-12 09:31:35 · 1114 阅读 · 0 评论 -
使用Go自己动手搭建一个HTTP代理服务器
代理服务器的工作方式如下:客户端向代理服务器发送请求,表明自己需要请求的网站内容代理服务器接收到来自客户端的请求之后,通过解析,获取到需要访问的web服务代理服务器将客户端的请求信息全部转发给web服务器web服务器返回响应消息给代理服务器代理服务器将返回的消息转发给对应的客户端下面介绍一下如何使用golang搭建一个简单的HTTP代理服务器(不支持HTTPS)1. 首先,我们需要绑定一个端口监听客户端的请求,如果客户端发送请求,便进行相关处理func main() { // 端口原创 2021-01-07 09:58:39 · 2356 阅读 · 0 评论 -
golang http请求时设置代理ip
在http.Client中自定义Transport,设置Proxy即可,目前网上存在很多代理ip网站,本人也写过一些代理ip网址的爬取,见 GitHub// 如果需要代理验证,那么如下进行设置// 否则直接设置为url.Parse("http://inproxy.sjtu.edu.cn:8000")uri, err := url.Parse("http://username:password@inproxy.sjtu.edu.cn:8000")if err != nil{ log.Fatal("原创 2021-01-01 10:58:37 · 18361 阅读 · 0 评论 -
解决 pkg.go.dev 有时访问不了
在pkg.go.dev中查看文档的时候,有时候访问不了,但是有时候又可以正确访问,原因是这个网站对应多个服务器,有时候访问的时候解析DNS返回的ip地址无法访问,比如说对应的172.217.24.19地址无法ping通,但是216.58.200.51可以正确ping通我们可以在hosts文件中(windows 平台该文件在C:\Windows\System32\drivers\etc)进行修改,添加这样一行# pkg.go.dev216.58.200.51 pkg.go.dev然后刷新dns缓存原创 2021-01-01 10:07:29 · 1464 阅读 · 0 评论 -
golang multiple-value xxx in single-value context
使用下面的代码的时候会出现这样的错误,原因是user.Password()返回值有两个,但是只能在fmt.Println中一个位置只能使用一个值,所以会出现这样的问题user := url.UserPassword("username", "password")fmt.Println("username: ", user.Username())fmt.Println("password: ", user.Password())fmt.Println(user.String())解决方法:分别定原创 2021-01-01 01:36:23 · 4784 阅读 · 0 评论 -
golang 使用protobuffer进行消息编码
为什么用?使用protobuffer可以更简单更灵活的对结构化的数据进行序列化和反序列化,并且可以在不同的编程语言中进行共享环境配置在 Go中使用protobuffer需要首先下载对应的可执行文件进行编译,可以到 GitHub 进行下载,对于Go来说,还需要一个插件protoc-gen-go,使用下面的命令进行下载,记得将$GOPATH/bin设置为环境变量go get github.com/golang/protobuf/protoc-gen-go消息格式定义// 指定语法版本syntax原创 2020-12-31 09:30:57 · 386 阅读 · 0 评论 -
golang 实现端口扫描
对端口进行扫描基于连接,在go中我们可以使用net.Dial进行判断,如果返回的结果没有错误,那么这个端口就应该是打开的,如果返回了错误,那么可以说明这个端口是关闭的,代码如下func ScanPort(protocol string, hostname string, port int) bool { fmt.Printf("scanning port %d \n", port) p := strconv.Itoa(port) addr := net.JoinHostPort(hostname,原创 2020-12-30 19:48:39 · 1266 阅读 · 0 评论 -
gin 中获取查询字符串和表单内容
Query 数据获取直接获取查询字符串使用GetQuery该函数可以返回对应的查询键对应的值,比如GET /?name=Tom&lastname=如果使用c.GetQuery("name"),那么会返回"Tom", true,对于不存在的键,会返回"", false,如果键声明了,但是没有指定对应的值,比如c.GetQuery("lastname")会返回"", true使用GetQueryArray该方法会以一个切片形式返回对应的查询值,比如GET /?name=Tom&原创 2020-12-30 12:56:58 · 1001 阅读 · 0 评论 -
http2: request body larger than specified content length
在使用golang发送POST请求的时候,由于需要发送数据,所以需要使用mime/multipart包,不过在某次测试的时候出现了下面的错误http2: request body larger than specified content length很明显可以判断出错误的原因,但是错误在哪并不是很清楚,后来debug了一段时间之后,发现将创建的request返回之后,所得到的req.Body字段和之前有所不同,增加了一段内容,后来发现是因为用来写入body的writer并没有关闭,使得创建的requ原创 2020-12-19 00:05:33 · 620 阅读 · 1 评论 -
golang中的值方法和指针方法
和其他的面向对象编程语言有所区别,golang中并没有直接提供对象语法,比如类似python, C++等中的class,而是以struct来间接实现面向对象编程在给结构体对象添加方法的时候,接收者参数可以有两种类型,一种是值参数,还有一种则是指针参数func(receiver Type) Methodfunc(receiver *Type) Method值对象可以调用值方法&指针方法type Person struct{ Name string Age int }// 值方法原创 2020-12-17 10:56:57 · 2292 阅读 · 1 评论 -
使用golang下载github仓库中部分文件
在GitHub我们经常需要下载某一个目录下面的文件,而不是整个仓库,而GitHub提供给用户的下载功能并不能指定下载某一个目录下的文件,于是使用golang写了一个工具,可以用来下载目录中的文件效果如下代码如下,可见 github-dl-tool, 欢迎 ⭐️package mainimport ( "bytes" "flag" "fmt" "io" "io/ioutil" "net/http" "os" "path/filepath" "regexp" "strings"原创 2020-12-08 23:58:48 · 1286 阅读 · 0 评论 -
使用golang发送icmp包
package mainimport ( "fmt" "net")func main() { const IcmpLen = 8 var msg [512]byte msg[0] = 8 // type msg[1] = 0 // code msg[2] = 0 // checkSum -> 2 byte msg[3] = 0 msg[4] = 0 // identifier[0] msg[5] = 13 // identifier[1] msg[6] = 0 //原创 2020-12-06 13:32:16 · 2562 阅读 · 0 评论 -
golang 创建二维数组
对于普通的二维数组var direction = [4][2]int{ {1, 0}, // 下 {-1, 0}, // 上 {0, 1}, // 右 {0, -1}, // 左 }// 也可以自动推断大小var direction = [...][4]int{ {1, 0}, // 下 {-1, 0}, // 上 {0, 1}, // 右 {0, -1}, // 左 }动态创建的二维数组// 首先make第一维的大小var arr = make原创 2020-11-11 21:08:41 · 9194 阅读 · 1 评论 -
golang 简单实现tcp服务端和tcp客户端
服务端package mainimport ( "fmt" "net" "time")func main() { address := net.TCPAddr{ IP: net.ParseIP("127.0.0.1"), Port: 8000, } listener, err := net.ListenTCP("tcp", &address) if err != nil{ fmt.Println("ERR: ", err) return } for原创 2020-10-08 18:46:11 · 617 阅读 · 0 评论 -
golang 简单实现udp服务端和udp客户端
服务端package mainimport ( "fmt" "net" "time")func main() { udpAddr, err := net.ResolveUDPAddr("udp", ":8888") if err != nil { fmt.Println("Err resolve UDP address: ", err) return } serverConn, err := net.ListenUDP("udp", udpAddr) if err !=原创 2020-10-08 18:38:00 · 1280 阅读 · 0 评论 -
使用golang对文件进行zip打包和解包
打包程序package mainimport ( "archive/zip" "fmt" "os")func main() { out, err := os.Create("test.zip") if err != nil { fmt.Println("Create error: ", err) return } defer out.Close() writer := zip.NewWriter(out) var files = []struct { Name原创 2020-10-07 19:30:13 · 2159 阅读 · 0 评论 -
解决vscode 中go插件tools无法下载
本机windows中vscode完全可以下载这些插件,但是WSL中却一直提示FAILED,看了很多博客内容,说是要创建golang.org/x,git clone之后然后在GOPATH中go install xxx,但是还是失败,因为会出现下面类型的错误:cannot find package "github.com/mdempsky/gocode" in any of: /usr/local/go/src/github.com/mdempsky/gocode (from $GOROOT)原创 2020-10-07 09:30:25 · 2404 阅读 · 0 评论 -
linux 系统 安装golang最新版
下载之后解压到/usr/localwget https://golang.google.cn/dl/go1.15.2.linux-amd64.tar.gzsudo tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz 将go添加到环境变量,本地中为.bashrc,有可能是.bash_profilecd ~nano .bashrc 加入export PATH=$PATH:/usr/local/go/bin然后激活source .bashr原创 2020-10-06 20:34:17 · 538 阅读 · 0 评论 -
go 爬虫示例
整理一些自己之前使用go写的爬虫,内容包括比如豆瓣电影排行榜、糗事百科段子、优品PPT,携程等网站评论在之后如果还有爬虫也会逐渐加到里面去,对于一些想学go爬虫的同学来说,还是有帮助的吧,欢迎⭐️项目网站 https://git.io/JUyik...原创 2020-10-01 09:36:16 · 364 阅读 · 0 评论 -
控制goroutine线程的个数
创建一个大小为limit的通道limitChan,每一次使用一个新的goroutine的时候,向通道中传一个值,如果该goroutine结束,那么就从limitChan中释放一个值,如果limitChan中的值达到了缓冲的最大值,那么会一直阻塞直到channel中某些值被取出limitChan := make(chan struct, limit)for i:=0; i<NUM; i++{ limitChan <- struct{}{} go func(){ // 从通道中释放一个值原创 2020-09-29 21:23:15 · 646 阅读 · 3 评论 -
golang 爬取 PPT
按照原来的 博客 修改了一下,可能存在某些bug,比如部分条件下wg.Done没有考虑到,欢迎指出,另外代码中wg.Done调用的比较多,自己可以动手改改~package mainimport ( "fmt" "io/ioutil" "net/http" "os" "path/filepath" "regexp" "strconv" "strings" "sync" "time")const ( DOWNLOAD = "./download" NUM = 50原创 2020-09-24 15:40:13 · 211 阅读 · 0 评论 -
golang 爬取 PPT
下面代码仅供参考,目前还没有很好的方式判断如何停止,只能设置超时时间,另外其实直接构造http://www.ypppt.com/p/d.php?aid=num的网址即可,不需要这么麻烦,所以仅供参考package mainimport ( "fmt" "io/ioutil" "net/http" "os" "path/filepath" "regexp" "strconv" "strings" "sync" "time")var timeout *time.Timervar原创 2020-09-24 09:21:47 · 628 阅读 · 0 评论 -
使用 Go 爬取豆瓣电影排行榜
package mainimport ( "encoding/json" "fmt" "io/ioutil" "net/http" "os" "regexp" "strings")func main() { data, err := GetHTML("https://movie.douban.com/chart") if err != nil{ fmt.Println("获取源代码失败: ", err) return } file , err := os.Create原创 2020-09-22 20:58:50 · 325 阅读 · 0 评论 -
golang 使用net/smtp发送邮件
package mainimport ( "fmt" "net/smtp" "strings")func SendToMail(user, password, host, to, subject, body, mailtype string) error { hp := strings.Split(host, ":") auth := smtp.PlainAuth("", user, password, hp[0]) var content_type string if mailty原创 2020-09-20 15:33:24 · 1258 阅读 · 0 评论 -
golang 交叉编译
按照下面的方式进行编译,亲测可行目的系统方式windowsgo env -w CGO_ENABLED=0 go env -w GOOS=windows go env -w GOARCH=amd64 go buildMacgo env -w CGO_ENABLED=0 go env -w GOOS=darwin go env -w GOARCH=amd64 go buildLinuxgo env -w CGO_ENABLED=0 go env -w GOOS=li原创 2020-09-18 14:59:48 · 329 阅读 · 0 评论 -
golang使用stack对括号进行匹配检测
package mainimport ( "errors" "flag" "fmt")var str stringfunc init() { flag.StringVar(&str, "str", "", "输入要测试的字符串")}type IntStack interface { Pop() (int, error) Push(num int) error IsEmpty() bool}type stack struct { nums []int /.原创 2020-09-16 21:50:36 · 319 阅读 · 0 评论