Golang的设计理念是一个事物只有一种解法, 所以连三元运算也没有提供, 官方的思路是使用 if / else 代替三元运算
如果你平时习惯使用概括性更强的语句进行编写代码, 你可能希望可以这样去编写代码:
var a = 20 > 50 ? true: false; // a = false
var b = a || 100 // b = 100
var c = b && 50 // c = 50
var fn = c > 40 && func(){ return "ok" } // fn = "ok"
复制代码
使用hit
之后,以上的代码我们可以这样写:
var a = If(20 > 50, true, false) // a = false
var b = Or(a, 100) // b = 100
var c = If(b, 50) // c = 50
var fn = If(c > 40, func(){ return "ok" }) // fn = "ok"
复制代码
抛弃教条,享受 hit
吧
安装
$ go get github.com/ymzuiku/hit
复制代码
hit只有两个API
func If(args ...interface{}) interface{}
func Or(args ...interface{}) interface{}
复制代码
使用例子
当需返回取某个参数时, 并且该参数类型是函数时, hit会运行函数并且使用函数返回值作为参数的值
以下条件都会识别为不成立
- nil
- 0
- error
- ""
- "false"
- "0"
If(a, b, c)
类似 a ? b : c
if a
== 成立
, return b
, else return c
import . "github.com/ymzuiku/hit"
func main(){
value1 := If(20 > 5, "ok", "cancel")
log.Println(value1) // ok
value2 := If("test", "ok", "cancel")
log.Println(value2) // ok
value3 := If("", "ok", "cancel")
log.Println(value3) // cancel
value4 := If("false", "ok", "cancel")
log.Println(value4) // cancel
value5 := If(5, "ok", "cancel")
log.Println(value5) // ok
value6 := If(0, "ok", "cancel")
log.Println(value6) // cancel
value7 := If(nil, "ok", "cancel")
log.Println(value7) // cancel
value8 := If(errors.New("test-error"), func() { log.Println("if err != nil, 这个参数不会进行读取" }) // value8 is error
//如果参数的类型是 `func()`, hit 读取参数时会运行它并且返回nil
value9 := If(20 > 5, func() { log.Println("ok") }, func() { log.Println("cancel") }) // run: log.Println("ok"), value = nil
// 如果参数的类型是 `func()interface{}`, hit 读取参数时会运行它并且返回函数的返回值.
value10 := If(func() interface{} { return true }, func()interface{} { return "ok" }, func()interface{} { return "cancel" })
log.Println(value9) // ok
}
复制代码
If(a, b)
类似 a && b
if a
== 成立
, return b
, else return nil
import . "github.com/ymzuiku/hit"
func main(){
value1 := If("test", "ok")
log.Println(value1) // ok
value2 := If(500, "ok")
log.Println(value2) // "ok"
value3 := If(func() interface{} { return false }, func() { log.Println("this func no run") })
log.Println(value3) // func no run, and value = nil
value4 := If(func() interface{} { return true }, func() interface{} { log.Println("func is run"); return 50 })
log.Println(value4) // func is run, and value = 50
}
复制代码
Or(a, b)
类似 a || b
if a
== 成立
, return a
, else return b
import . "github.com/ymzuiku/hit"
func main(){
value1 := Or("test", "ok")
log.Println(value1) // ok
value2 := Or(500, "ok")
log.Println(value2) // 500
value3 := Or(func() interface{} { return 100 }, func() { log.Println("this func no run") })
log.Println(value3) // func no run, and value = 100
value4 := Or(func() interface{} { return false }, func() interface{} { log.Println("func is run"); return 50 })
log.Println(value4) // func is run, and value = 50
}
复制代码
测试用例:
hit代码的测试覆盖率为 100%, 查看具体的测试代码: hit_test.go