@Author : Lewis Tian ([email protected])
@Link : github.com/taseikyo
@Range : 2021-08-08 - 2021-08-14
本文总字数 1575 个,阅读时长约:3 分 5 秒,统计数据来自:算筹字数统计。
*Photo by Derek Lee on Unsplash
惆怅旧欢何处,后约难凭,看看春又老。 —— 柳永《留客住・林钟商》
- algorithm
- review
- go-advice: List of advice and tricks for Go(GitHub)
- JetBrains 编程语言调查(Golang & Python)
- tip
- share
- 责任越大,越要谨小慎微
algorithm 🔝
review 🔝
1、Go 箴言
- 错误是值
- 不要只检查错误,还要优雅地处理它们
- 设计架构,命名组件,文档记录细节
- 不要在生产环境使用
panic()
2、Go 之禅
- 每个 package 实现单一的目的
- 显式处理错误
- 尽早返回,而不是使用深嵌套
- 在启动一个 goroutine 时,需要知道何时它会停止
3、代码风格
- 使用
go fmt
格式化 - 多个 if 语句可以折叠成 switch
// NOT BAD
if foo() {
// ...
} else if bar == baz {
// ...
} else {
// ...
}
// BETTER
switch {
case foo():
// ...
case bar == baz:
// ...
default:
// ...
}
30 * time.Second
比time.Duration(30) * time.Second
更好- 按类型分组 const 声明,按逻辑和/或类型分组 var
// BAD
const (
foo = 1
bar = 2
message = "warn message"
)
// MOSTLY BAD
const foo = 1
const bar = 2
const message = "warn message"
// GOOD
const (
foo = 1
bar = 2
)
const message = "warn message"
- 检查 defer 中的错误
defer func() {
err := ocp.Close()
if err != nil {
rerr = err
}
}()
- 如果你想省略返回参数,你最好表示出来:
_ = f()
比f()
更好 - 用 range 循环来进行数组或 slice 的迭代
- 多行字符串用反引号`
- 用
_
来跳过不用的参数
func f(a int, _ string) {}
- 使用 time.Before 或 time.After 比较时间戳
- 一个 slice 的零值是 nil
var s []int
fmt.Println(s, len(s), cap(s))
if s == nil {
fmt.Println("nil!")
}
// Output:
// [] 0 0
// nil!
var a []string
b := []string{}
fmt.Println(reflect.DeepEqual(a, []string{}))
fmt.Println(reflect.DeepEqual(b, []string{}))
// Output:
// false
// true
- 注意空结构
struct{}
,两个同结构体并不相同
func f1() {
var a, b struct{}
print(&a, "\n", &b, "\n") // Prints same address
fmt.Println(&a == &b) // Comparison returns false
}
- 在 Go 里面要小心使用 range
for i := range a
和for i, v := range &a
,都不是 a 的副本- 但是
for i, v := range a
里面的就是 a 的副本 - 更多: https://play.golang.org/p/4b181zkB1O
- 不要依赖于计算顺序,特别是在 return 语句中
// BAD
return res, json.Unmarshal(b, &res)
// GOOD
err := json.Unmarshal(b, &res)
return res, err
- 防止结构体字段用纯值方式初始化,添加
_ struct {}
字段:
type Point struct {
X, Y float64
_ struct{} // to prevent unkeyed literals
}
对于 Point {X:1, Y:1}
都可以,但是对于 Point {1, 1}
则会出现编译错误
- 为了防止结构比较,添加
func
类型的空字段
type Point struct {
_ [0]func() // unexported, zero-width non-comparable field
X, Y float64
}
- 移动
defer
到顶部 - JavaScript 解析整数为浮点数并且你的 int64 可能溢出,用
json:"id,string"
代替
还有其他部分我没列出来,具体可以去看 >> 剩余部分
并不是说只有 go 和 python,我只是更关注这俩罢了,对于每项调查,我只列出前几位
1、golang
- 使用 go 的用途:工作、个人项目、兴趣
- 是否同时使用多个版本:no
- 是否使用同一个
GOPATH
:yes - 是否同时编辑多个项目:yes
- 包管理器:Go Module、dep、govender
- IDE:GoLang、VS Code、IDEA、VIM、VS、Atom
- 测试框架:内置测试、testify、gomock
- 编译系统:Go build、Makefile、Graddle
2、python
- Python 3 使用的占比变化(2017-2021):53%,75%,87%,93%,97%
- 使用场景:web 开发、数据分析、机器学习、爬虫
- 最常用的 web 框架:Flask(46%)、Django(45%)、FastAPI(14%)
- 数据科学框架:Numpy、Pandas、Matplotlib、TensorFlow、SciPy
- IDE:PyCharm PE、VS Code、PyCharm CE、Jupyter Notebook、Vim、IDEA、Sublime
tip 🔝
share 🔝
当仅仅只是一个学生时,只需要负责好自己的学习任务就行了
但是当成为打工人之后,你的工作面向了消费者/客户,你的责任就变大了;
往小了说,你得对自己、对部门、对公司负责;
往大了说,你的对使用你的产品的全国、全球消费者/客户负责。
用户使用体验不佳可能会导致用户流失,从而对公司对你自己产生影响;
严重一点,如果因为自己的疏忽出现事故,那就问题大了。
所以啊,责任越大,越要谨小慎微,小心小心再小心,努力成为一个细心的人,让出现问题的概率最小化。