提高生产力的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() }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值