Go 방법의 기본값


103

Go의 기능에 기본값을 지정하는 방법이 있습니까? 나는 이것을 문서에서 찾으려고 노력하고 있지만 이것이 가능하다는 것을 지정하는 것을 찾을 수 없습니다.

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

답변:



129

아니요,하지만 기본값을 구현하는 다른 옵션이 있습니다. 이 몇 가지 좋은 블로그 게시물 몇 가지 구체적인 예는 여기에있는 주제에,하지만.


** 옵션 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 : ** 전체 가변 인수 파싱 (자바 스크립트 스타일)
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 dec.

@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그렇지 않으면 할 일에 개행을 추가합니다 . 그러나 누군가의 코드를 읽을 때 그들이 호출하는 함수로 무엇을 하려는지 분명합니다. 기본값을 사용하면 실제로 기본값이 무엇인지 참조하는 함수로 이동하지 않고는 무슨 일이 발생하는지 알 수 없습니다.


나는이 대답을 좋아하고 동의하지만, 적어도 그들이 적어도 둔탁하지만 관용적 인 방법을 가지고 있기를 바랍니다.
Sam Gomena

15
"또 다른 기능을 추가 할" 방법의 폭발이 발생할 수 있습니다 인수가 여러 순열을 처리하는 데 필요한, 이러한 방법에 대한 의미있는 검색 및 rememberable 이름 결정의 부담을 필요로하며, 대 이상의 방법을 사용하여 패키지를 학습 부담을 추가 . 덜. #jmtcw
MikeSchinkel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.