simple tern expression condition ? expression 1 : expression 2 in golang
轻量级且多功能的 Go 包,通过优雅的三元表达式简化条件逻辑。
🎯 泛型三元运算: 类型安全的条件表达式,全面的泛型支持
⚡ 惰性求值: 基于函数参数的延迟执行,优化性能表现
🔄 灵活条件: 支持布尔和函数的条件求值模式
🌍 零值处理: 自动零值回退和专门零值比较工具
📋 多种求值模式: 支持直接值、函数和零值感知操作
go get github.com/yylego/tern此示例展示了不同求值模式下的核心三元表达式功能。
package main
import (
"fmt"
"github.com/yylego/tern"
)
func main() {
// 基本条件选择
result := tern.BVV(true, "选项 A", "选项 B")
fmt.Println(result) // 输出: 选项 A
// 延迟执行回退值
result = tern.BVF(false, "默认值", func() string { return "计算回退值" })
fmt.Println(result) // 输出: 计算回退值
// 使用零值作为回退
result = tern.BV(false, "回退值")
fmt.Println(result) // 输出: (空字符串)
}⬆️ 源码: 源码
zerotern 子包提供零值感知的条件逻辑工具。
package main
import (
"fmt"
"github.com/yylego/tern/zerotern"
)
func main() {
// 直接零值比较
result := zerotern.VV("非零", "回退值")
fmt.Println(result) // 输出: 非零
// 零值的函数回退
result = zerotern.VF("", func() string { return "回退函数" })
fmt.Println(result) // 输出: 回退函数
}⬆️ 源码: 源码
slicetern 子包提供安全的切片访问函数,避免产生 panic。
package main
import (
"fmt"
"github.com/yylego/tern/slicetern"
)
func main() {
slice := []string{"a", "b", "c"}
// 获取第一个元素
first := slicetern.V0(slice)
fmt.Println(first) // 输出: a
// 按索引获取元素
second := slicetern.VX(slice, 1)
fmt.Println(second) // 输出: b
// 安全访问越界索引
safeAccess := slicetern.VX(slice, 5)
fmt.Println(safeAccess) // 输出: (空字符串)
// 安全访问空切片
emptySlice := []int{}
safeFirst := slicetern.V0(emptySlice)
fmt.Println(safeFirst) // 输出: 0
}⬆️ 源码: 源码
tern 包提供全面的条件求值函数:
| 函数 | 条件类型 | 主值 | 回退值 |
|---|---|---|---|
BVV |
bool |
直接值 | 直接值 |
BVF |
bool |
直接值 | 函数返回值 |
BFV |
bool |
函数返回值 | 直接值 |
BFF |
bool |
函数返回值 | 函数返回值 |
FVV |
func() bool |
直接值 | 直接值 |
FVF |
func() bool |
直接值 | 函数返回值 |
FFV |
func() bool |
函数返回值 | 直接值 |
FFF |
func() bool |
函数返回值 | 函数返回值 |
| 函数 | 条件类型 | 主值 | 回退值 |
|---|---|---|---|
BV |
bool |
直接值 | 类型零值 |
BF |
bool |
函数返回值 | 类型零值 |
FV |
func() bool |
直接值 | 类型零值 |
FF |
func() bool |
函数返回值 | 类型零值 |
用于安全访问切片元素的函数。
| 函数 | 描述 |
|---|---|
V0 |
返回切片的第一个元素,如果切片为空则返回零值。 |
VX |
返回切片在指定索引的元素,如果索引越界则返回零值。 |
通过延迟执行优化性能:
func 昂贵的计算() string {
fmt.Println("正在计算...")
return "计算结果"
}
result := tern.BVF(false, "默认值", 昂贵的计算)
// 输出: 默认值 (昂贵的计算 未执行)获取任意泛型类型的零值:
fmt.Println(tern.Zero[int]()) // 输出: 0
fmt.Println(tern.Zero[string]()) // 输出: (空字符串)zerotern 子包提供零值感知操作的专门工具:
| 函数 | 比较类型 | 主值 | 回退值 |
|---|---|---|---|
VV |
直接比较 | 直接值 | 直接值 |
VF |
直接比较 | 直接值 | 函数返回值 |
FV |
函数比较 | 函数返回值 | 直接值 |
FF |
函数比较 | 函数返回值 | 函数返回值 |
| 函数 | 指针处理 | 回退值 |
|---|---|---|
SetPV |
指针到直接值 | 直接值 |
SetPF |
指针到直接值 | 函数返回值 |
具备零值感知的指针设置:
package main
import (
"fmt"
"github.com/yylego/tern/zerotern"
)
func main() {
var value int
zerotern.SetPV(&value, 42)
fmt.Println(value) // 输出: 42
value = 7
zerotern.SetPF(&value, func() int { return 99 })
fmt.Println(value) // 输出: 7 (未改变,因为已经是非零值)
}⬆️ 源码: 源码
- 增强代码清晰性: 用简洁表达式简化条件逻辑
- 性能优化: 惰性求值避免不必要的计算
- 类型保护: 利用 Go 泛型实现最大适应性和稳健性
- 全面覆盖: 支持包括零值处理在内的各种条件场景
- 易于集成: 复杂 if-else 链的直接替换
MIT 许可证 - 详见 LICENSE。
非常欢迎贡献代码!报告 BUG、建议功能、贡献代码:
- 🐛 问题报告? 在 GitHub 上提交问题并附上重现步骤
- 💡 新颖思路? 创建 issue 讨论
- 📖 文档疑惑? 报告问题,帮助我们完善文档
- 🚀 需要功能? 分享使用场景,帮助理解需求
- ⚡ 性能瓶颈? 报告慢操作,协助解决性能问题
- 🔧 配置困扰? 询问复杂设置的相关问题
- 📢 关注进展? 关注仓库以获取新版本和功能
- 🌟 成功案例? 分享这个包如何改善工作流程
- 💬 反馈意见? 欢迎提出建议和意见
新代码贡献,请遵循此流程:
- Fork:在 GitHub 上 Fork 仓库(使用网页界面)
- 克隆:克隆 Fork 的项目(
git clone https://github.com/yourname/repo-name.git) - 导航:进入克隆的项目(
cd repo-name) - 分支:创建功能分支(
git checkout -b feature/xxx) - 编码:实现您的更改并编写全面的测试
- 测试:(Golang 项目)确保测试通过(
go test ./...)并遵循 Go 代码风格约定 - 文档:面向用户的更改需要更新文档
- 暂存:暂存更改(
git add .) - 提交:提交更改(
git commit -m "Add feature xxx")确保向后兼容的代码 - 推送:推送到分支(
git push origin feature/xxx) - PR:在 GitHub 上打开 Merge Request(在 GitHub 网页上)并提供详细描述
请确保测试通过并包含相关的文档更新。
非常欢迎通过提交 Merge Request 和报告问题来贡献此项目。
项目支持:
- ⭐ 给予星标如果项目对您有帮助
- 🤝 分享项目给团队成员和(golang)编程朋友
- 📝 撰写博客关于开发工具和工作流程 - 我们提供写作支持
- 🌟 加入生态 - 致力于支持开源和(golang)开发场景
祝你用这个包编程愉快! 🎉🎉🎉
