安装好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…
重启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
定义变量
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>
定义数组
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
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>
_和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>
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
结束当前循环,进入下一个循环
切片
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
动态切片
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
PsD:Lvscodelgolafscan>gorun.lpac.go
[0123456789]
psD:Lyscodelgolafscan>
函数调用
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>
这个博主讲的不错
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>
if ;
之前总是看不懂这种语法,其实就是变换一下,把if写成一段了。
ERR : MSG.WRITEMSG(CONN, LOGINMSG);
303
IF ERR ! NIL {
304
305
RETURN
I
306
关于…的用法
…其实是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]
举个例子:
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
go 接口
go结构体
利用场景
结构体+函数和方法
go map
异常处理
https://blog.csdn.net/super_lixiang/article/details/82689474
go转义符
Go语言的字符串常见转义符包含回车,换行,单双引号,制表符等,如下表所示.
转义符
含义
回车符(返回行首)
r
换行符(直接跳到下一行的同列位置)
n
制表符
It
单引号
双引号
反杠
I1
代码内容格式化
碰到其他人写的代码,可能代码内容格式是乱的,可以使用下面的方法直接自动化格式好。
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
取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
声明了指针变量后,还需要使用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)
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)
每次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-
在这个路径里边还没办法直接运行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
flag包
PsD:lvscodelgola
golafscan>gorun.lflag.go-h
users19387VApppataLocau
Usageofc:Users193
-ipstring
需要探测的ip范围(default
PsD:Lyscodelgolafscan>
但是需要指针进行传值,所以可以用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
若有收获,就点个赞吧