Skip to content

Latest commit

 

History

History
237 lines (175 loc) · 5.97 KB

202108W2.md

File metadata and controls

237 lines (175 loc) · 5.97 KB

@Author : Lewis Tian ([email protected])

@Link : github.com/taseikyo

@Range : 2021-08-08 - 2021-08-14

Weekly #41

readme | previous | next

本文总字数 1575 个,阅读时长约:3 分 5 秒,统计数据来自:算筹字数统计

*Photo by Derek Lee on Unsplash

惆怅旧欢何处,后约难凭,看看春又老。 —— 柳永《留客住・林钟商》

Table of Contents

  • 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.Secondtime.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
  • 不要依赖于计算顺序,特别是在 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" 代替

还有其他部分我没列出来,具体可以去看 >> 剩余部分

2. JetBrains 编程语言调查(Golang & Python)

并不是说只有 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 🔝

1. 责任越大,越要谨小慎微

当仅仅只是一个学生时,只需要负责好自己的学习任务就行了

但是当成为打工人之后,你的工作面向了消费者/客户,你的责任就变大了;

往小了说,你得对自己、对部门、对公司负责;

往大了说,你的对使用你的产品的全国、全球消费者/客户负责。

用户使用体验不佳可能会导致用户流失,从而对公司对你自己产生影响;

严重一点,如果因为自己的疏忽出现事故,那就问题大了。

所以啊,责任越大,越要谨小慎微,小心小心再小心,努力成为一个细心的人,让出现问题的概率最小化。

readme | previous | next