[go] 이동의 선택적 매개 변수?

Go가 선택적 매개 변수를 가질 수 있습니까? 아니면 같은 이름과 다른 수의 인수로 두 함수를 정의 할 수 있습니까?



답변

Go에는 선택적 매개 변수가 없으며 메서드 오버로드를 지원하지 않습니다 .

형식 일치를 수행 할 필요가없는 경우 메서드 디스패치가 단순화됩니다. 다른 언어를 사용한 경험에 따르면 이름은 같지만 서명이 다른 다양한 방법을 사용하는 것이 때로는 유용하지만 실제로는 혼란스럽고 깨지기 쉽습니다. 이름 만 일치하고 유형의 일관성을 요구하는 것은 Go의 유형 시스템에서 단순화 된 주요 결정이었습니다.


답변

선택적 매개 변수와 같은 것을 달성하는 좋은 방법은 가변형 인수를 사용하는 것입니다. 이 함수는 실제로 지정한 유형의 슬라이스를받습니다.

func foo(params ...int) {
    fmt.Println(len(params))
}

func main() {
    foo()
    foo(1)
    foo(1,2,3)
}


답변

매개 변수가 포함 된 구조체를 사용할 수 있습니다.

type Params struct {
  a, b, c int
}

func doIt(p Params) int {
  return p.a + p.b + p.c
}

// you can call it without specifying all parameters
doIt(Params{a: 1, c: 9})


답변

임의의 잠재적으로 많은 수의 선택적 매개 변수의 경우 기능 옵션 을 사용하는 것이 좋습니다 .

type의 Foobar경우 먼저 생성자를 하나만 작성 하십시오 .

func NewFoobar(options ...func(*Foobar) error) (*Foobar, error){
  fb := &Foobar{}
  // ... (write initializations with default values)...
  for _, op := range options{
    err := op(fb)
    if err != nil {
      return nil, err
    }
  }
  return fb, nil
}

여기서 각 옵션은 Foobar를 변경하는 기능입니다. 그런 다음 사용자가 다음과 같은 표준 옵션을 사용하거나 만들 수있는 편리한 방법을 제공하십시오.

func OptionReadonlyFlag(fb *Foobar) error {
  fb.mutable = false
  return nil
}

func OptionTemperature(t Celsius) func(*Foobar) error {
  return func(fb *Foobar) error {
    fb.temperature = t
    return nil
  }
}

운동장

간결성을 위해 옵션 유형 ( 놀이터 )에 이름을 지정할 수 있습니다 .

type OptionFoobar func(*Foobar) error

필수 매개 변수가 필요한 경우 variadic 앞에 생성자의 첫 번째 인수로 추가하십시오 options.

기능 옵션 관용구 의 주요 이점은 다음 과 같습니다.

  • 새로운 옵션이 필요할 때 컨스트럭터 서명이 동일하게 유지되므로 기존 코드를 손상시키지 않고 시간이 지남에 따라 API가 커질 수 있습니다.
  • 기본 유스 케이스가 가장 단순합니다. 인수가 전혀 없습니다!
  • 복잡한 값의 초기화를 세밀하게 제어 할 수 있습니다.

이 기술은 Rob Pike 가 만들었 으며 Dave Cheney 도 시연했습니다 .


답변

Go에서는 선택적 매개 변수 나 함수 오버로드가 지원되지 않습니다. Go는 다양한 수의 매개 변수를 지원합니다. 인수를 … 매개 변수에 전달


답변

아니요. 당 C ++ 프로그래머를위한 이동 문서,

Go는 함수 오버로딩을 지원하지 않으며 사용자 정의 연산자를 지원하지 않습니다.

선택적 매개 변수가 지원되지 않는다는 똑같이 명확한 진술을 찾을 수 없지만 지원되지 않습니다.


답변

아래 내용과 비슷한 기능으로 이것을 꽤 잘 캡슐화 할 수 있습니다.

package main

import (
        "bufio"
        "fmt"
        "os"
)

func main() {
        fmt.Println(prompt())
}

func prompt(params ...string) string {
        prompt := ": "
        if len(params) > 0 {
                prompt = params[0]
        }
        reader := bufio.NewReader(os.Stdin)
        fmt.Print(prompt)
        text, _ := reader.ReadString('\n')
        return text
}

이 예에서 기본적으로 프롬프트에는 콜론과 그 앞에 공백이 있습니다. . .

: 

. . . 그러나 프롬프트 기능에 매개 변수를 제공하여이를 대체 할 수 있습니다.

prompt("Input here -> ")

아래와 같은 프롬프트가 나타납니다.

Input here ->