您的位置:

Golang参数默认值

一、Golang参数默认值介绍

Golang是一种编译型语言,具有快速和高效的特性。在默认情况下,所有参数都是必需的,但是在某些特定情况下,应该使用默认值。Golang提供了在函数定义时设置参数的默认值的功能。在函数调用时,如果实参没有指定参数,则使用定义时设置的值。

参数默认值我们可以用常量或变量来设置。Golang使用非空接口类型来实现默认值,同一参数可以有多个默认值,只需将它们定义为有相同接口类型的常量即可。例如:

func Add(a int, b int, c ...int)(res int) {
    for _, v := range c {
        res += v
    }
    return a + b + res
} 
func main() {
    fmt.Println(Add(1, 2, 3)) //6
    fmt.Println(Add(1, 2)) //3
}

二、Golang函数参数默认值的限制

Golang函数参数默认值有以下限制:

1、参数列表必须是连续的,即不能给中间参数设置默认值,需要连续赋值;

2、一个参数只能有一个默认值;

3、只有在相应位置的参数没有被传入时,才会采用该位置的默认参数。

例如:

func Add(a int, b int, c int, d int=4)int{
    return a + b + c +d
}
func main() {
    fmt.Println(Add(1,2,3)) //10
    fmt.Println(Add(1,2,3,4)) //10
}

三、Golang用空接口实现任意类型参数默认值

Golang使用空接口(interface{})类型来实现任意类型的默认值。用户可以定义变量或者常量,将它们赋值给空接口类型参数

func Hello(name string, args ...interface{})string{
    greet := fmt.Sprintf("Hello,%s!\n", name)

    if len(args) == 0{
        return greet
    }

    greet += "I have some messages for you:\n"
    for _, arg := range args{
        greet += fmt.Sprintf("%v\n", arg)
    }
    return greet
}
func main() {
    fmt.Println(Hello("John")) // Hello, John!
    fmt.Println(Hello("Tom", "message one", 2)) // Hello, Tom!\nI have some messages for you:\nmessage one\n2\n
}

四、使用函数闭包实现默认值

可以使用函数闭包代替参数默认值。函数闭包是一个无需参数的函数,在被调用时返回另一个函数。

func Hello(name string)func(args ...interface{})string{
    return func(args ...interface{})string{
        greet := fmt.Sprintf("Hello,%s!\n", name)
        if len(args) == 0{
            return greet
        }
        greet += "I have some messages for you:\n"
        for _, arg := range args{
            greet += fmt.Sprintf("%v\n", arg)
        }
        return greet
    }
}
func main() {
    Tom := Hello("Tom")
    John := Hello("John")
    fmt.Println(Tom())  // Hello, Tom!
    fmt.Println(Tom("message 1", "message 2")) // Hello, Tom!\nI have some messages for you:\nmessage 1\nmessage 2\n
    fmt.Println(John()) // Hello, John!
}

五、结论

Golang默认参数是函数调用中提供默认值以覆盖函数声明中未给定值的参数,从而简化某些情况下的函数调用。通常使用常数或变量实现符合接口的默认参数。还可以通过空接口类型实现任意类型的参数默认值,使用函数闭包代替参数默认值。