提高生产力的Go小技巧

2024-08-07 12:07:49 浏览数 (1)

1. 统计耗时

  • 使用defer关键字和TrackTime函数来跟踪函数执行时间。
代码语言:javascript复制
go 代码解读复制代码func TrackTime(pre time.Time) time.Duration {
    elapsed := time.Since(pre)
    fmt.Println("elapsed:", elapsed)
    return elapsed
}
func TestTrackTime(t *testing.T) {
    defer TrackTime(time.Now())
    time.Sleep(500 * time.Millisecond)
}

2 资源清理

  • 利用defer进行任务的准备和清理。
代码语言:javascript复制
go 代码解读复制代码func setupTeardown() func() {
    fmt.Println("Run initialization")
    return func() {
        fmt.Println("Run cleanup")
    }
}
func main() {
    defer setupTeardown()()
    fmt.Println("Main function called")
}

3. 预先分配切片

  • 预先分配切片以提高性能。
代码语言:javascript复制
go 代码解读复制代码// 而不是这样
a := make([]int, 10)
a[0] = 1

// 这样使用
b := make([]int, 0, 10)
b = append(b, 1)

4. 链式调用

  • 修改函数接收者,返回修改后的对象本身,实现链式调用。
代码语言:javascript复制
go 代码解读复制代码type Person struct {
    Name string
    Age  int
}
func (p *Person) AddAge() *Person {
    p.Age  
    return p
}
func (p *Person) Rename(name string) *Person {
    p.Name = name
    return p
}

5. Go 1.20支持将切片解析为数组或数组指针

  • Go 1.20简化了切片转换为数组的过程。
代码语言:javascript复制
go 代码解读复制代码func Test(t *testing.T) {
    a := []int{0, 1, 2, 3, 4, 5}
    b := [3]int(a[0:3])
    fmt.Println(b) // [0 1 2]
}

6. 使用_ import进行包初始化

  • 使用下划线_进行包导入,执行包的初始化代码。
代码语言:javascript复制
go 代码解读复制代码import (
    _ "google.golang.org/genproto/googleapis/api/annotations"
)

7. 使用点.操作符导入包

  • 使用点操作符导入包,避免使用长包名。
代码语言:javascript复制
go 代码解读复制代码package main
import (
    "fmt"
    . "math"
)
func main() {
    fmt.Println(Pi)       // 3.141592653589793
    fmt.Println(Sin(Pi/2)) // 1
}

8. Go 1.20起可以将多个错误包装成一个错误

  • 使用errors.Join函数将多个错误关联起来。
代码语言:javascript复制
go 代码解读复制代码var (
    err1 = errors.New("Error 1st")
    err2 = errors.New("Error 2nd")
)
func main() {
    err := err1
    err = errors.Join(err, err2)
    fmt.Println(errors.Is(err, err1)) // true
    fmt.Println(errors.Is(err, err2)) // true
}

9. 编译时检查接口的技巧

  • 使用类型断言来检查接口实现。
代码语言:javascript复制
go 代码解读复制代码var _ Buffer = (*StringBuffer)(nil)

10. 三元运算符

  • 利用泛型在Go 1.18中创建类似三元运算符的功能。
代码语言:javascript复制
go 代码解读复制代码func Ter[T any](cond bool, a, b T "T any") T {
    if cond {
        return a
    }
    return b
}

11. 验证接口是否真的为nil的方法

  • 使用reflect.ValueOf(x).IsNil()来检查接口值是否为nil。
代码语言:javascript复制
go 代码解读复制代码func IsNil(x interface{}) bool {
    if x == nil {
        return true
    }
    return reflect.ValueOf(x).IsNil()
}

0 人点赞