2023

20230826日志

2023年8月26日
2023
202308, C++

caution # int guess(12) 与 int guess{12} 的区别 在C++中,这两种方式的区别是: int guess(32); 是使用构造函数初始化 int guess{32}; 是使用统一初始化语法 构造函数初始化方式调用int的构造函数,使用括号中的值32来初始化guess。 统一初始化语法不需要调用构造函数,直接使用大括号{}初始化guess为32。 两者的结果是相同的,都将guess初始化为整数32。 主要区别在于: 构造函数初始化只适用于有构造函数的类类型,而统一初始化语法可以用于任何类型。 统一初始化语法可以防止隐式类型转换。例如int guess(3.14)会把3.14转为3,而int guess{3.14}在编译时会报错。 统一初始化语法在某些情况下会进行值初始化(将变量初始化为类型的默认值),构造函数初始化则总是直接初始化。 统一初始化语法可以初始化数组和聚合类型。 所以通常来说,统一初始化语法更为通用和安全,C++11后推荐使用统一初始化语法,而不是构造函数初始化 强制类型转化 (type) expression type(expression) static_cast<type>(expression) auto 含义转变 C 中表示内存自动分配释放 C++ 中表示类型自动推导 基本类型 整型从小到大, bool, char, signed char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long, long long, unsigned long long ...

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 命令会自动下载并安装最新的版本。

...

20230214日志

2023年2月14日
2023
202302, golang, 算法

golang # byte - byte 仍然为 byte 类型 # todo: 复现不了了? 遍历的同时将字符串恢复为整型 x := 0 for i := 0; i <size; i++{ x = x*10 + int(str[i]-'0') } while 循环使用 || , 在内部控制逻辑; 学习165题官解 func compareVersion(v1, v2 string) int { m, n := len(v1), len(v2) i, j := 0, 0 for i < m || j < n { // ... } }

20230212日志

2023年2月12日
2023
202302, 算法, 心流

算法 # if, else 剩余else是什么内容? if a { } else if b { } else { } else 的条件等价与 !(a) && !(b) 心流 # 先扩充技术广度,再拓展深度 深度不要太深,广度要充分 全栈应用开发 nextjs

20230211日志

2023年2月11日
2023
202302, golang, gin, 算法

算法 # 最大公约数 func (a, b int) int { for a != 0 { a, b = b%a, a } return b } golang # gin源码解读, 理解web后端框架 https://zhuanlan.zhihu.com/p/335779872

20230210日志

2023年2月10日
2023
202302, 心流

心流 # 提前制定计划什么时候做什么事,而不是到了时间点再做安排 包括短期,中期,长期计划