Go
Chinese and English translation tools in the command line(命令行下ä¸è‹±æ–‡ç¿»è¯‘工具)
dict is a command line tool by go
一键安装(OneKey Install)
wget https://raw.githubusercontent.com/LockGit/Go/master/go-dict/dict.go && go build -o /usr/local/bin/dict dict.go
使用(Usage)
英译ä¸(English To Chinese)
➜ ~ dict I love you
您的输入: I love you
*******英汉翻译:*******
æˆ‘çˆ±ä½ ã€‚
*******网络释义:*******
I Love You : 我爱ä½
I really love you : 真的爱ä½
I Do love you : æˆ‘æ˜¯çˆ±ä½ çš„ä¸è¯‘英(Chinese To English)
âžœ ~ dict 我爱ä½
您的输入: 我爱ä½
*******英汉翻译:*******
I love you
*******网络释义:*******
æˆ‘çˆ±ä½ : I Love You
æˆ‘ä¹Ÿçˆ±ä½ : I Love You Too
æˆ‘å°±çˆ±ä½ : The Arrangement命令行下的dnsä¿¡æ?¯å·¥å…·
一键安装(OneKey Install)
wget https://raw.githubusercontent.com/LockGit/Go/master/fdns/FindDnsRecordFast.go && go build -o /usr/local/bin/fdns FindDnsRecordFast.go
使用(Usage)
实现socks5代��访问看上去�能访问的资�
�设有如下网络情况:
a----->b<------>c
a�以访问b
b�能访问a
b与c之间�以互相访问
实现c访问a上的�务
具体实现:
proxy_server.go 为�务端,proxy_client.go 为客户端
在b上è¿?行:go run proxy_server.go 8000 7999 (其ä¸8000,7999为自定义监å?¬çš„端å?£ï¼‰
在a上è¿?行:go run proxy_client.go bçš„ip:8000 (其实是a主动连接bçš„8000端å?£ï¼Œä¸ºå?Žç»çš„æµ?转å?‘铺垫)
然�c使用b ip的7999端�作为socks5代���访问a上的内容
更多场景,�自行探索
两ç§?cache淘汰ç–ç•¥ lru.go
1,如果数æ?®æœ€è¿‘被访问过,那么将æ?¥è¢«è®¿é—®çš„å‡ çŽ‡ä¹Ÿæ›´é«˜ï¼ˆè®¿é—®å?Žï¼ŒæŠŠå½“å‰?èŠ‚ç‚¹è°ƒæ•´åˆ°é“¾è¡¨å¤´ï¼Œæ–°åŠ å…¥çš„Cacheç›´æŽ¥åŠ åˆ°é“¾è¡¨å¤´ä¸ï¼‰
2,如果访问的频率越高,将æ?¥è¢«è®¿é—®çš„å‡ çŽ‡æ›´é«˜ã€‚ï¼ˆéœ€è¦?一个计数器,计数器排åº?å?Žï¼Œè°ƒæ•´é“¾è¡¨ä½?ç½®ï¼Œæ·˜æ±°æ— ç”¨Cache)
go run lru.go
内å˜å¯¹é½?在golangä¸çš„表现
æ€?考:声明一个结构体的时候,结构体的内部æˆ?员顺åº?是å?¦ä¼šå¯¹å†…å˜çš„å? 用产生影å“??
首先了解一下:bool,int8,uint8,int32,uint32,int64,uint64,byte,string 类型å? 用多少å—节。
fmt.Printf("bool size: %d\n", unsafe.Sizeof(bool(true)))
fmt.Printf("int8 size: %d\n", unsafe.Sizeof(int8(0)))
fmt.Printf("uint8 size: %d\n", unsafe.Sizeof(uint8(0)))
fmt.Printf("int32 size: %d\n", unsafe.Sizeof(int32(0)))
fmt.Printf("uint32 size: %d\n", unsafe.Sizeof(uint32(0)))
fmt.Printf("int64 size: %d\n", unsafe.Sizeof(int64(0)))
fmt.Printf("uint64 size: %d\n", unsafe.Sizeof(uint64(0)))
fmt.Printf("byte size: %d\n", unsafe.Sizeof(byte(0)))
fmt.Printf("string size: %d\n", unsafe.Sizeof("lock"))
得到如下:
bool size: 1
int8 size: 1
uint8 size: 1
int32 size: 4
uint32 size: 4
int64 size: 8
uint64 size: 8
byte size: 1
string size: 16
那么下é?¢è¿™ä¸ªç»“构体ç?†è®ºä¸Šå…±å? 用 1+4+1+8+1=15 byte
type Test struct {
a bool // 1 byte
b int32 // 4 byte
c int8 // 1 byte
d int64 // 8 byte
e byte // 1 byte
}
执行如下:
test := Test{}
fmt.Println(unsafe.Sizeof(test))
//output 32
最终输出为å? 用32个å—节,这与å‰?é?¢æ‰€é¢„期的结果完全ä¸?ä¸€æ ·,这充分地说明了先å‰?的计算方å¼?是错误的!
更改结构体�员顺�:
type Test2 struct {
e byte // 1 byte
c int8 // 1 byte
a bool // 1 byte
b int32 // 4 byte
d int64 // 8 byte
}
执行:
test2 := Test2{}
fmt.Println(unsafe.Sizeof(test2))
//output 16
最终输出为å? 用16个å—节ï¼?两次输出结果ä¸?ä¸€æ ·ã€‚
分æž?: CPU读å?–å†…å˜æ˜¯ä¸€å?—一å?—读å?–的,å?—的大å°?å?¯ä»¥ä¸º 2ã€?4ã€?6ã€?8ã€?16 å—节ç‰å¤§å°?。
针对第一个输出32byte的实验:
| æˆ?员å?˜é‡? | 类型 | å??ç§»é‡? | 自身å? 用 |
|---|---|---|---|
| a | bool | 0 | 1 |
| å—节对é½? | æ— | 1 | 3 |
| b | int32 | 4 | 4 |
| c | int8 | 8 | 1 |
| å—节对é½? | æ— | 9 | 7 |
| d | int64 | 16 | 8 |
| e | byte | 24 | 1 |
| å—节对é½? | æ— | 25 | 7 |
| 总å? 用大å°? | - | - | 32 |
针对第二个输出16byte的实验:
| æˆ?员å?˜é‡? | 类型 | å??ç§»é‡? | 自身å? 用 |
|---|---|---|---|
| e | byte | 0 | 1 |
| c | int8 | 1 | 1 |
| a | bool | 2 | 1 |
| å—节对é½? | æ— | 3 | 1 |
| b | int32 | 4 | 4 |
| d | int64 | 8 | 8 |
| 总å? 用大å°? | - | - | 16 |
以上过程由于å—节对é½?åŽŸå› ï¼Œ 也就是说CPU读å?–å†…å˜æ˜¯ä¸€å?—一å?—读å?–的,而ä¸?是一次读å?–一个offsetï¼Œæ‰€ä»¥é€ æˆ?了两次结果ä¸?一致。
golang shell tools
使用golang实现的shell工具
这些问题都�是问题
1,结构体�以比较,但是包�map的结构体��比较。
2,当程åº?è¿?行到defer函数时,ä¸?会执行函数实现,但会将defer函数ä¸çš„å?‚数代ç ?进行执行。
3,使用 i.(type) ,i必须是interface{}
4,map需��始化,最好用make([]int,x)完��始化
5,deferã€?returnã€?返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值ä¸ï¼›æŽ¥ç?€defer开始执行一些收尾工作;最å?Žå‡½æ•°æ?ºå¸¦å½“å‰?返回值退出。
6,真æ£å®žçŽ°å¹¶è¡Œè‡³å°‘éœ€è¦?2个æ“?作系统硬件线程并至少有两个goroutineæ—¶æ‰?能实现真æ£çš„并行,æ¯?个goroutine在一个å?•独的系统线程上执行指令。
7,sliceå˜åœ¨å¯¹array的引用,对slice的修改在slice未扩容å‰?会影å“?到array,当sliceå?‘生扩容行为之å?Žï¼Œè¿™æ—¶å€™å†…部就会é‡?新申请一å?—内å˜ç©ºé—´ï¼Œ
å°†åŽŸæœ¬çš„å…ƒç´ æ‹·è´?一份到新的内å˜ç©ºé—´ä¸Šã€‚æ¤æ—¶å…¶ä¸ŽåŽŸæœ¬çš„æ•°ç»„å°±æ²¡æœ‰ä»»ä½•å…³è?”关系了,å†?进行修改值也ä¸?会å?˜åŠ¨åˆ°åŽŸå§‹æ•°ç»„ã€‚
func caseOne() *int {
var i int
defer func(i *int) {
time.Sleep(time.Second * 2)
*i = 3
}(&i)
return &i
}
func caseTwo() int {
var i int
defer func(i int) {
time.Sleep(time.Second * 2)
i = 3
}(i)
return i
}
func main() {
fmt.Println(*caseOne())
fmt.Println(caseTwo())
}leetcode with golang
cat *.go |grep Time -A 1 |grep -v Time
* 给定两个二进制å—符串,返回它们的和(也是一个二进制å—符串)。 例如, a = "11" b = "1" 返回"100"。
--
* 将大于10的数的å?„个ä½?上的数å—ç›¸åŠ ï¼Œè‹¥ç»“æžœè¿˜å¤§äºŽ0çš„è¯?,则继ç»ç›¸åŠ ï¼Œç›´åˆ°æ•°å—å°?于10为æ¢
--
* 将获得两个é?žç©ºé“¾æŽ¥åˆ—表,表示两个é?žè´Ÿæ•´æ•°ã€‚ æ•°å—以相å??的顺åº?å˜å‚¨ï¼Œå¹¶ä¸”它们的æ¯?个节点包å?«å?•个数å—。 æ·»åŠ ä¸¤ä¸ªæ•°å—并将其作为链接列表返回。
--
* 找出å—ç¬¦ä¸²ä¸æ‰€æœ‰çš„å?˜ä½?è¯?,é‡?å¤?出现的
--
* 高度平衡二å?‰æ ‘判æ–
--
* ä¸åº?é??历二å?‰æ ‘
--
* å??转二å?‰æ ‘
--
* 层åº?é??历二å?‰æ ‘
--
* 在二å?‰æ ‘䏿‰¾ä¸€æ?¡è·¯å¾„,使得该路径的和最大。该路径å?¯ä»¥ä»ŽäºŒå?‰æ ‘任何结点开始,也å?¯ä»¥åˆ°ä»»ä½•结点结æ?Ÿã€‚
--
* è¿”å›žæ‰€æœ‰æ ¹åˆ°å?¶èŠ‚ç‚¹çš„è·¯å¾„
--
* 二å?‰æ ‘çš„å?Žåº?é??历
--
* 二å?‰æ ‘å‰?åº?é??历
--
* 二å?‰æ ‘锯齿形层次é??历
--
* ç‰ä»·äºŽ 求 m 与 n 二进制编ç ?ä¸ å?Œä¸º1çš„å‰?ç¼€. [5,7] , 5 & 6 & 7 = 4
--
* 爬N阶的楼梯,�次�以爬1阶或者2阶,一共有多少�爬法? (递归,动�规划)
--
* 回溯算法|递归实现
--
* ç»™ä¸€ä¸ªæ•°ç»„ï¼Œå…¶ä¸æ•°ç»„åœ¨ä¸‹æ ‡i处的值为A[i],å??æ ‡(i,A[i])å’Œå??æ ‡(i,0)æž„æˆ?一æ?¡åž‚直于å??æ ‡è½´x的直线。现任å?–两æ?¡åž‚线和x轴组æˆ?四边形容器。问其ä¸ç››æ°´é‡?最大为多少?
--
* 求�于给定�负数n的质数个数
--
* git diff 算法
--
* 给定å—符串Tå’ŒS,求Sçš„å?䏲䏿œ‰å¤šå°‘与T相ç‰ã€‚
--
* 动�规划
--
* 求一个整数的阶乘末尾有多少个0
--
* 从一个未ç»?排åº?çš„æ•°ç»„ä¸æ‰¾å‡ºç¬¬kå¤§çš„å…ƒç´ ã€‚æ³¨æ„?是排åº?之å?Žçš„第k大,而é?žç¬¬k个ä¸?é‡?å¤?çš„å…ƒç´ ã€‚
--
* 在旋转排åº?æ•°ç»„ä¸æ?œç´¢(æŒ‡å®šçš„ç›®æ ‡)
--
* 二分查找
--
* 给定一个数组[a,b,c,d,e],一个target值,找出满足a+b+c+d==target的���集�
--
* æ— å?‘图å¤?制 DFS,BFS
--
* 群组错��分类
--
* 实现一个http代�
--
* 实现å—符串ä½?置查找
--
* å?Œæž„å—符串
--
* 跳跃游�---动�规划
--
* 求一个å—符串最å?Žä¸€ä¸ªå—符的长度
--
* å—符串最长公共å‰?ç¼€
--
* ä»Žä¸€ä¸ªæ•°ç»„ä¸æ‰¾å‡ºå‡ºçްå?Šæ•°ä»¥ä¸Šçš„å…ƒç´
--
* 动�规划---最大�积
--
* 求连ç»çš„æ•°ç»„å€¼ï¼ŒåŠ å’Œæœ€å¤§
--
* å¯»æ‰¾è¿žç»æ•°ç»„ä¸ç¼ºå¤±çš„æ•°
--
* 将数组ä¸çš„0移动数组末尾
--
* 海明��---��作
--
* 实现一个æ£åˆ™åŒ¹é…?算法
--
* 一个有åº?数组,返回去除é‡?å¤?å…ƒç´ å?Žæ•°ç»„的长度。ä¸?å…?许申请新的空间。
--
* 给定一个数组和一个值,在这个数组ä¸ç§»é™¤æŒ‡å®šå€¼å’Œè¿”回移除å?Žæ–°çš„æ•°ç»„长度。ä¸?è¦?为其他数组分é…?é¢?外空间,O(1)å¤?æ?‚度
--
* golangå??转链表
--
* å??转数组
--
* 一个listä¸å?ªæœ‰ä¸€ä¸ªæ•°å‡ºçŽ°äº†1次,其他数2次,找出这个出现一次的数å—
--
* 在一个数组ä¸ï¼Œæ‰¾åˆ°3个元数之和ç‰äºŽ0çš„å…ƒç´ åˆ—è¡¨ç»„å?ˆ
--
* 给一个整数数组,找到三个数的和与给定target的值è·?离最çŸçš„那个和
--
* 两数之和
--
* 是å?¦æ˜¯ä¸‘é™‹æ•°ï¼Œæ‰€è°“ä¸‘é™‹æ•°å°±æ˜¯å…¶è´¨æ•°å› å?å?ªèƒ½æ˜¯2,3,5。
http-proxy.go 使用go实现一个http代�
执行:go run http-proxy.go -h 查看帮助
执行:go run http-proxy.go --debug=true 打开调�模�
默认监�:8080 端�,把�览器的代�设置�127.0.0.1 8080 端�,那么�览器所访问资�将会走go代�脚本
* 如果是https类型,CONNECT方法 (è¦?求httpå??è®®>=1.1)
* 客户端通过CONNECT方法请求代ç?†æœ?务器创建一æ?¡åˆ°è¾¾ä»»æ„?目的æœ?务器和端å?£çš„TCP链接,代ç?†æœ?务器仅对客户端和æœ?务器之间的å?Žç»æ•°æ?®è¿›è¡Œç›²è½¬å?‘(å?ªæ˜¯è½¬å?‘,ä¸?关心,也ä¸?懂å?‘é€?的内容是什么)。
* 如果是http类型,直接代�转�
代�https时的大致过程如下:
1)客户端通过HTTPå??è®®å?‘é€?一æ?¡CONNECT方法的请求给代ç?†æœ?务器,告知代ç?†æœ?务器需è¦?连接的主机和端å?£ã€‚
CONNECT www.xxx.com:443 HTTP/1.1
User-agent: Mozilla/5.0
2)代ç?†æœ?åŠ¡å™¨ä¸€æ—¦å»ºç«‹äº†å’Œç›®æ ‡ä¸»æœºï¼ˆä¸Šä¾‹çš„www.xxx.com:443)TCP连接,就会回é€?一æ?¡HTTP 200 Connection Established应ç”给客户端。
example: HTTP/1.1 200 Connection Established
3ï¼‰æ¤æ—¶éš§é?“就建立起æ?¥äº†ã€‚客户端通过该HTTPéš§é?“å?‘é€?的所有数æ?®éƒ½ä¼šè¢«ä»£ç?†æœ?务器(通过之å‰?建立起æ?¥çš„ä¸Žç›®æ ‡ä¸»æœºçš„TCP连接)原å°?ä¸?动的转å?‘ç»™ç›®æ ‡æœ?åŠ¡å™¨ã€‚ç›®æ ‡æœ?务器å?‘é€?的所有数æ?®ä¹Ÿä¼šè¢«ä»£ç?†æœ?务器原å°?ä¸?动的转å?‘给客户端。
4) å?Žç»å?¯å®Œå–„认è¯?体系,在vps上部署代ç?†
使用(Usage)
diff.go 实现类似gitä¸diff功能
执行: go run diff.go 1.md 2.md
关于算法:
Myers算法,原作者1953年生于美国Idaho州,University of California at Berkeley教授,
美国科å¦é™¢å·¥ç¨‹éƒ¨æˆ?员,贡献了模å¼?匹é…?和计算生物å¦çš„基本算法。
算法将寻找diff的过程,抽象�表示为图的�索。
在网上找了一些关于该算法文档æ??述如下:
以两个å—符串,src=ABCABBA,dst=CBABACä¸ºä¾‹ï¼Œæ ¹æ?®è¿™ä¸¤ä¸ªå—符串我们å?¯ä»¥æž„é€ ä¸‹é?¢ä¸€å¼ 图,横轴是src内容,纵轴是dst内容。
é‚£ä¹ˆï¼Œå›¾ä¸æ¯?一æ?¡ä»Žå·¦ä¸Šè§’到å?³ä¸‹è§’的路径,都表示一个diff。å?‘å?³è¡¨ç¤ºâ€œåˆ 除â€?,å?‘下表示â€?新增“,对角线则表示“原内容ä¿?æŒ?ä¸?动“。
图:
最优路径如红线:
首先,定义å?‚æ•°då’Œk,d代表路径的长度,k代表当å‰?å??æ ‡x - y的值。定义一个â€?最优å??æ ‡â€œçš„æ¦‚å¿µï¼Œ
最优å??æ ‡è¡¨ç¤ºdå’Œk值固定的情况下,x值最大的å??æ ‡ã€‚x大,表示å?‘å?³èµ°çš„å¤šï¼Œè¡¨ç¤ºä¼˜å…ˆåˆ é™¤ã€‚
还是用上é?¢é‚£å¼ 图为例。我们从å??æ ‡(0, 0)å¼€å§‹ï¼Œæ¤æ—¶ï¼Œd=0,k=0,然å?Žé€?æ¥å¢žåŠ d,计算æ¯?个k值下对应的最优å??æ ‡ã€‚
å› ä¸ºæ¯?一æ¥è¦?么å?‘å?³ï¼ˆx + 1),è¦?么å?‘下(y + 1),è¦?么就是对角线(xå’Œy都+1),所以,当d=1时,kå?ªå?¯èƒ½æœ‰ä¸¤ä¸ªå?–值,è¦?么是1,è¦?么是-1。
当d=1,k=1时,最优å??æ ‡æ˜¯(1, 0)。
当d=1,k=-1时,最优å??æ ‡æ˜¯(0, 1)。
å› ä¸ºd=1时,kè¦?么是1,è¦?么是-1,当d=2时,表示在d=1的基础上å†?走一æ¥ï¼Œkå?ªæœ‰ä¸‰ä¸ªå?¯èƒ½çš„å?–值,分别是-2,0,2。
当d=2,k=-2时,最优å??æ ‡æ˜¯(2, 4)。
当d=2,k=0时,最优å??æ ‡æ˜¯(2, 2)。
当d=2,k=2时,最优å??æ ‡æ˜¯(3, 1)。
以æ¤ç±»æŽ¨ï¼Œç›´åˆ°æˆ‘们找到一个då’Œkå€¼ï¼Œè¾¾åˆ°æœ€ç»ˆçš„ç›®æ ‡å??æ ‡(7, 6)。
算法过程:
è¿ä»£d,dçš„å?–值范围为0到n+m,其ä¸nå’Œm分别代表æº?æ–‡æœ¬å’Œç›®æ ‡æ–‡æœ¬çš„é•¿åº¦ï¼ˆè¿™é‡Œæˆ‘ä»¬é€‰æ‹©ä»¥è¡Œä¸ºå?•ä½?)
æ¯?个d内部,è¿ä»£k,kçš„å?–值范围为-d到d,以2为æ¥é•¿ï¼Œä¹Ÿå°±æ˜¯-d,-d + 2,-d + 2 + 2…
使用一个数组v,以k值为索引,å˜å‚¨æœ€ä¼˜å??æ ‡çš„x值(这里使用hashä¹Ÿè¡Œï¼Œä½†æ˜¯ç”¨æ•°ç»„æ•ˆçŽ‡æ›´é«˜ä¸€äº›ï¼Œå› ä¸ºGoä¸?支æŒ?使用负数å?šç´¢å¼•,所以需è¦?创建一个自定义类型)
å°†æ¯?个d对应的v数组å˜å‚¨èµ·æ?¥ï¼Œå?Žé?¢å›žæº¯çš„æ—¶å€™éœ€è¦?用
当我们找到一个då’Œkï¼Œåˆ°è¾¾ç›®æ ‡å??æ ‡(n, m)时就跳出循环
使用上é?¢å˜å‚¨çš„v数组(æ¯?个då¯¹åº”ä¸€ä¸ªè¿™æ ·çš„æ•°ç»„ï¼‰ï¼Œä»Žç»ˆç‚¹å??å?‘得出路径
git真æ£ç”¨çš„æ˜¯æ ‡å‡†Myers算法的一个å?˜ä½“ï¼Œæ ‡å‡†çš„ç®—æ³•ç©ºé—´æ¶ˆè€—å¾ˆå¤§ã€‚
在æŸ?些情况下,å?˜ä½“产生的diffä¼šå’Œæ ‡å‡†ç®—æ³•æœ‰æ‰€ä¸?å?Œã€‚
ä¹Ÿå°±æ˜¯è¯´ï¼Œå¦‚æžœä½ æŒ‰ç…§ä¸Šé?¢çš„算法实现的程åº?,出æ?¥çš„结果和git diff的结果有所ä¸?å?Œæ˜¯æ£å¸¸çš„。






