Si var
mencionar es su principal problema, se puede eliminar fácilmente, cambiando =
en :=
, así:
english := Greeting(func(name string) string {
return ("Hello, " + name);
})
Pero no siquiera tiene que emitir su función en Greeting
. La especificación dice esto sobre function types:
Un tipo de función denota el conjunto de todas las funciones con el mismo parámetro y los mismos tipos de resultados.
Y esto sobre type identity:
dos tipos de función son iguales si tienen el mismo número de parámetros y valores de resultado, tipos de parámetro y de resultados correspondiente son idénticos, y, o bien ambas funciones son variadic o ninguno es. No es necesario que coincidan los nombres de parámetros y resultados.
Esto significa que cada función tiene su propio tipo de función. Si dos funciones tienen la misma firma (tipos de parámetros y resultados), comparten un tipo de función. Al escribir type Greeting func...
solo está dando un nombre a un tipo de función en particular, sin definir uno nuevo.
Así que el siguiente código funciona, y espero que muestra la manera correcta de trabajar con tipos de funciones de movimiento:
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")
}
Tenga en cuenta que también cayó punto y coma y paréntesis de su función english
. Los desarrolladores de Go no usan estas puntuaciones si no es necesario.
ACTUALIZACIÓN: Ahora que ha proporcionado un código de muestra, puedo entender claramente el problema.
Para este propósito, su código es lo suficientemente bueno y no hay muchas otras formas de hacerlo. Si lo desea, puede lanzar antes de llamar al método:
english := func(name string) string { return "Hello, " + name }
Greeting(english).exclamation("ANisus")
Pero no estoy seguro de que esto sea una mejora. Solo digo que por lo que quieres hacer no parece haber otras formas de escribir el código.
Es decir, si no queremos cambiar sus tipos. Quiero decir, la idea de llamar a un método en un tipo de función parece un poco extraño. No es que esté mal, pero es un poco raro. Otra forma de lograr el mismo efecto de una manera más habitual es mediante un tipo de estructura y un campo para la función.Algo como esto:
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"))
}
Aquí english
y french
muestran dos formas diferentes de codificación de la misma cosa. Una vez más, no estoy diciendo que esta sea la mejor solución, sino una forma más habitual y más flexible de lograr el mismo efecto.
No puede eliminar 'var' porque está declarando' english' como una variable global. – Mostafa