深入理解go的slice和到底什么时候该用slice

深入理解go的slice和到底什么时候该用slice 前言 用过go语言的亲们都知道,slice(中文翻译为切片)在编程中经常用到,它代表变长的序列,序列中每个元素都有相同的类型,类似一个动态数组,利用append可以实现动态增长,利用slice的特性可以很容易的切割slice,它们是怎么实现这些特性的呢?现在我们来探究一下这些特性的本质是什么。 先了解一下slice的特性 定义一个slice s := []int{1,2,3,4,5} fmt.Println(s) // [1 2 3 4 5] 一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。 slice的扩容 s := []int{1,2,3,4,5} s = append(s, 6) fmt.Println(s) // [1 2 3 4 5 6] 内置append函数在现有数组的长度 < 1024 时 cap 增长是翻倍的,再往上的增长率则是 1.25,至于为何后面会说。 slice的切割 s := []int{1,2,3,4,5,6} s1 := s[0:2] fmt.Println(s1) // [1 2] s2 := s[4:] fmt.Println(s2) // [5 6] s3 := s[:4] fmt.Println(s3) // [1 2 3 4] slice作为函数参数 [Read More]
Go 

用golang写一个http代理,可以抓包和科学上网

用golang写一个http代理,可以抓包和科学上网 缘起 因为在工作中需要对上网进行限制,只让我们的app上网,意思就是放行app请求的所有域名或ip,而其他域名都禁止,所以我需要对app的http请求进行抓包。上网搜了一下,win下的fiddler不错,可惜我用的是Linux系统,fiddler不跨平台,找了下linux下的抓包软件,当然tcpdump和wireshare是足够强大的,完全可以实现我要的小小要求,但用起来有一定的复杂性,门槛稍高。在网上找到其他类似的软件还挺多,charles、NProxy等,最后发现mitmproxy最符合我的胃口,如图: 但是mitmproxy的安装依赖太多,python就是这样,一不小心就报错了,so,想着用golang实现类似的功能,自己也很喜欢go语言,如果有空能安静写写自己喜欢的代码,是多么的幸福。想好了就实践,Let’s do it,当然凡事都有个从简到繁的过程,下面的特性慢慢增加。 特性 特性,也可以说功能,以下是实现或者将要实现的特性 http代理 http请求响应的抓取 修改http请求 重复请求 同时监听多端口 支持socks5、websocket、https协议 界面支持终端和网页两种形式 安装 git clone https://github.com/zboya/gomitmproxy.git cd gomitmproxy go build 使用 http代理 gomimtproxy 不带任何参数,表示http代理,默认端口8080,更改端口用 -port http抓包 gomimtproxy -m 加 -m 参数,表示抓取http请求和响应 http代理科学上网 首先你得有个墙外的服务器,如阿里香港的服务器,为图中的Server,假设其ip地址为:22.222.222.222 在Server执行: gomitmproxy -port 8888 在你自己电脑执行: gomitmproxy -port 8080 -raddr 22.222.222.222:8888 然后浏览器设置代理,ip为localhost,端口为8080,即可实现科学上网 源码简析 对于网络编程,Anything is a socket! 实现http代理并不难,简单地说就是用代理服务器代替客户端去请求web服务,然后在把请求的结果返回给客户端。 先来个示意图: 1. 客户端发起一个到gomitmproxy的连接,并且提交了HTTP CONNECT请求。 2. [Read More]
Go