🥷
🥷
文章目录
  1. 前言
  2. 基础篇
  3. 高级篇
  4. 包管理工具之使用dep
  5. 其他
  6. 资源

golang也要耍一耍

前言

去年就开始接触了下Golang,后来工作中也用不到就又全忘掉了。又比较嫌弃Golang的包管理方式,就弃置一旁了。转投rust怀抱,写了写小demo。然后现在又由于一些原因,开始重新学习了下golang, 本着Talk is cheap的原则,写了个小项目,toy项目。自觉用来教程还是可以的(仅仅适用于有编程经验的)。不过也恰恰说明了语言只是一个工具。真正要学好的还是算法,设计模式,明白一些编程思想。这里就不比较和其他语言的差异了,选择合适或者较为合适的语言去写对应的项目。

基础篇

跟着Golang tour先过一遍, golang中没有类,但是这不妨碍用结构体的方法作为变相类的实现。如果没记错,rust好像也是这么套路的。临时写了个demo,基础语法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

package main

import (
"fmt"
)

type People struct {
Name string
sex string
age int
}

func (person *People) Say(something string){
fmt.Println(something)
}

func main(){

notices := "This is variable string"
var noticesagain string = "我还可以这样写"

var haha string
haha = "Another String"

yoyoyo := make([]string, 3)
fmt.Println("啥也没有", yoyoyo)

lalalabytes := []byte(`




`)


fmt.Println(lalalabytes)

zhangsan := People{"Zhangsan", "male", 18}
zhangsan.Say("我可真帅")
fmt.Println(zhangsan.Name)
fmt.Println(zhangsan.age)

fmt.Println(notices, noticesagain, haha)

}

高级篇

高级一点点的是指针和引用了,还有Map, 接口, Slices, 协程,回调函数了。 你需要通过golang tour网页,或者书本系统的学习一下。这些算是比较高级一点的用法了。 下面是一些高级用法的初级示例。代码摘自我的github上学习golang的项目boomb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

package models

type Try struct {
Target string // ip or hostname
Port string
Protocal string // http ssh and what ever
Data *Boomb // burp force auth ticket for try
Status bool // sucessful or not
}

type Boomb struct {
Username string
Password string
}

基本的结构体设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

package burp

func HTTPBrust(try *models.Try) *models.Try{
//Basic Auth Brust
client := &http.Client{}
req, err := http.NewRequest("GET", try.Protocal + "://" + try.Target + ":" + try.Port , nil)
req.SetBasicAuth(try.Data.Username, try.Data.Password)
resp, err := client.Do(req)
if err != nil{
log.Fatal(err)
}

if resp.StatusCode == 200 {
try.Status = true
return try
}

return nil
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

func Fire(fire func(*models.Try) *models.Try, trys []*models.Try) *models.Boomb {

res := make(chan *models.Try)

go func() {
for _, try := range trys {
res <- fire(try)
}
}()

select {
case result := <- res:
if result != nil && result.Status {
fmt.Println("[Target Cracked] \nusername:password = ", result.Data.Username, ":", result.Data.Password)
return &models.Boomb{result.Data.Username, result.Data.Password}
}
}

return nil
}


Fire(HTTPBrust, trys)

可以看出,Fire接受函数作为参数,并用协程的方式调用,且将结果存到channel里面。如果能看懂上面的代码,说明channel, callback, pointer, struct都理解的差不多了。

包管理工具之使用dep

把项目放在goapth下面,一般在~/go/src/下面,然后在项目下运行dep init, 之后就由dep接管该项目的包管理了。当前目录下会多出vendor目录,以及Gopkg.lock,Gopkg.toml文件。然后运行dep ensure下载依赖包到本地,到当前项目下。使用以上命令的时候,加上-v可以获得更加详细的信息dep ensure -v。增加新的依赖则需要使用dep ensure add xxxxx
Gopkg.toml文件是dep的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

required = ["github.com/go-redis/redis","github.com/mylamour/boomb"]
ignored = ["golang.org/x/crypto/ssh"]


[metadata]
homepage = "https://github.com/myalmour/boomb"
license = "MIT"
user = "mylamour"
email = "[email protected]"


[prune]
go-tests = true
unused-packages = true

require字段的是一定会在ensure的时候拉取到vendor里面的。但是注意托管到代码管理平台的时候,不要推送上去。

其他

  • 使用Makefile帮助管理工程命令
  • Go build时候使用-ldflags="-s -w"来减小生成的二进制大小
  • https_proxy=127.0.0.1:1080 go get xxxx可以解决部分的包安装问题
  • 一个好的ide可以解决许多麻烦

资源