Go现在与将来都不会支持参数默认值。Go始终在使得自己变得尽可能的简单,而增加这种额外的支持会使parser变得更复杂。
但是如果仍然需要,这里也有一些实现途径,
使用可变参数语法糖
go
package main
import "fmt"
// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat(a string, b_optional ...int) string {
b := 0
if len(b_optional) > 0 {
b = b_optional[0]
}
return fmt.Sprintf("%s%d", a, b)
}
func main() {
fmt.Println(Concat("Hello"))
fmt.Println(Concat("Hello", 1))
}
这种算是比较常见的一种, 利用变长参数。
b_optional 本质是个变长参数,对应一个切片,切片长度可能为0,也可能包含1个或者多个值。
利用结构体
go
package main
import (
"fmt"
)
type Parameters struct {
A string
B string
}
func Concat(prm Parameters) string {
// 变相给A 设置默认值
if prm.A == "" {
prm.A = "Hello"
}
return prm.A + ", " + prm.B
}
func main() {
// fmt.Println(Concat("Hello"))
p := Parameters{A: "Hello", B: "World"}
fmt.Println(Concat(p))
p1 := Parameters{A: "Hello"}
fmt.Println(Concat(p1))
p2 := Parameters{B: "World"}
fmt.Println(Concat(p2))
p3 := Parameters{}
fmt.Println(Concat(p3))
}
利用结构体不强校验每个字段必须要存在,在函数开始时检查添加默认值
小结
整体上Go不太建议 默认或者缺省值,但是也有一定的方法来实现。