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

embedded/2024/9/24 5:30:04/

本期看点:

正文开始:

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 = namereturn p
}

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

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

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

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

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

package mainimport "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)
}

完结~


http://www.ppmy.cn/embedded/3550.html

相关文章

初学python记录:力扣705. 设计哈希集合

题目: 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 MyHashSet 类: void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合…

DBeaver导入sql文件

DBeaver导入sql文件 下载数据库 数据库下载地址: https://www.begtut.com/mysql/mysql-sample-database.html数据库导入 获取sql文件中创建的数据库的名称,创建一个同名的数据库。 输入数据库的名称,设置字符集和排序规则 数据库创建完…

【Docker】有关docker操作命令

最近在使用docker以及docker-compose等进行项目环境搭建,以及项目的部署,有些命令记录一下: 删除所有镜像 docker rmi $(docker images -q) -f停止所有容器 docker stop $(docker ps -aq)进入容器内部 docker exec -it CONTAINER_ID /bin/bas…

桥接模式【结构型模式C++】

1.概述 桥接模式是一种结构型设计模式,是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&am…

2024华中杯C题光纤传感器平面曲线重建原创论文分享

大家好,从昨天肝到现在,终于完成了2024华中杯数学建模C题的完整论文啦。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 12 二.问题分析 13 2.1问题一 13 2.2问题二 14 2.3问题三 14 三、模型假设 15 四、…

【鸿蒙开发】第二十一章 Media媒体服务(一)

1 简介 Media Kit(媒体服务)提供了AVPlayer和AVRecorder用于播放、录制音视频。 在Media Kit的开发指导中,将介绍各种涉及音频、视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能。比如使用…

统一SQL-支持CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库:Oracle 目标数据库:Postgresql,TDSQL-MySQL,达梦8,LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式

一、前言 使用ORACLE作为数据库的应用软件中,偶尔会遇到使用游标作为出参的存储过程,这种存储过程迁移到MogDB并不需要进行改造,但是在开发这样的存储过程时,开发人员偶尔会想要在数据库中测试执行一下,看看游标中的数…