提高生产力的Go小技巧

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文档介绍了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()
}


转载来源:https://juejin.cn/post/7386927836848914467

相关文章
|
6月前
|
开发框架 安全 中间件
Go语言开发小技巧&易错点100例(十二)
Go语言开发小技巧&易错点100例(十二)
74 1
|
6月前
|
Go
Go语言开发小技巧&易错点100例(十一)
Go语言开发小技巧&易错点100例(十一)
48 0
|
6月前
|
存储 Java Go
Go语言开发小技巧&易错点100例(十)
Go语言开发小技巧&易错点100例(十)
47 0
|
6月前
|
Go 开发者
Go语言开发小技巧&易错点100例(九)
Go语言开发小技巧&易错点100例(九)
27 0
|
6月前
|
JSON Go 数据格式
Go语言开发小技巧&易错点100例(八)
Go语言开发小技巧&易错点100例(八)
41 0
|
6月前
|
消息中间件 IDE Go
Go语言开发小技巧&易错点100例(七)
Go语言开发小技巧&易错点100例(七)
40 0
|
6月前
|
运维 监控 Go
Go语言开发小技巧&易错点100例(六)
Go语言开发小技巧&易错点100例(六)
32 0
|
6月前
|
Java Go
Go语言开发小技巧&易错点100例(五)
Go语言开发小技巧&易错点100例(五)
41 0
|
6月前
|
Go
Go语言开发小技巧&易错点100例(四)
Go语言开发小技巧&易错点100例(四)
56 0
|
6月前
|
JSON Go 数据格式
Go语言开发小技巧&易错点100例(三)
Go语言开发小技巧&易错点100例(三)
36 0