Go'の関数でデフォルト値を指定する方法はありますか?ドキュメントで探しているのですが、それが可能であることを指定するものが見つかりません。
func SaySomething(i string = "Hello")(string){
...
}
しかし、デフォルト値を実装するための他のオプションがいくつかあります。 このテーマについては、いくつかの 良いブログ記事 がありますが、ここではいくつかの具体例を紹介します。
オプション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: 末尾にオプションのパラメータを1つ指定します。
// 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)
}
いいえ、デフォルトを指定する方法はありません。これは可読性を高めるためにわざとそうしているのだと思いますが、その代償として書き手側には少し時間がかかります(できれば考えも必要です)。
私は、quot;default" を持つための適切なアプローチは、より一般的な関数にそのデフォルトを供給する新しい関数を持つことだと考えています。そうすることで、コードの意図がより明確になります。例えば
func SaySomething(say string) {
// All the complicated bits involved in saying something
}
func SayHello() {
SaySomething("Hello")
}
ほんの少しの手間で、よくあることをする関数を作り、汎用的な関数を再利用しています。これは多くのライブラリで見ることができ、例えば fmt.Println
は fmt.Print
が行うことに改行を追加しているだけです。しかし、誰かのコードを読むと、呼び出した関数が何を意図しているかは一目瞭然です。デフォルト値では、実際にデフォルト値が何であるかを関数で参照しなければ、何が起こることになっているのかわかりません。