var
に言及することは、あなたの主な問題であるならば、あなたはこのように、:=
に=
を変更することで、簡単にそれをドロップすることができます
english := Greeting(func(name string) string {
return ("Hello, " + name);
})
しかし、あなたもGreeting
にあなたの機能をキャストする必要はありません。仕様は以下の通りですfunction types:
機能タイプは、同じパラメーターと結果タイプを持つすべての機能のセットを表します。
そして、これは約type identity:彼らは、パラメータと結果の型に対応する、パラメータと結果の値の数が同じで同一であり、どちらかの両方の機能が可変長かでもない場合
2つの関数型が同一であり、です。パラメータと結果の名前は一致する必要はありません。
これは、各機能に独自の機能タイプがあることを意味します。 2つの関数が同じシグネチャ(パラメータと結果の型)を持つ場合、それらは1つの関数型を共有します。 type Greeting func...
を書くことによって、新しいものを定義するのではなく、特定の関数型に名前を付けるだけです。私はまた、あなたのenglish
機能から、セミコロンや括弧を落とし
package main
import "fmt"
type Greeting func(name string) string
func say(g Greeting, n string) { fmt.Println(g(n)) }
func french(name string) string { return "Bonjour, " + name }
func main() {
english := func(name string) string { return "Hello, " + name }
say(english, "ANisus")
say(french, "ANisus")
}
お知らせ:ゴーで関数型で動作するように正しい方法を示し
だから次のコードは動作しますが、と私は願っています。 Goの開発者は、そうでなければこれらの句読点を使用しません。
更新:サンプルコードを提供したので、私はこの問題をはっきりと理解することができました。
この目的のためには、コードは十分であり、それを行う方法はあまりありません。あなたが好きならば、あなただけのメソッドを呼び出す前にキャストすることができます:
english := func(name string) string { return "Hello, " + name }
Greeting(english).exclamation("ANisus")
しかし、私は、これは改善されているか分かりません。私はちょうどあなたがしたいことについては、コードを書くための他の方法ではないようだと言っています。
つまり、タイプを変更したくない場合です。つまり、関数型のメソッドを呼び出すという考えは少し変わっているようです。それは間違っているのではなく、少し稀です。より一般的な方法で同じ効果を達成する別の方法は、構造体の型を使用し、関数のフィールドを持つことです。このような何か:
package main
import "fmt"
type Greeting struct {
say func(name string) string
}
func newGreeting(f func(string) string) *Greeting {
return &Greeting{say: f}
}
func (g *Greeting) exclamation(name string) string { return g.say(name) + "!" }
func main() {
english := &Greeting{say: func(name string) string {
return "Hello, " + name
}}
french := newGreeting(func(name string) string {
return "Bonjour, " + name
})
fmt.Println(english.exclamation("ANisus"))
fmt.Println(french.exclamation("ANisus"))
}
ここ
english
とfrench
は、同じものをコード化する2つの異なる方法を示しています。繰り返しますが、これはより優れた解決策ではなく、同じ効果を達成するためのより普遍的な、より柔軟な方法です。ここでの問題を分離しようとすると
グローバル変数として 'english'を宣言しているので、' var'を削除することはできません。 – Mostafa