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()
}
相关推荐
程序员岳焱3 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*3 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅4 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头4 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
IT_10244 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9655 小时前
动态规划
后端
stark张宇5 小时前
VMware 虚拟机装 Linux Centos 7.9 保姆级教程(附资源包)
linux·后端
亚力山大抵6 小时前
实验六-使用PyMySQL数据存储的Flask登录系统-实验七-集成Flask-SocketIO的实时通信系统
后端·python·flask
超级小忍6 小时前
Spring Boot 中常用的工具类库及其使用示例(完整版)
spring boot·后端
CHENWENFEIc7 小时前
SpringBoot论坛系统安全测试实战报告
spring boot·后端·程序人生·spring·系统安全·安全测试