关于一些Golang包API设计的理解

有的API设计成通过传入引用来给调用者返回结果。

比如Gorm里Find 这个函数就需要传入指针来存放结果(假如你不传指针会直接报错)。

materials := make([]models.Material, 0)
var total int64
db := global.DB
db.Find(&materials).Count(&total)

仔细想来,应该是为了满足API的链式调用设计。链式调用需实例对象上的每个函数都返回且只能返回一个相同类型的指针,比如 Find 和 Count 的返回结果都是*gorm.DB。这样一来,传递结果只能通过函数接受一个指针对象才能实现函数的返回,Find(&materials).Count(&total)

类推到其他可以做链式调用的API,比如 Restry 之类,做赋值操作都要传一个指针进去。