Go의 기능에 기본값을 지정하는 방법이 있습니까? 나는 이것을 문서에서 찾으려고 노력하고 있지만 이것이 가능하다는 것을 지정하는 것을 찾을 수 없습니다.
func SaySomething(i string = "Hello")(string){
...
}
답변:
아니요, Google의 권한은이를 지원하지 않기로 결정했습니다.
https://groups.google.com/forum/#!topic/golang-nuts/-5MCaivW0qQ
아니요,하지만 기본값을 구현하는 다른 옵션이 있습니다. 이 몇 가지 좋은 블로그 게시물 몇 가지 구체적인 예는 여기에있는 주제에,하지만.
// 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)
}
// 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 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)
}
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)
}
func Concat1(a string = 'foo', b int = 10) string {
대부분의 다른 현대 언어에서와 같이 ... 주어진 예제를 거의 한 줄의 코드로 줄입니다.
아니요, 기본값을 지정할 방법이 없습니다. 나는 이것이 작가의 입장에서 조금 더 많은 시간 (그리고 바라건대 생각)을 희생시키면서 가독성을 높이기 위해 의도적으로 수행되었다고 믿는다.
"기본값"을 갖는 적절한 접근 방식은보다 일반적인 기능에 기본값을 제공하는 새로운 기능을 갖는 것입니다. 이를 통해 코드가 의도에 더 명확 해집니다. 예를 들면 :
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
아주 적은 노력으로 일반적인 기능을하는 함수를 만들고 일반 함수를 재사용했습니다. 많은 라이브러리에서 이것을 볼 수 있습니다. fmt.Println
예를 들어 fmt.Print
그렇지 않으면 할 일에 개행을 추가합니다 . 그러나 누군가의 코드를 읽을 때 그들이 호출하는 함수로 무엇을 하려는지 분명합니다. 기본값을 사용하면 실제로 기본값이 무엇인지 참조하는 함수로 이동하지 않고는 무슨 일이 발생하는지 알 수 없습니다.