赞
踩
不知你是否已经受够了大量判断变量是零或者空指针时给变量赋值的逻辑, 比如下述代码:
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[]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。