go 学习笔记

安装好go的环境变量后,直接在vscode安装

R

FiLe

View

Edit

Selection

Go

+由

EXTENSIO.

coderunner

CodeRunner

84ms

RunCC++JavaJ

.

JunHan

p9.1M

JAvaTEstRunner

RunanddebugJUnitorTes…

Microsoft

lnstall

Prettier-Code

14.4M

Codeformatterusingpretti…

image.png

重启vsc后,运行第一个hello word

test.go

packagemain

H

2

m

import"fmt"

4

funcmainO)

5

Fmt.Printin(“He1lo,world!”)

TERMINAL

DEBUGCONSOLE

OUTPUT

PROBLEMS

[Running]

"d:go\binlgowork\test.go

gorun

He11o,world!

[Done]exitedwithcode-oin0.58seconds

image.png

定义变量

go语言定义一个变量,如果不定义值,就默认为0或者false

var a string

var a string = “abc”

var a int

也可以这样子(简短变量声明)两个是一样的

:= (定义且赋值) = (只是赋值)

c := 1 → var c int = 1

d :=“abc” → var d string =“abc”

匿名变量

niming-go

1

packagemain

2

import’“'Fmt”

3

ao(int,int)

func

4

GetData

return100,

5

200

P

6

7

funcmain(

8

GetDatao)

-,bi-GetData(o)

9

fmt.PrintIn(a,b)

10

11

DEBUGCONSOLE

TERMINAL

PROBLEMS

TPUT

pD:Lvscodelgoogorun.niing.go

100200

PD:lvscodelgo>

image.png

定义数组

var n [10]int

balance := […]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

循环

break的意思:结束内层循环,外层继续。

import’fmt

3

l/goto

funcmainO)

fori:0:i<1o;i++t

8

ji’a;juZ;jtt

for

ifja’Bf

10

11

break

12

fmt.printf("%v-%cn"ij

13

14

15

16

DEBUGCONSOLETERMINAL

PROBLEMS

OUTPUT

d:projectlsrcicode.o.doy.comdaoin

0-A

1-A

2-A

3-A

4-A

5-A

6-A

7-A

8-A

9-A

image.png

goto:

daytwo>Go02go.go

1

package_main

N

import’“'fmt”’

34568

funcmainOf

fori:-O;i<10;1++0

forj:‘A’;j<"z’;j++f

ifj-C’f

gotoXx

9

fmt.printf(l"%v-%cn",ij

10

11

12

13

XX:

fmt.Printin"over")

14

15

16

DEBUGCONSOLE

PROBLEMS

1

OUTPUT

TERMINAL

psD:lyscodelgoldaytwogorun.2go.o

0-A

0-B

over

PsD:Lyscodelgoldaytwo>

image.png

_和for range循环

1

packagemain

2

import"‘fmt’"’

3

funcmainO)f

a:-[…Jint1,2,3,4

//[0105]

fmt.Printin(a)

//fmt.printf(“typeofa:%Tn”,a)/typeofa:[4jint

varb-l…lstringt"北京",“上海”,“中山”

fmt.Printin(b)

10

for

11

rangebs

fmt.Printin©

12

13

14

15

PROBLEMS

DEBUGCONSOLE

TERMINAL

OUTPUT

2

pSD:Lvscodelgoldaythreegorun.shuzu

[1234]

[北京上海中山]

北京

上海

中山

psD:Lyscodelpoldavthree>

image.png

daythree

shuzu.go

1

packagemain

N

import"‘Fmt’

funcmainO)f

a:a[…Jint,2,3,4

1/[0105]

fmt.Printin(a)

//fmt.PrintfC"typeofa:%Tna)//typeofa:[4jint

8

varb-[…jstring"北京",“上海”,“中山”

fmt.Printin(b)

10

forindex,crangebt

11

fmt,printin(index,c)

12

13

14

15

PROBLEMS

OUTPUT

DEBUGCONSOLE

TERMINAL

shuzu.go:11:6:indexdcaredbutnotu

PsD:lvscodelgoldaythreegorunzu.g

[1234

[北京上海中山]

0北京

1上海

2中山

pSD:Lvscodelgoldaythree

image.png

结束当前循环,进入下一个循环

切片

daythree

cap.go

package

HS

main

3456

import"fmt’"’

funcmainO

a:[Jint1,2,3,4,5

s:al1:3]//s:-a[low:high]

len(s),cap(s)

//fmt.Printf(“s:%vlen(s):%vcap(s):%vn”,sler

:-a[0:3]

8

Fmt.Printin(C,“”,)

9

75

10

11

1

DEBUGCONSOLE

PROBLEMS

OUTPUT

TERMINAL

pD:Lvscodelgoldaythreegoruncapg

[123][23]

psD:Lvscodelgoldaythree

image.png

动态切片

packagemain

import"‘fmt’"

funcmainO)

ai-[sjint1,2,3,4,5]

6

s:a1:3]//s:a[low:high]

7

//fmt.printf('s:%vlen(s):%vcap(s):%vin",s,len(S),ca())

8

9

C:-a[O:3]

fmt.Printin(C,“”

10

11

funcmainO)

12

//append添加元素和切片扩容

13

varnumslicelJint

14

fori:C;i<10;1++1

15

16

numslice-append(numlice)

,cap(numslice),numslice)

ptr:%pIn",numslice,len(umslice)

fmt.Printf"%len:%d

17

cap:%d

18

19

1

PROBLEMS

DEBUGCONSOLE

OUTPUT

TERMINAL

psD:Lvscodelgoldaythree>

.cap.go

gorun

[o]len:1

cap:1

ptr:0xc000014088

01]

1en:2

cap:2

ptr:0xc0000140do

[012]len:3

ptr:0xc00000c240

cap:4

012311en:4

cap:4

ptr:0xcoo000c240

[01234]len:5

cap:8

ptr:0xc000012200

012345]1en:6cap:8

ptr:0xc000012200

0123456]len:7cap:8ptr:axcooo012200

01234567]len:8cap:8ptr:axcoo0012200

[012345678]1en:9cap:16

ptr:0xc000020100

0123456789]len:10cap:16

ptr:0xc000020100

PSD:Lvscodelgoldaythree

image.png

PsD:Lvscodelgolafscan>gorun.lpac.go

[0123456789]

psD:Lyscodelgolafscan>

image.png

函数调用

GO

xunhuan.go

1.go

scan.go

scan.go

1

packagemain

2

import"Fmt’"

3

funcS

ncsrfloat32,paifloat2)

4

:pairr

5

S:

fmt.Printin(“圆面积:%f”,s)

6

7

7

8

9

varpaifloat32-3.14

10

11

funcmainO

12

varpaifioat323.14

13

var

14

varrfloat32

fmt.println(“输入:”)

15

fmt.Scanf(“%f”,&r)

16

S(r,pai)

17

18

19

1

DEBUGCONSOLE

OUTPUT

TERMINAL

PROBLEMS

psD:Lvscodelgoogorun.scan.g

输入:

9

圆面积:%254.34

PD:lvscodelgo>

image.png

这个博主讲的不错

https://blog.csdn.net/weixin_41640994/article/details/109491591

占位符

https://studygolang.com/articles/2644

输入输出

go的输入赋值和python不一样,要注意&

scan.go

packagemain

Nm寸L

import"'fmt"

funcmainO)

fmt.Printin(“输入:”)

vara1string

fmt.Scanf(“%s”,&a1

6

fmt.Printin("hel1o

7

,a1)

8

9

PROBLEMS

OUTPUT

TERMINAL

DEBUGCONSOLE

PsD:Lvscodelgo>gorun.scan.go

输入:

aufeng

aufeng

he11o

psD:lvscodelgo>

image.png

if ;

之前总是看不懂这种语法,其实就是变换一下,把if写成一段了。

ERR : MSG.WRITEMSG(CONN, LOGINMSG);

303

IF ERR ! NIL {

304

305

RETURN

I

306

image.png

关于…的用法

…其实是go的一种语法糖.

它的第一个用法主要是用于涵数有多个不定参数的情况,可以接受多个不确定数是的参数.

第二个用法是slice可以被打散进行传递.

下面直接上例子:

134568

functest1(args…string)可以受任意个string参数

for_vrangeargs

fmt.Println(v)

funcmain0

varstrss-dlstring

gwr"

234",

11

“yui”,

12

“cvbc”,

13

test1(strss…)//切片被打散传入

14

15]

image.png

举个例子:

Hwm寸u10o

x…intint

funcintSum2(X

fmt.Printin(x)//x是一个切片

sum:20

for-virangeXt

sum

sum

returnsum

调用上面的的数:

intSum2O

ret1

intSum2(10)

ret2:

2

m寸5n

intSum2(10,20)

ret3

intSum2(10,20,

30

ret4

fmt.Printin(ret1,ret2r3,re4)//0103060

image.png

go 接口

go结构体

利用场景

结构体+函数和方法

go map

异常处理

https://blog.csdn.net/super_lixiang/article/details/82689474

go转义符

Go语言的字符串常见转义符包含回车,换行,单双引号,制表符等,如下表所示.

转义符

含义

回车符(返回行首)

r

换行符(直接跳到下一行的同列位置)

n

制表符

It

单引号

双引号

反杠

I1

image.png

代码内容格式化

碰到其他人写的代码,可能代码内容格式是乱的,可以使用下面的方法直接自动化格式好。

go fmt xxx.go

go func

并发代码

WaitGroup对象不是一个引用类型,在通过函数传值的时候需要使用地址:

*sync.WaitGroup

控制线程池

https://zhuanlan.zhihu.com/p/150694706

指针

zhizhen.go

dayfive

packagemain

2

Fmt

import

3

funcmainO)

4

10//赋值

5

a

b;&a/地址保存

6

//取值

7

C:*B

fmt.println©

8

9

GS

10

1

TERMINAL

OUTPUT

DEBUGCONSOLE

PROBLEMS

psD:Lvscodelgoldayfivegorun.zhiz

izhen.go

10

image.png

取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。

声明了指针变量后,还需要使用new来初始化

指针调用传值

生成exe文件

go build -o bf.exe .\bingfa.go

类型强转换+切割

自定义包

这个自定义包,必须要再go的 $GOPATH/src 下面建立,例如我在src的目录下创建了pac

D:\go\src\pac

pac的内容:

然后可以引用自定义的包,引用方式如下,记得,引用的函数名开头要大写

这个调用自定义包的话,要注意全局变量的问题,之前写端口扫描的时候,总是会卡住,原因调用的时候,这个全局变量没被函数使用,需要去掉,然后像箭头那样调用才行

funcmainOf

//

ports:“443”

6

//

ip:“210.76.75192/24”

Webtitle(ports,ip)

8

0

varwgsync.waitGroup

stringtint,timeoutint64)

funcWebtitle(ipstring,

por

varwgsync.waitGroup

m

addr:portscan2.Portscan(ip,ports,ttimout)

H/addr:-portscan.Second_Main(ports,p

iflen(addr)>00

for

ips:-rangeaddr

wg.Add(1)

//fmt.Printin(ips)

titlescan(ips,&wg)

go

wg.waitO)

image.png

channel 通道

无缓冲的通道只有在有接收值的时候才能发送值

定义的通道是否缓冲,需要看缓冲大小的值有没有定义。

make(chan 元素类型, [缓冲大小])

下载第三方依赖包的代理

go env -w GOPROXY=https://goproxy.cn,direct

关于引用第三方包的报错

psD:Lvscodelgolafscan>gorun

run.AFping-go

github.com/pkg/errors"inanyof:

D:golsorloithub.comimalfiunktlinangelin.:cafic

nackape

D:golsrclvendorlgithub.compkglrors(endortree)

D:golsrclgithub.comlpkgle

kglerrors(fromSGOROOT)

c:lusers1937golsrclgithucomkg(romT)

image.png

每次go get都会下载到 C:\Users\19307\go\pkg\mod\github.com 需要把里边的包放到D:\go\src\github.com 然后还需要改一下errors的命名才能正常使用

go get -u

GOFLAGS-

set

fengou>goopkg

qithub.com

mod

GOHOSTARCH-and64

set

GOHOSTOS-windows

set

名称

欢开

修改日期

GOINSECURE

sat

GOMODCACHE-C:Users19307gkgmo

set

文件夹

2021/9/2215:17

loveleshsharma

GONOPROXY

set

文件夹

2021/9/2312:22

malfunkt

GONOSUMDB-

set

setGOOS-windows

文件夹

2021/9/2215:17

pkg

setGOPATH-C:Users19307g

setGOPRIVATE

setGOPROXY-htt/goroxycir

setGOROOT-D:gO

setGoSUMDB-sum.golang.org

setGOTMPDIR

GOTOOLDIR-D:gopkgtoowidowsa

set

GOVCS-

set

GOVERSION-gO1.16.5

set

setGCCGO-gccgo

AD-

image.png

在这个路径里边还没办法直接运行main.go文件,需要把main.go文件移出来其他目录才行

nil是什么

当出现不等于nil的时候,说明出现某些错误了 , nil的意思是无,或者是零值

未知类型转为string

后面加个.String()

a:rng[1o0]string)

22

23

1cmp.Main(a)

1og.Printinreflect.Typeof(rng),a

24

25

26

image.png

flag包

PsD:lvscodelgola

golafscan>gorun.lflag.go-h

users19387VApppataLocau

Usageofc:Users193

-ipstring

需要探测的ip范围(default

PsD:Lyscodelgolafscan>

image.png

但是需要指针进行传值,所以可以用Var()的方法去解决问题

正则匹配

go交叉编译

https://studygolang.com/articles/14376

SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 go build xxx.go

GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) GOARCH:目标平台的体系架构(386、amd64、arm) 交叉编译不支持 CGO 所以要禁用它

go socket编程

server服务端

Java

复制代码

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

//go-tcpsock/server.go

func handleConn(c net.Conn) {

​ defer c.Close()

​ for {

​ // read from the connection

​ // … …

​ // write to the connection

​ //… …

​ }

}

func main() {

​ l, err := net.Listen(“tcp”, “:8888”)

​ if err != nil {

​ fmt.Println(“listen error:”, err)

​ return

​ }

​ for {

​ c, err := l.Accept()

​ if err != nil {

​ fmt.Println(“accept error:”, err)

​ break

​ }

​ // start a new goroutine to handle

​ // the new connection.

​ go handleConn©

​ }

}

客户端

Java

复制代码

1

2

3

4

5

conn, err := net.Dial(“tcp”, “ip:port”)

if err != nil {

​ //handle error

}

// read or write on conn

若有收获,就点个赞吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑战士安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值