golang给变量设置默认值

不知你是否已经受够了大量判断变量是零或者空指针时给变量赋值的逻辑, 比如下述代码:

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[]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值