..

Go 1.22的新功能 Cmp.Or

一、介绍

截至撰写本文时, Go 1.22已经发布几个月了。

Go 1.22提出并实现的最终函数是cmp.Or

首先我们看一下代码:

// Or returns the first of its arguments that is not equal to the zero value.
// If no argument is non-zero, it returns the zero value.
func Or[T comparable](vals ...T) T {
	var zero T
	for _, val := range vals {
		if val != zero {
			return val
		}
	}
	return zero
}

它非常简短。它只是比较其参数并返回第一个不是 0 or nil or ""其类型的零值的参数。

二、如何使用它?

主要用途cmp.Or是获取数字并返回第一个非0数字。例如,一个 API 获取列表页中的 pagepageSize参数值, 给一些默认值。

它也适用于字符串和指针。

以下是我的真实代码库中的一些实际用途:

query.Event.WithContext(l.ctx).
		Limit(cmp.Or(in.PageSize, 20)).
		Offset((cmp.Or(in.Page, 1) - 1) * cmp.Or(in.PageSize, 20)).
		Order(query.Event.ID.Desc()).
		Scan(&events)

上面例子就是 Page 和 PageSize 都为 0 时, 默认赋值默认值。