defer
:生命周期结束后执行(栈顺序),在打开一些资源后,可以使用defer执行关闭.释放的操作,类似RAIIpanic
:类似于throw,抛出异常make
()用于构建切片,map,channel
defer
,panic
,recover
配合使用代码
go
defer func(){
if ret := recover(); ret != nil{
fmt.print(ret)
}
}
panic("error")
interface
:接口类型,只需定义接口然后实现接口,无需绑定,即可使用多态interface{}
:相当于any类型,可装万物
go
type duck interface{
gaga()
walk()
}
type pskDuck struct{
age int
}
type (p *pskDuck) gaga(){
}
type (p *pskDuck) walk(){
}
func main(){
var value duck = &pskDuck{}
d.gaga()
}
-
go在同一级目录下包名要一致,
import
的路径是相对于*.mod
文件的路径 -
小驼峰相当于private,大驼峰相当于public(针对于不同的包之间)
-
在import文件前面可以声明包的别名
- import std "fmt",从此fmt包要写成std
- 在前面加
.
就类似于using namespace,不在需要通过包名使用(少使用,可能重名,污染) - 如果引入包,但是不使用,是会报错的,需要在前面添加
_
(import一个包会默认调用func init()
函数,这是使用场景)
-
go get
指令可以安装库,自动安装依赖 -
go mod init xxx
初始化 -
go mod tidy
添加需要用到但go.mod中查不到的模块,删除未使用的模块(推荐) -
sync.WaitGroup
:主要用于goroutine
的执行等待add
用于添加等待的次数done
用于减少一次计数器Wait
阻塞等待
-
go
关键字启动一个协程 -
atomic
是一个原子包,里面提供了很多原子方法 -
channel
分为有缓冲和无缓冲,如果需要使用无缓冲(make(chan string,0)),那么需要启动一个goroutine去读取 -
可以通过
close
函数关闭一个channel
,已经关闭的channel
不能在放值,但是可以取值, -
可以通过
for range
不断地取值-
<-chan
只读channel -
chan<-
只写channel
goc := make(chan int,3) var send chan<- int = c var read <-chan int = c
-
-
go实现继承需要以匿名的形式嵌入结构体
gostruct A{} struct B{ A }