不知你是否已经受够了大量判断变量是零或者空指针时给变量赋值的逻辑, 比如下述代码:
package main
func t1(page, size int) {
if page == 0 {
page = 1
}
if size == 0 {
size = 10
}
//other
}
func main() {
var a int
t1(a)
}
为了解决上述问题封装了下述函数可以解决各种空值判断
package set
import "reflect"
func Default(field, _default interface{}) {
v1 := reflect.ValueOf(field).Elem()
v2 := reflect.ValueOf(_default)
if v1.IsZero() {
v1.Set(v2)
}
}
然后文章开头的示例就可以改为
package main
func t1(page, size int) {
set.Default(&page, 1)
set.Default(&size, 10)
//other
}
func main() {
var a int
t1(a)
}
另外还支持其它一些空值的设置, 如下:
package main
import (
"fmt"
"github.com/goperate/convert/core/set"
)
type Test struct {
A int
}
func main() {
var a string
set.Default(&a, "10")
fmt.Println(a)
var b int
set.Default(&b, 10)
fmt.Println(b)
var c float32 = 1.28
set.Default(&c, float32(2))
fmt.Println(c)
var d Test
set.Default(&d, Test{A: 10})
fmt.Println(d)
//空指针必须传入指针的指针, 否则程序报错
var e *Test
set.Default(&e, &Test{A: 111})
fmt.Println(e)
var f []int
set.Default(&f, []int{2222})
fmt.Println(f)
//长度为0的数组不会被覆盖
g := make([]int, 0, 0)
set.Default(&g, []int{2})
fmt.Println(g)
var h map[string]int
set.Default(&h, map[string]int{"a": 666})
fmt.Println(h)
//初始化完成的空map不会被覆盖
i := make(map[string]int)
set.Default(&i, map[string]int{"a": 777})
fmt.Println(i)
}
10
10
1.28
{10}
&{111}
[2222]
[]
map[a:666]
map[]