泛型

利用泛型实现的语法糖

// Cond
// 条件表达式的简单实现,支持任意类型
func Cond[T any](val bool, a, b T) T {
	if val {
		return a
	}
	return b
}

// Or
// 返回 vals 中第一个不是对应类型0值的参数,如果没有,则返回对应类型的0值
func Or[T comparable](vals ...T) T {
	for _, val := range vals {
		if val != *new(T) {
			return val
		}
	}
	return *new(T)
}
  • 用法
func TestCond(t *testing.T) {
	assert.Equal(t, 1, Cond(true, 1, 2))
	assert.Equal(t, 2, Cond(false, 1, 2))
	var req *http.Request
	assert.Equal(t, http.MethodGet, Cond(req == nil, http.MethodGet, http.MethodPost))
}

func TestOr(t *testing.T) {
	// 范型函数可以不传类型参数
	// 我在 1.18, 1.19, 1.20 上测试均可以工作
	assert.Equal(t, 0, Or[int]())
	assert.Equal(t, 0, Or(0))
	assert.Equal(t, 1, Or(1))
	assert.Equal(t, 2, Or(0, 2))
	assert.Equal(t, 3, Or(0, 0, 3))
}
2023年08月15日 / 19:22