Skip to content

Latest commit

 

History

History
314 lines (223 loc) · 9.83 KB

File metadata and controls

314 lines (223 loc) · 9.83 KB

golang-tern-expression logo

golang-tern-expression

simple tern expression condition ? expression 1 : expression 2 in golang


GitHub Workflow Status (branch) GoDoc Coverage Status Supported Go Versions GitHub Release Go Report Card

tern

轻量级且多功能的 Go 包,通过优雅的三元表达式简化条件逻辑。


英文文档

ENGLISH README

核心特性

🎯 泛型三元运算: 类型安全的条件表达式,全面的泛型支持
惰性求值: 基于函数参数的延迟执行,优化性能表现
🔄 灵活条件: 支持布尔和函数的条件求值模式
🌍 零值处理: 自动零值回退和专门零值比较工具
📋 多种求值模式: 支持直接值、函数和零值感知操作

安装

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 函数返回值 类型零值

切片访问函数 (slicetern)

用于安全访问切片元素的函数。

函数 描述
V0 返回切片的第一个元素,如果切片为空则返回零值。
VX 返回切片在指定索引的元素,如果索引越界则返回零值。

高级用法

惰性求值优势

通过延迟执行优化性能:

func 昂贵的计算() string {
	fmt.Println("正在计算...")
	return "计算结果"
}

result := tern.BVF(false, "默认值", 昂贵的计算)
// 输出: 默认值 (昂贵的计算 未执行)

处理零值

获取任意泛型类型的零值:

fmt.Println(tern.Zero[int]()) // 输出: 0
fmt.Println(tern.Zero[string]()) // 输出: (空字符串)

零值比较包 (zerotern)

zerotern 子包提供零值感知操作的专门工具:

函数 比较类型 主值 回退值
VV 直接比较 直接值 直接值
VF 直接比较 直接值 函数返回值
FV 函数比较 函数返回值 直接值
FF 函数比较 函数返回值 函数返回值

指针工具 (zerotern)

函数 指针处理 回退值
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 (未改变,因为已经是非零值)
}

⬆️ 源码: 源码

tern 的独特之处?

  1. 增强代码清晰性: 用简洁表达式简化条件逻辑
  2. 性能优化: 惰性求值避免不必要的计算
  3. 类型保护: 利用 Go 泛型实现最大适应性和稳健性
  4. 全面覆盖: 支持包括零值处理在内的各种条件场景
  5. 易于集成: 复杂 if-else 链的直接替换

📄 许可证类型

MIT 许可证 - 详见 LICENSE


💬 联系与反馈

非常欢迎贡献代码!报告 BUG、建议功能、贡献代码:

  • 🐛 问题报告? 在 GitHub 上提交问题并附上重现步骤
  • 💡 新颖思路? 创建 issue 讨论
  • 📖 文档疑惑? 报告问题,帮助我们完善文档
  • 🚀 需要功能? 分享使用场景,帮助理解需求
  • 性能瓶颈? 报告慢操作,协助解决性能问题
  • 🔧 配置困扰? 询问复杂设置的相关问题
  • 📢 关注进展? 关注仓库以获取新版本和功能
  • 🌟 成功案例? 分享这个包如何改善工作流程
  • 💬 反馈意见? 欢迎提出建议和意见

🔧 代码贡献

新代码贡献,请遵循此流程:

  1. Fork:在 GitHub 上 Fork 仓库(使用网页界面)
  2. 克隆:克隆 Fork 的项目(git clone https://github.com/yourname/repo-name.git
  3. 导航:进入克隆的项目(cd repo-name
  4. 分支:创建功能分支(git checkout -b feature/xxx
  5. 编码:实现您的更改并编写全面的测试
  6. 测试:(Golang 项目)确保测试通过(go test ./...)并遵循 Go 代码风格约定
  7. 文档:面向用户的更改需要更新文档
  8. 暂存:暂存更改(git add .
  9. 提交:提交更改(git commit -m "Add feature xxx")确保向后兼容的代码
  10. 推送:推送到分支(git push origin feature/xxx
  11. PR:在 GitHub 上打开 Merge Request(在 GitHub 网页上)并提供详细描述

请确保测试通过并包含相关的文档更新。


🌟 项目支持

非常欢迎通过提交 Merge Request 和报告问题来贡献此项目。

项目支持:

  • 给予星标如果项目对您有帮助
  • 🤝 分享项目给团队成员和(golang)编程朋友
  • 📝 撰写博客关于开发工具和工作流程 - 我们提供写作支持
  • 🌟 加入生态 - 致力于支持开源和(golang)开发场景

祝你用这个包编程愉快! 🎉🎉🎉


GitHub 标星点赞

Stargazers