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()
}
相关推荐
用户69371750013841 小时前
2026,程序员的时代拐点到了
android·前端·后端
惜鸟1 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
量化分析码农1 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端
十年Java程序媛1 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
IT_陈寒1 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
用户8356290780511 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
程序员cxuan1 小时前
腾讯又来一王炸,开源版 WorkBuddy 太夯了!
人工智能·后端·程序员
用户8356290780512 小时前
使用 Python 合并 PowerPoint 演示文稿
后端·python
掘金者阿豪3 小时前
数据同步软件技术实践:从异构数据库迁移到实时数据流转,解析电科金仓KFS架构设计
后端
ServBay3 小时前
不会写代码,如何搭建自己的 AI 自动化工作流
后端·aigc·ai编程