11个提高生产力的Go小技巧

1. 统计耗时

  • 使用defer关键字和TrackTime函数来跟踪函数执行时间。
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进行任务的准备和清理。
go 复制代码
func setupTeardown() func() {
    fmt.Println("Run initialization")
    return func() {
        fmt.Println("Run cleanup")
    }
}
func main() {
    defer setupTeardown()()
    fmt.Println("Main function called")
}

3. 预先分配切片

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

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

4. 链式调用

  • 修改函数接收者,返回修改后的对象本身,实现链式调用。
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简化了切片转换为数组的过程。
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进行包初始化

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

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

  • 使用点操作符导入包,避免使用长包名。
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函数将多个错误关联起来。
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. 编译时检查接口的技巧

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

10. 三元运算符

  • 利用泛型在Go 1.18中创建类似三元运算符的功能。
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。
go 复制代码
func IsNil(x interface{}) bool {
    if x == nil {
        return true
    }
    return reflect.ValueOf(x).IsNil()
}
相关推荐
Pandaconda13 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
编程小筑1 小时前
R语言的编程范式
开发语言·后端·golang
技术的探险家1 小时前
Elixir语言的文件操作
开发语言·后端·golang
ss2731 小时前
【2025小年源码免费送】
前端·后端
Ai 编码助手1 小时前
Golang 中强大的重试机制,解决瞬态错误
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的区块链
开发语言·后端·golang
齐雅彤2 小时前
Lisp语言的循环实现
开发语言·后端·golang
梁雨珈2 小时前
Lisp语言的物联网
开发语言·后端·golang
邓熙榆3 小时前
Logo语言的网络编程
开发语言·后端·golang
羊小猪~~7 小时前
MYSQL学习笔记(四):多表关系、多表查询(交叉连接、内连接、外连接、自连接)、七种JSONS、集合
数据库·笔记·后端·sql·学习·mysql·考研