1-安装go
yum install go (linux系统中yum安装一般不是latest版本)
2-go version
查看版本
3-go env
环境变量
4-修改某个环境变量,比如关系gosum
go env -w GOSUMDB="off"
5-恢复某个go env
go env -u "GOSUMDB"
6-查看go env使用帮助
go help env
7--go中最?�的一个命令(小黑这么认为的)
8-go run konglong.go
8.0.1--go run -race 判断资源变量竞争,多个goroutine是否并发安全
1
$ go run -race xxxx.go // to run the source xxx gofile
执行命令以及结果
1[root@konglong kk2020]#
2[root@konglong kk2020]# go run -race race_01.go
3==================
4WARNING: DATA RACE
5Read at 0x00c0000180a8 by goroutine 8:
6 main.main.func2()
7 /root/kk2020/race_01.go:17 +0x38
8
9Previous write at 0x00c0000180a8 by goroutine 7:
10 main.main.func1()
11 /root/kk2020/race_01.go:13 +0x4e
12
13Goroutine 8 (running) created at:
14 main.main()
15 /root/kk2020/race_01.go:16 +0x9c
16
17Goroutine 7 (finished) created at:
18 main.main()
19 /root/kk2020/race_01.go:12 +0x7a
20==================
21结束
22exit status 1
23[root@konglong kk2020]#
24[root@konglong kk2020]#
对比之前的konglong001.go
9-go build konglong.go -o konglong
编译一个go文件为可执行,-o代表目的文件名,默认与main函数文件同名,大哥最好尝试几下子,小弟可能说错了
10-go help build
go build一些参数,比如交叉编译,
go build konglong.go -o konglong -GOOS=
11-使用go mod,go的一个包管理官方工具
12-go mod 常用几个
13--go tool,go自带工具
14--go tool之看汇编代码
比如这样式的:
go tool commpile -S konglong.go
GOOS=linux GOARCH=amd64 go tool compile -l -N -S
-l 禁止内联
-N 禁止优化
-S 生成汇编代码
7[root@konglong kk2020]# GOOS=linux GOARCH=amd64 go tool compile -l -N -S race_01.go
8"".main STEXT size=355 args=0x0 locals=0x88
9 0x0000 00000 (race_01.go:10) TEXT "".main(SB), ABIInternal, $136-0
10 0x0000 00000 (race_01.go:10) MOVQ (TLS), CX
11 0x0009 00009 (race_01.go:10) LEAQ -8(SP), AX
12 0x000e 00014 (race_01.go:10) CMPQ AX, 16(CX)
13 0x0012 00018 (race_01.go:10) JLS 345
14 0x0018 00024 (race_01.go:10) SUBQ $136, SP
15 0x001f 00031 (race_01.go:10) MOVQ BP, 128(SP)
---14.0.1补充----go:xxxxxx-----编译指令-----
1
go:xxxxxx
以//go:开头的注释,是编译指令,作用是指定编译器如何编译这段代码
//go:noescape
noescape禁止逃逸,指定文件中的下一个声明必须是不带主题的func(意味着该声明的实现不是用Go编写的),不允许将作为参数传递的任何指针逃逸到堆或函数的返回值上
//go:nosplit
指定文件中声明的函数不得进行堆栈溢出检查,goroutine的栈可以动态自增的。Runtime会追踪每个stack的使用情况。在运行函数之前会进行检查以确保有足够的栈空间来运行该函数。如果不够,代码先进入runtime扩充stack。nosplit指令禁止stack拆分。如果堆栈耗尽,编译器也必须确保运行函数是安全的,不能因为避免了栈检查的开销就让函数使用比被允许空间更多的内存。so,编译器维护一个名为redzone的缓冲区,768字节的,分配在每个goroutines的堆栈框架底部,保证可用。
编译器会跟踪每个函数的堆栈要求。当它遇到一个nosplit函数时,它会累积该函数对redzone的堆栈分配。
//go:linkname localname [importpath.name]
使用[importpath.name]作为源代码中声明的localname的变量或函数。由于该指令可以破坏类型系统和包模块化。只有引用unsafe包才可使用
//go:nowritebarrierrec
编译器如果发现在下面的函数中包含写屏障, 产生一个错误。(这不能阻止写屏障的产生,这只是个断言)
//go:yeswritebarrierrec与nowritebarrierrec相对,遇write屏障产生错误
//go:noinline
禁止内联,内联简单说是简短的函数在调用它的地方展开,函数调用处替换为被调用函数主体的一种编译器优化手段。
注意gcflags='-l -N' 选项在全局范围内禁止优化,作用范围不同
//go:norace
跳过竞态检测
15--go tool之objdump
go tool objdump
反汇编可执行文件
go tool objdump -s “konglong.\main” konglong上面的意思是,解析可执行文件konglong,将其中的 konglong 包的 main 方法转成汇编代码
1[root@konglong xm01]# cat main.go
2package main
3
4import "fmt"
5
6func main(){
7 fmt.Println("各位大哥好,这是恐龙的写的一个go,for command,今天晴,冷,无风,叶子还没落完,农历十月十九")
8}
9[root@konglong xm01]#
10[root@konglong xm01]#
11[root@konglong xm01]# go tool objdump -h
12usage: go tool objdump [-S] [-s symregexp] binary [start end]
13
14 -S print go code alongside assembly
15 -s string
16 only dump symbols matching this regexp //支持正则表达式
17[root@konglong xm01]#
18[root@konglong xm01]# go tool objdump -S -s "^main" main
19TEXT main.main(SB) /root/kk2020/xm01/main.go
20func main(){
21 0x48ce60 64488b0c25f8ffffff MOVQ FS:0xfffffff8, CX
22 0x48ce69 483b6110 CMPQ 0x10(CX), SP
23 0x48ce6d 7670 JBE 0x48cedf
24 0x48ce6f 4883ec58 SUBQ $0x58, SP
25 0x48ce73 48896c2450 MOVQ BP, 0x50(SP)
26 0x48ce78 488d6c2450 LEAQ 0x50(SP), BP
27 fmt.Println("各位大哥好,这是恐龙的写的一个go,for command,今天晴,冷,无风,叶子还没落完,农历十月十九")
28 0x48ce7d 0f57c0 XORPS X0, X0
29 0x48ce80 0f11442440 MOVUPS X0, 0x40(SP)
30 0x48ce85 488d0554130100 LEAQ 0x11354(IP), AX
31 0x48ce8c 4889442440 MOVQ AX, 0x40(SP)
32 0x48ce91 488d0578c10400 LEAQ 0x4c178(IP), AX
33 0x48ce98 4889442448 MOVQ AX, 0x48(SP)
34 return Fprintln(os.Stdout, a...)
35 0x48ce9d 488b05ec020d00 MOVQ os.Stdout(SB), AX
36 0x48cea4 488d0d35d70400 LEAQ go.itab.*os.File,io.Writer(SB), CX
37 0x48ceab 48890c24 MOVQ CX, 0(SP)
38 0x48ceaf 4889442408 MOVQ AX, 0x8(SP)
39 0x48ceb4 488d442440 LEAQ 0x40(SP), AX
40 0x48ceb9 4889442410 MOVQ AX, 0x10(SP)
41 0x48cebe 48c744241801000000 MOVQ $0x1, 0x18(SP)
42 0x48cec7 48c744242001000000 MOVQ $0x1, 0x20(SP)
43 0x48ced0 e8eb97ffff CALL fmt.Fprintln(SB)
44 0x48ced5 488b6c2450 MOVQ 0x50(SP), BP
45 0x48ceda 4883c458 ADDQ $0x58, SP
46 0x48cede c3 RET
47func main(){
48 0x48cedf e8ec48fcff CALL runtime.morestack_noctxt(SB)
49 0x48cee4 e977ffffff JMP main.main(SB)
50[root@konglong xm01]#
51[root@konglong xm01]#
16--go install
go install
这个命令用于编译安装,然后将编译后的生成的执行文件存放到工程的 bin 目录下,将生成的归档文件(即静态链接库)存放到工程的 pkg 目录下。使用方式类似于 go build,可以在某个代码包目录下直接使用,也可以指定代码包使用。
17--go tool pprof
性能检查工具
1package main
2
3import (
4 "fmt"
5 "net/http"
6 _ "net/http/pprof"
7)
8
9func main() {
10 fmt.Println("这是一个go pprof 性能监控小 demo")
11 startHttpSvr002()
12}
13
14func startHttpSvr002() {
15 //导入pprof的包,自动包含一些handler,
16 http.HandleFunc("/aa", hand002)
17 http.ListenAndServe(":8999", nil)
18 //在浏览器输入http://localhost:8999/debug/pprof/
19
20
21}
22
23func hand002(w http.ResponseWriter, r *http.Request) {
24 w.Write([]byte("[konglong]--====>" + r.Method))
25 fmt.Println("r===>", r)
26}
在浏览器输入http://localhost:8999/debug/pprof/
18-go fmt格式化代码
19.一个nb的调式工具delve
https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv.md
dlv attach pid
grs
gr 2 选中2号协程
locals 查看局部变量
19---->>> 还请大哥补充........
孔小黑子
小黑心声
谢谢各位大哥观看小黑弟弟
小黑感恩戴德
欢迎大哥批评指正小黑
由衷的感谢大哥