Go小技巧&易错点100例(十五)

发布于:2024-04-23 ⋅ 阅读:(18) ⋅ 点赞:(0)

本期看点:

正文开始:

Go程序跟踪函数的执行时间

在Go程序中我们经常会对接口执行的耗时做一个记录,特别是针对核心或复杂业务的时候,我们需要关注该业务的执行耗时,可以具体到某个方法,有一个简单有效的技巧,你可以使用defer关键字,只需一行代码即可使用。例如:

// 封装函数
func ExecTime(t time.Time) time.Duration {
  ts := time.Since(t)
  fmt.Println("ts:", ts)
  return ts
}

func main(t *testing.T) {
 defer ExecTime(time.Now()) //记录耗时

 time.Sleep(500 * time.Millisecond)
}

// ts: 500.21125ms

Go链式编程

链式编程(Chain Programming)也称为流式编程(Fluent Interface),是一种编程风格,其中方法的调用能够返回对象本身,从而允许调用者继续调用该对象的其他方法。这种风格的主要目的是通过减少代码的冗余和提高可读性来简化代码。

链式编程通常具有以下特点:

  • 方法返回值:每个方法调用后都返回当前对象(通常是this),从而允许连续调用其他方法。

  • 可读性:链式编程通常可以提高代码的可读性,因为它允许开发者以直观、流式的方式组织代码。

  • 构建器模式:链式编程常用于构建器模式(Builder Pattern)中,用于创建具有多个可选参数的对象。

  • 减少代码量:通过链式编程,开发者可以在单行代码中执行多个操作,从而减少代码量。

下面就用一个简单的例子展示下Go语言中的链式编程:

func (p *Person) AddAge() *Person {
  p.Age++
  return p
}

func (p *Person) Rename(name string) *Person {
  p.Name = name
  return p
}

通过返回修改后的对象本身,我们可以轻松地将多个函数接收器链接在一起,而无需添加不必要的代码行:

p = p.AddAge().Rename("ZhangSan")

结构体值接收者和指针接收者实现接口的区别

结构体值接收者和指针接收者实现接口的区别
在 Go 语言中,结构体可以通过实现接口来满足某个接口的约束条件。在实现接口时,可以使用值接收者或指针接收者。它们的主要区别在于如何处理结构体的拷贝和指针。
值接收者方法接收一个结构体值的副本作为接收者,而指针接收者方法接收一个结构体指针作为接收者。具体来说,值接收者方法会将结构体值拷贝一份,然后对副本进行操作,
而指针接收者方法则直接操作原始结构体指针所指向的对象。

总而言之,在实现接口时,应保持接收者定义、结构体定义、断言类型一致。

package main

import "fmt"

type People struct {
	Name string
}

type Student struct {
	People
}

type Say interface {
	SayHello() string
}

//结构体值接收者实现接口
//func (p People) SayHello() string {
//	return "hello"
//}

func (p *People) SayHello() string {
	return "hello"
}

func main() {
	people := People{Name: "zs"}

	//student := Student{People: people}  //结构体值定义

	student := &Student{People: people}

	Print(student)
}

func Print(s Say) {
	//student, ok := s.(People) //结构体值断言

	student, ok := s.(*People)
	fmt.Println(ok)
	fmt.Println(student)
}

完结~