Методы привязаны к типу. MyFunc.eval()
связан с типом MyFunc
.
Это:
randomFunction := func() int {
return 1
}
Является кратким объявлением переменной , которое создает переменную с именем randomFunction
и использует литерал функции для предоставления ей начального значения, тип которого будет анонимным типом функции: func() int
. Этот тип не имеет функции eval()
(анонимные типы имеют нулевые методы).
Но вы можете использовать преобразование типа , чтобы преобразовать его в MyFunc
, и полученное значение будет иметь этот метод:
randomFunction2 := func() int {
return 1
}
fmt.Println(MyFunc(randomFunction2).eval()) // prints 1
Приведенное выше преобразование не меняет тип randomFucntion2
, конечно.
Если вы используете преобразование в кратком объявлении переменной, randomFunction3
будет иметь статический тип MyFunc
, а "всегда" будет иметь метод eval()
:
randomFunction3 := MyFunc(func() int {
return 1
})
fmt.Println(randomFunction3.eval()) // prints 1
Также обратите внимание, что часто вам даже не нужно вручную преобразовывать значения вашей функции, как если бы это был анонимный тип, преобразование будет происходить автоматически.
Например, если у вас есть функция, которая принимает значение типа MyFunc
:
func handle(f MyFunc) {
fmt.Println(f.eval())
}
Вы можете передать ему randomFunction2
:
handle(randomFunction2) // This is OK
Вышеописанное работает, потому что значение randomFunction2
равно , присваиваемому типу (переменной) MyFunc
(они имеют одинаковый базовый тип). Подробнее см. Пользовательский тип, переданный в функцию в качестве параметра .
Попробуйте примеры на Go Playground .