go

go

2023年2月26日
go
202302, go

负数除法 # 余数的符号和被除数的符号一致 -5 % 3 = -2 5 % 3 = 2 -5 % -3 = -2 5 % -3 = 2

20230224日志

2023年2月24日
2023
202302, go, defer

go # err总是通过最后一个返回值返回 panicking # panic可以被recover恢复, recover仅可以在defer中, 即使发生panic,defer也会执行 节省的使用panic, 在programmer error或者dependency场景中使用 func main(){ defer fun(){ if f := recevoer(); r != nil { fmt.Println("recover", r) } }() f() } func f(){ fmt.Println("a") panic("foo") fmt.Println("b") } ignoring when to wrap an error # 需要添加额外信息;把error作为特定的一种error 老式的方式,通过struct包装 type BarError struct { Err error } func (b BarError) Error() string { return "bar failed:" + b.Err.Error() } 通过%w添加上下文, 可以unwrap if err ! ...

20230223日志

2023年2月23日
2023
202302, go, range

go #

value copy #

type account struct {
    balance float32
}

accounts := []account{
    {balance: 100.},
    {balance: 200.},
    {balance: 300.},
}
for _, a := range accounts {
    a.balance += 1000
}
...

20230222日志

2023年2月22日
2023
202302, go, defer

go # defer: in a loop # func readFiles(ch <-chan string) error { for path := range ch { file, err := os.Open(path) if err != nil { return err } defer file.Close() // Do something with file } return nil } 方案1, 将file的open与close封装在独立函数, 循环中不defer 方案2, 循环内创建闭包调用, 在闭包中defer defer: ignoring how defer arguments and receivers are evaluated # func f() error { var status string defer notify(status) defer incrementCounter(status) if err := foo(); err ! ...

20230220日志

2023年2月20日
2023
202302, go

go 模块 #

Go 1.11 版本之后,引入了 Go 模块化支持,可以通过 go mod 命令来管理模块。下面是一些常用的添加模块的命令:

初始化一个新的模块

go mod init <module_name>

该命令会在当前目录下创建一个新的 go.mod 文件,并将当前目录视为一个新的 Go 模块。<module_name> 为模块的名称,通常使用类似于 github.com/<username>/<repo> 的格式。

添加依赖

go get <module_path>@<version>

该命令会下载并安装指定版本的依赖包,并将其添加到当前模块的 go.mod 文件中。<module_path> 为依赖包的路径,可以是本地路径、远程仓库路径或者包名等形式;<version> 则为依赖包的版本号,可以是标签、分支或者提交哈希等形式。

[!NOTE] 注意,如果依赖包没有指定版本号,则 go get 命令会自动下载并安装最新的版本。

...