Если упоминая var
ваша главная проблема, вы можете оставить его легко, изменив =
в :=
, как это:
english := Greeting(func(name string) string {
return ("Hello, " + name);
})
Но вы даже не должны отбрасывать вашу функцию в Greeting
. Спектр говорит об этом function types:
Тип функции обозначает набор всех функций с теми же параметрами и типами результатов.
И это о type identity:
Два типа функций идентичны, если они имеют одинаковое количество параметров и значений результатов, соответствующие параметры и результаты типов идентичны, и либо обе функции VARIADIC или ни является. Имена параметров и результатов не обязательно совпадают.
Это означает, что каждая функция имеет свой собственный тип функции. Если две функции имеют одну и ту же подпись (параметры и типы результатов), они имеют один тип функции. Написав type Greeting func...
, вы просто указываете имя определенному типу функции, а не определяете новый.
Так следующий код работает, и я надеюсь, показывает правильный способ работы с типами функций в Go:
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")
}
Обратите внимание, что я также упал точку с запятой и скобку от вашей english
функции. Разработчики не используют эти пунктуации, если им это не нужно.
UPDATE: Теперь, когда вы предоставили образец кода, я могу четко понять проблему.
Для этого ваш код достаточно хорош, и нет других способов сделать это. Если вам нравится, вы можете бросить перед вызовом метода:
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
показывают два различных способа кодирования то же самое. Опять же, я не говорю, что это лучшее решение, но более обычный и более гибкий способ достижения такого же эффекта.
Вы не можете удалить 'var', потому что вы объявляете' english' как глобальную переменную. – Mostafa