2023年8月26日
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
...
2023年3月25日
not understanding stack vs heap
#
...
2023年2月24日
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 !
...
2023年2月23日
go
#
value copy
#
type account struct {
balance float32
}
accounts := []account{
{balance: 100.},
{balance: 200.},
{balance: 300.},
}
for _, a := range accounts {
a.balance += 1000
}
...
2023年2月22日
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 !
...
2023年2月20日
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 命令会自动下载并安装最新的版本。
...
2023年2月14日
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 { // ... } }
2023年2月12日
算法 # if, else 剩余else是什么内容? if a { } else if b { } else { } else 的条件等价与 !(a) && !(b)
心流 # 先扩充技术广度,再拓展深度 深度不要太深,广度要充分 全栈应用开发 nextjs
2023年2月11日
算法 # 最大公约数 func (a, b int) int { for a != 0 { a, b = b%a, a } return b } golang # gin源码解读, 理解web后端框架 https://zhuanlan.zhihu.com/p/335779872
2023年2月10日
心流 # 提前制定计划什么时候做什么事,而不是到了时间点再做安排 包括短期,中期,长期计划