Skip to content
master
Go to file
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
Oct 28, 2019
Aug 31, 2018

README.md

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的结果有所��是正常的。

Releases

No releases published

Packages

No packages published

Languages

You can’t perform that action at this time.