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开发。