一、设计思想golang函数中的参数不支持默认值主要是因为设计思想。Go语言的设计者们认为,参数默认值会使代码更难以理解和维护,在Go语言中,函数的参数是必须显式传递的,这样可以使代码更加清晰和易于理解,因此在Go语言中不支持参数默认值。
Go语言的设计哲学是简单、显式、组合、并发和面向工程。Go语言的设计初衷是为了解决Google内部大规模软件开发存在的各种问题,例如程序构建慢、依赖管理失控、代码难于理解、跨语言构建难等。Go语言的设计者将解决工程问题作为Go的设计原则之一,从而考虑Go语法、工具链与标准库的设计,这也是Go与其他偏学院派、偏研究型的编程语言在设计思路上的一个重大差异。
Go语言追求显式的表达,避免隐含,这种设计在其面向对象的语法中尤其明显package test
struct clstest {
int a
int b
int c
}
func (this *clstest) sum() int{
return this.a + this.b + this.c
}
一、golang中函数如何设置参数默认值1、强制改变
// Both parameters are optional, use empty string for default value
func Concat1(a string, b int) string {
if a == “” {
a = “default-a”
}
if b == 0 {
b = 5
}
return fmt.Sprintf(“%s%d”, a, b)
}
go的一大特点就是所有的变量都必须经过初始化。那如果在函数内部读取到参数值为初始化值,即可进行对应的操作。 但是这种方法无法解决设置参数默认值时所经常应对的场景,即参数缺省问题。
2、使用可变参数语法糖
// a is required, b is optional.
// Only the first value in b_optional will be used.
func Concat2(a string, b_optional …int) string {
b := 5
if len(b_optional) > 0 {
b = b_optional[0]
}
return fmt.Sprintf(“%s%d”, a, b)
}
上述方法中,a是必须的,而b是可选的。 此时b的默认值时5,如果b_optional中存在数据,则将其读取。
3、利用结构体的config
// A declarative default value syntax
// Empty values will be replaced with defaults
type Parameters struct {
A string `default:”default-a”` // this only works with strings
B string // default is 5
}
func Concat3(prm Parameters) string {
typ := reflect.TypeOf(prm)
if prm.A == “” {
f, _ := typ.FieldByName(“A”)
prm.A = f.Tag.Get(“default”)
}
if prm.B == 0 {
prm.B = 5
}
return fmt.Sprintf(“%s%d”, prm.A, prm.B)
}
虽然也能做到缺省参数(如果不设置A属性,则该属性将被默认初始化),但是这种方式只对字符串管用。
4、转换函数的全部参数
func Concat4(args …interface{}) string {
a := “default-a”
b := 5
for _, arg := range args {
switch t := arg.(type) {
case string:
a = t
case int:
b = t
default:
panic(“Unknown argument”)
}
}
return fmt.Sprintf(“%s%d”, a, b)
}
二、Go语言应用场景鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等;网络编程方面,Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还适用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发。
- 服务器编程。例如处理日志、数据打包、虚拟机处理、文件系统等。
- 分布式系统、数据库代理器、中间件等。例如Etcd。
- 网络编程。这一块目前应用最广,包括Web应用、API应用、下载应用等等。
- 开发云平台。目前国内外很多云平台在采用Go开发。