delve调试
dlv调试:https://www.jianshu.com/p/2802d71ab9e9
go mod init
dlv debug main.go
格式化
预览gofmt
修改gofmt -w
概念
高并发
执行
脚本执行 go run
编译执行:go build src后目录(默认在src内寻找(Gopath里执行
将exe放入bin:go build -o bin/cal 文件名
go build 出的exe均与执行go文件同名
调用包
import gopath/src下地址
会被外部调用的函数 首字母大写
_ 空白符,只导入做初始化,但不调用。
包的别名 import时在包·路径前写别名
包内如果含有init函数,则在main前执行 init->全局变量->main
值类型和引用类型
值(传值):基本数据类型、数组、struct (仅在子函数内拷贝,并未实现调用)
引用(传地址):指针 slice map chan
值只会拷贝传递 先拷贝 即把备份给调用的函数传参,所以改变的只有子函数里的值,对外界无影响。
所以如果要实现函数返回改变,用指针实现,将地址传入函数。(注意不是改备份的地址,需要改地址所指的内存值)
值类型取星号即为引用 如 *int
变量
仅在最小代码块内有效。优先局部变量,再全局。可能出现与全局变量名称相同的局部变量,注意是否是新定义的。
全局区域只能声明变量,不能执行代码 即可以 var a int = 100;但不可以 a:=100
类型不能直接赋值。
Switch
无break??!!!可以在case下写多条,往下走:fallthrough,不需匹配下一case即可执行。
无条件时,用case 判断:
Label
跳转标识 字符串:
函数
函数也是一种类型 可以赋值给变量,也可以直接使用。此变量为指针,指向函数 打印出来为地址
用type可进行自定义。函数不能比较。无论是值传递还是引用传递,都是拷贝。
return返回值只需在函数名处定义,可以return 空。如要忽略可以用下划线。
可变参数 func add(arg···int) int{} 零个或多个参数。arg(变量名)是一个slice,可通过arg[]依次访问所有参数。
defer
先进后出 函数返回时,执行defer,可用来进行资源清理。
在函数执行后再执行defer,但defer里的值在defer定义时即确定,与后续无关。
用途 :关闭文件句柄、锁资源释放、数据库连接释放。
rune
[]rune表示一个字符,无论中英文都只占1。byte中中文占3个字节,循环时可能出错(比如判断中文回文。
new/make
分配内存。分配值类型(int\struct,返回指针)/引用类型(chan map slice)
panic和recover
错误处理
append/copy
a = append(a,b…) 如越界会扩容
copy 不足时会补默认值0 超过则只复制前面
sort
不能传入数组,因为是值。sort改变后无法传出。如要数组排序,可以采用切片。a[:]
search的前提是有序
map
map[key]value。初始化需要make,声明时不分配内存。map的value可以是map。内部无序。如要有序输出,先处理key,然后遍历
线程遍历
互斥锁 var mu sync.Mutex (同一时间仅一个goroutine可进入)
(读)写锁 var mu sync.RWMutex (只读不需要加锁,读多写少则读写锁,效率更高)
go build -race 竞争检测
互斥:go 中各读写前后均需lock和unlock
读写:Rlock和RUnlock