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 ->