Go方法的默认值


103

有没有一种方法可以在Go函数中指定默认值?我正在尝试在文档中找到它,但是找不到任何指定这是可能的东西。

func SaySomething(i string = "Hello")(string){
...
}

Answers:



128

否,但是还有其他一些选项可以实现默认值。关于这个主题有一些不错的博客文章,但是这里有一些具体的例子。


**选项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)
}

**选项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)
}

**选项3:**配置结构
// 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)
}

**选项4:**完全可变参数解析(javascript样式)
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)
}

99
真痛苦 我希望是这样的:func Concat1(a string = 'foo', b int = 10) string {就像大多数其他现代语言一样,它将任何给定的示例都简化为一行代码。
Rotareti

我们是否可以选择编写两个不同的函数,然后将其留给调用方以明确说明他们的期望。
ProgramCpp

@ProgramCpp否,golang不允许函数重载Go语言是否具有函数/方法重载?
Vusal

11

不,没有办法指定默认值。我相信这样做的目的是为了提高可读性,但要花更多时间(并且希望是在作者端)花些时间。

我认为拥有“默认”的正确方法是拥有一个新功能,该功能将默认提供给更通用的功能。有了这个,您的代码就变得更加清晰了。例如:

func SaySomething(say string) {
    // All the complicated bits involved in saying something
}

func SayHello() {
    SaySomething("Hello")
}

花费很少的精力,我做了一个做普通事情的函数并重用了通用函数。您可以在许多库中看到这一点,fmt.Println例如,仅在其他情况下添加换行符即可fmt.Print。但是,在阅读某人的代码时,很明显他们通过调用的函数打算做什么。使用默认值时,如果不使用函数来引用默认值的实际含义,我将不知道会发生什么。


我喜欢并同意这个答案,但是该死,我还是希望他们至少有一种钝但惯用的方式。
山姆·戈梅纳

15
“添加另一功能”的说法可能导致的方法爆炸来处理多个排列,需要决定这些方法的意义,发现和rememberable名称的负担,并增加了负担,学习使用多种方法VS包。 减。#jmtcw
MikeSchinkel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.